Ver código fonte

1.完善修改后台

slambb 3 anos atrás
pai
commit
a2f0c53b16
72 arquivos alterados com 2666 adições e 1302 exclusões
  1. 0 3
      src/main/java/com/YuyeTech/TPlat/dto/LevelJumpDTO.java
  2. 16 0
      src/main/java/com/YuyeTech/TPlat/enums/UserDeleteStatus.java
  3. 16 0
      src/main/java/com/YuyeTech/TPlat/enums/UserStatus.java
  4. 5 1
      src/main/java/com/YuyeTech/TPlat/game/TP_AppleInfo/projo/AppleInfo.java
  5. 19 0
      src/main/java/com/YuyeTech/TPlat/game/TP_AppleInfo/repository/AppleInfoServiceRepository.java
  6. 18 0
      src/main/java/com/YuyeTech/TPlat/game/TP_AppleInfo/service/AppleInfoService.java
  7. 9 5
      src/main/java/com/YuyeTech/TPlat/game/TP_AppleInfo/service/AppleInfoServiceImpl.java
  8. 26 0
      src/main/java/com/YuyeTech/TPlat/game/TP_AppleInfo/vo/AppleInfoVo.java
  9. 4 2
      src/main/java/com/YuyeTech/TPlat/game/TP_WxInfo/projo/WxInfo.java
  10. 19 0
      src/main/java/com/YuyeTech/TPlat/game/TP_WxInfo/repository/WxInfoRepository.java
  11. 20 0
      src/main/java/com/YuyeTech/TPlat/game/TP_WxInfo/service/WxInfoService.java
  12. 40 0
      src/main/java/com/YuyeTech/TPlat/game/TP_WxInfo/service/WxInfoServicelmpl.java
  13. 28 0
      src/main/java/com/YuyeTech/TPlat/game/TP_WxInfo/vo/WxInfoVo.java
  14. 6 8
      src/main/java/com/YuyeTech/TPlat/game/bluetoothinfo/controller/BackstageBLEDeviceController.java
  15. 66 35
      src/main/java/com/YuyeTech/TPlat/game/controller/LoginController.java
  16. 1 0
      src/main/java/com/YuyeTech/TPlat/game/controller/RewardController.java
  17. 7 0
      src/main/java/com/YuyeTech/TPlat/game/imageInfo/service/PicturesService.java
  18. 22 0
      src/main/java/com/YuyeTech/TPlat/game/imageInfo/service/PicturesServiceImpl.java
  19. 35 9
      src/main/java/com/YuyeTech/TPlat/game/levelInfo/controller/BackstageLevelController.java
  20. 5 1
      src/main/java/com/YuyeTech/TPlat/game/levelInfo/controller/LevelController.java
  21. 1 1
      src/main/java/com/YuyeTech/TPlat/game/levelInfo/projo/LevelCondition.java
  22. 1 1
      src/main/java/com/YuyeTech/TPlat/game/levelInfo/projo/LevelHonor.java
  23. 5 2
      src/main/java/com/YuyeTech/TPlat/game/levelInfo/projo/LevelJump.java
  24. 2 3
      src/main/java/com/YuyeTech/TPlat/game/levelInfo/repository/LevelConditionRepository.java
  25. 2 3
      src/main/java/com/YuyeTech/TPlat/game/levelInfo/repository/LevelHonorRepository.java
  26. 7 3
      src/main/java/com/YuyeTech/TPlat/game/levelInfo/repository/LevelJumpRepository.java
  27. 1 1
      src/main/java/com/YuyeTech/TPlat/game/levelInfo/service/LevelConditionService.java
  28. 2 15
      src/main/java/com/YuyeTech/TPlat/game/levelInfo/service/LevelConditionServiceImpl.java
  29. 1 5
      src/main/java/com/YuyeTech/TPlat/game/levelInfo/service/LevelHonorService.java
  30. 3 11
      src/main/java/com/YuyeTech/TPlat/game/levelInfo/service/LevelHonorServiceImpl.java
  31. 7 7
      src/main/java/com/YuyeTech/TPlat/game/levelInfo/service/LevelJumpService.java
  32. 12 3
      src/main/java/com/YuyeTech/TPlat/game/levelInfo/service/LevelJumpServiceImpl.java
  33. 43 0
      src/main/java/com/YuyeTech/TPlat/game/levelInfo/vo/LevelJumpSimpleVo.java
  34. 48 0
      src/main/java/com/YuyeTech/TPlat/game/levelInfo/vo/LevelJumpVo.java
  35. 3 3
      src/main/java/com/YuyeTech/TPlat/game/otaInfo/controller/OtaController.java
  36. 1 1
      src/main/java/com/YuyeTech/TPlat/game/otaInfo/projo/OtaInfo.java
  37. 2 2
      src/main/java/com/YuyeTech/TPlat/game/otaInfo/repository/OtaInfoRepository.java
  38. 2 2
      src/main/java/com/YuyeTech/TPlat/game/otaInfo/service/OtaInfoService.java
  39. 4 4
      src/main/java/com/YuyeTech/TPlat/game/otaInfo/service/OtaInfoServiceImpl.java
  40. 52 0
      src/main/java/com/YuyeTech/TPlat/game/userDeleteLog/controller/BackstageUserDeleteLogController.java
  41. 15 0
      src/main/java/com/YuyeTech/TPlat/game/userDeleteLog/controller/UserDeleteLogController.java
  42. 31 0
      src/main/java/com/YuyeTech/TPlat/game/userDeleteLog/pojo/UserDeleteLog.java
  43. 9 0
      src/main/java/com/YuyeTech/TPlat/game/userDeleteLog/repository/UserDeleteLogRepository.java
  44. 9 0
      src/main/java/com/YuyeTech/TPlat/game/userDeleteLog/service/UserDeleteLogService.java
  45. 24 0
      src/main/java/com/YuyeTech/TPlat/game/userDeleteLog/service/UserDeleteLogServiceImpl.java
  46. 27 0
      src/main/java/com/YuyeTech/TPlat/game/userDeleteLog/vo/UserDeleteLogSimpleVo.java
  47. 27 0
      src/main/java/com/YuyeTech/TPlat/game/userDeleteLog/vo/UserDeleteLogVo.java
  48. 102 54
      src/main/java/com/YuyeTech/TPlat/game/userinfo/controller/BackstageUserController.java
  49. 76 76
      src/main/java/com/YuyeTech/TPlat/game/userinfo/controller/ManagerController.java
  50. 60 66
      src/main/java/com/YuyeTech/TPlat/game/userinfo/controller/UserInfoController.java
  51. 4 3
      src/main/java/com/YuyeTech/TPlat/game/userinfo/projo/MainInfo.java
  52. 6 1
      src/main/java/com/YuyeTech/TPlat/game/userinfo/projo/UserInfo.java
  53. 13 0
      src/main/java/com/YuyeTech/TPlat/game/userinfo/service/MainInfoService.java
  54. 199 20
      src/main/java/com/YuyeTech/TPlat/game/userinfo/service/MainInfoServiceImpl.java
  55. 12 5
      src/main/java/com/YuyeTech/TPlat/game/userinfo/service/UserInfoServiceImpl.java
  56. 4 3
      src/main/java/com/YuyeTech/TPlat/game/userinfo/vo/MainInfoVo.java
  57. 3 1
      src/main/java/com/YuyeTech/TPlat/game/userinfo/vo/UserInfoVo.java
  58. 0 16
      src/main/java/com/YuyeTech/TPlat/repository/AppleInfoServiceRepository.java
  59. 0 12
      src/main/java/com/YuyeTech/TPlat/repository/WxInfoRepository.java
  60. 0 15
      src/main/java/com/YuyeTech/TPlat/service/AppleInfoService.java
  61. 0 16
      src/main/java/com/YuyeTech/TPlat/service/WxInfoService.java
  62. 0 32
      src/main/java/com/YuyeTech/TPlat/service/impl/WxInfoServicelmpl.java
  63. 1 1
      src/main/java/com/YuyeTech/TPlat/utils/CodeDOM.java
  64. 30 289
      src/main/resources/static/client/js/bluetoothInfo.js
  65. 588 0
      src/main/resources/static/client/js/levelInfo.js
  66. 80 468
      src/main/resources/static/client/js/userInfo.js
  67. 157 0
      src/main/resources/static/client/js/userInfoLog.js
  68. 27 2
      src/main/resources/static/common/common.js
  69. 19 48
      src/main/resources/templates/client/bluetoothInfo.html
  70. 368 0
      src/main/resources/templates/client/levelInfo.html
  71. 159 43
      src/main/resources/templates/client/userInfo.html
  72. 55 0
      src/main/resources/templates/client/userInfoLog.html

+ 0 - 3
src/main/java/com/YuyeTech/TPlat/dto/LevelJumpDTO.java

@@ -1,10 +1,7 @@
 package com.YuyeTech.TPlat.dto;
 
-import com.YuyeTech.TPlat.dataobject.LevelHonor;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
-import java.util.Date;
 import java.util.List;
 
 /**

+ 16 - 0
src/main/java/com/YuyeTech/TPlat/enums/UserDeleteStatus.java

@@ -0,0 +1,16 @@
+package com.YuyeTech.TPlat.enums;
+
+public enum UserDeleteStatus {
+    /**
+     * 挂起中
+     */
+    PENDING,
+    /**
+     * 已经删除
+     */
+    DELETE,
+    /**
+     * 已经恢复
+     */
+    RESTORE,
+}

+ 16 - 0
src/main/java/com/YuyeTech/TPlat/enums/UserStatus.java

@@ -0,0 +1,16 @@
+package com.YuyeTech.TPlat.enums;
+
+public enum UserStatus {
+    /**
+     * 正常状态
+     */
+    NORMAL,
+    /**
+     * 挂起状态
+     */
+    PENDING,
+    /**
+     * 已经恢复
+     */
+    RESTORE,
+}

+ 5 - 1
src/main/java/com/YuyeTech/TPlat/dataobject/AppleInfo.java → src/main/java/com/YuyeTech/TPlat/game/TP_AppleInfo/projo/AppleInfo.java

@@ -1,9 +1,10 @@
-package com.YuyeTech.TPlat.dataobject;
+package com.YuyeTech.TPlat.game.TP_AppleInfo.projo;
 
 import lombok.Data;
 
 import javax.persistence.Entity;
 import javax.persistence.Id;
+import java.util.Date;
 
 /**
  * @author:slambb
@@ -22,4 +23,7 @@ public class AppleInfo {
      */
     private String appleId;
 
+    private Date createTime;
+
+    private Date updateTime;
 }

+ 19 - 0
src/main/java/com/YuyeTech/TPlat/game/TP_AppleInfo/repository/AppleInfoServiceRepository.java

@@ -0,0 +1,19 @@
+package com.YuyeTech.TPlat.game.TP_AppleInfo.repository;
+
+import com.YuyeTech.TPlat.common.repository.CommonRepository;
+import com.YuyeTech.TPlat.game.TP_AppleInfo.projo.AppleInfo;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.Optional;
+
+/**
+ * @author:slambb
+ * @date:2020/6/4
+ */
+// extends JpaRepository<AppleInfo,String>
+public interface AppleInfoServiceRepository extends CommonRepository<AppleInfo,String> {
+
+    Optional<AppleInfo> findByAppleId(String appleId);
+
+    Optional<AppleInfo> findByUserId(String userId);
+}

+ 18 - 0
src/main/java/com/YuyeTech/TPlat/game/TP_AppleInfo/service/AppleInfoService.java

@@ -0,0 +1,18 @@
+package com.YuyeTech.TPlat.game.TP_AppleInfo.service;
+
+import com.YuyeTech.TPlat.common.service.CommonService;
+import com.YuyeTech.TPlat.game.TP_AppleInfo.projo.AppleInfo;
+import com.YuyeTech.TPlat.game.TP_AppleInfo.vo.AppleInfoVo;
+
+/**
+ * @author:slambb
+ * @date:2020/6/4
+ */
+public interface AppleInfoService extends CommonService<AppleInfoVo, AppleInfo, String> {
+
+    //检查是否存储appleId
+    AppleInfo findByAppleId(String appleId);
+
+    AppleInfo addAppleInfo(AppleInfo appleInfo);
+
+}

+ 9 - 5
src/main/java/com/YuyeTech/TPlat/service/impl/AppleInfoServiceImpl.java → src/main/java/com/YuyeTech/TPlat/game/TP_AppleInfo/service/AppleInfoServiceImpl.java

@@ -1,17 +1,20 @@
-package com.YuyeTech.TPlat.service.impl;
+package com.YuyeTech.TPlat.game.TP_AppleInfo.service;
 
-import com.YuyeTech.TPlat.dataobject.AppleInfo;
-import com.YuyeTech.TPlat.repository.AppleInfoServiceRepository;
-import com.YuyeTech.TPlat.service.AppleInfoService;
+import com.YuyeTech.TPlat.common.service.CommonServiceImpl;
+import com.YuyeTech.TPlat.game.TP_AppleInfo.projo.AppleInfo;
+import com.YuyeTech.TPlat.game.TP_AppleInfo.repository.AppleInfoServiceRepository;
+import com.YuyeTech.TPlat.game.TP_AppleInfo.vo.AppleInfoVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * @author:slambb
  * @date:2020/6/4
  */
 @Service
