基于java的微信小程序的实现(四)用户个人信息相关接口开发

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);

    }

猜你喜欢

转载自blog.csdn.net/qq_36258498/article/details/84639340
今日推荐