1. 程式人生 > >基於java的微信小程式的實現(四)使用者個人資訊相關介面開發

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

    }