Преглед на файлове

登录验证码,带看

lyhzzz преди 2 години
родител
ревизия
85e3bb2a2c
променени са 21 файла, в които са добавени 537 реда и са изтрити 6 реда
  1. 8 0
      pom.xml
  2. 3 0
      src/main/java/com/fdkankan/fusion/common/ResultCode.java
  3. 1 0
      src/main/java/com/fdkankan/fusion/common/util/RedisKeyUtil.java
  4. 1 1
      src/main/java/com/fdkankan/fusion/config/SaTokenConfigure.java
  5. 31 0
      src/main/java/com/fdkankan/fusion/controller/CaseLiveController.java
  6. 7 1
      src/main/java/com/fdkankan/fusion/controller/LoginController.java
  7. 41 0
      src/main/java/com/fdkankan/fusion/controller/NoLoginController.java
  8. 57 0
      src/main/java/com/fdkankan/fusion/entity/CaseLive.java
  9. 1 1
      src/main/java/com/fdkankan/fusion/generate/AutoGenerate.java
  10. 18 0
      src/main/java/com/fdkankan/fusion/httpClient/FdService.java
  11. 7 0
      src/main/java/com/fdkankan/fusion/httpClient/client/FdKKClient.java
  12. 15 0
      src/main/java/com/fdkankan/fusion/httpClient/request/FdRoomAddParam.java
  13. 2 1
      src/main/java/com/fdkankan/fusion/httpClient/request/FdkkLoginRequest.java
  14. 111 0
      src/main/java/com/fdkankan/fusion/httpClient/response/FdRoomVo.java
  15. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ICaseLiveMapper.java
  16. 17 0
      src/main/java/com/fdkankan/fusion/service/ICaseLiveService.java
  17. 95 0
      src/main/java/com/fdkankan/fusion/service/impl/CaseLiveServiceImpl.java
  18. 43 0
      src/main/java/com/fdkankan/fusion/typehandle/ArrayStringTypeHandler.java
  19. 54 0
      src/main/java/com/fdkankan/fusion/typehandle/JsonArrayTypeHandler.java
  20. 2 2
      src/main/resources/application-test.yaml
  21. 5 0
      src/main/resources/mapper/fusion/CaseLiveMapper.xml

+ 8 - 0
pom.xml

@@ -124,6 +124,14 @@
             <version>1.34.0</version>
         </dependency>
 
+        <!-- 添加图形验证码依赖 -->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-captcha</artifactId>
+            <version>5.8.6</version>
+        </dependency>
+
+
     </dependencies>
 
     <build>

+ 3 - 0
src/main/java/com/fdkankan/fusion/common/ResultCode.java

