如图1所示为传统的单项目工程,将所有层都写在一个工程中,项目较大不利用后期修改,适用于小型项目。
本小程序后台采用maven搭建分成的聚合工程,如图2所示,子工程是作为module存在的。
图3是视频后台搭建的模块图
swagger介绍,可以帮助我们更好地管理接口,接口以网站形式进行展示,方便前端人员查看,有利于接口对接,简化开发。
使用swagger2构建restful接口测试步骤:
1.在common工程下引入依赖
io.springfox
springfox-swagger2
2.4.0
io.springfox
springfox-swagger-ui
2.4.0
2.在application同级文件下配置Swagger2.java文件
@Configuration
@EnableSwagger2
public class Swagger2 {
/**
* @Description:swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等
*/
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
.apis(RequestHandlerSelectors.basePackage("com.jxw.controller"))
.paths(PathSelectors.any()).build();
}
/**
* @Description: 构建 api文档的信息
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
// 设置页面标题
.title("使用swagger2构建短视频后端api接口文档")
// 设置联系人
.contact(new Contact("阿休短视频", "---", "[email protected]"))
// 描述
.description("欢迎访问短视频接口文档,这里是描述信息")
// 定义版本号
.version("1.0").build();
}
}
3.在controller中配置
@RestController //与小程序接口 都是返回消息
@Api(value="用户注册登录的接口", tags= {"注册和登录的controller"})
public class RegistLoginController {
@RequestMapping("regist")
@ApiOperation(value="用户注册", notes="用户注册的接口")
public String regist(@RequestBody Users user) throws Exception { //一个json对象
...
}
4.在响应pojo类中配置
@ApiModel(value="用户对象", description="这是用户对象")
public class Users {
@ApiModelProperty(hidden=true)
@Id
private String id;
/**
* 用户名
*/
@ApiModelProperty(value="用户名", name="username", example="imoocuser", required=true)
private String username;
/**
* 密码
*/
@ApiModelProperty(value="密码", name="password", example="123456", required=true)
private String password;
...
}
5.运行
访问网址:
http://localhost:8081/swagger-ui.html#!/
可看到之前设置的展示信息,与接口列表,该网站还可以使用示例参数直接调试非常方便。
后台端是简单的几层实现,小程序端登录注册接口实现如下:
wx.request小程序所有与后台的交互,全通过这个API,下面是注册接口,登录接口类似:
doRegist:function(e){ //e可以获取到form对象
var formObject = e.detail.value;
var username= formObject.username;
var password = formObject.password;
// console.log(formObject);
if(username.length==0 || password.length==0){
wx.showToast({
title: '用户名或密码不能为空',
icon:'none',
duration:2000
})
}else{
var serverUrl = app.serverUrl;
wx.showLoading({
title: '注册中...',
})
wx.request({
url: serverUrl+"/regist",
method:"POST",
data: {
username: username,
password: password
},
header: {
'content-type': 'application/json' // 默认值
},
success:function(res){
wx.hideLoading();
console.log(res);
var status = res.data.status;
console.log(status);
if(status==200){
wx.showToast({
title:"注册成功,跳转至登录界面",
icon:"success",
duration: 3000,
success: function () {
wx.redirectTo({
url: '../userLogin/login'
});
}
}),
app.userInfo=res.data.data; // 给全局赋予这个变量
}else if(status==500){
wx.showToast({
title:res.data.msg,
duration: 3000
})
}
}
})
}
}
注:
(1)在小程序与后台交互时,后端会因为网络情况等没有马上回应,为了使得用户体验更好,在小程序发送请求之前添加一个加载框,成功之后,手动关闭:
wx.showLoading({
title: '注册中...',
})
wx.hideLoading();
如加载框如下图所示: 更多具体用法可以查看 小程序界面API
(2)后台通信的URL需要通过之前提到的ngrok穿透暴露出来。
并且小程序中要进行相应设置,将不校验合法域名、web-view(业务域名)、TLS版本以及HTTPS证书勾选掉
(1)有状态会话与无状态会话基本概念
有状态会话
当用户不访问时,会话关闭
无状态会话
APP用户一次连接之后就断开,无法继续保持会话,这时需要在后台做一些操作维护用户关系。
这时可以利用Redis-session来建立手机端用户和Web系统之间的关系。
(2)Redis-session
当手机用户访问时,建立一个redis-session,用json形式记录用户信息,也可以设置有效时间,存到缓存中
Redis-session的好处
用户信息存储到redis缓存中,形成无状态会话
便于扩展,当单体应用该扩展成集群会相当方便
便于权限验证(拦截器)
4.0.2 64位
安装单机版Redis以及RedisDesktopManager工具连接Redix教程
https://blog.csdn.net/qq_41986312/article/details/90903197
引入相关的依赖
org.springframework.boot
spring-boot-starter-data-redis
redis.clients
jedis
2.9.0
org.springframework.data
spring-data-redis
1.8.7.RELEASE
在application.properties中进行一些基本配置
注意springboot版本不一样的配置文件会有一些区别,下面是2.0的配置
https://blog.csdn.net/qq_33326449/article/details/80457571
#Redis数据库索引(默认为0)
spring.redis.database=1
#Redis服务器地址
spring.redis.host=192.168.137.55
spring.redis.port=6379
#服务器连接密码 (默认为空)
spring.redis.password=123456
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=1000
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=-1ms
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=10
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=2
# 连接超时时间(毫秒)
spring.redis.timeout=1000ms
连接超时时间不能设成0ms具体还不知道为啥
然后创建redisTemplate的操作实现类
1.Redis版本要和spring一致
org.springframework.data
spring-data-redis
2.1.5.RELEASE
官网http://ffmpeg.org/
由于小程序上传视频 success的回调函数没有返回封面的临时路径,所以要通过ffmpeg来截取视频图片
当传递到页面显示的东西比pojo类更多时,可以新定义一个vo的pojo,此时不用和数据库交互,为浏览器显示提供服务
自定义mapper来提供服务。
更改type 新增一些与数据库的映射字段
下图id是 mapper.java文件中定义的函数名, resultMap是上面定义的返回类型
(1)原理
向数据库发送查询请求时,被拦截,添加分页的语句拼接,返回对应数据
(2)使用
page返回一些基本参数,如一共有几页等
封装分页后的数据格式
public class PagedResult {
private int page; // 当前页数
private int total; // 总页数
private long records; // 总记录数
private List> rows; // 每行显示的内容
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public long getRecords() {
return records;
}
public void setRecords(long records) {
this.records = records;
}
public List> getRows() {
return rows;
}
public void setRows(List> rows) {
this.rows = rows;
}
}