文章目录
- 1.查询用户个人信息接口开发
- 1.需求分析
- 2.用户上传头像接口开发
- 1.需求分析
- 2.定义一个拦截器类
- 3.创建一个类继承WebMvcConfigurerAdapter,做虚拟目录的配置
- 4.编写controller代码
- 5.编写service层的用户更新操作的代码
1.查询用户个人信息接口开发
1.需求分析
需要通过前端传来的用户的userid去数据库中进行查询,并将查询到的对象封装为usersVo返回给前端
dao层代码
public interface UsersDao extends JpaRepository<Users,String> {
}
service层代码
/**
* 根据用户id返回查询用户信息并返回
* @param id
* @return
*/
@Override
public Users findUserInfo(String id) {
return usersDao.findOne(id);
}
controller层代码
@ApiOperation(value = "用户信息查询", notes = "用户信息查询的接口")
@PostMapping("/findUserInfo")
public LexJSONResult findUserInfo(String id){
Users users= userService.findUserInfo(id);
UsersVo usersVo=new UsersVo();
//使用BeanUtils工具类将users的信息复制到usersVo中
BeanUtils.copyProperties(users,usersVo);
return LexJSONResult.ok(usersVo);
}
2.用户上传头像接口开发
1.需求分析
用户在小程序端点击头像上传后调用头像上传接口,在这之前需要定义一个拦截器对用户登录状态进行判断,如果当前有用户使用工具恶意掉用该接口则会让服务器端出现错误,所以需要在这里让前端将用户的id和token数据放在请求的header中,通过拦截器的解析来确定是否放行,如果验证通过则进行头像的上传,并实现头像图片的回显,这里则需要在springMVC中配置一个虚拟目录。
2.定义一个拦截器类
public class Intercepto implements HandlerInterceptor {
/**
* 拦截请求 在controller之前
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @return
* @throws Exception
*/
@Autowired
private RedisOperator redisOperator;
public final String USERSESSIONID="user-session-id";
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
String userId = httpServletRequest.getHeader("userId");
String userToken=httpServletRequest.getHeader("userToken");
if (!StringUtils.isEmpty(userId)&& !StringUtils.isEmpty(userToken)){
// System.out.println("不为空");
String token = redisOperator.get(USERSESSIONID + ":" + userId);
if (StringUtils.isEmpty(token)){
returnErrorResponse(httpServletResponse,new LexJSONResult().errorTokenMsg("用户信息已经过期,请重新登录"));
System.out.println("用户信息已经过期,请重新登录");
return false;
}
else if (!token.equals(userToken)){
returnErrorResponse(httpServletResponse,new LexJSONResult().errorTokenMsg("该账号已经登录"));
System.out.println("该账号已经登录");
return false;
}else {
return true;
}
}else {
returnErrorResponse(httpServletResponse,new LexJSONResult().errorTokenMsg("你还没有登录,请登录"));
System.out.println("请登录");
return false;
}
}
public void returnErrorResponse(HttpServletResponse response, LexJSONResult result)
throws IOException, UnsupportedEncodingException {
OutputStream out=null;
try{
response.setCharacterEncoding("utf-8");
response.setContentType("text/json");
out = response.getOutputStream();
out.write(JsonUtils.objectToJson(result).getBytes("utf-8"));
out.flush();
} finally{
if(out!=null){
out.close();
}
}
}
/**
* 请求controller后 页面渲染前
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
/**
* 最后
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @param e
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
3.创建一个类继承WebMvcConfigurerAdapter,做虚拟目录的配置
@Configuration
public class WebMvc extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//这里是对swagger2的静态页面资源进行添加
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/META-INF/resources/")
//对应的服务器端存放文件的目录
.addResourceLocations("file:F:/file/");
}
@Bean
public Intercepto intercepto(){
return new Intercepto();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(intercepto())
.addPathPatterns("/user/**")
.addPathPatterns("/video/uploadVideo")
.addPathPatterns("/video/saveComments")
;
}
}
4.编写controller代码
关于用户相关的操作,把它写在UserController中,创建一个新的controller
@Autowired
private UserService userService;
@ApiOperation(value = "用户头像上传", notes = "用户头像上传的接口")
@PostMapping("/upload")
public LexJSONResult upload(String id, @RequestParam("file") MultipartFile[] file) throws IOException {
if (StringUtils.isEmpty(id)){
return LexJSONResult.errorMsg("id不能为空");
}
//创建一个文件输出流对象
FileOutputStream fileOutputStream=null;
//创建一个输入流对象
InputStream inputStream=null;
//文件的命名空间
String fileSpace="F:/file";
//文件保存的相对路径
String upLoadPathDb="/"+id+"/face";
try {
//判断传入的文件是否为空
if (file!=null && file.length>0){
//获取到传入的文件名称
String filename = file[0].getOriginalFilename();
//判断该文件名是否为空
if (!StringUtils.isEmpty(filename)){
//获得该文件的绝对路径
String finalPath=fileSpace+upLoadPathDb+"/"+filename;
//获得该文件存入数据库的相对路径
upLoadPathDb=upLoadPathDb+"/"+filename;
File f=new File(finalPath);
if (f.getParentFile()!=null || !f.getParentFile().isDirectory()){
//创建该文件所在目录的文件夹
f.getParentFile().mkdirs();
}
fileOutputStream=new FileOutputStream(f);
inputStream=file[0].getInputStream();
IOUtils.copy(inputStream,fileOutputStream);
Users u=new Users();
u.setId(id);
u.setFaceImage(upLoadPathDb);
//将用户id和头像相对路径传入,调用更新方法
userService.updateUserInfo(u);
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
if (fileOutputStream!=null){
fileOutputStream.flush();
fileOutputStream.close();
}
}
//将文件的相对路径返回给前端,用来做头像的回显
return LexJSONResult.ok(upLoadPathDb);
}
5.编写service层的用户更新操作的代码
/**
* 用户更新操作,将用户的头像存储的相对路径保存到数据
* @param users
*/
@Override
@Transactional
public void updateUserInfo(Users users) {
Users one = usersDao.findOne(users.getId());
one.setFaceImage(users.getFaceImage());
usersDao.save(one);
}