@@ -24,6 +24,7 @@ public enum ResultCode {
     ROTE_ERROR(4020,"路由解析失败"),
     RAND_ERROR(4021,"访问密码只能是4位字母或数字"),
     RAND_NOT_EXIST(4022,"访问密码为生成"),
+    LOGIN_AUTH_NOT_EXIST(4023,"验证码不正确"),
 
     USER_HAVE_CAMERA(6000,"该用户已绑定相机,请先绑定至其他用户,再修改该用户所属架构。"),
     DEPT_NAME_EXITS(6001,"部门名称已存在"),
@@ -34,6 +35,8 @@ public enum ResultCode {
     DEPT_NOT_EXITS(6006,"部门不存在"),
     PROJECT_EXITS(6007,"火调项目已经存在,无需重复添加"),
     PROJECT_CASE_NOT_EXITS(6007,"火调项目未关联案件"),
+    PROJECT_SCENE_NOT_EXITS(6008,"项目未关联场景"),
+    CASE_NOT_EXITS(6009,"案件不存在"),
 
 
     UPLOAD_ERROR(7001,"文件上传失败"),

+ 1 - 0
src/main/java/com/fdkankan/fusion/common/util/RedisKeyUtil.java

@@ -16,4 +16,5 @@ public class RedisKeyUtil {
     public static String RAND_CODE_KEY = "fusion:project:rand_key:%s";
 
 
+    public static String loginAuthCode = "fusion:login:auth:%s";
 }

+ 1 - 1
src/main/java/com/fdkankan/fusion/config/SaTokenConfigure.java

@@ -44,7 +44,7 @@ public class SaTokenConfigure {
     public SaServletFilter getSaServletFilter() {
         return new SaServletFilter()
                 // 指定 拦截路由 与 放行路由
-                .addInclude("/**").addExclude("/**/test/**","/**/inner/**")
+                .addInclude("/**").addExclude("/**/test/**","/**/inner/**","/**/notAuth/**")
                 // 认证函数: 每次请求执行
                 .setAuth(obj -> {
                     String share = SaHolder.getRequest().getHeader("share");

+ 31 - 0
src/main/java/com/fdkankan/fusion/controller/CaseLiveController.java

@@ -0,0 +1,31 @@
+package com.fdkankan.fusion.controller;
+
+
+import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.entity.CaseEntity;
+import com.fdkankan.fusion.entity.CaseLive;
+import com.fdkankan.fusion.service.ICaseLiveService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-08-10
+ */
+@RestController
+@RequestMapping("/caseLive")
+public class CaseLiveController {
+
+    @Autowired
+    ICaseLiveService caseLiveService;
+
+    @PostMapping("/getTakeLookRoom")
+    public ResultData getTakeLookRoom(@RequestBody CaseLive caseLive){
+        return ResultData.ok(caseLiveService.getByCaseId(caseLive.getCaseId()));
+    }
+}
+

+ 7 - 1
src/main/java/com/fdkankan/fusion/controller/LoginController.java

@@ -2,6 +2,9 @@ package com.fdkankan.fusion.controller;
 
 import cn.dev33.satoken.stp.SaLoginConfig;
 import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.captcha.CaptchaUtil;
+import cn.hutool.captcha.LineCaptcha;
+import com.alibaba.excel.EasyExcel;
 import com.alibaba.fastjson.JSONObject;
 import com.fdkankan.fusion.common.ResultCode;
 import com.fdkankan.fusion.common.ResultData;
@@ -37,9 +40,12 @@ public class LoginController extends BaseController{
 
     @PostMapping("/fdLogin")
     public ResultData fdLogin(@RequestBody FdkkLoginRequest request){
-        if(StringUtils.isBlank(request.getPhoneNum()) || StringUtils.isBlank(request.getPassword())){
+        if(StringUtils.isBlank(request.getPhoneNum()) || StringUtils.isBlank(request.getPassword()) || StringUtils.isBlank(request.getCode())){
             throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
         }
+        if(!redisUtil.hasKey(String.format(RedisKeyUtil.loginAuthCode,request.getCode()))){
+            throw new BusinessException(ResultCode.LOGIN_AUTH_NOT_EXIST);
+        }
         TmUser tmUser = tmUserService.getByUserName(request.getPhoneNum());
         if(tmUser == null){
             throw new BusinessException(ResultCode.PASSWORD_ERROR);

+ 41 - 0
src/main/java/com/fdkankan/fusion/controller/NoLoginController.java

@@ -0,0 +1,41 @@
+package com.fdkankan.fusion.controller;
+
+import cn.hutool.captcha.CaptchaUtil;
+import cn.hutool.captcha.LineCaptcha;
+import com.fdkankan.fusion.common.util.RedisKeyUtil;
+import com.fdkankan.fusion.common.util.StringUtils;
+import com.fdkankan.redis.util.RedisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+
+@RestController
+@RequestMapping("/notAuth")
+@Slf4j
+public class NoLoginController {
+
+    @Autowired
+    RedisUtil redisUtil;
+
+    @GetMapping("/getLoginAuthCode")
+    public void  getLoginCode(HttpServletResponse response){
+        response.setHeader("Cache-Control", "no-store, no-cache");
+        response.setContentType("image/jpeg");
+
+        try {
+            LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100,4,60);
+            String code = lineCaptcha.getCode();
+            redisUtil.set(String.format(RedisKeyUtil.loginAuthCode,code),code,60);
+            lineCaptcha.write(response.getOutputStream());
+            response.getOutputStream().close();
+        } catch (Exception e){
+            log.info("生成登录验证码错误:",e);
+        }
+
+    }
+
+}

+ 57 - 0
src/main/java/com/fdkankan/fusion/entity/CaseLive.java

@@ -0,0 +1,57 @@
+package com.fdkankan.fusion.entity;
+
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fdkankan.fusion.typehandle.JsonArrayTypeHandler;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2023-08-10
+ */
+@Getter
+@Setter
+@TableName(value = "t_case_live",autoResultMap = true)
+public class CaseLive implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("case_id")
+    private Integer caseId;
+
+    @TableField("tm_user_id")
+    private String tmUserId;
+
+    @TableField("take_room_id")
+    private String takeRoomId;
+
+    @TableField(typeHandler = JsonArrayTypeHandler.class)
+    private JSONArray numList;
+
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 1 - 1
src/main/java/com/fdkankan/fusion/generate/AutoGenerate.java

@@ -18,7 +18,7 @@ public class AutoGenerate {
         String path =System.getProperty("user.dir") ;
 
         generate(path,"fusion", getTables(new String[]{
-                "tm_attachment","tm_camera","tm_message","tm_permission","tm_project","tm_role","tm_role_permission","tm_scene","tm_user","tm_user_role"
+                "t_case_live"
         }));
 
 //        generate(path,"goods", getTables(new String[]{

+ 18 - 0
src/main/java/com/fdkankan/fusion/httpClient/FdService.java

@@ -2,12 +2,15 @@ package com.fdkankan.fusion.httpClient;
 
 import cn.dev33.satoken.stp.StpUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.util.DateUtil;
 import com.fdkankan.fusion.common.ResultCode;
 import com.fdkankan.fusion.common.util.RedisKeyUtil;
 import com.fdkankan.fusion.entity.TmCamera;
 import com.fdkankan.fusion.exception.BusinessException;
 import com.fdkankan.fusion.httpClient.client.FdKKClient;
+import com.fdkankan.fusion.httpClient.request.FdRoomAddParam;
 import com.fdkankan.fusion.httpClient.request.FdkkCameraParam;
+import com.fdkankan.fusion.httpClient.response.FdRoomVo;
 import com.fdkankan.fusion.httpClient.response.FdkkLoginVo;
 import com.fdkankan.fusion.httpClient.response.FdkkResponse;
 import com.fdkankan.fusion.response.CameraVo;
@@ -16,6 +19,8 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -75,4 +80,17 @@ public class FdService {
     public Object getFdTokenByNum(String num) {
         return fdKKClient.getFdTokenByNum(num,getFdToken());
     }
+
+    public FdkkResponse<FdRoomAddParam> fdCreateTakeLookRoom(String caseTitle,List<String> numList,String roomId) {
+        FdRoomAddParam param = new FdRoomAddParam();
+        param.setRoomTitle(caseTitle);
+        param.setNumList(numList);
+        param.setRoomId(roomId);
+        param.setMaxMan(30);
+        List<Date> dateList = new ArrayList<>();
+        dateList.add(new Date());
+        dateList.add(DateUtil.string2Date("2099-01-01 00:00:00","yyyy-MM-dd HH:mm:ss"));
+        param.setUseTimeList(dateList);
+        return fdKKClient.roomAddOrUpdate(param,getFdToken());
+    }
 }

+ 7 - 0
src/main/java/com/fdkankan/fusion/httpClient/client/FdKKClient.java

@@ -4,8 +4,10 @@ import com.alibaba.fastjson.JSONObject;
 import com.dtflys.forest.annotation.*;
 import com.fdkankan.fusion.common.PageInfo;
 import com.fdkankan.fusion.httpClient.address.FdkkAddressSource;
+import com.fdkankan.fusion.httpClient.request.FdRoomAddParam;
 import com.fdkankan.fusion.httpClient.request.FdkkCameraParam;
 import com.fdkankan.fusion.httpClient.request.FdkkLoginRequest;
+import com.fdkankan.fusion.httpClient.response.FdRoomVo;
 import com.fdkankan.fusion.httpClient.response.FdkkLoginVo;
 import com.fdkankan.fusion.httpClient.response.FdkkResponse;
 import com.fdkankan.fusion.request.ScenePram;
@@ -99,4 +101,9 @@ public interface FdKKClient {
     @Get("/fd/api/user/scene/getTokenByNum")
     String getFdTokenByNum(@Query("num") String num, @Header("token")  String token);
 
+    /**
+     * 获取相机详情
+     */
+    @Post("/takeLook/roomAddOrUpdate")
+    FdkkResponse<FdRoomAddParam> roomAddOrUpdate(@JSONBody FdRoomAddParam param, @Header("token")  String token);
 }

+ 15 - 0
src/main/java/com/fdkankan/fusion/httpClient/request/FdRoomAddParam.java

@@ -0,0 +1,15 @@
+package com.fdkankan.fusion.httpClient.request;
+
+import com.fdkankan.fusion.httpClient.response.FdRoomVo;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class FdRoomAddParam extends FdRoomVo {
+
+    private List<String> numList;   //场景码列表
+
+
+
+}

+ 2 - 1
src/main/java/com/fdkankan/fusion/httpClient/request/FdkkLoginRequest.java

@@ -5,12 +5,13 @@ import lombok.NoArgsConstructor;
 
 @Data
 @NoArgsConstructor
-public class FdkkLoginRequest {
+public class  FdkkLoginRequest {
     private String phoneNum;
     private String password;
     private String confirmPwd;
     private String msgAuthCode = "2a22bac40f44af4d3b5fdc20ea706fc5";
     private String areaNum ="86";
+    private String code;
 
     public FdkkLoginRequest(String phoneNum) {
         this.phoneNum = phoneNum;

+ 111 - 0
src/main/java/com/fdkankan/fusion/httpClient/response/FdRoomVo.java

@@ -0,0 +1,111 @@
+package com.fdkankan.fusion.httpClient.response;
+
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.fdkankan.fusion.typehandle.JsonArrayTypeHandler;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class FdRoomVo {
+
+    /**
+     * 房间id
+     */
+    private String roomId;
+
+    /**
+     * 房间标题
+     */
+    private String roomTitle;
+
+    /**
+     * 房间简介
+     */
+    private String roomInfo;
+
+    /**
+     * 房间主持人昵称
+     */
+    private String roomHostName;
+
+    /**
+     * 房间主持人用户名
+     */
+    private String roomUserName;
+
+    /**
+     * 房间封面图
+     */
+    private String roomCoverUrl;
+
+    /**
+     * 房间分享二维码
+     */
+    private String roomShareCode;
+    /**
+     * 房间主持人二维码
+     */
+    private String roomHostCode;
+    /**
+     * 房间分享链接
+     */
+    private String roomShareUrl;
+
+    private Integer tbStatus;
+
+    private String createTime;
+
+    private String updateTime;
+    //房间状态 ,0 未开启,1进行中,2已关闭
+    private Integer roomStatus;
+
+    private String lastLookTime;
+
+    //房间状态 ,0 不显示,1显示
+    private Integer isShow;
+
+    //使用开始时间    v1.1.0添加字段
+    private Date useStartTime;
+
+    //使用结束时间    v1.1.0添加字段
+    private Date useEndTime;
+
+    //房间密码  v1.1.0添加字段
+    private String visitPassword;
+
+    //带看锁,0没密码,1有密码  v1.1.0添加字段
+    private Integer takeLookLock;
+
+    //自由漫游锁,0没密码,1有密码  v1.1.0添加字段
+    private Integer freeRoamLock;
+
+    //房间最大人数设置
+    private Integer maxMan;
+    //分享次数
+    //主持人状态,0未进入房间,1已进入房间
+    private Integer hostStatus;
+
+    private String head;
+
+    private String gps;
+
+    @TableField(typeHandler = JsonArrayTypeHandler.class)
+    private JSONArray image;
+
+    @TableField(typeHandler = JsonArrayTypeHandler.class)
+    private JSONArray video;
+
+    @TableField(exist = false)
+    private Integer roomUserId;
+
+    @TableField(exist = false)
+    private Long roomViewCount;
+
+    @TableField(exist = false)
+    private List<Date> useTimeList;
+}

+ 18 - 0
src/main/java/com/fdkankan/fusion/mapper/ICaseLiveMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.fusion.mapper;
+
+import com.fdkankan.fusion.entity.CaseLive;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-08-10
+ */
+@Mapper
+public interface ICaseLiveMapper extends BaseMapper<CaseLive> {
+
+}

+ 17 - 0
src/main/java/com/fdkankan/fusion/service/ICaseLiveService.java

@@ -0,0 +1,17 @@
+package com.fdkankan.fusion.service;
+
+import com.fdkankan.fusion.entity.CaseLive;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-08-10
+ */
+public interface ICaseLiveService extends IService<CaseLive> {
+
+    Object getByCaseId(Integer caseId);
+}

+ 95 - 0
src/main/java/com/fdkankan/fusion/service/impl/CaseLiveServiceImpl.java

@@ -0,0 +1,95 @@
+package com.fdkankan.fusion.service.impl;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import cn.dev33.satoken.stp.StpUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.entity.CaseEntity;
+import com.fdkankan.fusion.entity.CaseLive;
+import com.fdkankan.fusion.entity.CaseNumEntity;
+import com.fdkankan.fusion.exception.BusinessException;
+import com.fdkankan.fusion.httpClient.FdService;
+import com.fdkankan.fusion.httpClient.request.FdRoomAddParam;
+import com.fdkankan.fusion.httpClient.response.FdRoomVo;
+import com.fdkankan.fusion.httpClient.response.FdkkResponse;
+import com.fdkankan.fusion.mapper.ICaseLiveMapper;
+import com.fdkankan.fusion.service.ICaseLiveService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.fusion.service.ICaseNumService;
+import com.fdkankan.fusion.service.ICaseService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.ListUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-08-10
+ */
+@Service
+public class CaseLiveServiceImpl extends ServiceImpl<ICaseLiveMapper, CaseLive> implements ICaseLiveService {
+
+    @Autowired
+    FdService fdService;
+    @Autowired
+    ICaseNumService caseNumService;
+    @Autowired
+    ICaseService caseService;
+
+
+    @Override
+    public Object getByCaseId(Integer caseId) {
+
+        CaseEntity caseEntity = caseService.getById(caseId);
+        if(caseEntity == null ){
+            throw new BusinessException(ResultCode.CASE_NOT_EXITS);
+        }
+        LambdaQueryWrapper<CaseLive> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(CaseLive::getCaseId,caseId);
+        wrapper.eq(CaseLive::getTmUserId, StpUtil.getLoginId());
+        CaseLive caseLive = this.getOne(wrapper);
+        List<CaseNumEntity> caseNumEntities = caseNumService.getByCaseId(caseId);
+        if(caseNumEntities == null || caseNumEntities.size() <=0 ){
+            throw new BusinessException(ResultCode.PROJECT_SCENE_NOT_EXITS);
+        }
+        List<String> numList = caseNumEntities.stream().map(CaseNumEntity::getNum).collect(Collectors.toList());
+        if(caseLive == null){
+            caseLive = new CaseLive();
+            caseLive.setCaseId(caseId);
+            caseLive.setTmUserId((String)StpUtil.getLoginId() );
+        }
+        Boolean flag = this.getCheckCreateRoom(caseLive.getNumList(),numList);
+        if(flag){
+            FdkkResponse<FdRoomAddParam> fdkkResponse = fdService.fdCreateTakeLookRoom(caseEntity.getCaseTitle(),numList,caseLive.getTakeRoomId());
+            if(fdkkResponse.getCode() != 0){
+                throw new BusinessException(fdkkResponse.getCode(),fdkkResponse.getMsg());
+            }
+            caseLive.setTakeRoomId(fdkkResponse.getData().getRoomId());
+            List<String> numList1 = fdkkResponse.getData().getNumList();
+            caseLive.setNumList(JSONArray.parseArray(JSON.toJSONString(numList1)));
+            this.saveOrUpdate(caseLive);
+        }
+        return caseLive.getTakeRoomId();
+    }
+
+    private Boolean getCheckCreateRoom(JSONArray array,List<String> numList) {
+        if(array == null || array.isEmpty() ){
+            return true;
+        }
+        //List<String> list = JSONObject.parseArray(array.toJSONString(), String.class);
+        List<String> lists = array.toJavaList(String.class);
+        return CollectionUtils.isEqualCollection(lists,numList);
+
+    }
+
+}

+ 43 - 0
src/main/java/com/fdkankan/fusion/typehandle/ArrayStringTypeHandler.java

@@ -0,0 +1,43 @@
+package com.fdkankan.fusion.typehandle;
+
+import cn.hutool.json.JSONUtil;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedJdbcTypes;
+import org.apache.ibatis.type.MappedTypes;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ *  存储到数据库, 将String数组转换成字符串;
+ *  从数据库获取数据, 将字符串转为LONG数组.
+ */
+@MappedTypes({String[].class})
+@MappedJdbcTypes({JdbcType.VARCHAR})
+public class ArrayStringTypeHandler extends BaseTypeHandler<String[]> {
+    private static String[] l = new String[]{};
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i,
+                                    String[] parameter, JdbcType jdbcType) throws SQLException {
+        ps.setString(i, JSONUtil.toJsonStr(parameter));
+    }
+    @Override
+    public String[] getNullableResult(ResultSet rs, String columnName)
+            throws SQLException {
+        return JSONUtil.parseArray(rs.getString(columnName)).toArray(l);
+    }
+    @Override
+    public String[] getNullableResult(ResultSet rs, int columnIndex)
+            throws SQLException {
+        return JSONUtil.parseArray(rs.getString(columnIndex)).toArray(l);
+    }
+    @Override
+    public String[] getNullableResult(CallableStatement cs, int columnIndex)
+            throws SQLException {
+        return JSONUtil.parseArray(cs.getString(columnIndex)).toArray(l);
+    }
+}
+

+ 54 - 0
src/main/java/com/fdkankan/fusion/typehandle/JsonArrayTypeHandler.java

@@ -0,0 +1,54 @@
+package com.fdkankan.fusion.typehandle;
+
+import com.alibaba.fastjson.JSONArray;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedJdbcTypes;
+import org.apache.ibatis.type.MappedTypes;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ *  存储到数据库, 将JSON数组对象转换成字符串;
+ *  从数据库获取数据, 将字符串转为JSON数组对象.
+ */
+@MappedTypes({JSONArray.class})
+@MappedJdbcTypes({JdbcType.VARCHAR})
+public class JsonArrayTypeHandler extends BaseTypeHandler<JSONArray> {
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, JSONArray parameter,
+                                    JdbcType jdbcType) throws SQLException {
+        ps.setString(i, JSONArray.toJSONString(parameter));
+    }
+    @Override
+    public JSONArray getNullableResult(ResultSet rs, String columnName)
+            throws SQLException {
+        return parseArray(rs.getString(columnName));
+    }
+    @Override
+    public JSONArray getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        return parseArray(rs.getString(columnIndex));
+    }
+    @Override
+    public JSONArray getNullableResult(CallableStatement cs, int columnIndex)
+            throws SQLException {
+        return parseArray(cs.getString(columnIndex));
+    }
+
+    public static JSONArray parseArray(String content) {
+        if(StringUtils.isBlank(content)){
+            return new JSONArray();
+        }
+        try {
+            return JSONArray.parseArray(content);
+        } catch (Exception e) {
+            return new JSONArray();
+        }
+    }
+
+}
+

+ 2 - 2
src/main/resources/application-test.yaml

@@ -3,8 +3,8 @@ spring:
     type: com.zaxxer.hikari.HikariDataSource          # 数据源类型:HikariCP
     driver-class-name: com.mysql.jdbc.Driver          # mysql驱动
     #120.25.146.52
-    #url: jdbc:mysql://120.25.146.52:13306/fd_fusion?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
-    url: jdbc:mysql://127.0.0.1:13306/fd_fusion?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
+    url: jdbc:mysql://120.25.146.52:13306/fd_fusion?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
+    #url: jdbc:mysql://127.0.0.1:13306/fd_fusion?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
     username: root
     password: JK123456%JIK
     hikari:

+ 5 - 0
src/main/resources/mapper/fusion/CaseLiveMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.fusion.mapper.ICaseLiveMapper">
+
+</mapper>