-public class AppleInfoServiceImpl implements AppleInfoService {
+@Transactional
+public class AppleInfoServiceImpl extends CommonServiceImpl<AppleInfoVo, AppleInfo, String> implements AppleInfoService {
 
     @Autowired
     private AppleInfoServiceRepository appleInfoServiceRepository;
@@ -25,4 +28,5 @@ public class AppleInfoServiceImpl implements AppleInfoService {
     public AppleInfo addAppleInfo(AppleInfo appleInfo) {
         return appleInfoServiceRepository.save(appleInfo);
     }
+
 }

+ 26 - 0
src/main/java/com/YuyeTech/TPlat/game/TP_AppleInfo/vo/AppleInfoVo.java

@@ -0,0 +1,26 @@
+package com.YuyeTech.TPlat.game.TP_AppleInfo.vo;
+
+import com.YuyeTech.TPlat.common.pojo.PageCondition;
+import lombok.Data;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author:slambb
+ * @date:2022/08/09
+ */
+@Data
+public class AppleInfoVo extends PageCondition implements Serializable {
+    private String userId;
+    /**
+     * 苹果用户的userID
+     */
+    private String appleId;
+
+    private Date createTime;
+
+    private Date updateTime;
+}

+ 4 - 2
src/main/java/com/YuyeTech/TPlat/dataobject/WxInfo.java → src/main/java/com/YuyeTech/TPlat/game/TP_WxInfo/projo/WxInfo.java

@@ -1,9 +1,10 @@
-package com.YuyeTech.TPlat.dataobject;
+package com.YuyeTech.TPlat.game.TP_WxInfo.projo;
 
 import lombok.Data;
 
 import javax.persistence.Entity;
 import javax.persistence.Id;
+import java.util.Date;
 
 /**
  * @author:slambb
@@ -20,7 +21,8 @@ public class WxInfo {
 
     private String unionid;
 
+    private Date createTime;
 
-
+    private Date updateTime;
 
 }

+ 19 - 0
src/main/java/com/YuyeTech/TPlat/game/TP_WxInfo/repository/WxInfoRepository.java

@@ -0,0 +1,19 @@
+package com.YuyeTech.TPlat.game.TP_WxInfo.repository;
+
+import com.YuyeTech.TPlat.common.repository.CommonRepository;
+import com.YuyeTech.TPlat.game.TP_WxInfo.projo.WxInfo;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.Optional;
+
+/**
+ * @author:slambb
+ * @date:2019/12/13
+ */
+//  extends JpaRepository<WxInfo,String>
+public interface WxInfoRepository extends CommonRepository<WxInfo,String> {
+
+   Optional<WxInfo>  findByOpenid(String openid);
+
+   Optional<WxInfo>  findByUnionid(String unionid);
+}

+ 20 - 0
src/main/java/com/YuyeTech/TPlat/game/TP_WxInfo/service/WxInfoService.java

@@ -0,0 +1,20 @@
+package com.YuyeTech.TPlat.game.TP_WxInfo.service;
+
+import com.YuyeTech.TPlat.common.service.CommonService;
+import com.YuyeTech.TPlat.game.TP_WxInfo.projo.WxInfo;
+import com.YuyeTech.TPlat.game.TP_WxInfo.vo.WxInfoVo;
+
+/**
+ * @author:slambb
+ * @date:2019/12/13
+ */
+public interface WxInfoService extends CommonService<WxInfoVo, WxInfo, String> {
+
+    WxInfo findWxInfoByOpenid(String openid);
+
+    WxInfo findWxInfoByUnionid(String unionid);
+
+    WxInfo addWxInfo(WxInfo wxInfo);
+
+    WxInfo findWxInfoById(String userId);
+}

+ 40 - 0
src/main/java/com/YuyeTech/TPlat/game/TP_WxInfo/service/WxInfoServicelmpl.java

@@ -0,0 +1,40 @@
+package com.YuyeTech.TPlat.game.TP_WxInfo.service;
+
+import com.YuyeTech.TPlat.common.service.CommonServiceImpl;
+import com.YuyeTech.TPlat.game.TP_WxInfo.projo.WxInfo;
+import com.YuyeTech.TPlat.game.TP_WxInfo.repository.WxInfoRepository;
+import com.YuyeTech.TPlat.game.TP_WxInfo.vo.WxInfoVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @author:slambb
+ * @date:2019/12/13
+ */
+@Service
+@Transactional
+public class WxInfoServicelmpl extends CommonServiceImpl<WxInfoVo, WxInfo, String> implements WxInfoService {
+    @Autowired
+    private WxInfoRepository wxInfoRepository;
+
+    @Override
+    public WxInfo findWxInfoByOpenid(String openid) {
+        return wxInfoRepository.findByOpenid(openid).orElse(null);
+    }
+
+    @Override
+    public WxInfo findWxInfoByUnionid(String unionid) {
+        return wxInfoRepository.findByUnionid(unionid).orElse(null);
+    }
+
+    @Override
+    public WxInfo addWxInfo(WxInfo wxInfo) {
+        return wxInfoRepository.save(wxInfo);
+    }
+
+    @Override
+    public WxInfo findWxInfoById(String userId) {
+        return wxInfoRepository.findById(userId).orElse(null);
+    }
+}

+ 28 - 0
src/main/java/com/YuyeTech/TPlat/game/TP_WxInfo/vo/WxInfoVo.java

@@ -0,0 +1,28 @@
+package com.YuyeTech.TPlat.game.TP_WxInfo.vo;
+
+import com.YuyeTech.TPlat.common.pojo.PageCondition;
+import lombok.Data;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author:slambb
+ * @date:2022/08/09
+ */
+@Data
+public class WxInfoVo extends PageCondition implements Serializable {
+
+    private String userId;
+
+    private String openid;
+
+    private String unionid;
+
+    private Date createTime;
+
+    private Date updateTime;
+
+}

+ 6 - 8
src/main/java/com/YuyeTech/TPlat/game/bluetoothinfo/controller/BackstageBLEDeviceController.java

@@ -47,7 +47,7 @@ public class BackstageBLEDeviceController {
      * @return
      */
     @GetMapping("gotoView")
-    public ModelAndView excelWorkPro() {
+    public ModelAndView gotoView() {
         ModelAndView modelAndView = new ModelAndView("client/bluetoothInfo");
         modelAndView.addObject("defaultMac", "C5:5C:19:04:00:00");
         modelAndView.addObject("defaultName", "BGBOX_202012");
@@ -77,14 +77,13 @@ public class BackstageBLEDeviceController {
     @Decrypt
     @Encrypt
     public Result save(BluetoothInfoVo vo) {
-        //默认未绑定状态
-        vo.setBluetoothStatus(0);
-        //如果没有设备标识,记录一个时间戳(时间戳为标识。用于区分是否统一生成)
-        if(!StringUtils.hasText(vo.getIdentifier()) ){
+        //没有传入id。则判断是新增
+        if(vo.getBluetoothId() == null){
+            //默认未绑定状态
+            vo.setBluetoothStatus(0);
             String identifier = System.currentTimeMillis() + "";
             vo.setIdentifier(identifier);
         }
-
         BluetoothInfoVo resultVo = bluetoothInfoService.saveAndCache(vo);
         //bluetoothInfoService.updateListToCache();
         return Result.of(resultVo);
@@ -119,9 +118,8 @@ public class BackstageBLEDeviceController {
         if(vo == null){
             return  Result.of(null,false,"不存在蓝牙数据!");
         }
-        vo.setIsShare(0);
         vo.setBluetoothStatus(0);
-        vo.setUserId(null);
+        vo.setUserId("");
         bluetoothInfoService.save(vo);
         bluetoothInfoService.updateListToCache();
         return Result.of(vo.getBluetoothId());

+ 66 - 35
src/main/java/com/YuyeTech/TPlat/game/controller/LoginController.java

@@ -3,9 +3,14 @@ package com.YuyeTech.TPlat.game.controller;
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
+import cn.hutool.core.date.DateUtil;
 import com.YuyeTech.TPlat.dataobject.*;
-import com.YuyeTech.TPlat.enums.RedisType;
+import com.YuyeTech.TPlat.enums.*;
 import com.YuyeTech.TPlat.form.ClientForm;
+import com.YuyeTech.TPlat.game.TP_AppleInfo.projo.AppleInfo;
+import com.YuyeTech.TPlat.game.TP_AppleInfo.service.AppleInfoService;
+import com.YuyeTech.TPlat.game.TP_WxInfo.projo.WxInfo;
+import com.YuyeTech.TPlat.game.TP_WxInfo.service.WxInfoService;
 import com.YuyeTech.TPlat.game.userinfo.projo.MainInfo;
 import com.YuyeTech.TPlat.game.userinfo.projo.UserInfo;
 import com.YuyeTech.TPlat.game.userinfo.service.MainInfoService;
@@ -19,9 +24,6 @@ import com.YuyeTech.TPlat.VO.UserInfoVO;
 import com.YuyeTech.TPlat.config.WxMaConfiguration;
 import com.YuyeTech.TPlat.constant.CookieConstant;
 import com.YuyeTech.TPlat.constant.RedisConstant;
-import com.YuyeTech.TPlat.enums.ResultEnum;
-import com.YuyeTech.TPlat.enums.UserEnum;
-import com.YuyeTech.TPlat.enums.WxInfoEnum;
 import com.YuyeTech.TPlat.exception.UserException;
 import com.YuyeTech.TPlat.exception.WxInfoException;
 
@@ -101,25 +103,25 @@ public class LoginController {
 
 
 
-    @GetMapping("/getSessionToken")
-    public ResultVO getSessionToken(@RequestParam("code") String code) {
-
-        log.info("进入getSessionToken 方法。");
-        log.info("code={}", code);
-
-        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx463e58507db8f1ef&secret=ba04f48301d083e961d6f84cc696aeb2&code=" + code + "&grant_type=authorization_code";
-
-        RestTemplate restTemplate = new RestTemplate();
-        String response = restTemplate.getForObject(url, String.class);
-        log.info("response={}", response);
-        ResultVO resultVO = new ResultVO();
-        resultVO.setCode(0);
-        resultVO.setMsg("成功");
-        resultVO.setData(response);
-
-        return resultVO;
-
-    }
+//    @GetMapping("/getSessionToken")
+//    public ResultVO getSessionToken(@RequestParam("code") String code) {
+//
+//        log.info("进入getSessionToken 方法。");
+//        log.info("code={}", code);
+//
+//        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx463e58507db8f1ef&secret=ba04f48301d083e961d6f84cc696aeb2&code=" + code + "&grant_type=authorization_code";
+//
+//        RestTemplate restTemplate = new RestTemplate();
+//        String response = restTemplate.getForObject(url, String.class);
+//        log.info("response={}", response);
+//        ResultVO resultVO = new ResultVO();
+//        resultVO.setCode(0);
+//        resultVO.setMsg("成功");
+//        resultVO.setData(response);
+//
+//        return resultVO;
+//
+//    }
 
     /**
      * android 端登录,微信登录
@@ -192,18 +194,29 @@ public class LoginController {
 
     }
 
+    /**
+     * 统一创建mainInfo
+     * @return
+     */
     //调用创建一个mainInfo
-    public MainInfo createMainInfo() {
+    MainInfo createMainInfo() {
         String _id = KeyUtil.genUniqueKey();
         MainInfo mainInfo = new MainInfo();
         mainInfo.setUserId(_id);
         mainInfo.setUsername("u_" + _id);
         mainInfo.setPassword("p_" + _id);
+        mainInfo.setStatus(UserStatus.NORMAL.ordinal());
+        mainInfo.setCreateTime(DateUtil.date());
+        mainInfo.setUpdateTime(DateUtil.date());
         return mainInfo;
     }
 
-    //查看是否存在 UserInfo里面;
-    public Boolean bUserInfoByUserId(String userId) {
+    /**
+     * 查询是否存在userInfo对应用户数据,如果存在。则判断为新用户
+     * @param userId
+     * @return
+     */
+    Boolean bUserInfoByUserId(String userId) {
         UserInfo saveUserInfo = userInfoService.findUserInfoById(userId, true);
         Boolean bNewUser = saveUserInfo == null ? true : false;
         return bNewUser;
@@ -327,6 +340,7 @@ public class LoginController {
             saveUserInfo.setWeight(0.0);
             saveUserInfo.setRegisterTime(new Date());
             saveUserInfo.setStatus(1);//1为新注册
+            saveUserInfo.setUpdateTime(DateUtil.date());
             userInfoService.addUserInfo(saveUserInfo);
         }
 
@@ -340,11 +354,12 @@ public class LoginController {
 
     /**
      * 获取验证码
-     *
+     * deprecated since version 2.4.10
      * @param phoneNumber
      * @return
      */
     @GetMapping("/getCode")
+    @Deprecated
     public ResultVO getCode(@RequestParam(value = "phoneNumber") String phoneNumber) {
         Integer expire = RedisConstant.CODE_EXPIRE;//过期时间
         String code = String.valueOf((int) ((Math.random() * 9 + 1) * 1000));
@@ -478,8 +493,7 @@ public class LoginController {
     }
 
     /**
-     * 验证码绑定号码或者邮箱
-     *
+     * 通过验证码,绑定用户手机号码或者邮箱。
      * @param account
      * @param code
      * @return
@@ -538,7 +552,11 @@ public class LoginController {
 
     }
 
-
+    /**
+     * 解绑用户手机号
+     * @param userId
+     * @return
+     */
     @GetMapping("/delete_phone")
     public ResultVO userDeletePhoneNumber(@RequestParam("userId") String userId) {
         try {
@@ -557,7 +575,13 @@ public class LoginController {
 
     }
 
-
+    /**
+     * 绑定微信信息
+     * @param openid
+     * @param unionid
+     * @param userId
+     * @return
+     */
     @GetMapping("/bind_wx_info")
     public ResultVO userBindWXInfo(@RequestParam("openid") String openid,
                                    @RequestParam("unionid") String unionid,
@@ -647,6 +671,14 @@ public class LoginController {
 
     }
 
+    /**
+     * 根据不同类型账号注册登录
+     * 手机或者邮箱
+     * @param account
+     * @param code
+     * @param type
+     * @return
+     */
     @GetMapping("/SMS_login_from_type")
     public ResultVO userRegistrationAndSMSLogin(String account, String code, Integer type) {
         String codeValue = redisSettingMap.getValue(RedisType.SMS,account);
@@ -753,7 +785,7 @@ public class LoginController {
     }
 
     /**
-     * 密码登录
+     * 根据手机号或者邮箱进行密码登录
      *
      * @param account
      * @param password
@@ -797,9 +829,8 @@ public class LoginController {
     }
 
     /**
-     * 用来验证一下信息
-     *
-     * @return
+     * 登录时候,用来验证一下信息。
+     * @return 返回一个bool判断是否是新用户
      */
     @GetMapping("/Verification_Info")
     public ResultVO VerificationInfo(@RequestParam(value = "token", required = false) String token,

+ 1 - 0
src/main/java/com/YuyeTech/TPlat/game/controller/RewardController.java

@@ -2,6 +2,7 @@ package com.YuyeTech.TPlat.game.controller;
 
 import com.YuyeTech.TPlat.VO.ResultVO;
 import com.YuyeTech.TPlat.dto.LevelHonorDTO;
+import com.YuyeTech.TPlat.game.levelInfo.service.LevelHonorService;
 import com.YuyeTech.TPlat.service.*;
 import com.YuyeTech.TPlat.utils.ResultVOUtil;
 import lombok.extern.slf4j.Slf4j;

+ 7 - 0
src/main/java/com/YuyeTech/TPlat/game/imageInfo/service/PicturesService.java

@@ -68,6 +68,13 @@ public interface PicturesService  extends CommonService<PicturesVo, Pictures, In
      */
     List<Pictures> findByPictureTypeAndAssociatedId(Integer pictureType,String associatedId);
 
+    /**
+     * 删除头像关联数据
+     * @param associatedId
+     * @return
+     */
+    Pictures deleteAvatar(String associatedId);
+
     /**
      * 根据id列表获取数据信息
      * @param pictureIds

+ 22 - 0
src/main/java/com/YuyeTech/TPlat/game/imageInfo/service/PicturesServiceImpl.java

@@ -184,6 +184,28 @@ public class PicturesServiceImpl extends CommonServiceImpl<PicturesVo, Pictures,
         return picturesRepository.findByPictureTypeAndAssociatedId(pictureType, associatedId);
     }
 
+    @Override
+    public Pictures deleteAvatar(String associatedId) {
+        PicturesVo pictureIcon = new PicturesVo();
+        //存在头像,则删除
+        List<Pictures> avatarList =  picturesRepository.findByPictureTypeAndAssociatedId(PictureType.USER_AVATAR.ordinal(), associatedId);
+        if (avatarList.size() > 1) {
+            throw new RuntimeException("avatar图片数量异常!");
+        }
+        //如果图片库存在游戏的icon
+        if (avatarList.size() != 0) {
+            //删除图片库信息,删除oss信息
+            Pictures picture = avatarList.get(0);
+            pictureIcon = CopyUtil.copy(picture, PicturesVo.class);
+            super.delete(pictureIcon.getPictureId());
+            if (aliyunOSSUtil.deleteBlog(picture.getPictureUrl())) {
+                //替换图片信息
+               log.info("删除头像成功:"+associatedId);
+            }
+            return picture;
+        }
+        return null;
+    }
 
     @Override
     public List<Pictures> findByPictureIdIn(List<Integer> pictureIds) {

+ 35 - 9
src/main/java/com/YuyeTech/TPlat/game/controller/BackstageLevelController.java → src/main/java/com/YuyeTech/TPlat/game/levelInfo/controller/BackstageLevelController.java

@@ -1,14 +1,18 @@
-package com.YuyeTech.TPlat.game.controller;
+package com.YuyeTech.TPlat.game.levelInfo.controller;
 
-import com.YuyeTech.TPlat.dataobject.*;
-import com.YuyeTech.TPlat.service.*;
+import com.YuyeTech.TPlat.annotation.Decrypt;
+import com.YuyeTech.TPlat.annotation.Encrypt;
+import com.YuyeTech.TPlat.common.pojo.PageInfo;
+import com.YuyeTech.TPlat.common.pojo.Result;
+import com.YuyeTech.TPlat.game.levelInfo.projo.LevelCondition;
+import com.YuyeTech.TPlat.game.levelInfo.projo.LevelHonor;
+import com.YuyeTech.TPlat.game.levelInfo.projo.LevelJump;
+import com.YuyeTech.TPlat.game.levelInfo.service.LevelJumpService;
+import com.YuyeTech.TPlat.game.levelInfo.vo.LevelJumpVo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.ModelAndView;
 
 import javax.servlet.http.HttpServletRequest;
@@ -29,13 +33,35 @@ public class BackstageLevelController {
     private LevelJumpService levelJumpService;
 
 
-
-
     @Value("${RSA.friendId.publicKey}")
     private String friendIdPublicKey;
     @Value("${RSA.friendId.privateKey}")
     private String friendIdPrivateKey;
 
+    /**
+     * 前端view跳转,配置菜单路径
+     * @return
+     */
+    @GetMapping("gotoView")
+    public ModelAndView gotoView() {
+        ModelAndView modelAndView = new ModelAndView("client/levelInfo");
+        return modelAndView;
+    }
+
+    /**
+     * 分页查询
+     * @param vo
+     * @return
+     */
+    @PostMapping("findAll")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<LevelJumpVo>> findAll(LevelJumpVo vo) {
+        return levelJumpService.page(vo);
+    }
+
+
+
     /**
      * 获取levelJump关卡列表
      *

+ 5 - 1
src/main/java/com/YuyeTech/TPlat/game/controller/LevelController.java → src/main/java/com/YuyeTech/TPlat/game/levelInfo/controller/LevelController.java

@@ -1,4 +1,4 @@
-package com.YuyeTech.TPlat.game.controller;
+package com.YuyeTech.TPlat.game.levelInfo.controller;
 
 import com.YuyeTech.TPlat.VO.ResultVO;
 import com.YuyeTech.TPlat.dataobject.*;
@@ -6,6 +6,10 @@ import com.YuyeTech.TPlat.dto.LevelConditionDTO;
 import com.YuyeTech.TPlat.dto.LevelHonorDTO;
 import com.YuyeTech.TPlat.enums.ResultEnum;
 import com.YuyeTech.TPlat.exception.UserException;
+import com.YuyeTech.TPlat.game.levelInfo.projo.LevelJump;
+import com.YuyeTech.TPlat.game.levelInfo.service.LevelConditionService;
+import com.YuyeTech.TPlat.game.levelInfo.service.LevelHonorService;
+import com.YuyeTech.TPlat.game.levelInfo.service.LevelJumpService;
 import com.YuyeTech.TPlat.service.*;
 import com.YuyeTech.TPlat.utils.RSAUtils;
 import com.YuyeTech.TPlat.utils.ResultVOUtil;

+ 1 - 1
src/main/java/com/YuyeTech/TPlat/dataobject/LevelCondition.java → src/main/java/com/YuyeTech/TPlat/game/levelInfo/projo/LevelCondition.java

@@ -1,4 +1,4 @@
-package com.YuyeTech.TPlat.dataobject;
+package com.YuyeTech.TPlat.game.levelInfo.projo;
 
 import lombok.Data;
 import org.hibernate.annotations.DynamicUpdate;

+ 1 - 1
src/main/java/com/YuyeTech/TPlat/dataobject/LevelHonor.java → src/main/java/com/YuyeTech/TPlat/game/levelInfo/projo/LevelHonor.java

@@ -1,4 +1,4 @@
-package com.YuyeTech.TPlat.dataobject;
+package com.YuyeTech.TPlat.game.levelInfo.projo;
 
 import lombok.Data;
 import org.hibernate.annotations.DynamicUpdate;

+ 5 - 2
src/main/java/com/YuyeTech/TPlat/dataobject/LevelJump.java → src/main/java/com/YuyeTech/TPlat/game/levelInfo/projo/LevelJump.java

@@ -1,4 +1,4 @@
-package com.YuyeTech.TPlat.dataobject;
+package com.YuyeTech.TPlat.game.levelInfo.projo;
 
 import lombok.Data;
 import org.hibernate.annotations.DynamicUpdate;
@@ -15,7 +15,7 @@ import java.util.Date;
  */
 @Data
 @Entity
-@DynamicUpdate
+//@DynamicUpdate
 public class LevelJump {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -44,4 +44,7 @@ public class LevelJump {
      * 关卡类型,1代表 跳,2代表拳击
      */
     private Integer type;
+
+    private Date createTime;
+    private Date updateTime;
 }

+ 2 - 3
src/main/java/com/YuyeTech/TPlat/repository/LevelConditionRepository.java → src/main/java/com/YuyeTech/TPlat/game/levelInfo/repository/LevelConditionRepository.java

@@ -1,7 +1,6 @@
-package com.YuyeTech.TPlat.repository;
+package com.YuyeTech.TPlat.game.levelInfo.repository;
 
-import com.YuyeTech.TPlat.dataobject.LevelCondition;
-import com.YuyeTech.TPlat.dataobject.LevelHonor;
+import com.YuyeTech.TPlat.game.levelInfo.projo.LevelCondition;
 import com.YuyeTech.TPlat.dto.LevelConditionDTO;
 import org.springframework.data.jpa.repository.JpaRepository;
 

+ 2 - 3
src/main/java/com/YuyeTech/TPlat/repository/LevelHonorRepository.java → src/main/java/com/YuyeTech/TPlat/game/levelInfo/repository/LevelHonorRepository.java

@@ -1,7 +1,6 @@
-package com.YuyeTech.TPlat.repository;
+package com.YuyeTech.TPlat.game.levelInfo.repository;
 
-import com.YuyeTech.TPlat.dataobject.LevelHonor;
-import com.YuyeTech.TPlat.dataobject.LevelJump;
+import com.YuyeTech.TPlat.game.levelInfo.projo.LevelHonor;
 import com.YuyeTech.TPlat.dto.LevelHonorDTO;
 import org.springframework.data.jpa.repository.JpaRepository;
 

+ 7 - 3
src/main/java/com/YuyeTech/TPlat/repository/LevelJumpRepository.java → src/main/java/com/YuyeTech/TPlat/game/levelInfo/repository/LevelJumpRepository.java

@@ -1,8 +1,10 @@
-package com.YuyeTech.TPlat.repository;
+package com.YuyeTech.TPlat.game.levelInfo.repository;
 
-import com.YuyeTech.TPlat.dataobject.LevelJump;
+import com.YuyeTech.TPlat.common.repository.CommonRepository;
+import com.YuyeTech.TPlat.game.levelInfo.projo.LevelJump;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
 
 import java.util.List;
 
@@ -10,7 +12,9 @@ import java.util.List;
  * @author:slambb
  * @date:2020/8/4
  */
-public interface LevelJumpRepository extends JpaRepository<LevelJump, Integer> {
+//extends JpaRepository<LevelJump, Integer>
+@Repository
+public interface LevelJumpRepository extends CommonRepository<LevelJump,Integer> {
 //    /**
 //     * In查询,根据参数列表顺序返回对象顺序
 //     * @param fcIdList

+ 1 - 1
src/main/java/com/YuyeTech/TPlat/service/LevelConditionService.java → src/main/java/com/YuyeTech/TPlat/game/levelInfo/service/LevelConditionService.java

@@ -1,4 +1,4 @@
-package com.YuyeTech.TPlat.service;
+package com.YuyeTech.TPlat.game.levelInfo.service;
 
 import com.YuyeTech.TPlat.dto.LevelConditionDTO;
 import java.util.List;

+ 2 - 15
src/main/java/com/YuyeTech/TPlat/service/impl/LevelConditionServiceImpl.java → src/main/java/com/YuyeTech/TPlat/game/levelInfo/service/LevelConditionServiceImpl.java

@@ -1,24 +1,11 @@
-package com.YuyeTech.TPlat.service.impl;
+package com.YuyeTech.TPlat.game.levelInfo.service;
 
-import com.YuyeTech.TPlat.dataobject.LevelCondition;
-import com.YuyeTech.TPlat.dataobject.LevelJump;
-import com.YuyeTech.TPlat.dataobject.UserLevel;
 import com.YuyeTech.TPlat.dto.LevelConditionDTO;
-import com.YuyeTech.TPlat.dto.LevelJumpDTO;
-import com.YuyeTech.TPlat.repository.LevelConditionRepository;
-import com.YuyeTech.TPlat.repository.LevelHonorRepository;
-import com.YuyeTech.TPlat.repository.LevelJumpRepository;
-import com.YuyeTech.TPlat.repository.UserLevelRepository;
-import com.YuyeTech.TPlat.service.LevelConditionService;
-import com.YuyeTech.TPlat.service.LevelJumpService;
+import com.YuyeTech.TPlat.game.levelInfo.repository.LevelConditionRepository;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 

+ 1 - 5
src/main/java/com/YuyeTech/TPlat/service/LevelHonorService.java → src/main/java/com/YuyeTech/TPlat/game/levelInfo/service/LevelHonorService.java

@@ -1,11 +1,7 @@
-package com.YuyeTech.TPlat.service;
+package com.YuyeTech.TPlat.game.levelInfo.service;
 
-import com.YuyeTech.TPlat.dataobject.LevelHonor;
-import com.YuyeTech.TPlat.dto.LevelConditionDTO;
 import com.YuyeTech.TPlat.dto.LevelHonorDTO;
 
-import java.util.List;
-
 /**
  * @author:slambb
  * @date:2021/8/7

+ 3 - 11
src/main/java/com/YuyeTech/TPlat/service/impl/LevelHonorServiceImpl.java → src/main/java/com/YuyeTech/TPlat/game/levelInfo/service/LevelHonorServiceImpl.java

@@ -1,20 +1,12 @@
-package com.YuyeTech.TPlat.service.impl;
+package com.YuyeTech.TPlat.game.levelInfo.service;
 
-import com.YuyeTech.TPlat.dataobject.LevelHonor;
-import com.YuyeTech.TPlat.dto.LevelConditionDTO;
 import com.YuyeTech.TPlat.dto.LevelHonorDTO;
-import com.YuyeTech.TPlat.repository.LevelConditionRepository;
-import com.YuyeTech.TPlat.repository.LevelHonorRepository;
-import com.YuyeTech.TPlat.service.LevelConditionService;
-import com.YuyeTech.TPlat.service.LevelHonorService;
+import com.YuyeTech.TPlat.game.levelInfo.repository.LevelHonorRepository;
+import com.YuyeTech.TPlat.game.levelInfo.service.LevelHonorService;
 import com.YuyeTech.TPlat.utils.AliyunOSSUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-
 
 /**
  * @author:slambb

+ 7 - 7
src/main/java/com/YuyeTech/TPlat/service/LevelJumpService.java → src/main/java/com/YuyeTech/TPlat/game/levelInfo/service/LevelJumpService.java

@@ -1,11 +1,11 @@
-package com.YuyeTech.TPlat.service;
+package com.YuyeTech.TPlat.game.levelInfo.service;
 
-import com.YuyeTech.TPlat.dataobject.LevelCondition;
-import com.YuyeTech.TPlat.dataobject.LevelHonor;
-import com.YuyeTech.TPlat.dataobject.LevelJump;
-import com.YuyeTech.TPlat.dto.LevelConditionDTO;
-import com.YuyeTech.TPlat.dto.LevelHonorDTO;
+import com.YuyeTech.TPlat.common.service.CommonService;
+import com.YuyeTech.TPlat.game.levelInfo.projo.LevelCondition;
+import com.YuyeTech.TPlat.game.levelInfo.projo.LevelHonor;
+import com.YuyeTech.TPlat.game.levelInfo.projo.LevelJump;
 import com.YuyeTech.TPlat.dto.LevelJumpDTO;
+import com.YuyeTech.TPlat.game.levelInfo.vo.LevelJumpVo;
 import org.springframework.data.domain.Sort;
 
 import java.util.List;
@@ -15,7 +15,7 @@ import java.util.Map;
  * @author:slambb
  * @date:2021/8/4
  */
-public interface LevelJumpService {
+public interface LevelJumpService extends CommonService<LevelJumpVo, LevelJump, Integer> {
 
     List<LevelJump> findLevelJumpsByNumberTypeAndType(Integer numberType, Integer type, Sort.Direction direction);
 

+ 12 - 3
src/main/java/com/YuyeTech/TPlat/service/impl/LevelJumpServiceImpl.java → src/main/java/com/YuyeTech/TPlat/game/levelInfo/service/LevelJumpServiceImpl.java

@@ -1,12 +1,20 @@
-package com.YuyeTech.TPlat.service.impl;
+package com.YuyeTech.TPlat.game.levelInfo.service;
 
+import com.YuyeTech.TPlat.common.service.CommonServiceImpl;
 import com.YuyeTech.TPlat.dataobject.*;
 import com.YuyeTech.TPlat.dto.LevelJumpDTO;
+import com.YuyeTech.TPlat.game.levelInfo.projo.LevelCondition;
+import com.YuyeTech.TPlat.game.levelInfo.projo.LevelHonor;
+import com.YuyeTech.TPlat.game.levelInfo.projo.LevelJump;
+import com.YuyeTech.TPlat.game.levelInfo.repository.LevelConditionRepository;
+import com.YuyeTech.TPlat.game.levelInfo.repository.LevelHonorRepository;
+import com.YuyeTech.TPlat.game.levelInfo.repository.LevelJumpRepository;
+import com.YuyeTech.TPlat.game.levelInfo.vo.LevelJumpVo;
 import com.YuyeTech.TPlat.repository.*;
-import com.YuyeTech.TPlat.service.LevelJumpService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 import java.util.regex.Pattern;
@@ -18,7 +26,8 @@ import java.util.stream.Collectors;
  * @date:2021/8/4
  */
 @Service
-public class LevelJumpServiceImpl implements LevelJumpService {
+@Transactional
+public class LevelJumpServiceImpl extends CommonServiceImpl<LevelJumpVo, LevelJump, Integer> implements LevelJumpService {
 
     @Autowired
     private LevelJumpRepository levelJumpRepository;

+ 43 - 0
src/main/java/com/YuyeTech/TPlat/game/levelInfo/vo/LevelJumpSimpleVo.java

@@ -0,0 +1,43 @@
+package com.YuyeTech.TPlat.game.levelInfo.vo;
+
+import com.YuyeTech.TPlat.common.pojo.PageCondition;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author:slambb
+ * @date:2022/8/11
+ */
+@Data
+public class LevelJumpSimpleVo implements Serializable {
+    private Integer id;
+    private String name;//关卡名字
+    private String describe;//关卡描述
+    private Integer rewardGold;//奖励金币
+    private Integer rewardDiamond;//奖励钻石
+    private Integer rewardHonor;//过关荣誉
+    private Integer consumeGold;//消耗金币
+    private Integer consumeDiamond;//消耗钻石
+    private Integer signCount;//标志块的总数
+    private String signType;//标志块的种类
+    private Integer limitTime;//限时(秒),0-不限时
+    /** 解锁条件类型. */
+    private String conditionUnlock;
+    /** 通过关卡时候的类型. */
+    private Integer conditionPassed;
+    /** 补充说明 */
+    private String explain;
+    /** 人数类型 1单人 2pk*/
+    private Integer numberType;
+    /** 顺序设计,和number type 一起使用。用于游戏排序 */
+    private Integer sort;
+    /**
+     * 关卡类型,1代表 跳,2代表拳击
+     */
+    private Integer type;
+
+    private Date createTime;
+    private Date updateTime;
+}

+ 48 - 0
src/main/java/com/YuyeTech/TPlat/game/levelInfo/vo/LevelJumpVo.java

@@ -0,0 +1,48 @@
+package com.YuyeTech.TPlat.game.levelInfo.vo;
+
+import com.YuyeTech.TPlat.common.pojo.PageCondition;
+import lombok.Data;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author:slambb
+ * @date:2022/8/11
+ */
+@Data
+public class LevelJumpVo extends PageCondition implements Serializable {
+    private Integer id;
+    private String name;//关卡名字
+    private String describe;//关卡描述
+    private Integer rewardGold;//奖励金币
+    private Integer rewardDiamond;//奖励钻石
+    private Integer rewardHonor;//过关荣誉
+    private Integer consumeGold;//消耗金币
+    private Integer consumeDiamond;//消耗钻石
+    private Integer signCount;//标志块的总数
+    private String signType;//标志块的种类
+    private Integer limitTime;//限时(秒),0-不限时
+    /** 解锁条件类型. */
+    private String conditionUnlock;
+    /** 通过关卡时候的类型. */
+    private Integer conditionPassed;
+    /** 补充说明 */
+    private String explain;
+    /** 人数类型 1单人 2pk*/
+    private Integer numberType;
+    /** 顺序设计,和number type 一起使用。用于游戏排序 */
+    private Integer sort;
+    /**
+     * 关卡类型,1代表 跳,2代表拳击
+     */
+    private Integer type;
+
+    private Date createTime;
+    private Date updateTime;
+}

+ 3 - 3
src/main/java/com/YuyeTech/TPlat/game/controller/OtaController.java → src/main/java/com/YuyeTech/TPlat/game/otaInfo/controller/OtaController.java

@@ -1,8 +1,8 @@
-package com.YuyeTech.TPlat.game.controller;
+package com.YuyeTech.TPlat.game.otaInfo.controller;
 
 import com.YuyeTech.TPlat.VO.ResultVO;
-import com.YuyeTech.TPlat.dataobject.OtaInfo;
-import com.YuyeTech.TPlat.service.OtaInfoService;
+import com.YuyeTech.TPlat.game.otaInfo.projo.OtaInfo;
+import com.YuyeTech.TPlat.game.otaInfo.service.OtaInfoService;
 import com.YuyeTech.TPlat.utils.ResultVOUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;

+ 1 - 1
src/main/java/com/YuyeTech/TPlat/dataobject/OtaInfo.java → src/main/java/com/YuyeTech/TPlat/game/otaInfo/projo/OtaInfo.java

@@ -1,4 +1,4 @@
-package com.YuyeTech.TPlat.dataobject;
+package com.YuyeTech.TPlat.game.otaInfo.projo;
 
 import lombok.Data;
 import org.hibernate.annotations.DynamicUpdate;

+ 2 - 2
src/main/java/com/YuyeTech/TPlat/repository/OtaInfoRepository.java → src/main/java/com/YuyeTech/TPlat/game/otaInfo/repository/OtaInfoRepository.java

@@ -1,6 +1,6 @@
-package com.YuyeTech.TPlat.repository;
+package com.YuyeTech.TPlat.game.otaInfo.repository;
 
-import com.YuyeTech.TPlat.dataobject.OtaInfo;
+import com.YuyeTech.TPlat.game.otaInfo.projo.OtaInfo;
 import org.springframework.data.jpa.repository.JpaRepository;
 
 import java.util.Optional;

+ 2 - 2
src/main/java/com/YuyeTech/TPlat/service/OtaInfoService.java → src/main/java/com/YuyeTech/TPlat/game/otaInfo/service/OtaInfoService.java

@@ -1,6 +1,6 @@
-package com.YuyeTech.TPlat.service;
+package com.YuyeTech.TPlat.game.otaInfo.service;
 
-import com.YuyeTech.TPlat.dataobject.OtaInfo;
+import com.YuyeTech.TPlat.game.otaInfo.projo.OtaInfo;
 
 /**
  * 游戏

+ 4 - 4
src/main/java/com/YuyeTech/TPlat/service/impl/OtaInfoServiceImpl.java → src/main/java/com/YuyeTech/TPlat/game/otaInfo/service/OtaInfoServiceImpl.java

@@ -1,8 +1,8 @@
-package com.YuyeTech.TPlat.service.impl;
+package com.YuyeTech.TPlat.game.otaInfo.service;
 
-import com.YuyeTech.TPlat.dataobject.OtaInfo;
-import com.YuyeTech.TPlat.repository.OtaInfoRepository;
-import com.YuyeTech.TPlat.service.OtaInfoService;
+import com.YuyeTech.TPlat.game.otaInfo.projo.OtaInfo;
+import com.YuyeTech.TPlat.game.otaInfo.repository.OtaInfoRepository;
+import com.YuyeTech.TPlat.game.otaInfo.service.OtaInfoService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 

+ 52 - 0
src/main/java/com/YuyeTech/TPlat/game/userDeleteLog/controller/BackstageUserDeleteLogController.java

@@ -0,0 +1,52 @@
+package com.YuyeTech.TPlat.game.userDeleteLog.controller;
+
+import com.YuyeTech.TPlat.annotation.Decrypt;
+import com.YuyeTech.TPlat.annotation.Encrypt;
+import com.YuyeTech.TPlat.common.controller.CommonController;
+import com.YuyeTech.TPlat.common.pojo.PageInfo;
+import com.YuyeTech.TPlat.common.pojo.Result;
+import com.YuyeTech.TPlat.game.userDeleteLog.pojo.UserDeleteLog;
+import com.YuyeTech.TPlat.game.userDeleteLog.service.UserDeleteLogService;
+import com.YuyeTech.TPlat.game.userDeleteLog.vo.UserDeleteLogVo;
+import com.YuyeTech.TPlat.game.userinfo.service.MainInfoService;
+import com.YuyeTech.TPlat.game.userinfo.service.UserInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import java.util.Map;
+
+@RestController
+@RequestMapping("/backstage_userDeleteLog/")
+public class BackstageUserDeleteLogController extends CommonController<UserDeleteLogVo, UserDeleteLog, String> {
+    @Autowired
+    private UserDeleteLogService userDeleteLogService;
+
+    /**
+     * 前端view跳转,配置菜单路径
+     * 设置默认参数
+     *
+     * @return
+     */
+    @GetMapping("gotoView")
+    public ModelAndView gotoView() {
+        ModelAndView modelAndView = new ModelAndView("client/userInfoLog");
+        return modelAndView;
+    }
+
+    /**
+     * 分页查询数据
+     *
+     * @param vo
+     * @return
+     */
+    @PostMapping("findAll")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<UserDeleteLogVo>> findAll(UserDeleteLogVo vo) {
+        return userDeleteLogService.page(vo);
+    }
+
+
+
+}

+ 15 - 0
src/main/java/com/YuyeTech/TPlat/game/userDeleteLog/controller/UserDeleteLogController.java

@@ -0,0 +1,15 @@
+package com.YuyeTech.TPlat.game.userDeleteLog.controller;
+
+import com.YuyeTech.TPlat.common.controller.*;
+import com.YuyeTech.TPlat.game.userDeleteLog.pojo.UserDeleteLog;
+import com.YuyeTech.TPlat.game.userDeleteLog.vo.UserDeleteLogVo;
+import com.YuyeTech.TPlat.game.userDeleteLog.service.UserDeleteLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/tPlat/userDeleteLog/")
+public class UserDeleteLogController extends CommonController<UserDeleteLogVo, UserDeleteLog, String> {
+    @Autowired
+    private UserDeleteLogService userDeleteLogService;
+}

+ 31 - 0
src/main/java/com/YuyeTech/TPlat/game/userDeleteLog/pojo/UserDeleteLog.java

@@ -0,0 +1,31 @@
+package com.YuyeTech.TPlat.game.userDeleteLog.pojo;
+
+import lombok.Data;
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Entity
+@Table(name = "user_delete_log")
+@Data
+public class UserDeleteLog implements Serializable {
+    @Id
+    private String userId;//
+
+    private String telephoneNumber;//电话
+
+    private String email;//邮箱
+
+    private String openid;//微信openid
+
+    private String unionid;//
+
+    private String appleId;//苹果登录id
+
+    private Integer status;//0:挂起数据,1:已删除,2:已恢复
+
+    private Date createTime;//创建时间
+
+    private Date updateTime;//修改时间
+
+}

+ 9 - 0
src/main/java/com/YuyeTech/TPlat/game/userDeleteLog/repository/UserDeleteLogRepository.java

@@ -0,0 +1,9 @@
+package com.YuyeTech.TPlat.game.userDeleteLog.repository;
+
+import com.YuyeTech.TPlat.common.repository.*;
+import com.YuyeTech.TPlat.game.userDeleteLog.pojo.UserDeleteLog;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface UserDeleteLogRepository extends CommonRepository<UserDeleteLog, String> {
+}

+ 9 - 0
src/main/java/com/YuyeTech/TPlat/game/userDeleteLog/service/UserDeleteLogService.java

@@ -0,0 +1,9 @@
+package com.YuyeTech.TPlat.game.userDeleteLog.service;
+
+import com.YuyeTech.TPlat.common.service.*;
+import com.YuyeTech.TPlat.game.userDeleteLog.pojo.UserDeleteLog;
+import com.YuyeTech.TPlat.game.userDeleteLog.vo.UserDeleteLogVo;
+
+public interface UserDeleteLogService extends CommonService<UserDeleteLogVo, UserDeleteLog, String> {
+
+}

+ 24 - 0
src/main/java/com/YuyeTech/TPlat/game/userDeleteLog/service/UserDeleteLogServiceImpl.java

@@ -0,0 +1,24 @@
+package com.YuyeTech.TPlat.game.userDeleteLog.service;
+
+import com.YuyeTech.TPlat.common.service.*;
+import com.YuyeTech.TPlat.game.userDeleteLog.pojo.UserDeleteLog;
+import com.YuyeTech.TPlat.game.userDeleteLog.vo.UserDeleteLogVo;
+import com.YuyeTech.TPlat.game.userDeleteLog.repository.UserDeleteLogRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+@Service
+@Transactional
+public class UserDeleteLogServiceImpl extends CommonServiceImpl<UserDeleteLogVo, UserDeleteLog, String> implements UserDeleteLogService{
+
+    @PersistenceContext
+    private EntityManager em;
+    @Autowired
+    private UserDeleteLogRepository userDeleteLogRepository;
+
+
+
+}

+ 27 - 0
src/main/java/com/YuyeTech/TPlat/game/userDeleteLog/vo/UserDeleteLogSimpleVo.java

@@ -0,0 +1,27 @@
+package com.YuyeTech.TPlat.game.userDeleteLog.vo;
+
+import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class UserDeleteLogSimpleVo implements Serializable {
+    private String userId;//
+
+    private String telephoneNumber;//电话
+
+    private String email;//邮箱
+
+    private String openid;//微信openid
+
+    private String unionid;//
+
+    private String appleId;//苹果登录id
+
+    private Integer status;//0:挂起数据,1:已删除,2:已恢复
+
+    private Date createTime;//创建时间
+
+    private Date updateTime;//修改时间
+
+}

+ 27 - 0
src/main/java/com/YuyeTech/TPlat/game/userDeleteLog/vo/UserDeleteLogVo.java

@@ -0,0 +1,27 @@
+package com.YuyeTech.TPlat.game.userDeleteLog.vo;
+
+import com.YuyeTech.TPlat. common.pojo.PageCondition;import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class UserDeleteLogVo extends PageCondition implements Serializable {
+    private String userId;//
+
+    private String telephoneNumber;//电话
+
+    private String email;//邮箱
+
+    private String openid;//微信openid
+
+    private String unionid;//
+
+    private String appleId;//苹果登录id
+
+    private Integer status;//0:挂起数据,1:已删除,2:已恢复
+
+    private Date createTime;//创建时间
+
+    private Date updateTime;//修改时间
+
+}

+ 102 - 54
src/main/java/com/YuyeTech/TPlat/game/userinfo/controller/BackstageUserController.java

@@ -7,7 +7,9 @@ import com.YuyeTech.TPlat.common.pojo.Result;
 import com.YuyeTech.TPlat.game.userinfo.projo.UserInfo;
 import com.YuyeTech.TPlat.enums.ResultEnum;
 import com.YuyeTech.TPlat.exception.UserException;
+import com.YuyeTech.TPlat.game.userinfo.service.MainInfoService;
 import com.YuyeTech.TPlat.game.userinfo.service.UserInfoService;
+import com.YuyeTech.TPlat.game.userinfo.vo.MainInfoVo;
 import com.YuyeTech.TPlat.game.userinfo.vo.UserInfoVo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,6 +20,7 @@ import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.ModelAndView;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
 
 /**
@@ -29,10 +32,14 @@ import java.util.Map;
 @Slf4j
 public class BackstageUserController {
 
+    @Autowired
+    private MainInfoService mainInfoService;
+
     @Autowired
     private UserInfoService userInfoService;
 
 
+
     /**
      * 前端view跳转,配置菜单路径
      * 设置默认参数
@@ -54,13 +61,14 @@ public class BackstageUserController {
     @PostMapping("findAll")
     @Decrypt
     @Encrypt
-    public Result<PageInfo<UserInfoVo>> findAll(UserInfoVo vo) {
-        return userInfoService.page(vo);
+    public Result<PageInfo<MainInfoVo>> findAll(MainInfoVo vo) {
+        return mainInfoService.page(vo);
     }
 
 
     /**
      * 用户列表
+     *
      * @param page 第几页, 从1页开始
      * @param size 一页有多少条数据
      * @return
@@ -79,67 +87,107 @@ public class BackstageUserController {
     }
 
     /**
-     * 用户详情
+     * 获取信息详情
      * @param userId
-     * @param map
      * @return
      */
-    @GetMapping("/detail")
-    public ModelAndView detail(@RequestParam("userId") String userId,
-                               Map<String, Object> map) {
-
-        //todo 1.查询用户信息
-        UserInfo userInfo = userInfoService.findUserInfoById(userId,true);
-        if(userInfo == null){
-            map.put("msg","用户信息不存在!");
-            map.put("url","/backstage_user/list");
-            return new ModelAndView("common/error",map);
-        }
-        map.put("userInfo", userInfo);
-
-        return new ModelAndView("user/detail", map);
-    }
-
-    @RequestMapping(value = "/")
-    public String index() {
-        return "index";
+    @PostMapping("/findUserDetail")
+    public Result findUserDetail(@RequestParam("userId") String userId) {
+        //预删除数据库数据
+        return userInfoService.get(userId);
     }
 
 
     /**
-     * 根据用户名搜索信息
+     * 删除用户数据
+     *
+     * @param userId
      * @return
      */
-    @PostMapping("/searchUserInfo")
-    public ModelAndView searchUserInfo(
-            @RequestParam(value = "username")String username,
-            @RequestParam(value = "page", defaultValue = "1") Integer page,
-            @RequestParam(value = "size", defaultValue = "10") Integer size,
-            Map<String, Object> map) {
-        if(page<1){
-            map.put("msg", "page不能小于1.");
-            map.put("url", "/backstage_user/list");
-            return new ModelAndView("common/error", map);
-        }
-        if(StringUtils.isEmpty(username)){
-            map.put("msg", ResultEnum.USER_NAME_ERROR.getMessage());
-            map.put("url", "/backstage_user/list");
-            return new ModelAndView("common/error", map);
-        }
-        //todo 根据用户名搜索,查询用户信息
-        try {
-            PageRequest request = PageRequest.of(page-1, size);
-            Page<UserInfo> userInfoPage =  userInfoService.searchByUsername(request,username);
-            map.put("userInfo",userInfoPage);
-            map.put("username",username);
-            map.put("currentPage", page);
-            map.put("size", size);
-            return new ModelAndView("/user/list", map);
-        } catch (UserException e) {
-            map.put("msg", e.getMessage());
-            map.put("url", "/backstage_user/list");
-            return new ModelAndView("common/error", map);
-        }
+    @PostMapping("/deleteUser")
+    public Result deleteUser(@RequestParam("userId") String userId) {
+        //预删除数据库数据
+        String msg = mainInfoService.deleteMainInfoById(userId);
+        return Result.of(msg);
+    }
 
+    /**
+     * 恢复挂起的用户数据
+     * @param userId
+     * @return
+     */
+    @PostMapping("/restoreUser")
+    public Result restoreUser(@RequestParam("userId") String userId) {
+        //预删除数据库数据
+        MainInfoVo mainInfoVo = mainInfoService.restoreMainInfoById(userId);
+        return Result.of(mainInfoVo);
     }
+
+    /**
+     * 用户详情
+     *
+     * @param userId
+     * @param map
+     * @return
+     */
+//    @GetMapping("/detail")
+//    public ModelAndView detail(@RequestParam("userId") String userId,
+//                               Map<String, Object> map) {
+//
+//        //todo 1.查询用户信息
+//        UserInfo userInfo = userInfoService.findUserInfoById(userId, true);
+//        if (userInfo == null) {
+//            map.put("msg", "用户信息不存在!");
+//            map.put("url", "/backstage_user/list");
+//            return new ModelAndView("common/error", map);
+//        }
+//        map.put("userInfo", userInfo);
+//
+//        return new ModelAndView("user/detail", map);
+//    }
+
+
+
+//    @RequestMapping(value = "/")
+//    public String index() {
+//        return "index";
+//    }
+
+
+//    /**
+//     * 根据用户名搜索信息
+//     * @return
+//     */
+//    @PostMapping("/searchUserInfo")
+//    public ModelAndView searchUserInfo(
+//            @RequestParam(value = "username")String username,
+//            @RequestParam(value = "page", defaultValue = "1") Integer page,
+//            @RequestParam(value = "size", defaultValue = "10") Integer size,
+//            Map<String, Object> map) {
+//        if(page<1){
+//            map.put("msg", "page不能小于1.");
+//            map.put("url", "/backstage_user/list");
+//            return new ModelAndView("common/error", map);
+//        }
+//        if(StringUtils.isEmpty(username)){
+//            map.put("msg", ResultEnum.USER_NAME_ERROR.getMessage());
+//            map.put("url", "/backstage_user/list");
+//            return new ModelAndView("common/error", map);
+//        }
+//        //todo 根据用户名搜索,查询用户信息
+//        try {
+//            PageRequest request = PageRequest.of(page-1, size);
+//            Page<UserInfo> userInfoPage =  userInfoService.searchByUsername(request,username);
+//            map.put("userInfo",userInfoPage);
+//            map.put("username",username);
+//            map.put("currentPage", page);
+//            map.put("size", size);
+//            return new ModelAndView("/user/list", map);
+//        } catch (UserException e) {
+//            map.put("msg", e.getMessage());
+//            map.put("url", "/backstage_user/list");
+//            return new ModelAndView("common/error", map);
+//        }
+//
+//    }
 }

+ 76 - 76
src/main/java/com/YuyeTech/TPlat/game/userinfo/controller/ManagerController.java

@@ -48,80 +48,80 @@ public class ManagerController {
     @Autowired
     private UserInfoService userInfoService;
 
-    /**
-     * 删除用户数据
-     * @param userId
-     * @return
-     */
-    @GetMapping("/deleteUser")
-    public ResultVO deleteUser(@RequestParam("userId") String userId,
-                               HttpServletRequest request) {
-        //1.删除token
-        String headToken = request.getHeader("token");
-        log.info("{}",request.getParameterValues("userId")[0]);
-        if (StringUtils.isNotBlank(headToken)) {
-            log.info(String.format(RedisConstant.TOKEN_PREFIX, headToken));
-            Boolean bSuccess = redisTemplate.delete(String.format(RedisConstant.TOKEN_PREFIX, headToken));
-            if (!bSuccess) {
-                //删除不成功,redis不存在,是非法token
-                log.info("redis 没有对应的token");
-                return ResultVOUtil.error(ResultEnum.TOKEN_IS_ILLEGAL.getCode(), ResultEnum.TOKEN_IS_ILLEGAL.getMessage());
-            }
-        }
-        //2.删除头像W
-        UserInfo userInfo = userInfoService.findUserInfoById(userId, false);
-        if (!userInfo.getAvatarUrl().equals("publicAvatar/defaultAvatar.png") && userInfo.getAvatarUrl() != null && userInfo.getAvatarUrl().length() != 0) {
-            if (aliyunOSSUtil.deleteBlog(userInfo.getAvatarUrl())) {
-                log.info("删除头像成功");
-            }
-        }
-        //3.删除数据库数据
-        mainInfoService.deleteMainInfoById(userId);
-
-        return ResultVOUtil.success();
-    }
-
-    /**
-     * 更加userId 来删除信息
-     * @param userId
-     * @return
-     */
-    @GetMapping("/deleteUserById")
-    public ResultVO deleteUserById(@RequestParam("userId") String userId) {
-        UserInfo userInfo = userInfoService.findUserInfoById(userId, false);
-        if (!userInfo.getAvatarUrl().equals("publicAvatar/defaultAvatar.png") && userInfo.getAvatarUrl() != null && userInfo.getAvatarUrl().length() != 0) {
-            if (aliyunOSSUtil.deleteBlog(userInfo.getAvatarUrl())) {
-                log.info("删除头像成功");
-            }
-        }
-        //3.删除数据库数据
-        mainInfoService.deleteMainInfoById(userId);
-
-        return ResultVOUtil.success();
-    }
-
-    /**
-     * 删除游戏
-     * @param gameId
-     * @return
-     */
-    @GetMapping("/deleteGame")
-    @Transactional
-    public ResultVO deleteGame(@RequestParam("gameId") String gameId) {
-        gameInfoService.deleteByGameId(gameId);
-        return ResultVOUtil.success();
-    }
-
-
-    @PostMapping("/upload_feedback")
-    @ResponseBody
-    public ResultVO toUploadBlogPost(@RequestParam(value = "files", required = false) MultipartFile[] files,
-                                     @Valid FeedbackForm feedbackForm,
-                                     Map<String, Object> map) {
-
-        log.info("{}",files.length);
-
-
-        return ResultVOUtil.success();
-    }
+//    /**
+//     * 删除用户数据
+//     * @param userId
+//     * @return
+//     */
+//    @GetMapping("/deleteUser")
+//    public ResultVO deleteUser(@RequestParam("userId") String userId,
+//                               HttpServletRequest request) {
+//        //1.删除token
+//        String headToken = request.getHeader("token");
+//        log.info("{}",request.getParameterValues("userId")[0]);
+//        if (StringUtils.isNotBlank(headToken)) {
+//            log.info(String.format(RedisConstant.TOKEN_PREFIX, headToken));
+//            Boolean bSuccess = redisTemplate.delete(String.format(RedisConstant.TOKEN_PREFIX, headToken));
+//            if (!bSuccess) {
+//                //删除不成功,redis不存在,是非法token
+//                log.info("redis 没有对应的token");
+//                return ResultVOUtil.error(ResultEnum.TOKEN_IS_ILLEGAL.getCode(), ResultEnum.TOKEN_IS_ILLEGAL.getMessage());
+//            }
+//        }
+//        //2.删除头像W
+//        UserInfo userInfo = userInfoService.findUserInfoById(userId, false);
+//        if (!userInfo.getAvatarUrl().equals("publicAvatar/defaultAvatar.png") && userInfo.getAvatarUrl() != null && userInfo.getAvatarUrl().length() != 0) {
+//            if (aliyunOSSUtil.deleteBlog(userInfo.getAvatarUrl())) {
+//                log.info("删除头像成功");
+//            }
+//        }
+//        //3.删除数据库数据
+//        mainInfoService.deleteMainInfoById(userId);
+//
+//        return ResultVOUtil.success();
+//    }
+//
+//    /**
+//     * 更加userId 来删除信息
+//     * @param userId
+//     * @return
+//     */
+//    @GetMapping("/deleteUserById")
+//    public ResultVO deleteUserById(@RequestParam("userId") String userId) {
+//        UserInfo userInfo = userInfoService.findUserInfoById(userId, false);
+//        if (!userInfo.getAvatarUrl().equals("publicAvatar/defaultAvatar.png") && userInfo.getAvatarUrl() != null && userInfo.getAvatarUrl().length() != 0) {
+//            if (aliyunOSSUtil.deleteBlog(userInfo.getAvatarUrl())) {
+//                log.info("删除头像成功");
+//            }
+//        }
+//        //3.删除数据库数据
+//        mainInfoService.deleteMainInfoById(userId);
+//
+//        return ResultVOUtil.success();
+//    }
+//
+//    /**
+//     * 删除游戏
+//     * @param gameId
+//     * @return
+//     */
+//    @GetMapping("/deleteGame")
+//    @Transactional
+//    public ResultVO deleteGame(@RequestParam("gameId") String gameId) {
+//        gameInfoService.deleteByGameId(gameId);
+//        return ResultVOUtil.success();
+//    }
+//
+//
+//    @PostMapping("/upload_feedback")
+//    @ResponseBody
+//    public ResultVO toUploadBlogPost(@RequestParam(value = "files", required = false) MultipartFile[] files,
+//                                     @Valid FeedbackForm feedbackForm,
+//                                     Map<String, Object> map) {
+//
+//        log.info("{}",files.length);
+//
+//
+//        return ResultVOUtil.success();
+//    }
 }

+ 60 - 66
src/main/java/com/YuyeTech/TPlat/game/userinfo/controller/UserInfoController.java

@@ -1,5 +1,6 @@
 package com.YuyeTech.TPlat.game.userinfo.controller;
 
+import cn.hutool.core.date.DateUtil;
 import com.YuyeTech.TPlat.dataobject.*;
 import com.YuyeTech.TPlat.dto.FriendInfoDTO;
 import com.YuyeTech.TPlat.dto.SignInDTO;
@@ -8,6 +9,8 @@ import com.YuyeTech.TPlat.enums.PictureType;
 import com.YuyeTech.TPlat.enums.ResultEnum;
 import com.YuyeTech.TPlat.enums.UserEnum;
 import com.YuyeTech.TPlat.exception.UserException;
+import com.YuyeTech.TPlat.game.TP_WxInfo.projo.WxInfo;
+import com.YuyeTech.TPlat.game.TP_WxInfo.service.WxInfoService;
 import com.YuyeTech.TPlat.game.imageInfo.projo.Pictures;
 import com.YuyeTech.TPlat.game.imageInfo.service.PicturesService;
 import com.YuyeTech.TPlat.game.imageInfo.vo.PicturesVo;
@@ -124,42 +127,43 @@ public class UserInfoController {
         return ResultVOUtil.success(map);
     }
 
-    @GetMapping("delete")
-    public ResultVO deleteUserInfo(@RequestParam(value = "userId") String userId) {
-        //请求userId为空时候
-        if (userId == null) {
-            throw new UserException(UserEnum.USER_NOT_EXIST);
-        }
-        try {
-            String callback = userInfoService.deleteUserInfoById(userId);
-            return ResultVOUtil.success(callback);
-
-        } catch (UserException e) {
-            return ResultVOUtil.error(e.getCode(), e.getMessage());
-        }
-
-    }
+//    @GetMapping("delete")
+//    public ResultVO deleteUserInfo(@RequestParam(value = "userId") String userId) {
+//        //请求userId为空时候
+//        if (userId == null) {
+//            throw new UserException(UserEnum.USER_NOT_EXIST);
+//        }
+//        try {
+//            String callback = userInfoService.deleteUserInfoById(userId);
+//            return ResultVOUtil.success(callback);
+//
+//        } catch (UserException e) {
+//            return ResultVOUtil.error(e.getCode(), e.getMessage());
+//        }
+//
+//    }
 
+    /**
+     * 前端替换头像等用户数据
+     * @param file
+     * @param form
+     * @return
+     */
     @PostMapping(value = "add_avatar", headers = "content-type=multipart/form-data")
     @Transactional
     public ResultVO addUserImage(@RequestParam(value = "file", required = false) MultipartFile file,
                                  @Valid UserForm form) {
-//        String userId = request.getParameterValues("userId")[0];
         UserInfo userInfo = new UserInfo();
-        //写入图片库
-        PicturesVo pictureIcon = new PicturesVo();
         //存的项目的中模版图片
         String contextPath = "";
         File uploadFile = null;
         try {
             String uploadUrl = "";
-            log.info("{}", file);
             String filename = file.getOriginalFilename();
             if (!"".equals(filename.trim())) {
                 contextPath = imageUtils.getCompressPath(file, 200);
                 uploadFile = new File(contextPath);
                 uploadUrl = aliyunOSSUtil.upload(uploadFile, "avatar");
-                log.info("uploadUrl=" + uploadUrl);
             }
             userInfo = userInfoService.findUserInfoById(form.getUserId(), false);
             //数据表没有数据
@@ -168,53 +172,31 @@ public class UserInfoController {
                 userInfo.setUserId(form.getUserId());
                 userInfo.setUsername("");
                 userInfo.setGender("其他");
-                userInfo.setBirthday(new Date());
+                userInfo.setBirthday(DateUtil.date());
                 userInfo.setSignature("");
                 userInfo.setAvatarUrl(uploadUrl);
                 userInfo.setHeight(0.0);
                 userInfo.setWeight(0.0);
-                userInfo.setRegisterTime(new Date());
+                userInfo.setRegisterTime(DateUtil.date());
                 userInfo.setStatus(1);//1为新注册
-
-                //注册新用户时候,上传的图片
-                pictureIcon.setPictureUrl(uploadUrl);
-                pictureIcon.setPictureType(PictureType.USER_AVATAR.ordinal());
-                pictureIcon.setAssociatedId(userInfo.getUserId());
+                userInfo.setUpdateTime(DateUtil.date());
 
             } else {
                 //这里判断处理,把旧的头像数据删除
                 //默认头像不用删除
                 if (!userInfo.getAvatarUrl().equals("publicAvatar/defaultAvatar.png") && userInfo.getAvatarUrl() != null && userInfo.getAvatarUrl().length() != 0) {
-                    //存在旧的数据,查找并且替换信息
-                    List<Pictures> picturesList = picturesService.findByPictureTypeAndAssociatedId(PictureType.USER_AVATAR.ordinal(), userInfo.getUserId());
-                    if (picturesList.size() > 1) {
-                        throw new RuntimeException("avatar 图片数量异常!");
-                    }
-                    Pictures picture = picturesList.get(0);
-                    if (aliyunOSSUtil.deleteBlog(picture.getPictureUrl())) {
-                        //替换图片信息
-                        pictureIcon = CopyUtil.copy(picture, PicturesVo.class);
-                        pictureIcon.setPictureUrl(uploadUrl);
+                    //直接删除数据,替换新的url
+                    if (aliyunOSSUtil.deleteBlog(userInfo.getAvatarUrl())) {
                         userInfo.setAvatarUrl(uploadUrl);
                     }
-//                    if (aliyunOSSUtil.deleteBlog(userInfo.getAvatarUrl())) {
-//                        userInfo.setAvatarUrl(uploadUrl);
-//                    }
                 } else {
-                    //没有头像时候,设置上传新的头像,保存新记录的图片数据
-                    pictureIcon.setPictureUrl(uploadUrl);
-                    pictureIcon.setPictureType(PictureType.USER_AVATAR.ordinal());
-                    pictureIcon.setAssociatedId(userInfo.getUserId());
+                    //没有头像时候,设置上传新的头像
                     userInfo.setAvatarUrl(uploadUrl);
-
                 }
             }
             BeanUtils.copyProperties(form, userInfo, PropertyUtil.getNullPropertyNames(form));
             //保存数据库,获取保存后的字段
             userInfo = userInfoService.addUserInfo(userInfo);
-            //刷新保存一次图片数据
-            picturesService.saveReturnVo(pictureIcon);
-
         } catch (UserException e) {
             return ResultVOUtil.error(e.getCode(), e.getMessage());
         } catch (Exception ex) {
@@ -235,6 +217,14 @@ public class UserInfoController {
         return ResultVOUtil.success(userInfoVO);
     }
 
+    /**
+     * 操作微信头像
+     * @param file
+     * @param username
+     * @param gender
+     * @param userId
+     * @return
+     */
     @PostMapping("add_wx_avatar_info")
     @Transactional
     public ResultVO addAvatarUserInfo(@RequestParam(value = "file", required = false) MultipartFile file,
@@ -242,41 +232,30 @@ public class UserInfoController {
                                       @RequestParam("gender") String gender,
                                       @RequestParam("userId") String userId) {
         UserInfo userInfo = new UserInfo();
-
-        //微信头像时候新增的用户
-        //存的项目的中模版图片
         String contextPath = "";
         File uploadFile = null;
-
         try {
             String uploadUrl = "";
             String filename = file.getOriginalFilename();
             if (!"".equals(filename.trim())) {
-//                File newFile = new File(filename);
-//                FileOutputStream os = new FileOutputStream(newFile);
-//                os.write(file.getBytes());
-//                os.close();
-//                file.transferTo(newFile);
                 contextPath = imageUtils.getCompressPath(file, 200);
                 uploadFile = new File(contextPath);
                 //上传到OSS
                 uploadUrl = aliyunOSSUtil.upload(uploadFile, "avatar");
-                log.info("uploadUrl=" + uploadUrl);
             }
-
             //数据表没有数据
             userInfo.setUsername(username);
             userInfo.setUserId(userId);
             userInfo.setGender(gender);
-            userInfo.setBirthday(new Date());
+            userInfo.setBirthday(DateUtil.date());
             userInfo.setAvatarUrl(uploadUrl);
             userInfo.setHeight(0.0);
             userInfo.setWeight(0.0);
-            userInfo.setRegisterTime(new Date());
+            userInfo.setRegisterTime(DateUtil.date());
             userInfo.setStatus(1);//1为新注册
+            userInfo.setUpdateTime(DateUtil.date());
             //保存数据库,获取保存后的字段
             userInfo = userInfoService.addUserInfo(userInfo);
-
         } catch (UserException e) {
             return ResultVOUtil.error(e.getCode(), e.getMessage());
         } catch (Exception ex) {
@@ -295,6 +274,13 @@ public class UserInfoController {
         return ResultVOUtil.success(userInfoVO);
     }
 
+    /**
+     * 苹果登录信息添加,使用数据库默认头像
+     * @param username
+     * @param gender
+     * @param userId
+     * @return
+     */
     @PostMapping("appleAdd")
     public ResultVO appleAddUserInfo(@RequestParam("username") String username,
                                      @RequestParam("gender") String gender,
@@ -315,12 +301,13 @@ public class UserInfoController {
                 userInfo.setUserId(userId);
                 userInfo.setUsername(username);
                 userInfo.setGender(gender);
-                userInfo.setBirthday(new Date());
+                userInfo.setBirthday(DateUtil.date());
                 userInfo.setSignature("");
                 userInfo.setHeight(0.0);
                 userInfo.setWeight(0.0);
-                userInfo.setRegisterTime(new Date());
+                userInfo.setRegisterTime(DateUtil.date());
                 userInfo.setStatus(1);//1为新注册
+                userInfo.setUpdateTime(DateUtil.date());
                 //保存数据库,获取保存后的字段
                 userInfo = userInfoService.addUserInfo(userInfo);
             } else {
@@ -345,6 +332,12 @@ public class UserInfoController {
         return ResultVOUtil.success(userInfoVO);
     }
 
+    /**
+     * 添加用户信息,使用数据库默认头像
+     * @param form
+     * @param bAddWeightInfo
+     * @return
+     */
     @PostMapping("add")
     @Transactional
     public ResultVO addUserInfo(@Valid UserForm form,
@@ -365,12 +358,13 @@ public class UserInfoController {
                 userInfo.setUserId(form.getUserId());
                 userInfo.setUsername(form.getUsername());
                 userInfo.setGender(form.getGender());
-                userInfo.setBirthday(new Date());
+                userInfo.setBirthday(DateUtil.date());
                 userInfo.setSignature(form.getSignature());
                 userInfo.setHeight(0.0);
                 userInfo.setWeight(0.0);
-                userInfo.setRegisterTime(new Date());
+                userInfo.setRegisterTime(DateUtil.date());
                 userInfo.setStatus(1);//1为新注册
+                userInfo.setUpdateTime(DateUtil.date());
                 bAddWeightInfo = true;
             }
 

+ 4 - 3
src/main/java/com/YuyeTech/TPlat/game/userinfo/projo/MainInfo.java

@@ -5,6 +5,7 @@ import org.hibernate.annotations.DynamicUpdate;
 
 import javax.persistence.Entity;
 import javax.persistence.Id;
+import java.util.Date;
 
 /**
  * @author:slambb
@@ -16,11 +17,11 @@ import javax.persistence.Id;
 public class MainInfo {
     @Id
     private String  userId;
-
     private String username;
     private String password;
-
     private String telephoneNumber;
-
     private String email;
+    private Integer status;//用户状态,0:正常,1:预删除
+    private Date createTime;
+    private Date updateTime;
 }

+ 6 - 1
src/main/java/com/YuyeTech/TPlat/game/userinfo/projo/UserInfo.java

@@ -39,5 +39,10 @@ public class UserInfo {
     /** 创建时间. */
     private Date registerTime;
 
-    private Integer status;
+    private Date updateTime;
+
+    /**
+     * todo 后续看情况设置旧用户信息
+     */
+    private Integer status;//0:旧用户,1:新注册
 }

+ 13 - 0
src/main/java/com/YuyeTech/TPlat/game/userinfo/service/MainInfoService.java

@@ -15,5 +15,18 @@ public interface MainInfoService extends CommonService<MainInfoVo, MainInfo, Str
     MainInfo findMainInfoByEmailAndPassword(String email,String password);
     MainInfo findMainInfoByEmail(String mail);
     MainInfo addMainInfo(MainInfo mainInfo);
+
+    /**
+     * 删除用户,目前只是挂起数据
+     * @param userId
+     * @return
+     */
     String deleteMainInfoById(String userId);
+
+    /**
+     * 恢复删除用户数据
+     * @param userId
+     * @return
+     */
+    MainInfoVo restoreMainInfoById(String userId);
 }

+ 199 - 20
src/main/java/com/YuyeTech/TPlat/game/userinfo/service/MainInfoServiceImpl.java

@@ -1,50 +1,78 @@
 package com.YuyeTech.TPlat.game.userinfo.service;
 
+import cn.hutool.core.date.DateUtil;
 import com.YuyeTech.TPlat.common.service.CommonServiceImpl;
+import com.YuyeTech.TPlat.enums.PictureType;
+import com.YuyeTech.TPlat.enums.UserDeleteStatus;
+import com.YuyeTech.TPlat.game.TP_AppleInfo.projo.AppleInfo;
 import com.YuyeTech.TPlat.enums.UserEnum;
+import com.YuyeTech.TPlat.enums.UserStatus;
 import com.YuyeTech.TPlat.exception.UserException;
+import com.YuyeTech.TPlat.game.TP_AppleInfo.vo.AppleInfoVo;
+import com.YuyeTech.TPlat.game.TP_WxInfo.projo.WxInfo;
+import com.YuyeTech.TPlat.game.TP_WxInfo.vo.WxInfoVo;
+import com.YuyeTech.TPlat.game.imageInfo.projo.Pictures;
+import com.YuyeTech.TPlat.game.imageInfo.service.PicturesService;
+import com.YuyeTech.TPlat.game.userDeleteLog.pojo.UserDeleteLog;
+import com.YuyeTech.TPlat.game.userDeleteLog.service.UserDeleteLogService;
+import com.YuyeTech.TPlat.game.userDeleteLog.vo.UserDeleteLogVo;
 import com.YuyeTech.TPlat.game.userinfo.projo.MainInfo;
+import com.YuyeTech.TPlat.game.userinfo.projo.UserInfo;
 import com.YuyeTech.TPlat.game.userinfo.repository.MainInfoRepository;
-import com.YuyeTech.TPlat.game.userinfo.service.MainInfoService;
 import com.YuyeTech.TPlat.game.userinfo.vo.MainInfoVo;
+import com.YuyeTech.TPlat.game.TP_AppleInfo.service.AppleInfoService;
+import com.YuyeTech.TPlat.game.TP_WxInfo.service.WxInfoService;
+import com.YuyeTech.TPlat.utils.AliyunOSSUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import javax.transaction.Transactional;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+import java.util.List;
 
 /**
  * @author:slambb
  * @date:2019/12/31
  */
 @Service
+@Transactional
 @Slf4j
 public class MainInfoServiceImpl extends CommonServiceImpl<MainInfoVo, MainInfo, String> implements MainInfoService {
 
     @Autowired
     private MainInfoRepository mainInfoRepository;
 
+    @Autowired
+    private UserInfoService userInfoService;
+
+    @Autowired
+    private AliyunOSSUtil aliyunOSSUtil;
+
+    @Autowired
+    private PicturesService picturesService;
+
+    @Autowired
+    private AppleInfoService appleInfoService;
+
+    @Autowired
+    private WxInfoService wxInfoService;
+
+    @Autowired
+    private UserDeleteLogService userDeleteLogService;
 
-    @Override
-    public MainInfo findMainInfoById(String userId) {
-       MainInfo mainInfo= mainInfoRepository.findById(userId).orElse(null);
-       if(mainInfo==null){
-           throw  new UserException(UserEnum.USER_NOT_EXIST.getCode(),UserEnum.USER_NOT_EXIST.getMessage());
-       }
-       return mainInfo;
-    }
 
     @Override
-    @Transactional
-    public String deleteMainInfoById(String userId) {
-        try {
-            mainInfoRepository.deleteById(userId);
-        }catch (UserException e){
-            return "error";
+    public MainInfo findMainInfoById(String userId) {
+        MainInfo mainInfo = mainInfoRepository.findById(userId).orElse(null);
+        if (mainInfo == null) {
+            throw new UserException(UserEnum.USER_NOT_EXIST.getCode(), UserEnum.USER_NOT_EXIST.getMessage());
         }
-        return "success";
+        return mainInfo;
     }
 
+
     @Override
     public MainInfo addMainInfo(MainInfo mainInfo) {
         return mainInfoRepository.save(mainInfo);
@@ -52,19 +80,19 @@ public class MainInfoServiceImpl extends CommonServiceImpl<MainInfoVo, MainInfo,
 
     @Override
     public MainInfo findMainInfoByPhoneNumberAndPassword(String telephoneNumber, String password) {
-        MainInfo mainInfo= mainInfoRepository.findByTelephoneNumberAndPassword(telephoneNumber,password).orElse(null);
+        MainInfo mainInfo = mainInfoRepository.findByTelephoneNumberAndPassword(telephoneNumber, password).orElse(null);
         return mainInfo;
     }
 
     @Override
     public MainInfo findMainInfoByEmailAndPassword(String email, String password) {
-        MainInfo mainInfo= mainInfoRepository.findByEmailAndPassword(email,password).orElse(null);
+        MainInfo mainInfo = mainInfoRepository.findByEmailAndPassword(email, password).orElse(null);
         return mainInfo;
     }
 
     @Override
     public MainInfo findMainInfoByEmail(String mail) {
-        MainInfo mainInfo= mainInfoRepository.findByEmail(mail).orElse(null);
+        MainInfo mainInfo = mainInfoRepository.findByEmail(mail).orElse(null);
         return mainInfo;
     }
 
@@ -73,4 +101,155 @@ public class MainInfoServiceImpl extends CommonServiceImpl<MainInfoVo, MainInfo,
         MainInfo mainInfo = mainInfoRepository.findByTelephoneNumber(telephoneNumber).orElse(null);
         return mainInfo;
     }
+
+    /**
+     * 1.挂起用户状态,修改 main_info 信息。
+     * 2.记录到日志里面
+     * 删除关联的表数据,外键关联
+     *
+     * @param userId
+     * @return
+     */
+    @Override
+    public String deleteMainInfoById(String userId) {
+        try {
+            //记录挂起日志,
+            UserDeleteLogVo userDeleteLog = userDeleteLogService.getVo(userId);
+            if(userDeleteLog == null)
+            {
+                userDeleteLog = new UserDeleteLogVo();
+                userDeleteLog.setCreateTime(DateUtil.date());
+            }
+            MainInfoVo mainInfoVo = super.getVo(userId);
+
+            //判断是否处于挂起状态,如果是,暂时不再调用
+            if (mainInfoVo.getStatus().equals(UserStatus.PENDING.ordinal())) {
+                throw new RuntimeException("不可删除");
+                //删除用户自定义头像
+                //清除好友列表关系
+                //super.delete(userId);
+                //todo 后续考虑是否完成删除
+
+            } else  {
+                //正常状态下进行删除操作,先清空用户信息(包活wx登录和apple登录),然后记录一个日志
+                //此删除只是把用户关联的数据清空,暂时保留一份记录
+                userDeleteLog.setUserId(mainInfoVo.getUserId());
+                userDeleteLog.setTelephoneNumber(mainInfoVo.getTelephoneNumber());
+                mainInfoVo.setTelephoneNumber("");
+                userDeleteLog.setEmail(mainInfoVo.getEmail());
+                mainInfoVo.setEmail("");
+                //记录一个main info 状态
+                mainInfoVo.setStatus(UserStatus.PENDING.ordinal());
+                //删除apple_info信息
+                AppleInfoVo appleInfo = appleInfoService.getVo(userId);
+                if (appleInfo != null) {
+                    userDeleteLog.setAppleId(appleInfo.getAppleId());
+                    appleInfoService.delete(appleInfo.getUserId());
+                }
+                WxInfoVo wxInfo = wxInfoService.getVo(userId);
+                if (wxInfo != null) {
+                    userDeleteLog.setOpenid(wxInfo.getOpenid());
+                    userDeleteLog.setUnionid(wxInfo.getUnionid());
+                    wxInfoService.delete(wxInfo.getUserId());
+                }
+                userDeleteLog.setUpdateTime(DateUtil.date());
+                //记录一个log状态
+                userDeleteLog.setStatus(UserDeleteStatus.PENDING.ordinal());
+                userDeleteLogService.save(userDeleteLog);
+                super.save(mainInfoVo);
+            }
+//            mainInfoRepository.deleteById(userId);
+        } catch (UserException e) {
+            return "error";
+        }
+        return "success";
+    }
+
+    /**
+     * 恢复数据时候,需要判断对应恢复的数据是否使用
+     * 比如手机,邮箱,绑定的苹果登录id,wxid等是否已经被使用,如果被使用,不允许恢复
+     * @param userId
+     * @return
+     */
+    @Override
+    public MainInfoVo restoreMainInfoById(String userId) {
+        UserDeleteLogVo userDeleteLog = userDeleteLogService.getVo(userId);
+
+        if(!userDeleteLog.getStatus().equals(UserDeleteStatus.PENDING.ordinal())){
+            throw new RuntimeException("UserDeleteStatus 状态异常!");
+        }
+
+        //苹果信息处理
+        if(StringUtils.hasText(userDeleteLog.getAppleId())){
+            AppleInfo appleInfo = appleInfoService.findByAppleId(userDeleteLog.getAppleId());
+            if(appleInfo != null)
+            {
+                throw new RuntimeException("appleid 已被占用,不能恢复!");
+            }
+        }
+        //wx信息处理
+        if(StringUtils.hasText(userDeleteLog.getOpenid())){
+            WxInfo wxInfo = wxInfoService.findWxInfoByOpenid(userDeleteLog.getOpenid());
+            if(wxInfo != null)
+            {
+                throw new RuntimeException("openid 已被占用,不能恢复!");
+            }
+        }
+        if(StringUtils.hasText(userDeleteLog.getUnionid())){
+            WxInfo wxInfo = wxInfoService.findWxInfoByUnionid(userDeleteLog.getUnionid());
+            if(wxInfo != null)
+            {
+                throw new RuntimeException("unionid 已被占用,不能恢复!");
+            }
+        }
+
+        /**
+         * 电话号码,邮箱
+         */
+        if(StringUtils.hasText(userDeleteLog.getTelephoneNumber())){
+            MainInfo mainInfo = findMainInfoByPhoneNumber(userDeleteLog.getTelephoneNumber());
+            if(mainInfo != null)
+            {
+                throw new RuntimeException("Telephone 已被占用,不能恢复!");
+            }
+        }
+
+        if(StringUtils.hasText(userDeleteLog.getEmail())){
+            MainInfo mainInfo = findMainInfoByEmail(userDeleteLog.getEmail());
+            if(mainInfo != null)
+            {
+                throw new RuntimeException("Email 已被占用,不能恢复!");
+            }
+        }
+        MainInfoVo mainInfoVo = super.getVo(userId);
+        if(mainInfoVo == null){
+            throw new RuntimeException("mainInfoVo 数据异常!");
+        }
+        mainInfoVo.setTelephoneNumber(userDeleteLog.getTelephoneNumber());
+        mainInfoVo.setEmail(userDeleteLog.getEmail());
+        //设置为恢复信息状态
+        mainInfoVo.setStatus(UserStatus.RESTORE.ordinal());
+        super.save(mainInfoVo);
+        //恢复绑定的授权信息
+        if(StringUtils.hasText(userDeleteLog.getAppleId())){
+            AppleInfo appleInfo = new AppleInfo();
+            appleInfo.setUserId(mainInfoVo.getUserId());
+            appleInfo.setAppleId(userDeleteLog.getAppleId());
+            appleInfoService.addAppleInfo(appleInfo);
+        }
+        if(StringUtils.hasText(userDeleteLog.getOpenid())
+                && StringUtils.hasText(userDeleteLog.getUnionid())){
+            WxInfo wxInfo = new WxInfo();
+            wxInfo.setUserId(mainInfoVo.getUserId());
+            wxInfo.setOpenid(userDeleteLog.getOpenid());
+            wxInfo.setUnionid(userDeleteLog.getUnionid());
+            wxInfoService.addWxInfo(wxInfo);
+        }
+
+        //设置恢复状态
+        userDeleteLog.setStatus(UserDeleteStatus.RESTORE.ordinal());
+        userDeleteLogService.save(userDeleteLog);
+
+        return mainInfoVo;
+    }
 }

+ 12 - 5
src/main/java/com/YuyeTech/TPlat/game/userinfo/service/UserInfoServiceImpl.java

@@ -11,12 +11,16 @@ import com.YuyeTech.TPlat.game.userinfo.service.UserInfoService;
 import com.YuyeTech.TPlat.game.userinfo.vo.UserInfoVo;
 import com.YuyeTech.TPlat.utils.AliyunOSSUtil;
 import org.apache.commons.lang3.StringUtils;
+import org.hibernate.Session;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -27,8 +31,12 @@ import java.util.stream.Collectors;
  * @date:2019/12/5
  */
 @Service
+@Transactional
 public class UserInfoServiceImpl extends CommonServiceImpl<UserInfoVo, UserInfo, String> implements UserInfoService {
 
+    @PersistenceContext
+    private EntityManager em;
+
     @Autowired
     private UserInfoRepository userInfoRepository;
 
@@ -42,16 +50,14 @@ public class UserInfoServiceImpl extends CommonServiceImpl<UserInfoVo, UserInfo,
     @Override
     public UserInfo findUserInfoById(String userId,Boolean bDomain) {
         UserInfo userInfo = userInfoRepository.findById(userId).orElse(null);
-//        if(userInfo ==null){
-//            throw  new UserException(UserEnum.USER_NOT_EXIST);
-//        }
-
         if(bDomain&&userInfo!=null&& StringUtils.isNoneBlank(userInfo.getAvatarUrl())){
             //修改url,添加访问域名
             String url = aliyunOSSUtil.addDomainName(userInfo.getAvatarUrl());
-
             userInfo.setAvatarUrl(url);
         }
+        //清楚对象缓存,避免update到数据库
+        Session session = em.unwrap(Session.class);
+        session.evict(userInfo);
         return userInfo;
     }
 
@@ -61,6 +67,7 @@ public class UserInfoServiceImpl extends CommonServiceImpl<UserInfoVo, UserInfo,
         return userInfoRepository.save(userInfo);
     }
 
+
     @Override
     public String deleteUserInfoById(String userId) {
         userInfoRepository.deleteById(userId);

+ 4 - 3
src/main/java/com/YuyeTech/TPlat/game/userinfo/vo/MainInfoVo.java

@@ -7,6 +7,7 @@ import org.hibernate.annotations.DynamicUpdate;
 import javax.persistence.Entity;
 import javax.persistence.Id;
 import java.io.Serializable;
+import java.util.Date;
 
 /**
  * @author:slambb
@@ -15,11 +16,11 @@ import java.io.Serializable;
 @Data
 public class MainInfoVo extends PageCondition implements Serializable {
     private String  userId;
-
     private String username;
     private String password;
-
     private String telephoneNumber;
-
     private String email;
+    private Integer status;//用户状态,0:正常,1:预删除
+    private Date createTime;
+    private Date updateTime;
 }

+ 3 - 1
src/main/java/com/YuyeTech/TPlat/game/userinfo/vo/UserInfoVo.java

@@ -39,5 +39,7 @@ public class UserInfoVo extends PageCondition implements Serializable {
     /** 创建时间. */
     private Date registerTime;
 
-    private Integer status;
+    private Date updateTime;
+
+    private Integer status;//0:旧用户,1:新注册
 }

+ 0 - 16
src/main/java/com/YuyeTech/TPlat/repository/AppleInfoServiceRepository.java

@@ -1,16 +0,0 @@
-package com.YuyeTech.TPlat.repository;
-
-import com.YuyeTech.TPlat.dataobject.AppleInfo;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import java.util.Optional;
-
-/**
- * @author:slambb
- * @date:2020/6/4
- */
-public interface AppleInfoServiceRepository extends JpaRepository<AppleInfo,String> {
-
-    Optional<AppleInfo> findByAppleId(String appleId);
-
-}

+ 0 - 12
src/main/java/com/YuyeTech/TPlat/repository/WxInfoRepository.java

@@ -1,12 +0,0 @@
-package com.YuyeTech.TPlat.repository;
-
-import com.YuyeTech.TPlat.dataobject.WxInfo;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-/**
- * @author:slambb
- * @date:2019/12/13
- */
-public interface WxInfoRepository extends JpaRepository<WxInfo,String> {
-    WxInfo findByOpenid(String openid);
-}

+ 0 - 15
src/main/java/com/YuyeTech/TPlat/service/AppleInfoService.java

@@ -1,15 +0,0 @@
-package com.YuyeTech.TPlat.service;
-
-import com.YuyeTech.TPlat.dataobject.AppleInfo;
-
-/**
- * @author:slambb
- * @date:2020/6/4
- */
-public interface AppleInfoService {
-
-    //检查是否存储appleId
-    AppleInfo findByAppleId(String appleId);
-
-    AppleInfo addAppleInfo(AppleInfo appleInfo);
-}

+ 0 - 16
src/main/java/com/YuyeTech/TPlat/service/WxInfoService.java

@@ -1,16 +0,0 @@
-package com.YuyeTech.TPlat.service;
-
-import com.YuyeTech.TPlat.dataobject.WxInfo;
-
-/**
- * @author:slambb
- * @date:2019/12/13
- */
-public interface WxInfoService {
-
-    WxInfo findWxInfoByOpenid(String openid);
-
-    WxInfo addWxInfo(WxInfo wxInfo);
-
-    WxInfo findWxInfoById(String userId);
-}

+ 0 - 32
src/main/java/com/YuyeTech/TPlat/service/impl/WxInfoServicelmpl.java

@@ -1,32 +0,0 @@
-package com.YuyeTech.TPlat.service.impl;
-
-import com.YuyeTech.TPlat.service.WxInfoService;
-import com.YuyeTech.TPlat.dataobject.WxInfo;
-import com.YuyeTech.TPlat.repository.WxInfoRepository;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-/**
- * @author:slambb
- * @date:2019/12/13
- */
-@Service
-public class WxInfoServicelmpl implements WxInfoService {
-    @Autowired
-    private WxInfoRepository wxInfoRepository;
-
-    @Override
-    public WxInfo findWxInfoByOpenid(String openid) {
-        return wxInfoRepository.findByOpenid(openid);
-    }
-
-    @Override
-    public WxInfo addWxInfo(WxInfo wxInfo) {
-        return wxInfoRepository.save(wxInfo);
-    }
-
-    @Override
-    public WxInfo findWxInfoById(String userId) {
-        return wxInfoRepository.findById(userId).orElse(null);
-    }
-}

+ 1 - 1
src/main/java/com/YuyeTech/TPlat/utils/CodeDOM.java

@@ -550,7 +550,7 @@ public class CodeDOM {
     }
 
     public static void main(String[] args) {
-        String[] tables = {"user_data"};
+        String[] tables = {"user_delete_log"};
         for (String table : tables) {
             String msg = new CodeDOM(table).create();
             System.out.println(msg);

+ 30 - 289
src/main/resources/static/client/js/bluetoothInfo.js

@@ -75,12 +75,12 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], func
         , toolbar: '#mainTableToolbarDemo'
         , title: '列表'
         , cols: [[
-            {field: 'bluetoothId', title: '蓝牙ID'}
-            , {field: 'userId', title: '用户id'}
-            , {field: 'bluetoothName', title: '蓝牙名字'}
-            , {field: 'bluetoothMac', title: '蓝牙地址'}
+            {field: 'bluetoothId', title: '蓝牙ID', sort: true}
+            , {field: 'userId', title: '用户id', sort: true}
+            , {field: 'bluetoothName', title: '蓝牙名字', sort: true}
+            , {field: 'bluetoothMac', title: '蓝牙地址', sort: true}
             , {
-                field: 'bluetoothStatus', title: '设备状态', templet: '#bindButton'
+                field: 'bluetoothStatus', title: '设备状态', templet: '#bindButton', sort: true
             }
             , {
                 field: 'bluetoothType', title: '设备类型', templet: function (d) {
@@ -93,7 +93,7 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], func
                     } else {
                         return '未添加:' + d.bluetoothType;
                     }
-                }
+                }, sort: true
             }
             , {
                 field: 'isShare', title: '是否分享', templet: function (d) {
@@ -104,11 +104,11 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], func
                     } else {
                         return '未添加:' + d.isShare;
                     }
-                }
+                }, sort: true
             }
-            , {field: 'identifier', title: '设备标识'}
-            , {field: 'createTime', title: '创建时间', hide: true}
-            , {field: 'updateTime', title: '更新时间', hide: true}
+            , {field: 'identifier', title: '设备标识', sort: true}
+            , {field: 'createTime', title: '创建时间', hide: true, sort: true}
+            , {field: 'updateTime', title: '更新时间', hide: true, sort: true}
             , {fixed: 'right', title: '操作', width: 140, toolbar: '#mainTableBarDemo'}
         ]]
         , defaultToolbar: ['', 'exports', 'print']
@@ -121,34 +121,39 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], func
     table.on('toolbar(test)', function (obj) {
         switch (obj.event) {
             case 'query':
-                //根据用户地址查询
-                findByUserAddress(form);
-                break;
-            case 'playerLogReload':
-                playerLogReload();
+                let queryByInput = $("#queryByInput").val();
+                let query = {
+                    page: {
+                        curr: 1 //重新从第 1 页开始
+                    }
+                    , done: function (res, curr, count) {
+                        //完成后重置where,解决下一次请求携带旧数据
+                        this.where = {};
+                    }
+                };
+                if (!queryByInput) {
+                    queryByInput = "";
+                }else{
+                    query.where = {bluetoothMac: queryByInput};
+                }
+                tableIns.reload(query);
+                $("#queryByInput").val(queryByInput);
                 break;
 
             case 'addNewRow':
-
-                $("#tableId").css("display", "none");
+                // $("#tableId").css("display", "none");
                 $("input[name='itemId']").removeAttr("readonly");
                 $("#tableTime").css("display", "none");
                 $("#saveBtn").css("display", "none");
                 $("#addBtn").css("display", "block");
-
                 $('#bluetoothTypeAdd').find("option").remove();
                 $('#bluetoothTypeAdd').append(new Option("普通绑带", "1", ));
                 $('#bluetoothTypeAdd').append(new Option("沙袋绑带", "2", ));
                 $('#bluetoothTypeAdd').append(new Option("手柄蓝牙", "3", true));
-
                 $('#isShareAdd').find("option").remove();
                 $('#isShareAdd').append(new Option("不共享", "0", true));
                 $('#isShareAdd').append(new Option("共享", "1", ));
-
-
-
                 form.render("select");
-
                 $("#addForm")[0].reset();
                 form.val("addForm", defaultBLEData);
                 form.render();
@@ -178,7 +183,7 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], func
             $('#isShare').append(new Option("共享", "1", ));
             form.render("select");
 
-            $("#tableId").css("display", "block");
+            // $("#tableId").css("display", "block");
             $("input[name='itemId']").attr("readonly", "readonly");
 
             $("#tableTime").css("display", "block");
@@ -243,47 +248,11 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], func
 });
 
 
-function findByUserAddress(form) {
-    if (form) {
-        //重置数据
-        $("#comForm")[0].reset();
-        form.render();
-    }
-    let queryByAddress = $("#queryByAddress").val();
-    //获取菜单数据
-    if (queryByAddress.length <= 0) {
-        layer.msg("输入用户钱包地址查询", {icon: 2, time: 1000}, function () {
-        });
-        return;
-    }
-    tableIns.reload({
-        page: {
-            curr: 1 //重新从第 1 页开始
-            , limit: 10
-        },
-        method: 'POST'
-        , url: ctx + "/sys/sysComUsers/findPlayerBackpack"
-        , where: {address: queryByAddress, sidx: "desc", sord: "createTime"}
-        , done: function (res, curr, count) {
-            // console.log(res, curr, count);
-            $("input[name='queryByAddress']").val(queryByAddress);
-            //this.where={};
-            //不清空,有问题:搜索条件会保留
-            //清空,  有问题:分页的时候没有搜索条件了,分页会受到影响
-        }
-    });
-}
-
 /**
  * 提交保存
  */
 function comFormSave(isAddNew) {
     let comForm = $("#comForm").serializeObject();
-    if (!comForm.bluetoothId && !isAddNew) {
-        layer.msg("选择编辑的对象", {icon: 2, time: 1000}, function () {
-        });
-        return;
-    }
     $.post(ctx + mainSaveUrl, comForm, function (data) {
         if (!data.flag) {
             layer.msg(data.msg, {icon: 2, time: 2000}, function () {
@@ -291,23 +260,12 @@ function comFormSave(isAddNew) {
             return;
         }
         layer.close(openIndex);
-        if (isAddNew) {
-            if (!bHasData) {
-                findByUserAddress();
-            } else {
-                tableIns.reload();
-            }
-        } else {
-            tableIns.reload();
-        }
-
+        tableIns.reload();
     });
 }
 
-
 function comFormAdd() {
     let addForm = $("#addForm").serializeObject();
-    console.log(addForm);
     $.post(ctx + mainSaveUrl, addForm, function (data) {
         if (!data.flag) {
             layer.msg(data.msg, {icon: 2, time: 2000}, function () {
@@ -318,220 +276,3 @@ function comFormAdd() {
         tableIns.reload();
     });
 }
-
-/**
- * 用户操作日志
- * @param table
- * @param data
- */
-function initPlayerLog(table, data) {
-    //用户操作playerLog
-    // console.log("playerLog");
-    tablePlayerLog = table.render({
-        elem: '#comPlayerLogTable'
-        , url: ctx + "/sys/sysComUsers/findPlayerLogPage"
-        , method: 'POST'
-        //请求前参数处理
-        , request: {
-            pageName: 'page' //页码的参数名称,默认:page
-            , limitName: 'rows' //每页数据量的参数名,默认:limit
-        }
-        , where: data
-        , response: {
-            statusName: 'flag' //规定数据状态的字段名称,默认:code
-            , statusCode: true //规定成功的状态码,默认:0
-            , msgName: 'msg' //规定状态信息的字段名称,默认:msg
-            , countName: 'records' //规定数据总数的字段名称,默认:count
-            , dataName: 'rows' //规定数据列表的字段名称,默认:data
-        }
-        //响应后数据处理
-        , parseData: function (res) { //res 即为原始返回的数据
-            let data = res.data;
-            // console.log("playerLog",res);
-            return {
-                "flag": res.flag, //解析接口状态
-                "msg": res.msg, //解析提示文本
-                "records": data.records, //解析数据长度
-                "rows": data.rows //解析数据列表
-            };
-        }
-        , toolbar: '#comPlayerLogTableToolbarDemo'
-        , title: '用户仓库操作列表'
-        , cols: [[
-            {field: 'id', title: 'ID', hide: true}
-            , {field: 'userId', title: 'userId', width: 260}
-            , {field: 'tId', title: '目标id', width: 100}
-            , {
-                field: 'tType', title: '交易的类型', width: 100, templet: function (d) {
-                    if (d.tType == 0) {  // 自定义内容
-                        return '<span style="color: green">收获果实</span>';
-                    } else if (d.tType == 1) {
-                        return '<span style="color: red">种植种子</span>';
-                    } else if (d.tType == 2) {
-                        return '<span style="color: red">赠送</span>';
-                    } else if (d.tType == 3) {
-                        return '<span style="color: green">被赠送</span>';
-                    } else if (d.tType == 4) {
-                        return '<span style="color: green">钻石兑换种子</span>';
-                    } else if (d.tType == 5) {
-                        return '<span style="color: red">出售果实</span>';
-                    } else if (d.tType == 6) {
-                        return '<span style="color: green">偷取果实</span>';
-                    } else if (d.tType == 7) {
-                        return '<span style="color: red">断电扣除果实</span>';
-                    } else {
-                        return '<span style="color: green">待添加:</span>' + d.tType;
-                    }
-                }
-            }
-            , {field: 'tName', title: '物品名字', width: 120}
-            // , {field: 'tAmount', title: '交易数量', width: 150}
-            // , {field: 'beforeAmount', title: '交易前数量'}
-            // , {field: 'afterAmount', title: '交易后数量'}
-            , {
-                field: 'tAmount', title: '交易数量', width: 150, templet: function (d) {
-                    return (d.tAmount + d.tPart).toFixed(5);
-                }
-            }
-            , {
-                field: 'beforeAmount', title: '交易前数量', templet: function (d) {
-                    return (d.beforeAmount + d.beforePart).toFixed(5);
-                }
-            }
-            , {
-                field: 'afterAmount', title: '交易后数量', templet: function (d) {
-                    return (d.afterAmount + d.afterPart).toFixed(5);
-                }
-            }
-            , {field: 'tLoss', title: '系统扣除部分'}
-            , {field: 'lMultiple', title: 'land倍数', width: 80}
-            , {
-                field: 'withered', title: '损耗类型', width: 100, templet: function (d) {
-                    if (d.withered == 0) {  // 自定义内容
-                        return '<span style="color: green">---</span>';
-                    } else if (d.withered == 1) {
-                        return '<span style="color: red">枯萎(死亡)</span>';
-                    } else if (d.withered == 2) {
-                        return '<span style="color: red">断电损耗</span>';
-                    } else {
-                        return '<span style="color: green">待添加:</span>' + d.withered;
-                    }
-                }
-            }
-            , {field: 'createTime', title: '创建时间'}
-            , {field: 'updateTime', title: '更新时间', hide: true}
-        ]]
-        , defaultToolbar: ['', 'exports', 'print']
-        , page: true
-        , height: 500
-        , cellMinWidth: 80
-    });
-}
-
-
-function playerLogReload(data) {
-    tablePlayerLog.reload({
-        page: {
-            curr: 1 //重新从第 1 页开始
-            , limit: 10
-        }
-        , method: 'POST'
-        , url: ctx + "/sys/sysComUsers/findPlayerLogPage"
-        , where: data
-        , done: function (res, curr, count) {
-        }
-    });
-}
-
-
-/**
- * 用户偷取的操作
- * @param table
- * @param data
- */
-function initPlayerProfit(table, data) {
-    //用户操作PlayerProfit
-    tablePlayerProfit = table.render({
-        elem: '#comPlayerProfitTable'
-        , url: ctx + "/sys/sysComUsers/findPlayerProfitPage"
-        , method: 'POST'
-        //请求前参数处理
-        , request: {
-            pageName: 'page' //页码的参数名称,默认:page
-            , limitName: 'rows' //每页数据量的参数名,默认:limit
-        }
-        , where: data
-        , response: {
-            statusName: 'flag' //规定数据状态的字段名称,默认:code
-            , statusCode: true //规定成功的状态码,默认:0
-            , msgName: 'msg' //规定状态信息的字段名称,默认:msg
-            , countName: 'records' //规定数据总数的字段名称,默认:count
-            , dataName: 'rows' //规定数据列表的字段名称,默认:data
-        }
-        //响应后数据处理
-        , parseData: function (res) { //res 即为原始返回的数据
-            let data = res.data;
-            // console.log("playerLog",res);
-            return {
-                "flag": res.flag, //解析接口状态
-                "msg": res.msg, //解析提示文本
-                "records": data.records, //解析数据长度
-                "rows": data.rows //解析数据列表
-            };
-        }
-        , toolbar: '#comPlayerProfitTableToolbarDemo'
-        , title: '用户仓库操作列表'
-        , cols: [[
-            {field: 'id', title: 'ID', hide: true}
-            , {field: 'userId', title: 'userId', width: 260}
-            , {field: 'targetId', title: '目标id', width: 100}
-            , {field: 'plantFlag', title: '种植标识', width: 120}
-            , {field: 'landId', title: '土地号数', width: 120}
-            , {
-                field: 'leaseDate', title: '租赁类型', width: 100, templet: function (d) {
-                    if (d.leaseDate == 1) {  // 自定义内容
-                        return '<span style="color: green">3个月</span>';
-                    } else if (d.leaseDate == 2) {
-                        return '<span style="color: red">1年</span>';
-                    } else if (d.leaseDate == 3) {
-                        return '<span style="color: red">5年</span>';
-                    } else if (d.leaseDate == 4) {
-                        return '<span style="color: red">养殖场</span>';
-                    } else {
-                        return '<span style="color: green">待添加:</span>' + d.leaseDate;
-                    }
-                }
-            }
-            , {field: 'leaseMultiple', title: '租赁倍数', width: 120}
-            , {field: 'harvest', title: '土地产出量', width: 150}
-            , {field: 'profit', title: '利润总值'}
-            , {field: 'profitAfter', title: '交易后利润'}
-            , {field: 'stolen', title: '目标损失量', width: 150}
-            , {field: 'finalSteal', title: '玩家偷取得到的数量'}
-            , {field: 'profitRatio', title: '收成的比例值'}
-            , {field: 'stealRatio', title: '比例区间1%~3%'}
-            , {field: 'finalRatio', title: '损失比例', width: 80}
-            , {field: 'createTime', title: '创建时间'}
-            , {field: 'updateTime', title: '更新时间', hide: true}
-        ]]
-        , defaultToolbar: ['', 'exports', 'print']
-        , page: true
-        , height: 500
-        , cellMinWidth: 80
-    });
-}
-
-
-function playerProfitReload(data) {
-    tablePlayerProfit.reload({
-        page: {
-            curr: 1 //重新从第 1 页开始
-            , limit: 10
-        }
-        , method: 'POST'
-        , url: ctx + "/sys/sysComUsers/findPlayerProfitPage"
-        , where: data
-        , done: function (res, curr, count) {
-        }
-    });
-}

+ 588 - 0
src/main/resources/static/client/js/levelInfo.js

@@ -0,0 +1,588 @@
+let tableIns;
+let openIndex;
+let multiSelectTag;
+
+let mainTableUrl = "/backstage_level/findAll";
+let mainSaveUrl = "/backstage_game/saveBaseInfo";
+let mainDeleteUrl = "/backstage_game/delete";
+let mainUploadUrl = "/backstage_game/uploadImg";
+let mainGameDetailUrl = "/backstage_game/findGameDetail";
+
+
+layui.config({
+    base: ctx + '/common/'
+}).extend({
+    xmSelect: 'layui/xm-select',
+    step: 'step-lay/step',
+    dragMove: 'dragMove/dragMove'
+})
+layui.use(['element', 'form', 'table', 'layer', 'laydate', 'util', 'upload', 'xmSelect', 'step', 'dragMove'], function () {
+    let element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
+    let laydate = layui.laydate;
+    let table = layui.table, upload = layui.upload, form = layui.form;//select、单选、复选等依赖form
+    let step = layui.step, xmSelect = layui.xmSelect, dragMove = layui.dragMove;//引入工具
+    let layer = layui.layer;
+    form.verify({
+        // positiveInteger: [/^(([0-9]+[\.]?[0-9]+)|[1-9])$/, '只能填写正整数'],//必填,且只能输入正整数
+        positiveInteger: [/^[1-9]\d*$/, '只能填写正整数'],//必填,且只能输入正整数
+    });
+    /**
+     * 渲染图片查看
+     */
+    dragMove.render({
+        elem: "#cardBody", //指向图片的父容器
+        layerArea: ["960px", "720px"], //弹窗的宽高,同layer的area,默认["960px","720px"]
+        layerShade: 0.6, //遮罩的透明度,同layer的shade,默认0.6
+        layerMove: false, //触发拖动的元素,同layer的move,这里默认禁止,可设置为'.layui-layer-title'
+        maxZoom: 1 //图片能放大的最大倍数,默认1倍
+    });
+    //主列表渲染
+    tableIns = table.render({
+        elem: '#mainTable'
+        , url: ctx + mainTableUrl
+        , method: 'POST'
+        //请求前参数处理
+        , request: {
+            pageName: 'page' //页码的参数名称,默认:page
+            , limitName: 'rows' //每页数据量的参数名,默认:limit
+        }
+        // , where: {sidx: "desc", sord: "createTime"}
+        , response: {
+            statusName: 'flag' //规定数据状态的字段名称,默认:code
+            , statusCode: true //规定成功的状态码,默认:0
+            , msgName: 'msg' //规定状态信息的字段名称,默认:msg
+            , countName: 'records' //规定数据总数的字段名称,默认:count
+            , dataName: 'rows' //规定数据列表的字段名称,默认:data
+        }
+        //响应后数据处理
+        , parseData: function (res) { //res 即为原始返回的数据
+            let data = res.data;
+            console.log("返回的地址数据:", data);
+            // if (data.rows && data.rows.length > 0) {
+            // }
+            return {
+                "flag": res.flag, //解析接口状态
+                "msg": res.msg, //解析提示文本
+                "records": data.records, //解析数据长度
+                "rows": data.rows //解析数据列表
+            };
+        }
+        , toolbar: '#mainTableToolbarDemo'
+        , title: '列表'
+        , cols: [[
+            {field: 'id', title: 'ID', sort: true}
+            , {field: 'name', title: '名称', sort: true}
+            , {field: 'describe', title: '描述', hide: true, sort: true}
+            , {field: 'rewardGold', title: '奖励金币', sort: true}
+            , {field: 'rewardDiamond', title: '奖励钻石', sort: true}
+            , {field: 'rewardHonor', title: '奖励荣誉', sort: true}
+            , {field: 'consumeGold', title: '消耗金币', sort: true}
+            , {field: 'consumeDiamond', title: '消耗钻石', sort: true}
+            , {field: 'signCount', title: '标志块的总数', sort: true}
+            , {field: 'signType', title: '标志块的种类', sort: true}
+            , {field: 'limitTime', title: '限时(秒),0-不限时', sort: true}
+            , {field: 'consumeDiamond', title: '消耗钻石', sort: true}
+            , {field: 'conditionUnlock', title: '解锁条件类型', sort: true}
+            , {field: 'conditionPassed', title: '通过关卡时候的类型', sort: true}
+            , {field: 'explain', title: '补充说明', sort: true}
+            , {field: 'numberType', title: '人数类型 1单人 2pk*', sort: true}
+            , {field: 'sort', title: '顺序*', sort: true}
+            , {field: 'type', title: '关卡类型*', sort: true}
+            , {field: 'createTime', title: '创建时间', hide: true, sort: true}
+            , {field: 'updateTime', title: '更新时间', hide: true, sort: true}
+            // , {fixed: 'right', title: '操作', width: 140, toolbar: '#mainTableBarDemo'}
+        ]]
+        , defaultToolbar: ['', 'exports', 'print']
+        , page: true
+        // , height: height
+        , cellMinWidth: 80
+    });
+
+    //渲染步骤条
+    step.render({
+        elem: '#stepForm',
+        filter: 'stepForm',
+        width: '100%', //设置容器宽度
+        stepWidth: '600px',
+        height: '1000px',
+        stepItems: [{
+            title: '填入游戏基本信息'
+        }, {
+            title: '上传游戏对应图片'
+        }, {
+            title: '完成'
+        }]
+    });
+
+    /**
+     * 添加新游戏信息时候图片上传
+     */
+    let uploadIcon = upload.render({
+        elem: '#iconAdd'
+        , url: ctx + mainUploadUrl
+        , data: {
+            type: 'icon', gameId: function () {
+                return $('#newGameId').val();
+            }
+        }
+        // , auto: false
+        , before: function (obj) {
+            //预读本地文件示例,不支持ie8
+            obj.preview(function (index, file, result) {
+                $('#iconImageAdd').attr('src', result); //图片链接(base64)
+            });
+            // element.progress('iconProgress', '0%'); //进度条复位
+            layer.msg('上传中', {icon: 16, time: 0});
+            // console.log("before" + JSON.stringify(obj));
+        }
+        , done: function (res) {
+            //如果上传失败
+            if (res.code > 0) {
+                return layer.msg('上传失败');
+            }
+            //上传成功的一些操作
+            //……
+            $('#iconTextAdd').html(''); //置空上传失败的状态
+            // console.log("done" + JSON.stringify(res));
+            layer.msg('上传成功', {icon: 1});
+        }
+        , error: function () {
+            //演示失败状态,并实现重传
+            let demoText = $('#iconTextAdd');
+            demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');
+            demoText.find('.demo-reload').on('click', function () {
+                uploadIcon.upload();
+            });
+        }
+    });
+
+    let uploadPicture = upload.render({
+        elem: '#pictureAdd'
+        , url: ctx + mainUploadUrl
+        , data: {
+            type: 'picture', gameId: function () {
+                return $('#newGameId').val();
+            }
+        }
+        , before: function (obj) {
+            obj.preview(function (index, file, result) {
+                $('#pictureImageAdd').attr('src', result);
+            });
+            layer.msg('上传中', {icon: 16, time: 0});
+        }
+        , done: function (res) {
+            //如果上传失败
+            if (res.code > 0) {
+                return layer.msg('上传失败');
+            }
+            //上传成功的一些操作
+            $('#pictureTextAdd').html(''); //置空上传失败的状态
+            layer.msg('上传成功', {icon: 1});
+        }
+        , error: function () {
+            //演示失败状态,并实现重传
+            let demoText = $('#pictureTextAdd');
+            demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');
+            demoText.find('.demo-reload').on('click', function () {
+                uploadPicture.upload();
+            });
+        }
+        //进度条
+        // , progress: function (n, elem, e) {
+        //     element.progress('pictureProgress', n + '%'); //可配合 layui 进度条元素使用
+        //     if (n == 100) {
+        //         layer.msg('上传完毕', {icon: 1});
+        //     }
+        // }
+    });
+
+    //多图片上传
+    let uploadScroll = upload.render({
+        elem: '#scrollAdd'
+        , url: ctx + mainUploadUrl
+        , data: {
+            type: 'scroll', gameId: function () {
+                return $('#newGameId').val();
+            }
+        }
+        , multiple: true
+        , before: function (obj) {
+            //预读本地文件示例,不支持ie8
+            obj.preview(function (index, file, result) {
+                $('#scrollImageListAdd').append('<img src="' + result + '" alt="' + file.name + '" class="layui-upload-img">')
+            });
+        }
+        , done: function (res) {
+            //上传完毕
+            layer.msg('上传完毕', {icon: 1});
+        }
+    });
+
+    /**
+     * 修改信息时候图片上传
+     */
+    let modifyIcon = upload.render({
+        elem: '#icon'
+        , url: ctx + mainUploadUrl
+        , data: {
+            type: 'icon', gameId: function () {
+                return $('#modifyGameId').val();
+            }
+        }
+        , before: function (obj) {
+            //预读本地文件示例,不支持ie8
+            obj.preview(function (index, file, result) {
+                $('#iconImage').attr('src', result); //图片链接(base64)
+            });
+            layer.msg('上传中', {icon: 16, time: 0});
+        }
+        , done: function (res) {
+            //如果上传失败
+            if (res.code > 0) {
+                return layer.msg('上传失败');
+            }
+            $('#iconText').html('');
+            layer.msg('上传成功', {icon: 1});
+        }
+        , error: function () {
+            //演示失败状态,并实现重传
+            let demoText = $('#iconText');
+            demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');
+            demoText.find('.demo-reload').on('click', function () {
+                modifyIcon.upload();
+            });
+        }
+    });
+
+    let modifyPicture = upload.render({
+        elem: '#picture'
+        , url: ctx + mainUploadUrl
+        , data: {
+            type: 'picture', gameId: function () {
+                return $('#modifyGameId').val();
+            }
+        }
+        , before: function (obj) {
+            obj.preview(function (index, file, result) {
+                $('#pictureImage').attr('src', result);
+            });
+            layer.msg('上传中', {icon: 16, time: 0});
+        }
+        , done: function (res) {
+            //如果上传失败
+            if (res.code > 0) {
+                return layer.msg('上传失败');
+            }
+            //上传成功的一些操作
+            $('#pictureText').html(''); //置空上传失败的状态
+            layer.msg('上传成功', {icon: 1});
+        }
+        , error: function () {
+            //演示失败状态,并实现重传
+            let demoText = $('#pictureText');
+            demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');
+            demoText.find('.demo-reload').on('click', function () {
+                modifyPicture.upload();
+            });
+        }
+    });
+
+    let modifyScroll = upload.render({
+        elem: '#scroll'
+        , url: ctx + mainUploadUrl
+        , data: {
+            type: 'scroll', gameId: function () {
+                return $('#modifyGameId').val();
+            }
+        }
+        , multiple: true
+        , before: function (obj) {
+            //预读本地文件示例,不支持ie8
+            obj.preview(function (index, file, result) {
+                $('#scrollImageList').append('<img src="' + result + '" alt="' + file.name + '" class="layui-upload-img">')
+            });
+        }
+        , done: function (res) {
+            //上传完毕
+            layer.msg('上传完毕', {icon: 1});
+        }
+    });
+
+    //渲染多选tags
+    let dataArray = [];
+    for (let i = 0; i < allCustomTags.length; i++) {
+        let tag = allCustomTags[i];
+        dataArray.push({name: tag.tagName, value: tag.tagId})
+    }
+    ['#multiselectTagAdd', '#multiselectTag'].forEach((el, index) => {
+        xmSelect.render({
+            el,
+            layVerify: 'required',
+            layVerType: 'tips',
+            data: dataArray
+        });
+    });
+
+    //头工具栏事件
+    table.on('toolbar(test)', function (obj) {
+        switch (obj.event) {
+            case 'addNewRow':
+                $("#tableId").css("display", "none");
+                $("input[name='itemId']").removeAttr("readonly");
+                $("#tableTime").css("display", "none");
+                $("#updateTime").css("display", "none");
+                $("#saveBtn").css("display", "none");
+                $("#addBtn").css("display", "block");
+
+                $('#gameStatusAdd').find("option").remove();
+                $('#gameStatusAdd').append(new Option("下线", "0", true));
+                $('#gameStatusAdd').append(new Option("上线", "1"));
+
+                $('#gameTypeAdd').find("option").remove();
+                for (let i = 0; i < categoryList.length; i++) {
+                    let category = categoryList[i];
+                    $('#gameTypeAdd').append(new Option(category.categoryName, category.categoryType));
+                }
+
+                $('#platformAdd').find("option").remove();
+                $('#platformAdd').append(new Option("Android", "0"));
+                $('#platformAdd').append(new Option("IOS", "1"));
+                $('#platformAdd').append(new Option("同时支持两个平台", "2", true));
+
+                form.render("select");
+
+
+                $("#addForm")[0].reset();
+                form.render();
+                //重置图片信息
+                $('#iconImageAdd').attr('src', '');
+                $('#pictureImageAdd').attr('src', '');
+
+
+                // form.val("addForm", defaultBLEData);
+                openIndex = layer.open({
+                    type: 1,  //可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
+                    title: ['新增数据', 'font-size:18px;'],//数组第二项可以写任意css样式;如果你不想显示标题栏,你可以title: false
+                    area: ['80%', '80%'],
+                    content: $('#show_add_div')
+                });
+                break;
+        }
+    });
+
+    //监听行工具事件
+    table.on('tool(test)', function (obj) {
+        let data = obj.data;
+        console.log("data:", data);
+        //编辑
+        if (obj.event === 'edit') {
+            //先查询数据,再显示
+            $.post(ctx + mainGameDetailUrl, {gameId: data.gameId}, function (res) {
+                if (!res.flag) {
+                    layer.msg(res.msg, {icon: 2, time: 2000}, function () {
+                    });
+                    return;
+                }
+                let gameInfo = res.data.gameInfo;
+                let gamePicturesList = res.data.gamePicturesList;
+                let gameTags = res.data.gameTags;
+
+                $('#gameStatus').find("option").remove();
+                $('#gameStatus').append(new Option("下线", "0", gameInfo.gameStatus === 0));
+                $('#gameStatus').append(new Option("上线", "1", gameInfo.gameStatus === 1));
+
+                $('#gameType').find("option").remove();
+                for (let i = 0; i < categoryList.length; i++) {
+                    let category = categoryList[i];
+                    $('#gameType').append(new Option(category.categoryName, category.categoryType, gameInfo.gameType === category.categoryType));
+                }
+
+                $('#platform').find("option").remove();
+                $('#platform').append(new Option("Android", "0", gameInfo.platform === 0));
+                $('#platform').append(new Option("IOS", "1", gameInfo.platform === 1));
+                $('#platform').append(new Option("同时支持两个平台", "2", gameInfo.platform === 2));
+
+                form.render("select");
+
+                //渲染多选tags
+                let defaultArray = [];
+                for (let i = 0; i < gameTags.length; i++) {
+                    let tag = gameTags[i];
+                    defaultArray.push(tag.tagId)
+                }
+                //设置value默认数组
+                xmSelect.get('#multiselectTag', true).setValue(defaultArray)
+
+
+                //重置图片信息
+                $('#iconImage').attr('src', domainName + gameInfo.gameIcon);
+                $('#pictureImage').attr('src', domainName + gameInfo.gamePicture);
+                $('#scrollImageList').children().remove();
+                for (let i = 0; i < gamePicturesList.length; i++) {
+                    $('#scrollImageList').append('<img src="' + domainName + gamePicturesList[i] + '"  alt="" class="layui-upload-img">')
+                }
+
+                $("#tableId").css("display", "block");
+                $("input[name='itemId']").attr("readonly", "readonly");
+
+                $("#tableTime").css("display", "block");
+                $("#updateTime").css("display", "block");
+                $("#saveBtn").css("display", "block");
+                $("#addBtn").css("display", "none");
+                //回显操作表单
+                $("#comForm").form(data);
+                form.render();
+
+                openIndex = layer.open({
+                    type: 1,  //可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
+                    title: ['修改数据', 'font-size:18px;'],//数组第二项可以写任意css样式;如果你不想显示标题栏,你可以title: false
+                    area: ['50%', '80%'],
+                    content: $('#show_div')
+                });
+            });
+
+
+        } else if (obj.event === 'del') {
+            layer.confirm('真的删除这个游戏么?', function (index) {
+                // console.log(ctx + mainDeleteUrl);
+                $.post(ctx + mainDeleteUrl, {id: data.gameId}, function (data) {
+                    if (!data.flag) {
+                        layer.msg(data.msg, {icon: 2, time: 2000}, function () {
+                        });
+                        return;
+                    }
+                    obj.del();
+                    tableIns.reload();
+                });
+                layer.close(index);
+            });
+        }
+    });
+
+
+    //日期选择器
+    // ['#showTimeDate', '#AddShowTimeDate'].forEach((el, index) => {
+    //     laydate.render({
+    //         elem:el,
+    //         format: "yyyy-MM-dd HH:mm:ss"
+    //     });
+    // });
+
+    //监听提交
+    form.on('submit(comFilter)', function (data) {
+        comFormSave();
+    });
+
+    form.on('submit(formStep)', function (data) {
+        //先存储一次数据,生成数据后,进行下一步
+        // let stepForm = $("#stepForm").serializeObject();
+        let selectStr = xmSelect.get('#multiselectTagAdd', true).getValue('valueStr');
+        data.field.multiSelectTag = selectStr;
+        console.log(data.field);
+        $.post(ctx + mainSaveUrl, data.field, function (data) {
+            if (!data.flag) {
+                layer.msg(data.msg, {icon: 2, time: 2000}, function () {
+                });
+                return;
+            }
+            // layer.close(openIndex);
+            console.log("data:" + data)
+            // currentGameInfo = data.data;
+            //回显
+            $("#stepForm").form(data.data);
+            form.render();
+            //下一步
+            step.next('#stepForm');
+        });
+        return false;
+    });
+
+    form.on('submit(formStep2)', function (data) {
+        step.next('#stepForm');
+        return false;
+    });
+
+    $('.updateGameInfo').click(function () {
+        tableIns.reload();
+        layer.close(openIndex);
+    });
+
+    $('.newGameInfo').click(function () {
+        tableIns.reload();
+        //重置表单数据
+        $("#addForm")[0].reset();
+        form.render();
+        //重置图片信息
+        $('#iconImageAdd').attr('src', '');
+        $('#pictureImageAdd').attr('src', '');
+
+        step.next('#stepForm');
+    });
+
+    $('.pre').click(function () {
+        step.pre('#stepForm');
+    });
+
+    $('.next').click(function () {
+        step.next('#stepForm');
+    });
+
+    $("#saveBtn").css("display", "none");
+    $("#addBtn").css("display", "none");
+});
+
+
+function findByUserAddress(form) {
+    if (form) {
+        //重置数据
+        $("#comForm")[0].reset();
+        form.render();
+    }
+    let queryByAddress = $("#queryByAddress").val();
+    //获取菜单数据
+    if (queryByAddress.length <= 0) {
+        layer.msg("输入用户钱包地址查询", {icon: 2, time: 1000}, function () {
+        });
+        return;
+    }
+    tableIns.reload({
+        page: {
+            curr: 1 //重新从第 1 页开始
+            , limit: 10
+        },
+        method: 'POST'
+        , url: ctx + "/sys/sysComUsers/findPlayerBackpack"
+        , where: {address: queryByAddress, sidx: "desc", sord: "createTime"}
+        , done: function (res, curr, count) {
+            // console.log(res, curr, count);
+            $("input[name='queryByAddress']").val(queryByAddress);
+            //this.where={};
+            //不清空,有问题:搜索条件会保留
+            //清空,  有问题:分页的时候没有搜索条件了,分页会受到影响
+        }
+    });
+}
+
+/**
+ * 提交保存
+ */
+function comFormSave() {
+    let comForm = $("#comForm").serializeObject();
+    if (!comForm.gameId) {
+        layer.msg("选择编辑的对象", {icon: 2, time: 1000}, function () {
+        });
+        return;
+    }
+    let selectStr = xmSelect.get('#multiselectTag', true).getValue('valueStr');
+    comForm.multiSelectTag = selectStr;
+
+    $.post(ctx + mainSaveUrl, comForm, function (data) {
+        if (!data.flag) {
+            layer.msg(data.msg, {icon: 2, time: 2000}, function () {
+            });
+            return;
+        }
+        layer.close(openIndex);
+        tableIns.reload();
+    });
+}

+ 80 - 468
src/main/resources/static/client/js/userInfo.js

@@ -3,24 +3,21 @@ let openIndex;
 let multiSelectTag;
 
 let mainTableUrl = "/backstage_user/findAll";
-let mainSaveUrl = "/backstage_game/saveBaseInfo";
-let mainDeleteUrl = "/backstage_user/delete";
-let mainUploadUrl = "/backstage_game/uploadImg";
-let mainGameDetailUrl = "/backstage_game/findGameDetail";
+let mainDeleteUrl = "/backstage_user/deleteUser";
+let mainUserDetailUrl = "/backstage_user/findUserDetail";
 
 
 layui.config({
     base: ctx + '/common/'
 }).extend({
     xmSelect: 'layui/xm-select',
-    step: 'step-lay/step',
     dragMove: 'dragMove/dragMove'
 })
-layui.use(['element', 'form', 'table', 'layer', 'laydate', 'util', 'upload', 'xmSelect', 'step', 'dragMove'], function () {
+layui.use(['element', 'form', 'table', 'layer', 'laydate', 'util', 'upload', 'xmSelect', 'dragMove'], function () {
     let element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
     let laydate = layui.laydate;
     let table = layui.table, upload = layui.upload, form = layui.form;//select、单选、复选等依赖form
-    let step = layui.step, xmSelect = layui.xmSelect, dragMove = layui.dragMove;//引入工具
+    let  xmSelect = layui.xmSelect, dragMove = layui.dragMove;//引入工具
     let layer = layui.layer;
     form.verify({
         // positiveInteger: [/^(([0-9]+[\.]?[0-9]+)|[1-9])$/, '只能填写正整数'],//必填,且只能输入正整数
@@ -46,7 +43,7 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'util', 'upload', 'xm
             pageName: 'page' //页码的参数名称,默认:page
             , limitName: 'rows' //每页数据量的参数名,默认:limit
         }
-        , where: {sidx: "desc", sord: "registerTime"}
+        , where: {sidx: "desc", sord: "createTime"}
         , response: {
             statusName: 'flag' //规定数据状态的字段名称,默认:code
             , statusCode: true //规定成功的状态码,默认:0
@@ -71,29 +68,46 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'util', 'upload', 'xm
         , title: '列表'
         , cols: [[
             {field: 'userId', title: '用户ID', sort: true}
-            , {field: 'username', title: '用户名称', sort: true}
+            , {field: 'username', title: '用户名字', hide: true, sort: true}
+            , {field: 'password', title: '用户密码', hide: true, sort: true}
+            , {field: 'telephoneNumber', title: '电话', sort: true}
+            , {field: 'email', title: '邮箱', sort: true}
             , {
-                field: 'gender', title: '性别', templet: function (d) {
-                    if (d.gender == 0) {
-                        return '<span style="color: green">男</span>';
-                    } else if (d.gender == 1) {
-                        return '<span style="color: red">女</span>';
+                field: 'status', title: '状态', templet: function (d) {
+                    if (d.status == 0) {
+                        return '<span style="color: green">正常</span>';
+                    } else if (d.status == 1) {
+                        return '<span style="color: red">已挂起</span>';
+                    } else if (d.status == 2) {
+                        return '<span style="color: red">已恢复</span>';
                     } else {
-                        return '未添加:' + d.gender;
+                        return '未添加:' + d.status;
                     }
                 }, sort: true
             }
-            , {field: 'cityCode', title: '城市代码', sort: true}
-            , {field: 'birthday', title: '生日', sort: true}
-            , {field: 'signature', title: '签名'}
-            , {field: 'avatarUrl', title: '头像', templet: '#avatarPicture'}
-            , {field: 'height', title: '身高', sort: true}
-            , {field: 'weight', title: '体重', sort: true}
-            , {field: 'registerTime', title: '注册时间', sort: true}
-            , {field: 'status', title: '状态', hide: true, sort: true}
-            // , {field: 'createTime', title: '创建时间', hide: true, sort: true}
-            // , {field: 'updateTime', title: '更新时间', hide: true, sort: true}
-            , {fixed: 'right', title: '操作', width: 140, toolbar: '#mainTableBarDemo'}
+            // , {field: 'username', title: '用户名称', sort: true}
+            // , {
+            //     field: 'gender', title: '性别', templet: function (d) {
+            //         if (d.gender == 0) {
+            //             return '<span style="color: green">男</span>';
+            //         } else if (d.gender == 1) {
+            //             return '<span style="color: red">女</span>';
+            //         } else {
+            //             return '未添加:' + d.gender;
+            //         }
+            //     }, sort: true
+            // }
+            // , {field: 'cityCode', title: '城市代码', sort: true}
+            // , {field: 'birthday', title: '生日', sort: true}
+            // , {field: 'signature', title: '签名'}
+            // , {field: 'avatarUrl', title: '头像', templet: '#avatarPicture'}
+            // , {field: 'height', title: '身高', sort: true}
+            // , {field: 'weight', title: '体重', sort: true}
+            // , {field: 'registerTime', title: '注册时间', sort: true}
+            // , {field: 'status', title: '状态', hide: true, sort: true}
+            , {field: 'createTime', title: '创建时间', sort: true}
+            , {field: 'updateTime', title: '更新时间', sort: true}
+            , {fixed: 'right', title: '操作', width: 300, toolbar: '#mainTableBarDemo'}
         ]]
         , defaultToolbar: ['', 'exports', 'print']
         , page: true
@@ -101,259 +115,11 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'util', 'upload', 'xm
         , cellMinWidth: 80
     });
 
-    //渲染步骤条
-    step.render({
-        elem: '#stepForm',
-        filter: 'stepForm',
-        width: '100%', //设置容器宽度
-        stepWidth: '600px',
-        height: '1000px',
-        stepItems: [{
-            title: '填入游戏基本信息'
-        }, {
-            title: '上传游戏对应图片'
-        }, {
-            title: '完成'
-        }]
-    });
-
-    /**
-     * 添加新游戏信息时候图片上传
-     */
-    let uploadIcon = upload.render({
-        elem: '#iconAdd'
-        , url: ctx + mainUploadUrl
-        , data: {
-            type: 'icon', gameId: function () {
-                return $('#newGameId').val();
-            }
-        }
-        // , auto: false
-        , before: function (obj) {
-            //预读本地文件示例,不支持ie8
-            obj.preview(function (index, file, result) {
-                $('#iconImageAdd').attr('src', result); //图片链接(base64)
-            });
-            // element.progress('iconProgress', '0%'); //进度条复位
-            layer.msg('上传中', {icon: 16, time: 0});
-            // console.log("before" + JSON.stringify(obj));
-        }
-        , done: function (res) {
-            //如果上传失败
-            if (res.code > 0) {
-                return layer.msg('上传失败');
-            }
-            //上传成功的一些操作
-            //……
-            $('#iconTextAdd').html(''); //置空上传失败的状态
-            // console.log("done" + JSON.stringify(res));
-            layer.msg('上传成功', {icon: 1});
-        }
-        , error: function () {
-            //演示失败状态,并实现重传
-            let demoText = $('#iconTextAdd');
-            demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');
-            demoText.find('.demo-reload').on('click', function () {
-                uploadIcon.upload();
-            });
-        }
-    });
-
-    let uploadPicture = upload.render({
-        elem: '#pictureAdd'
-        , url: ctx + mainUploadUrl
-        , data: {
-            type: 'picture', gameId: function () {
-                return $('#newGameId').val();
-            }
-        }
-        , before: function (obj) {
-            obj.preview(function (index, file, result) {
-                $('#pictureImageAdd').attr('src', result);
-            });
-            layer.msg('上传中', {icon: 16, time: 0});
-        }
-        , done: function (res) {
-            //如果上传失败
-            if (res.code > 0) {
-                return layer.msg('上传失败');
-            }
-            //上传成功的一些操作
-            $('#pictureTextAdd').html(''); //置空上传失败的状态
-            layer.msg('上传成功', {icon: 1});
-        }
-        , error: function () {
-            //演示失败状态,并实现重传
-            let demoText = $('#pictureTextAdd');
-            demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');
-            demoText.find('.demo-reload').on('click', function () {
-                uploadPicture.upload();
-            });
-        }
-        //进度条
-        // , progress: function (n, elem, e) {
-        //     element.progress('pictureProgress', n + '%'); //可配合 layui 进度条元素使用
-        //     if (n == 100) {
-        //         layer.msg('上传完毕', {icon: 1});
-        //     }
-        // }
-    });
-
-    //多图片上传
-    let uploadScroll = upload.render({
-        elem: '#scrollAdd'
-        , url: ctx + mainUploadUrl
-        , data: {
-            type: 'scroll', gameId: function () {
-                return $('#newGameId').val();
-            }
-        }
-        , multiple: true
-        , before: function (obj) {
-            //预读本地文件示例,不支持ie8
-            obj.preview(function (index, file, result) {
-                $('#scrollImageListAdd').append('<img src="' + result + '" alt="' + file.name + '" class="layui-upload-img">')
-            });
-        }
-        , done: function (res) {
-            //上传完毕
-            layer.msg('上传完毕', {icon: 1});
-        }
-    });
-
-    /**
-     * 修改信息时候图片上传
-     */
-    let modifyIcon = upload.render({
-        elem: '#icon'
-        , url: ctx + mainUploadUrl
-        , data: {
-            type: 'icon', gameId: function () {
-                return $('#modifyGameId').val();
-            }
-        }
-        , before: function (obj) {
-            //预读本地文件示例,不支持ie8
-            obj.preview(function (index, file, result) {
-                $('#iconImage').attr('src', result); //图片链接(base64)
-            });
-            layer.msg('上传中', {icon: 16, time: 0});
-        }
-        , done: function (res) {
-            //如果上传失败
-            if (res.code > 0) {
-                return layer.msg('上传失败');
-            }
-            $('#iconText').html('');
-            layer.msg('上传成功', {icon: 1});
-        }
-        , error: function () {
-            //演示失败状态,并实现重传
-            let demoText = $('#iconText');
-            demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');
-            demoText.find('.demo-reload').on('click', function () {
-                modifyIcon.upload();
-            });
-        }
-    });
-
-    let modifyPicture = upload.render({
-        elem: '#picture'
-        , url: ctx + mainUploadUrl
-        , data: {
-            type: 'picture', gameId: function () {
-                return $('#modifyGameId').val();
-            }
-        }
-        , before: function (obj) {
-            obj.preview(function (index, file, result) {
-                $('#pictureImage').attr('src', result);
-            });
-            layer.msg('上传中', {icon: 16, time: 0});
-        }
-        , done: function (res) {
-            //如果上传失败
-            if (res.code > 0) {
-                return layer.msg('上传失败');
-            }
-            //上传成功的一些操作
-            $('#pictureText').html(''); //置空上传失败的状态
-            layer.msg('上传成功', {icon: 1});
-        }
-        , error: function () {
-            //演示失败状态,并实现重传
-            let demoText = $('#pictureText');
-            demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');
-            demoText.find('.demo-reload').on('click', function () {
-                modifyPicture.upload();
-            });
-        }
-    });
-
-    let modifyScroll = upload.render({
-        elem: '#scroll'
-        , url: ctx + mainUploadUrl
-        , data: {
-            type: 'scroll', gameId: function () {
-                return $('#modifyGameId').val();
-            }
-        }
-        , multiple: true
-        , before: function (obj) {
-            //预读本地文件示例,不支持ie8
-            obj.preview(function (index, file, result) {
-                $('#scrollImageList').append('<img src="' + result + '" alt="' + file.name + '" class="layui-upload-img">')
-            });
-        }
-        , done: function (res) {
-            //上传完毕
-            layer.msg('上传完毕', {icon: 1});
-        }
-    });
-
     //头工具栏事件
     table.on('toolbar(test)', function (obj) {
         switch (obj.event) {
             case 'addNewRow':
-                $("#tableId").css("display", "none");
-                $("input[name='itemId']").removeAttr("readonly");
-                $("#tableTime").css("display", "none");
-                $("#updateTime").css("display", "none");
-                $("#saveBtn").css("display", "none");
-                $("#addBtn").css("display", "block");
-
-                $('#gameStatusAdd').find("option").remove();
-                $('#gameStatusAdd').append(new Option("下线", "0", true));
-                $('#gameStatusAdd').append(new Option("上线", "1"));
-
-                $('#gameTypeAdd').find("option").remove();
-                for (let i = 0; i < categoryList.length; i++) {
-                    let category = categoryList[i];
-                    $('#gameTypeAdd').append(new Option(category.categoryName, category.categoryType));
-                }
-
-                $('#platformAdd').find("option").remove();
-                $('#platformAdd').append(new Option("Android", "0"));
-                $('#platformAdd').append(new Option("IOS", "1"));
-                $('#platformAdd').append(new Option("同时支持两个平台", "2", true));
-
-                form.render("select");
-
-
-                $("#addForm")[0].reset();
-                form.render();
-                //重置图片信息
-                $('#iconImageAdd').attr('src', '');
-                $('#pictureImageAdd').attr('src', '');
 
-
-                // form.val("addForm", defaultBLEData);
-                openIndex = layer.open({
-                    type: 1,  //可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
-                    title: ['新增数据', 'font-size:18px;'],//数组第二项可以写任意css样式;如果你不想显示标题栏,你可以title: false
-                    area: ['80%', '80%'],
-                    content: $('#show_add_div')
-                });
                 break;
             case 'query':
                 let queryByLoginName = $("#queryByLoginName").val();
@@ -363,14 +129,28 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'util', 'upload', 'xm
                     }
                     , done: function (res, curr, count) {
                         //完成后重置where,解决下一次请求携带旧数据
-                        // this.where = {};
+                        this.where = {};
                     }
                 };
                 if (!queryByLoginName) {
                     queryByLoginName = "";
+                } else {
+                    if (!~queryByLoginName.indexOf('@')) {
+                        if (!commonUtil.checkPhone(queryByLoginName)) {
+                            layer.msg('请输入正确手机号');
+                            return;
+                        }
+                        //设定异步数据接口的额外参数
+                        query.where = {telephoneNumber: queryByLoginName};
+                    } else {
+                        if (!commonUtil.checkEMail(queryByLoginName)) {
+                            layer.msg('请输入正确邮箱号');
+                            return;
+                        }
+                        //设定异步数据接口的额外参数
+                        query.where = {email: queryByLoginName};
+                    }
                 }
-                //设定异步数据接口的额外参数
-                query.where = {username: queryByLoginName};
                 tableIns.reload(query);
                 $("#queryByLoginName").val(queryByLoginName);
                 break;
@@ -381,215 +161,47 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'util', 'upload', 'xm
     table.on('tool(test)', function (obj) {
         let data = obj.data;
         console.log("data:", data);
-        //编辑
-        if (obj.event === 'edit') {
+        if (obj.event === 'del') {
+            layer.confirm('真的删除这个用户么?', function (index) {
+                // console.log(ctx + mainDeleteUrl);
+                $.post(ctx + mainDeleteUrl, {userId: data.userId}, function (data) {
+                    if (!data.flag) {
+                        layer.msg(data.msg, {icon: 2, time: 2000}, function () {
+                        });
+                        return;
+                    }
+                    obj.del();
+                    tableIns.reload();
+                });
+                layer.close(index);
+            });
+        } else if (obj.event === 'detail') {
             //先查询数据,再显示
-            $.post(ctx + mainGameDetailUrl, {gameId: data.gameId}, function (res) {
+            $.post(ctx + mainUserDetailUrl, {userId: data.userId}, function (res) {
                 if (!res.flag) {
                     layer.msg(res.msg, {icon: 2, time: 2000}, function () {
                     });
                     return;
                 }
-                let gameInfo = res.data.gameInfo;
-                let gamePicturesList = res.data.gamePicturesList;
-                let gameTags = res.data.gameTags;
-
-                $('#gameStatus').find("option").remove();
-                $('#gameStatus').append(new Option("下线", "0", gameInfo.gameStatus === 0));
-                $('#gameStatus').append(new Option("上线", "1", gameInfo.gameStatus === 1));
-
-                $('#gameType').find("option").remove();
-                for (let i = 0; i < categoryList.length; i++) {
-                    let category = categoryList[i];
-                    $('#gameType').append(new Option(category.categoryName, category.categoryType, gameInfo.gameType === category.categoryType));
-                }
-
-                $('#platform').find("option").remove();
-                $('#platform').append(new Option("Android", "0", gameInfo.platform === 0));
-                $('#platform').append(new Option("IOS", "1", gameInfo.platform === 1));
-                $('#platform').append(new Option("同时支持两个平台", "2", gameInfo.platform === 2));
-
-                form.render("select");
-
-                //渲染多选tags
-                let defaultArray = [];
-                for (let i = 0; i < gameTags.length; i++) {
-                    let tag = gameTags[i];
-                    defaultArray.push(tag.tagId)
-                }
-                //设置value默认数组
-                xmSelect.get('#multiselectTag', true).setValue(defaultArray)
-
+                console.log(res);
+                let gameInfo = res.data;
 
                 //重置图片信息
-                $('#iconImage').attr('src', domainName + gameInfo.gameIcon);
-                $('#pictureImage').attr('src', domainName + gameInfo.gamePicture);
-                $('#scrollImageList').children().remove();
-                for (let i = 0; i < gamePicturesList.length; i++) {
-                    $('#scrollImageList').append('<img src="' + domainName + gamePicturesList[i] + '"  alt="" class="layui-upload-img">')
-                }
-
-                $("#tableId").css("display", "block");
-                $("input[name='itemId']").attr("readonly", "readonly");
-
-                $("#tableTime").css("display", "block");
-                $("#updateTime").css("display", "block");
-                $("#saveBtn").css("display", "block");
-                $("#addBtn").css("display", "none");
+                $('#avatar').attr('src', domainName + gameInfo.avatarUrl);
                 //回显操作表单
-                $("#comForm").form(data);
+                $("#userDetailForm").form(gameInfo);
                 form.render();
 
                 openIndex = layer.open({
                     type: 1,  //可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
-                    title: ['修改数据', 'font-size:18px;'],//数组第二项可以写任意css样式;如果你不想显示标题栏,你可以title: false
-                    area: ['50%', '80%'],
-                    content: $('#show_div')
-                });
-            });
-
-
-        } else if (obj.event === 'del') {
-            layer.confirm('真的删除这个游戏么?', function (index) {
-                // console.log(ctx + mainDeleteUrl);
-                $.post(ctx + mainDeleteUrl, {id: data.gameId}, function (data) {
-                    if (!data.flag) {
-                        layer.msg(data.msg, {icon: 2, time: 2000}, function () {
-                        });
-                        return;
-                    }
-                    obj.del();
-                    tableIns.reload();
+                    title: ['用户信息', 'font-size:18px;'],//数组第二项可以写任意css样式;如果你不想显示标题栏,你可以title: false
+                    area: ['80%', '80%'],
+                    content: $('#show_user_detail')
                 });
-                layer.close(index);
             });
         }
     });
 
 
-    //日期选择器
-    // ['#showTimeDate', '#AddShowTimeDate'].forEach((el, index) => {
-    //     laydate.render({
-    //         elem:el,
-    //         format: "yyyy-MM-dd HH:mm:ss"
-    //     });
-    // });
-
-    //监听提交
-    form.on('submit(comFilter)', function (data) {
-        comFormSave();
-    });
-
-    form.on('submit(formStep)', function (data) {
-        //先存储一次数据,生成数据后,进行下一步
-        // let stepForm = $("#stepForm").serializeObject();
-        let selectStr = xmSelect.get('#multiselectTagAdd', true).getValue('valueStr');
-        data.field.multiSelectTag = selectStr;
-        console.log(data.field);
-        $.post(ctx + mainSaveUrl, data.field, function (data) {
-            if (!data.flag) {
-                layer.msg(data.msg, {icon: 2, time: 2000}, function () {
-                });
-                return;
-            }
-            // layer.close(openIndex);
-            console.log("data:" + data)
-            // currentGameInfo = data.data;
-            //回显
-            $("#stepForm").form(data.data);
-            form.render();
-            //下一步
-            step.next('#stepForm');
-        });
-        return false;
-    });
-
-    form.on('submit(formStep2)', function (data) {
-        step.next('#stepForm');
-        return false;
-    });
-
-    $('.updateGameInfo').click(function () {
-        tableIns.reload();
-        layer.close(openIndex);
-    });
-
-    $('.newGameInfo').click(function () {
-        tableIns.reload();
-        //重置表单数据
-        $("#addForm")[0].reset();
-        form.render();
-        //重置图片信息
-        $('#iconImageAdd').attr('src', '');
-        $('#pictureImageAdd').attr('src', '');
-
-        step.next('#stepForm');
-    });
-
-    $('.pre').click(function () {
-        step.pre('#stepForm');
-    });
-
-    $('.next').click(function () {
-        step.next('#stepForm');
-    });
-
-    $("#saveBtn").css("display", "none");
-    $("#addBtn").css("display", "none");
 });
 
-
-function findByUserAddress(form) {
-    if (form) {
-        //重置数据
-        $("#comForm")[0].reset();
-        form.render();
-    }
-    let queryByAddress = $("#queryByAddress").val();
-    //获取菜单数据
-    if (queryByAddress.length <= 0) {
-        layer.msg("输入用户钱包地址查询", {icon: 2, time: 1000}, function () {
-        });
-        return;
-    }
-    tableIns.reload({
-        page: {
-            curr: 1 //重新从第 1 页开始
-            , limit: 10
-        },
-        method: 'POST'
-        , url: ctx + "/sys/sysComUsers/findPlayerBackpack"
-        , where: {address: queryByAddress, sidx: "desc", sord: "createTime"}
-        , done: function (res, curr, count) {
-            // console.log(res, curr, count);
-            $("input[name='queryByAddress']").val(queryByAddress);
-            //this.where={};
-            //不清空,有问题:搜索条件会保留
-            //清空,  有问题:分页的时候没有搜索条件了,分页会受到影响
-        }
-    });
-}
-
-/**
- * 提交保存
- */
-function comFormSave() {
-    let comForm = $("#comForm").serializeObject();
-    if (!comForm.gameId) {
-        layer.msg("选择编辑的对象", {icon: 2, time: 1000}, function () {
-        });
-        return;
-    }
-    let selectStr = xmSelect.get('#multiselectTag', true).getValue('valueStr');
-    comForm.multiSelectTag = selectStr;
-
-    $.post(ctx + mainSaveUrl, comForm, function (data) {
-        if (!data.flag) {
-            layer.msg(data.msg, {icon: 2, time: 2000}, function () {
-            });
-            return;
-        }
-        layer.close(openIndex);
-        tableIns.reload();
-    });
-}

+ 157 - 0
src/main/resources/static/client/js/userInfoLog.js

@@ -0,0 +1,157 @@
+let tableIns;
+let openIndex;
+let multiSelectTag;
+
+let mainTableUrl = "/backstage_userDeleteLog/findAll";
+let mainRestoreUrl = "/backstage_user/restoreUser";
+
+layui.config({
+    base: ctx + '/common/'
+}).extend({
+    dragMove: 'dragMove/dragMove'
+})
+layui.use(['element', 'form', 'table', 'layer', 'laydate', 'util', 'upload',  'dragMove'], function () {
+    let element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
+    let laydate = layui.laydate;
+    let table = layui.table, form = layui.form;//select、单选、复选等依赖form
+    let dragMove = layui.dragMove;//引入工具
+    let layer = layui.layer;
+    form.verify({
+        // positiveInteger: [/^(([0-9]+[\.]?[0-9]+)|[1-9])$/, '只能填写正整数'],//必填,且只能输入正整数
+        positiveInteger: [/^[1-9]\d*$/, '只能填写正整数'],//必填,且只能输入正整数
+    });
+    /**
+     * 渲染图片查看
+     */
+    dragMove.render({
+        elem: "#cardBody", //指向图片的父容器
+        layerArea: ["960px", "720px"], //弹窗的宽高,同layer的area,默认["960px","720px"]
+        layerShade: 0.6, //遮罩的透明度,同layer的shade,默认0.6
+        layerMove: false, //触发拖动的元素,同layer的move,这里默认禁止,可设置为'.layui-layer-title'
+        maxZoom: 1 //图片能放大的最大倍数,默认1倍
+    });
+    //主列表渲染
+    tableIns = table.render({
+        elem: '#mainTable'
+        , url: ctx + mainTableUrl
+        , method: 'POST'
+        //请求前参数处理
+        , request: {
+            pageName: 'page' //页码的参数名称,默认:page
+            , limitName: 'rows' //每页数据量的参数名,默认:limit
+        }
+        , where: {sidx: "desc", sord: "createTime"}
+        , response: {
+            statusName: 'flag' //规定数据状态的字段名称,默认:code
+            , statusCode: true //规定成功的状态码,默认:0
+            , msgName: 'msg' //规定状态信息的字段名称,默认:msg
+            , countName: 'records' //规定数据总数的字段名称,默认:count
+            , dataName: 'rows' //规定数据列表的字段名称,默认:data
+        }
+        //响应后数据处理
+        , parseData: function (res) { //res 即为原始返回的数据
+            let data = res.data;
+            console.log("返回的地址数据:", data);
+            // if (data.rows && data.rows.length > 0) {
+            // }
+            return {
+                "flag": res.flag, //解析接口状态
+                "msg": res.msg, //解析提示文本
+                "records": data.records, //解析数据长度
+                "rows": data.rows //解析数据列表
+            };
+        }
+        , toolbar: '#mainTableToolbarDemo'
+        , title: '列表'
+        , cols: [[
+            {field: 'userId', title: '用户ID', sort: true}
+            , {field: 'telephoneNumber', title: '用户电话', sort: true}
+            , {field: 'email', title: '用户邮箱', sort: true}
+            , {field: 'openid', title: 'openid', sort: true}
+            , {field: 'unionid', title: 'unionid', sort: true}
+            , {field: 'appleId', title: 'appleId', sort: true }
+            , {
+                field: 'status', title: '状态', templet: function (d) {
+                    if (d.status == 0) { //PENDING
+                        return '<span style="color: green">挂起</span>';
+                    } else if (d.status == 1) { //DELETE
+                        return '<span style="color: red">删除</span>';
+                    } else if (d.status == 2) { //RESTORE
+                        return '<span style="color: red">已恢复</span>';
+                    } else {
+                        return '未添加:' + d.status;
+                    }
+                }, sort: true
+            }
+            , {field: 'createTime', title: '创建时间',  sort: true}
+            , {field: 'updateTime', title: '更新时间',  sort: true}
+            , {fixed: 'right', title: '操作', width: 140, toolbar: '#mainTableBarDemo'}
+        ]]
+        , defaultToolbar: ['', 'exports', 'print']
+        , page: true
+        // , height: height
+        , cellMinWidth: 80
+    });
+
+    //头工具栏事件
+    table.on('toolbar(test)', function (obj) {
+        switch (obj.event) {
+            case 'addNewRow':
+                break;
+            case 'query':
+                let queryByLoginName = $("#queryByLoginName").val();
+                let query = {
+                    page: {
+                        curr: 1 //重新从第 1 页开始
+                    }
+                    , done: function (res, curr, count) {
+                        //完成后重置where,解决下一次请求携带旧数据
+                        this.where = {};
+                    }
+                };
+                if (!queryByLoginName) {
+                    queryByLoginName = "";
+                }else{
+                    if (!~queryByLoginName.indexOf('@')) {
+                        if (!commonUtil.checkPhone(queryByLoginName)) {
+                            layer.msg('请输入正确手机号');
+                            return;
+                        }
+                        //设定异步数据接口的额外参数
+                        query.where = {telephoneNumber: queryByLoginName};
+                    } else {
+                        if (!commonUtil.checkEMail(queryByLoginName)) {
+                            layer.msg('请输入正确邮箱号');
+                            return;
+                        }
+                        //设定异步数据接口的额外参数
+                        query.where = {email: queryByLoginName};
+                    }
+                }
+                tableIns.reload(query);
+                $("#queryByLoginName").val(queryByLoginName);
+                break;
+        }
+    });
+
+    //监听行工具事件
+    table.on('tool(test)', function (obj) {
+        let data = obj.data;
+        console.log("data:", data);
+        //恢复
+        if (obj.event === 'restore') {
+            layer.confirm('是否恢复这个用户数据?', function (index) {
+                $.post(ctx + mainRestoreUrl, {userId: data.userId}, function (data) {
+                    if (!data.flag) {
+                        layer.msg(data.msg, {icon: 2, time: 2000}, function () {
+                        });
+                        return;
+                    }
+                    tableIns.reload();
+                });
+                layer.close(index);
+            });
+        }
+    });
+
+});

+ 27 - 2
src/main/resources/static/common/common.js

@@ -206,13 +206,13 @@ jQueryExtend = {
                     //发送请求之前随机获取AES的key
                     let aesKey = aesUtil.genKey();// "8KKNEUBzEVz6zTLy";
                     let _encryptAESKey = rsaUtil.encrypt(aesKey, sessionStorage.getItem('javaPublicKey'));
-                    console.log("aesKey=:",aesKey,",encrypt=:",_encryptAESKey);
+                    console.log("aesKey=:", aesKey, ",encrypt=:", _encryptAESKey);
                     data = {
                         data: aesUtil.encrypt(data, aesKey),//AES加密后的数据
                         aesKey: _encryptAESKey,//后端RSA公钥加密后的AES的key
                         publicKey: window.jsPublicKey//前端公钥
                     };
-                    console.log("data2",data);
+                    console.log("data2", data);
                     opt.data = data;
                 }
 
@@ -356,6 +356,31 @@ commonUtil = {
             }
         }
         return arrTree;
+    },
+
+    checkEMail: function (string) {
+        var myreg = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;
+        if (string == undefined) {
+            return false;
+        } else if (!myreg.test(string)) {
+            return false;
+        } else {
+            return true;
+        }
+    },
+
+    checkPhone: function (string) {
+        // var myreg = /^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1})|(17[0-9]{1}))+\d{8})$/;
+        var myreg = /^(13[0-9]|14[5-9]|15[012356789]|166|17[0-8]|18[0-9]|19[8-9])[0-9]{8}$/;
+        if (string == undefined) {
+            return false;
+        } else if (string.length < 11) {
+            return false;
+        } else if (!myreg.test(string)) {
+            return false;
+        } else {
+            return true;
+        }
     }
 };
 

+ 19 - 48
src/main/resources/templates/client/bluetoothInfo.html

@@ -17,12 +17,14 @@
                 <table class="layui-hide" id="mainTable" lay-filter="test"></table>
                 <!-- 模板 -->
                 <script type="text/html" id="mainTableToolbarDemo">
-                    <div class="layui-form" action="">
-                        <div class="layui-form-item">
-                            <div class="layui-inline tool-btn">
-                                <button class="layui-btn layui-btn-sm" lay-event="addNewRow">新增</button>
-                            </div>
-                        </div>
+                    <div class="layui-btn-container" style="display: flex;align-items: center; margin-bottom: 10px;">
+                        <button class="layui-btn layui-btn-sm " style="margin-bottom: 0;" lay-event="addNewRow">新增<i
+                                class="layui-icon layui-icon-add-1"></i></button>
+                        <input type="text" id="queryByInput" name="queryByInput" autocomplete="off"
+                               placeholder="输入mac地址查询" class="layui-input layui-btn-sm "
+                               style="width: 300px;margin-right: 10px;">
+                        <button class="layui-btn layui-btn-sm " style="margin-bottom: 0;" lay-event="query">查询<i
+                                class="layui-icon layui-icon-search"></i></button>
                     </div>
                 </script>
 
@@ -34,7 +36,7 @@
                     {{# if(d.bluetoothStatus == 1){}}
                     <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="unBind">解除绑定用户</a>
                     {{#}else{}}
-                    <a class="layui-btn layui-btn-disabled layui-btn-xs" >尚未绑定用户</a>
+                    <a class="layui-btn layui-btn-disabled layui-btn-xs">尚未绑定用户</a>
                     {{#}}}
                 </script>
 
@@ -53,14 +55,15 @@
         <div class="layui-card">
             <div class="layui-card-body">
                 <form id="comForm" class="layui-form layui-form-pane" lay-filter="comForm">
-                    <div class="layui-form-item" >
+                    <div class="layui-form-item">
                         <label class="layui-form-label">蓝牙ID</label>
                         <div class="layui-input-block">
                             <input type="text" name="bluetoothId" autocomplete="off" placeholder="bluetoothId"
                                    class="layui-input" readonly="readonly">
                         </div>
                     </div>
-                    <div class="layui-form-item" id="tableId" >
+                    <!--  id="tableId" -->
+                    <div class="layui-form-item" hidden="hidden">
                         <label class="layui-form-label">用户ID</label>
                         <div class="layui-input-block">
                             <input type="text" name="userId" autocomplete="off" placeholder="userId"
@@ -71,14 +74,14 @@
                         <label class="layui-form-label">蓝牙名字</label>
                         <div class="layui-input-block">
                             <input type="text" name="bluetoothName" autocomplete="off" placeholder="bluetoothName"
-                                   class="layui-input" readonly="readonly" lay-verify="required">
+                                   class="layui-input" lay-verify="required">
                         </div>
                     </div>
                     <div class="layui-form-item">
                         <label class="layui-form-label">蓝牙地址</label>
                         <div class="layui-input-block">
                             <input type="text" name="bluetoothMac" autocomplete="off" placeholder="bluetoothMac"
-                                   class="layui-input" readonly="readonly" lay-verify="required">
+                                   class="layui-input" lay-verify="required">
                         </div>
                     </div>
                     <div class="layui-form-item" hidden="hidden">
@@ -109,7 +112,7 @@
                         <label class="layui-form-label">设备标识</label>
                         <div class="layui-input-block">
                             <input type="text" name="identifier" autocomplete="off" placeholder="identifier"
-                                   class="layui-input"  readonly="readonly">
+                                   class="layui-input" readonly="readonly">
                         </div>
                     </div>
 
@@ -158,13 +161,14 @@
                         <label class="layui-form-label">蓝牙地址</label>
                         <div class="layui-input-block">
                             <input type="text" name="bluetoothMac" autocomplete="off" placeholder="bluetoothMac"
-                                   class="layui-input" >
+                                   class="layui-input">
                         </div>
                     </div>
                     <div class="layui-form-item">
                         <label class="layui-form-label">设备类型</label>
                         <div class="layui-input-block">
-                            <select name="bluetoothType" id="bluetoothTypeAdd" lay-verify="required" lay-filter="xmFilter">
+                            <select name="bluetoothType" id="bluetoothTypeAdd" lay-verify="required"
+                                    lay-filter="xmFilter">
                                 <option value="">请选择</option>
                             </select>
                         </div>
@@ -185,44 +189,11 @@
             </div>
         </div>
     </div>
-
-    <!--<div class="layui-col-md12">-->
-    <!--    <div class="layui-card">-->
-    <!--        <div class="layui-card-header">用户仓库操作列表</div>-->
-    <!--        <div class="layui-card-body">-->
-    <!--            &lt;!&ndash; 表格主体 &ndash;&gt;-->
-    <!--            <table class="layui-hide" id="comPlayerLogTable" lay-filter="test"></table>-->
-    <!--            &lt;!&ndash; 模板 &ndash;&gt;-->
-    <!--            <script type="text/html" id="comPlayerLogTableToolbarDemo">-->
-    <!--                <div class="layui-btn-container">-->
-    <!--                    <button class="layui-btn layui-btn-sm" lay-event="playerLogReload">刷新</button>-->
-    <!--                </div>-->
-    <!--            </script>-->
-    <!--        </div>-->
-    <!--    </div>-->
-    <!--</div>-->
-
-    <!--<div class="layui-col-md12">-->
-    <!--    <div class="layui-card">-->
-    <!--        <div class="layui-card-header">用户偷取操作列表</div>-->
-    <!--        <div class="layui-card-body">-->
-    <!--            &lt;!&ndash; 表格主体 &ndash;&gt;-->
-    <!--            <table class="layui-hide" id="comPlayerProfitTable" lay-filter="test"></table>-->
-    <!--            &lt;!&ndash; 模板 &ndash;&gt;-->
-    <!--            <script type="text/html" id="comPlayerProfitTableToolbarDemo">-->
-    <!--                <div class="layui-btn-container">-->
-    <!--                    <button class="layui-btn layui-btn-sm" lay-event="playerProfitReload">刷新</button>-->
-    <!--                </div>-->
-    <!--            </script>-->
-    <!--        </div>-->
-    <!--    </div>-->
-    <!--</div>-->
-
 </div>
 </body>
 <script type="text/javascript" th:inline="javascript">
     //新增数据表单
-    defaultBLEData = {"bluetoothName": [[${defaultName}]],"bluetoothMac": [[${defaultMac}]]};
+    defaultBLEData = {"bluetoothName": [[${defaultName}]], "bluetoothMac": [[${defaultMac}]]};
 </script>
 <script th:src="@{/client/js/bluetoothInfo.js}"></script>
 </html>

+ 368 - 0
src/main/resources/templates/client/levelInfo.html

@@ -0,0 +1,368 @@
+<!DOCTYPE html>
+<!--解决idea thymeleaf 表达式模板报红波浪线-->
+<!--suppress ALL -->
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+
+<!--    <link th:href="@{/common/step-lay/step.css}" rel="stylesheet" type="text/css"/>-->
+    <!-- 引入公用部分 -->
+    <script th:replace="common/head::static"></script>
+
+    <style type="text/css">
+        /*.layui-form-label {*/
+        /*    width: 380px !important;*/
+        /*}*/
+        .layui-table-cell{height:60px;line-height:60px}
+    </style>
+</head>
+<body>
+<div class="layui-row layui-col-space15">
+    <!-- 树 -->
+    <div class="layui-col-md12">
+        <div class="layui-card">
+            <div class="layui-card-body" id="cardBody">
+                <!-- 表格主体 -->
+                <table class="layui-hide" id="mainTable" lay-filter="test"></table>
+                <!-- 模板 -->
+                <script type="text/html" id="mainTableToolbarDemo">
+                    <div class="layui-form" action="">
+                        <div class="layui-form-item">
+                            <div class="layui-inline tool-btn">
+<!--                                <button class="layui-btn layui-btn-sm" lay-event="addNewRow">新增</button>-->
+                            </div>
+                        </div>
+                    </div>
+                </script>
+
+                <script type="text/html" id="mainTableBarDemo">
+                    <a class="layui-btn layui-btn-xs" lay-event="edit">编辑<i class="layui-icon layui-icon-edit"></i></a>
+                    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
+                </script>
+                <script type="text/html" id="bindButton">
+                    {{# if(d.bluetoothStatus == 1){}}
+                    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="unBind">解除绑定用户</a>
+                    {{#}else{}}
+                    <a class="layui-btn layui-btn-disabled layui-btn-xs">尚未绑定用户</a>
+                    {{#}}}
+                </script>
+
+                <script type="text/html" id="gamePicture">
+                    <img  src="{{domainName}}{{d.gamePicture}}" style="" width="60" height="60" alt="">
+                </script>
+                <script type="text/html" id="gameIcon">
+                    <img src="{{domainName}}{{d.gameIcon}}" style="" width="60" height="60" alt="">
+                </script>
+
+
+<!--                <script type="text/html" id="gameTypeScript">-->
+<!--                    <select id="demoCity1" class="layui-border" lay-ignore>-->
+<!--                        <option th:each="item,iterStat : ${categoryList}"  th:value="${item.categoryType}" th:text="${item.categoryName }">-->
+<!--                        </option>-->
+<!--                    </select>-->
+<!--                </script>-->
+            </div>
+        </div>
+
+    </div>
+    <!-- 操作表单 -->
+    <div class="layui-col-md12" style="display:none;" id="show_div">
+        <div class="layui-card">
+            <div class="layui-card-body">
+                <form id="comForm" class="layui-form layui-form-pane" lay-filter="comForm">
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">游戏ID</label>
+                        <div class="layui-input-block">
+                            <input type="text" id="modifyGameId" name="gameId" autocomplete="off" placeholder="gameId"
+                                   class="layui-input" readonly="readonly">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">名字</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="gameName" autocomplete="off" placeholder="gameName"
+                                   class="layui-input" lay-verify="required">
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">状态</label>
+                        <div class="layui-input-block">
+                            <select name="gameStatus" id="gameStatus" lay-verify="required"
+                                    lay-filter="xmFilter">
+                                <option value="">请选择</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">所属分类</label>
+                        <div class="layui-input-block">
+                            <select name="gameType" id="gameType" lay-verify="required"
+                                    lay-filter="xmFilter">
+                                <option value="">请选择</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">展示平台</label>
+                        <div class="layui-input-block">
+                            <select name="platform" id="platform" lay-verify="required" lay-filter="xmFilter">
+                                <option value="">请选择</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">模式类型</label>
+                        <div class="layui-input-block" >
+                            <div id="multiselectTag" style="width: 600px;"></div>
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">简介</label>
+                        <div class="layui-input-block">
+                            <textarea name="gameDescription" placeholder="请输入内容" class="layui-textarea"></textarea>
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">地址</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="gameWebUrl" autocomplete="off" placeholder="gameWebUrl"
+                                   class="layui-input" >
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">图标</label>
+                        <div class="layui-input-block">
+                            <div class="layui-upload">
+                                <button type="button" class="layui-btn" id="icon">上传图标</button>
+                                <div class="layui-upload-list">
+                                    <img class="layui-upload-img" id="iconImage">
+                                    <p id="iconText"></p>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">封面</label>
+                        <div class="layui-input-block">
+                            <div class="layui-upload">
+                                <button type="button" class="layui-btn" id="picture">上传封面</button>
+                                <div class="layui-upload-list">
+                                    <img class="layui-upload-img" id="pictureImage">
+                                    <p id="pictureText"></p>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">轮播图</label>
+                        <div class="layui-input-block">
+                            <div class="layui-upload">
+                                <button type="button" class="layui-btn" id="scroll">多图片上传</button>
+                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                    预览图:
+                                    <div class="layui-upload-list" id="scrollImageList"></div>
+                                </blockquote>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">END时间</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="showTime" id="showTimeDate" autocomplete="off" placeholder="showTime"
+                                   class="layui-input"  readonly="readonly">
+                        </div>
+                    </div>
+                    <div class="layui-form-item" id="tableTime">
+                        <div class="layui-inline">
+                            <label class="layui-form-label">创建时间</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="createTime" autocomplete="off" class="layui-input"
+                                       readonly="readonly">
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item" id="tableUpdateTime">
+                        <div class="layui-inline">
+                            <label class="layui-form-label">更新时间</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="updateTime" autocomplete="off" class="layui-input"
+                                       readonly="readonly">
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <a id="saveBtn" class="layui-btn" type="submit" lay-submit lay-filter="comFilter">保存数据修改</a>
+                    </div>
+                </form>
+
+            </div>
+        </div>
+    </div>
+
+    <div class="layui-col-md12" style="display:none;" id="show_add_div">
+        <div class="layui-card">
+            <div class="layui-card-body">
+                <div class="layui-carousel" id="stepForm" lay-filter="stepForm" style="margin: 0 auto;">
+                    <div carousel-item>
+                        <div>
+                            <form  class="layui-form layui-form-pane" id="addForm"  lay-filter="addForm"  style="margin: 0 auto;padding-top: 40px;" >
+                                <input type="text" id="newGameId" name="gameId" hidden="hidden"/>-
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label">名字</label>
+                                    <div class="layui-input-block">
+                                        <input type="text" name="gameName" autocomplete="off" placeholder="gameName"
+                                               class="layui-input" lay-verify="required">
+                                    </div>
+                                </div>
+<!--                                <div class="layui-form-item">-->
+<!--                                    <label class="layui-form-label">显示时间</label>-->
+<!--                                    <div class="layui-input-block">-->
+<!--                                        <input type="text" name="showTime" id="AddShowTimeDate" autocomplete="off" placeholder="showTime"-->
+<!--                                               class="layui-input">-->
+<!--                                    </div>-->
+<!--                                </div>-->
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label">状态</label>
+                                    <div class="layui-input-block">
+                                        <select name="gameStatus" id="gameStatusAdd" lay-verify="required"
+                                                lay-filter="xmFilter">
+                                            <option value="">请选择</option>
+                                        </select>
+                                    </div>
+                                </div>
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label">所属分类</label>
+                                    <div class="layui-input-block">
+                                        <select name="gameType" id="gameTypeAdd" lay-verify="required"
+                                                lay-filter="xmFilter">
+                                            <option value="">请选择</option>
+                                        </select>
+                                    </div>
+                                </div>
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label">展示平台</label>
+                                    <div class="layui-input-block">
+                                        <select name="platform" id="platformAdd" lay-verify="required" lay-filter="xmFilter">
+                                            <option value="">请选择</option>
+                                        </select>
+                                    </div>
+                                </div>
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label">模式类型</label>
+                                    <div class="layui-input-block" >
+                                        <div id="multiselectTagAdd" style="width: 600px;"></div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label">简介</label>
+                                    <div class="layui-input-block">
+                                        <textarea name="gameDescription" placeholder="请输入内容" class="layui-textarea"></textarea>
+                                    </div>
+                                </div>
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label">地址</label>
+                                    <div class="layui-input-block">
+                                        <input type="text" name="gameWebUrl" autocomplete="off" placeholder="gameWebUrl"
+                                               class="layui-input" >
+                                    </div>
+                                </div>
+
+                                <div class="layui-form-item">
+                                    <div class="layui-input-block">
+                                        <button class="layui-btn" lay-submit lay-filter="formStep">
+                                            &emsp;下一步&emsp;
+                                        </button>
+                                    </div>
+                                </div>
+                            </form>
+                        </div>
+                        <div>
+                            <form class="layui-form layui-form-pane" style="margin: 0 auto;padding-top: 40px;">
+
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label">图标</label>
+                                    <div class="layui-input-block">
+                                        <div class="layui-upload">
+                                            <button type="button" class="layui-btn" id="iconAdd">上传图标</button>
+                                            <div class="layui-upload-list">
+                                                <img class="layui-upload-img" id="iconImageAdd">
+                                                <p id="iconTextAdd"></p>
+                                            </div>
+<!--                                            <div style="width: 95px;">-->
+<!--                                                <div class="layui-progress layui-progress-big" lay-showpercent="yes" lay-filter="iconProgress">-->
+<!--                                                    <div class="layui-progress-bar" lay-percent=""></div>-->
+<!--                                                </div>-->
+<!--                                            </div>-->
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label">封面</label>
+                                    <div class="layui-input-block">
+                                        <div class="layui-upload">
+                                            <button type="button" class="layui-btn" id="pictureAdd">上传封面</button>
+                                            <div class="layui-upload-list">
+                                                <img class="layui-upload-img" id="pictureImageAdd">
+                                                <p id="pictureTextAdd"></p>
+                                            </div>
+<!--                                            <div style="width: 95px;">-->
+<!--                                                <div class="layui-progress layui-progress-big" lay-showpercent="yes" lay-filter="pictureProgress">-->
+<!--                                                    <div class="layui-progress-bar" lay-percent=""></div>-->
+<!--                                                </div>-->
+<!--                                            </div>-->
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label">轮播图</label>
+                                    <div class="layui-input-block">
+                                        <div class="layui-upload">
+                                            <button type="button" class="layui-btn" id="scrollAdd">多图片上传</button>
+                                            <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                预览图:
+                                                <div class="layui-upload-list" id="scrollImageListAdd"></div>
+                                            </blockquote>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-form-item">
+                                    <div class="layui-input-block">
+                                        <button type="button" class="layui-btn layui-btn-primary pre">上一步</button>
+                                        <button class="layui-btn" lay-submit lay-filter="formStep2">
+                                            &emsp;确认
+                                        </button>
+                                    </div>
+                                </div>
+                            </form>
+                        </div>
+                        <div>
+                            <div style="text-align: center;margin-top: 90px;">
+                                <i class="layui-icon layui-circle"
+                                   style="color: white;font-size:30px;font-weight:bold;background: #52C41A;padding: 20px;line-height: 80px;">&#xe605;</i>
+                                <div style="font-size: 24px;color: #333;font-weight: 500;margin-top: 30px;">
+                                    添加游戏信息成功
+                                </div>
+<!--                                <div style="font-size: 14px;color: #666;margin-top: 20px;">预计两小时到账</div>-->
+                            </div>
+                            <div style="text-align: center;margin-top: 50px;">
+                                <button class="layui-btn newGameInfo">再添加一个</button>
+                                <button class="layui-btn layui-btn-primary updateGameInfo">查看已有游戏</button>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</body>
+<script type="text/javascript" th:inline="javascript">
+    //新增数据表单
+    categoryList = [[${categoryList}]];
+    allCustomTags = [[${allCustomTags}]];
+</script>
+<script th:src="@{/client/js/levelInfo.js}"></script>
+</html>

+ 159 - 43
src/main/resources/templates/client/userInfo.html

@@ -4,7 +4,7 @@
 <html xmlns:th="http://www.thymeleaf.org">
 <head>
 
-<!--    <link th:href="@{/common/step-lay/step.css}" rel="stylesheet" type="text/css"/>-->
+    <!--    <link th:href="@{/common/step-lay/step.css}" rel="stylesheet" type="text/css"/>-->
     <!-- 引入公用部分 -->
     <script th:replace="common/head::static"></script>
 
@@ -12,7 +12,10 @@
         /*.layui-form-label {*/
         /*    width: 380px !important;*/
         /*}*/
-        .layui-table-cell{height:60px;line-height:60px}
+        .layui-table-cell {
+            height: 60px;
+            line-height: 60px
+        }
     </style>
 </head>
 <body>
@@ -25,18 +28,24 @@
                 <table class="layui-hide" id="mainTable" lay-filter="test"></table>
                 <!-- 模板 -->
                 <script type="text/html" id="mainTableToolbarDemo">
-                    <div class="layui-btn-container"  style="display: flex;align-items: center; margin-bottom: 10px;">
-                        <button class="layui-btn layui-btn-sm " style="margin-bottom: 0;" lay-event="addNewRow">新增<i class="layui-icon layui-icon-add-1"></i></button>
+                    <div class="layui-btn-container" style="display: flex;align-items: center; margin-bottom: 10px;">
+                        <!--                        <button class="layui-btn layui-btn-sm " style="margin-bottom: 0;" lay-event="addNewRow">新增<i class="layui-icon layui-icon-add-1"></i></button>-->
                         <input type="text" id="queryByLoginName" name="queryByLoginName" autocomplete="off"
-                               placeholder="输入用户名" class="layui-input layui-btn-sm " style="width: 300px;margin-right: 10px;">
-                        <button class="layui-btn layui-btn-sm " style="margin-bottom: 0;" lay-event="query">查询<i class="layui-icon layui-icon-search"></i></button>
+                               placeholder="输入电话或者邮箱查询" class="layui-input layui-btn-sm "
+                               style="width: 300px;margin-right: 10px;">
+                        <button class="layui-btn layui-btn-sm " style="margin-bottom: 0;" lay-event="query">查询<i
+                                class="layui-icon layui-icon-search"></i></button>
                     </div>
                 </script>
 
 
                 <script type="text/html" id="mainTableBarDemo">
-                    <a class="layui-btn layui-btn-xs" lay-event="edit">编辑<i class="layui-icon layui-icon-edit"></i></a>
-                    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
+                    <a class="layui-btn layui-btn-xs" lay-event="detail">用户详情</a>
+                    {{# if(d.status !== 1){}}
+                    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">预删除</a>
+                    {{#}else{}}
+                    <a class="layui-btn layui-btn-disabled layui-btn-xs" >已删除</a>
+                    {{#}}}
                 </script>
                 <script type="text/html" id="bindButton">
                     {{# if(d.bluetoothStatus == 1){}}
@@ -47,24 +56,126 @@
                 </script>
 
                 <script type="text/html" id="avatarPicture">
-                    <img  src="{{domainName}}{{d.avatarUrl}}" style="" width="60" height="60" alt="">
+                    <img src="{{domainName}}{{d.avatarUrl}}" style="" width="60" height="60" alt="">
                 </script>
                 <script type="text/html" id="gameIcon">
                     <img src="{{domainName}}{{d.gameIcon}}" style="" width="60" height="60" alt="">
                 </script>
 
 
-<!--                <script type="text/html" id="gameTypeScript">-->
-<!--                    <select id="demoCity1" class="layui-border" lay-ignore>-->
-<!--                        <option th:each="item,iterStat : ${categoryList}"  th:value="${item.categoryType}" th:text="${item.categoryName }">-->
-<!--                        </option>-->
-<!--                    </select>-->
-<!--                </script>-->
+                <!--                <script type="text/html" id="gameTypeScript">-->
+                <!--                    <select id="demoCity1" class="layui-border" lay-ignore>-->
+                <!--                        <option th:each="item,iterStat : ${categoryList}"  th:value="${item.categoryType}" th:text="${item.categoryName }">-->
+                <!--                        </option>-->
+                <!--                    </select>-->
+                <!--                </script>-->
             </div>
         </div>
 
     </div>
     <!-- 操作表单 -->
+    <div class="layui-col-md12" style="display:none;" id="show_user_detail">
+        <div class="layui-card">
+            <div class="layui-card-body">
+                <form id="userDetailForm" class="layui-form layui-form-pane" lay-filter="userDetailForm">
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">用户ID</label>
+                        <div class="layui-input-block">
+                            <input type="text" id="userId" name="userId" autocomplete="off" placeholder="userId"
+                                   class="layui-input" readonly="readonly">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">用户名称</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="username" autocomplete="off" placeholder="username"
+                                   class="layui-input" readonly="readonly">
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">性别</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="gender" autocomplete="off" placeholder="gender"
+                                   class="layui-input" readonly="readonly">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">城市代码</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="cityCode" autocomplete="off" placeholder="cityCode"
+                                   class="layui-input" readonly="readonly">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">生日</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="birthday" autocomplete="off" placeholder="birthday"
+                                   class="layui-input" readonly="readonly">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">签名</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="signature" autocomplete="off" placeholder="signature"
+                                   class="layui-input" readonly="readonly">
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">头像</label>
+                        <div class="layui-input-block">
+                            <div class="layui-upload">
+                                <div class="layui-upload-list">
+                                    <img class="layui-upload-img" id="avatar">
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">身高</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="height" autocomplete="off" placeholder="height"
+                                   class="layui-input" readonly="readonly">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">体重</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="weight" autocomplete="off" placeholder="weight"
+                                   class="layui-input" readonly="readonly">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">状态</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="status" autocomplete="off" placeholder="status"
+                                   class="layui-input" readonly="readonly">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <div class="layui-inline">
+                            <label class="layui-form-label">注册时间</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="registerTime" autocomplete="off" placeholder="registerTime"
+                                       class="layui-input" readonly="readonly">
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item" id="tableUpdateTime">
+                        <div class="layui-inline">
+                            <label class="layui-form-label">更新时间</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="updateTime" autocomplete="off" class="layui-input"
+                                       readonly="readonly">
+                            </div>
+                        </div>
+                    </div>
+                </form>
+
+            </div>
+        </div>
+    </div>
     <div class="layui-col-md12" style="display:none;" id="show_div">
         <div class="layui-card">
             <div class="layui-card-body">
@@ -112,7 +223,7 @@
                     </div>
                     <div class="layui-form-item">
                         <label class="layui-form-label">模式类型</label>
-                        <div class="layui-input-block" >
+                        <div class="layui-input-block">
                             <div id="multiselectTag" style="width: 600px;"></div>
                         </div>
                     </div>
@@ -127,7 +238,7 @@
                         <label class="layui-form-label">地址</label>
                         <div class="layui-input-block">
                             <input type="text" name="gameWebUrl" autocomplete="off" placeholder="gameWebUrl"
-                                   class="layui-input" >
+                                   class="layui-input">
                         </div>
                     </div>
 
@@ -170,8 +281,9 @@
                     <div class="layui-form-item">
                         <label class="layui-form-label">END时间</label>
                         <div class="layui-input-block">
-                            <input type="text" name="showTime" id="showTimeDate" autocomplete="off" placeholder="showTime"
-                                   class="layui-input"  readonly="readonly">
+                            <input type="text" name="showTime" id="showTimeDate" autocomplete="off"
+                                   placeholder="showTime"
+                                   class="layui-input" readonly="readonly">
                         </div>
                     </div>
                     <div class="layui-form-item" id="tableTime">
@@ -207,7 +319,8 @@
                 <div class="layui-carousel" id="stepForm" lay-filter="stepForm" style="margin: 0 auto;">
                     <div carousel-item>
                         <div>
-                            <form  class="layui-form layui-form-pane" id="addForm"  lay-filter="addForm"  style="margin: 0 auto;padding-top: 40px;" >
+                            <form class="layui-form layui-form-pane" id="addForm" lay-filter="addForm"
+                                  style="margin: 0 auto;padding-top: 40px;">
                                 <input type="text" id="newGameId" name="gameId" hidden="hidden"/>-
                                 <div class="layui-form-item">
                                     <label class="layui-form-label">名字</label>
@@ -216,13 +329,13 @@
                                                class="layui-input" lay-verify="required">
                                     </div>
                                 </div>
-<!--                                <div class="layui-form-item">-->
-<!--                                    <label class="layui-form-label">显示时间</label>-->
-<!--                                    <div class="layui-input-block">-->
-<!--                                        <input type="text" name="showTime" id="AddShowTimeDate" autocomplete="off" placeholder="showTime"-->
-<!--                                               class="layui-input">-->
-<!--                                    </div>-->
-<!--                                </div>-->
+                                <!--                                <div class="layui-form-item">-->
+                                <!--                                    <label class="layui-form-label">显示时间</label>-->
+                                <!--                                    <div class="layui-input-block">-->
+                                <!--                                        <input type="text" name="showTime" id="AddShowTimeDate" autocomplete="off" placeholder="showTime"-->
+                                <!--                                               class="layui-input">-->
+                                <!--                                    </div>-->
+                                <!--                                </div>-->
                                 <div class="layui-form-item">
                                     <label class="layui-form-label">状态</label>
                                     <div class="layui-input-block">
@@ -244,14 +357,15 @@
                                 <div class="layui-form-item">
                                     <label class="layui-form-label">展示平台</label>
                                     <div class="layui-input-block">
-                                        <select name="platform" id="platformAdd" lay-verify="required" lay-filter="xmFilter">
+                                        <select name="platform" id="platformAdd" lay-verify="required"
+                                                lay-filter="xmFilter">
                                             <option value="">请选择</option>
                                         </select>
                                     </div>
                                 </div>
                                 <div class="layui-form-item">
                                     <label class="layui-form-label">模式类型</label>
-                                    <div class="layui-input-block" >
+                                    <div class="layui-input-block">
                                         <div id="multiselectTagAdd" style="width: 600px;"></div>
                                     </div>
                                 </div>
@@ -259,14 +373,15 @@
                                 <div class="layui-form-item">
                                     <label class="layui-form-label">简介</label>
                                     <div class="layui-input-block">
-                                        <textarea name="gameDescription" placeholder="请输入内容" class="layui-textarea"></textarea>
+                                        <textarea name="gameDescription" placeholder="请输入内容"
+                                                  class="layui-textarea"></textarea>
                                     </div>
                                 </div>
                                 <div class="layui-form-item">
                                     <label class="layui-form-label">地址</label>
                                     <div class="layui-input-block">
                                         <input type="text" name="gameWebUrl" autocomplete="off" placeholder="gameWebUrl"
-                                               class="layui-input" >
+                                               class="layui-input">
                                     </div>
                                 </div>
 
@@ -291,11 +406,11 @@
                                                 <img class="layui-upload-img" id="iconImageAdd">
                                                 <p id="iconTextAdd"></p>
                                             </div>
-<!--                                            <div style="width: 95px;">-->
-<!--                                                <div class="layui-progress layui-progress-big" lay-showpercent="yes" lay-filter="iconProgress">-->
-<!--                                                    <div class="layui-progress-bar" lay-percent=""></div>-->
-<!--                                                </div>-->
-<!--                                            </div>-->
+                                            <!--                                            <div style="width: 95px;">-->
+                                            <!--                                                <div class="layui-progress layui-progress-big" lay-showpercent="yes" lay-filter="iconProgress">-->
+                                            <!--                                                    <div class="layui-progress-bar" lay-percent=""></div>-->
+                                            <!--                                                </div>-->
+                                            <!--                                            </div>-->
                                         </div>
                                     </div>
                                 </div>
@@ -308,11 +423,11 @@
                                                 <img class="layui-upload-img" id="pictureImageAdd">
                                                 <p id="pictureTextAdd"></p>
                                             </div>
-<!--                                            <div style="width: 95px;">-->
-<!--                                                <div class="layui-progress layui-progress-big" lay-showpercent="yes" lay-filter="pictureProgress">-->
-<!--                                                    <div class="layui-progress-bar" lay-percent=""></div>-->
-<!--                                                </div>-->
-<!--                                            </div>-->
+                                            <!--                                            <div style="width: 95px;">-->
+                                            <!--                                                <div class="layui-progress layui-progress-big" lay-showpercent="yes" lay-filter="pictureProgress">-->
+                                            <!--                                                    <div class="layui-progress-bar" lay-percent=""></div>-->
+                                            <!--                                                </div>-->
+                                            <!--                                            </div>-->
                                         </div>
                                     </div>
                                 </div>
@@ -321,7 +436,8 @@
                                     <div class="layui-input-block">
                                         <div class="layui-upload">
                                             <button type="button" class="layui-btn" id="scrollAdd">多图片上传</button>
-                                            <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                            <blockquote class="layui-elem-quote layui-quote-nm"
+                                                        style="margin-top: 10px;">
                                                 预览图:
                                                 <div class="layui-upload-list" id="scrollImageListAdd"></div>
                                             </blockquote>
@@ -345,7 +461,7 @@
                                 <div style="font-size: 24px;color: #333;font-weight: 500;margin-top: 30px;">
                                     添加游戏信息成功
                                 </div>
-<!--                                <div style="font-size: 14px;color: #666;margin-top: 20px;">预计两小时到账</div>-->
+                                <!--                                <div style="font-size: 14px;color: #666;margin-top: 20px;">预计两小时到账</div>-->
                             </div>
                             <div style="text-align: center;margin-top: 50px;">
                                 <button class="layui-btn newGameInfo">再添加一个</button>

+ 55 - 0
src/main/resources/templates/client/userInfoLog.html

@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<!--解决idea thymeleaf 表达式模板报红波浪线-->
+<!--suppress ALL -->
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+
+    <!--    <link th:href="@{/common/step-lay/step.css}" rel="stylesheet" type="text/css"/>-->
+    <!-- 引入公用部分 -->
+    <script th:replace="common/head::static"></script>
+
+    <style type="text/css">
+        /*.layui-form-label {*/
+        /*    width: 380px !important;*/
+        /*}*/
+        .layui-table-cell {
+            height: 60px;
+            line-height: 60px
+        }
+    </style>
+</head>
+<body>
+<div class="layui-row layui-col-space15">
+    <!-- 树 -->
+    <div class="layui-col-md12">
+        <div class="layui-card">
+            <div class="layui-card-body" id="cardBody">
+                <!-- 表格主体 -->
+                <table class="layui-hide" id="mainTable" lay-filter="test"></table>
+                <!-- 模板 -->
+                <script type="text/html" id="mainTableToolbarDemo">
+                    <div class="layui-btn-container" style="display: flex;align-items: center; margin-bottom: 10px;">
+                        <input type="text" id="queryByLoginName" name="queryByLoginName" autocomplete="off"
+                               placeholder="输入电话或者邮箱查询" class="layui-input layui-btn-sm "
+                               style="width: 300px;margin-right: 10px;">
+                        <button class="layui-btn layui-btn-sm " style="margin-bottom: 0;" lay-event="query">查询<i
+                                class="layui-icon layui-icon-search"></i></button>
+                    </div>
+                </script>
+
+
+                <script type="text/html" id="mainTableBarDemo">
+                    <!--挂起状态下,才可执行恢复用户数据-->
+                    {{# if(d.status == 0){}}
+                    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="restore">恢复数据</a>
+                    {{#}}}
+                </script>
+
+            </div>
+        </div>
+
+    </div>
+</div>
+</body>
+<script th:src="@{/client/js/userInfoLog.js}"></script>
+</html>