Forráskód Böngészése

1.修改layui版本

slambb 3 éve
szülő
commit
cf6bf9fb5e
92 módosított fájl, 3648 hozzáadás és 1429 törlés
  1. 12 12
      pom.xml
  2. 10 4
      src/main/java/com/YuyeTech/TPlat/aspect/AuthorizeFilter.java
  3. 2 0
      src/main/java/com/YuyeTech/TPlat/common/service/CommonService.java
  4. 6 0
      src/main/java/com/YuyeTech/TPlat/common/service/CommonServiceImpl.java
  5. 1 0
      src/main/java/com/YuyeTech/TPlat/config/security/SecurityConfig.java
  6. 3 1
      src/main/java/com/YuyeTech/TPlat/config/token/WebConfig.java
  7. 1 1
      src/main/java/com/YuyeTech/TPlat/constant/RankingConstant.java
  8. 2 2
      src/main/java/com/YuyeTech/TPlat/constant/RedisConstant.java
  9. 0 22
      src/main/java/com/YuyeTech/TPlat/dataobject/Pictures.java
  10. 28 0
      src/main/java/com/YuyeTech/TPlat/enums/PictureType.java
  11. 5 4
      src/main/java/com/YuyeTech/TPlat/enums/RedisType.java
  12. 1 0
      src/main/java/com/YuyeTech/TPlat/enums/ResultEnum.java
  13. 7 2
      src/main/java/com/YuyeTech/TPlat/filter/gameFilter.java
  14. 3 0
      src/main/java/com/YuyeTech/TPlat/form/FitnessForm.java
  15. 2 0
      src/main/java/com/YuyeTech/TPlat/form/UserForm.java
  16. 10 4
      src/main/java/com/YuyeTech/TPlat/game/controller/BackstageManagerController.java
  17. 2 2
      src/main/java/com/YuyeTech/TPlat/game/controller/BackstageTagController.java
  18. 42 31
      src/main/java/com/YuyeTech/TPlat/game/controller/LoginController.java
  19. 14 8
      src/main/java/com/YuyeTech/TPlat/game/controller/RankingController.java
  20. 173 153
      src/main/java/com/YuyeTech/TPlat/game/gameInfo/controller/BackstageGameController.java
  21. 4 0
      src/main/java/com/YuyeTech/TPlat/game/gameInfo/controller/ClientGameInfoController.java
  22. 18 3
      src/main/java/com/YuyeTech/TPlat/game/gameInfo/controller/GameInfoController.java
  23. 2 1
      src/main/java/com/YuyeTech/TPlat/game/gameInfo/projo/GameInfo.java
  24. 6 1
      src/main/java/com/YuyeTech/TPlat/game/gameInfo/repository/GamePicturesRepository.java
  25. 1 4
      src/main/java/com/YuyeTech/TPlat/game/gameInfo/service/GameInfoService.java
  26. 84 79
      src/main/java/com/YuyeTech/TPlat/game/gameInfo/service/GameInfoServiceImpl.java
  27. 3 1
      src/main/java/com/YuyeTech/TPlat/game/gameInfo/service/GamePictureService.java
  28. 8 1
      src/main/java/com/YuyeTech/TPlat/game/gameInfo/service/GamePictureServiceImpl.java
  29. 8 8
      src/main/java/com/YuyeTech/TPlat/game/gameInfo/service/RecommendServiceImpl.java
  30. 41 0
      src/main/java/com/YuyeTech/TPlat/game/gameInfo/vo/GameInfoAndTagsVo.java
  31. 39 0
      src/main/java/com/YuyeTech/TPlat/game/gameInfo/vo/GameInfoSimpleVo.java
  32. 2 0
      src/main/java/com/YuyeTech/TPlat/game/gameInfo/vo/GameInfoVo.java
  33. 18 0
      src/main/java/com/YuyeTech/TPlat/game/gameInfo/vo/GamePictureSimpleVo.java
  34. 23 0
      src/main/java/com/YuyeTech/TPlat/game/gameInfo/vo/GamePictureVo.java
  35. 74 3
      src/main/java/com/YuyeTech/TPlat/game/imageInfo/controller/BackstagePictureController.java
  36. 3 3
      src/main/java/com/YuyeTech/TPlat/game/imageInfo/controller/UploadController.java
  37. 26 0
      src/main/java/com/YuyeTech/TPlat/game/imageInfo/projo/Pictures.java
  38. 39 0
      src/main/java/com/YuyeTech/TPlat/game/imageInfo/repository/PicturesRepository.java
  39. 77 0
      src/main/java/com/YuyeTech/TPlat/game/imageInfo/service/PicturesService.java
  40. 192 0
      src/main/java/com/YuyeTech/TPlat/game/imageInfo/service/PicturesServiceImpl.java
  41. 29 0
      src/main/java/com/YuyeTech/TPlat/game/imageInfo/vo/PicturesAndGameSimpleVo.java
  42. 31 0
      src/main/java/com/YuyeTech/TPlat/game/imageInfo/vo/PicturesAndGameVo.java
  43. 25 0
      src/main/java/com/YuyeTech/TPlat/game/imageInfo/vo/PicturesVo.java
  44. 64 0
      src/main/java/com/YuyeTech/TPlat/game/userData/controller/UserDataController.java
  45. 25 0
      src/main/java/com/YuyeTech/TPlat/game/userData/pojo/UserData.java
  46. 13 0
      src/main/java/com/YuyeTech/TPlat/game/userData/repository/UserDataRepository.java
  47. 24 0
      src/main/java/com/YuyeTech/TPlat/game/userData/service/UserDataService.java
  48. 100 0
      src/main/java/com/YuyeTech/TPlat/game/userData/service/UserDataServiceImpl.java
  49. 21 0
      src/main/java/com/YuyeTech/TPlat/game/userData/vo/UserDataSimpleVo.java
  50. 21 0
      src/main/java/com/YuyeTech/TPlat/game/userData/vo/UserDataVo.java
  51. 36 4
      src/main/java/com/YuyeTech/TPlat/game/userinfo/controller/BackstageUserController.java
  52. 4 4
      src/main/java/com/YuyeTech/TPlat/game/userinfo/controller/ManagerController.java
  53. 39 5
      src/main/java/com/YuyeTech/TPlat/game/userinfo/controller/UserInfoController.java
  54. 1 1
      src/main/java/com/YuyeTech/TPlat/game/userinfo/projo/MainInfo.java
  55. 1 1
      src/main/java/com/YuyeTech/TPlat/game/userinfo/projo/UserInfo.java
  56. 4 4
      src/main/java/com/YuyeTech/TPlat/game/userinfo/repository/MainInfoRepository.java
  57. 4 3
      src/main/java/com/YuyeTech/TPlat/game/userinfo/repository/UserInfoRepository.java
  58. 5 3
      src/main/java/com/YuyeTech/TPlat/game/userinfo/service/MainInfoService.java
  59. 7 5
      src/main/java/com/YuyeTech/TPlat/game/userinfo/service/MainInfoServiceImpl.java
  60. 6 4
      src/main/java/com/YuyeTech/TPlat/game/userinfo/service/UserInfoService.java
  61. 10 7
      src/main/java/com/YuyeTech/TPlat/game/userinfo/service/UserInfoServiceImpl.java
  62. 25 0
      src/main/java/com/YuyeTech/TPlat/game/userinfo/vo/MainInfoVo.java
  63. 43 0
      src/main/java/com/YuyeTech/TPlat/game/userinfo/vo/UserInfoVo.java
  64. 0 27
      src/main/java/com/YuyeTech/TPlat/repository/PicturesRepository.java
  65. 0 5
      src/main/java/com/YuyeTech/TPlat/repository/UserLevelRepository.java
  66. 0 6
      src/main/java/com/YuyeTech/TPlat/repository/UserWalletsRepository.java
  67. 0 36
      src/main/java/com/YuyeTech/TPlat/service/PicturesService.java
  68. 0 64
      src/main/java/com/YuyeTech/TPlat/service/impl/PicturesServiceImpl.java
  69. 0 15
      src/main/java/com/YuyeTech/TPlat/service/impl/UserLevelServiceImpl.java
  70. 64 55
      src/main/java/com/YuyeTech/TPlat/utils/AliyunOSSUtil.java
  71. 7 7
      src/main/java/com/YuyeTech/TPlat/utils/CodeDOM.java
  72. 1 1
      src/main/java/com/YuyeTech/TPlat/utils/LoginUtil.java
  73. 113 0
      src/main/java/com/YuyeTech/TPlat/utils/RedisSettingMap.java
  74. 0 4
      src/main/resources/application-dev.yml
  75. 0 4
      src/main/resources/application-prd.yml
  76. 351 430
      src/main/resources/static/client/js/gameInfo.js
  77. 143 0
      src/main/resources/static/client/js/imageInfo.js
  78. 595 0
      src/main/resources/static/client/js/userInfo.js
  79. 20 0
      src/main/resources/static/common/dragMove/dragMove.css
  80. 261 0
      src/main/resources/static/common/dragMove/dragMove.js
  81. 1 1
      src/main/resources/static/common/step-lay/step.js
  82. 143 161
      src/main/resources/templates/client/gameInfo.html
  83. 47 0
      src/main/resources/templates/client/imageInfo.html
  84. 369 0
      src/main/resources/templates/client/userInfo.html
  85. 2 2
      src/main/resources/templates/logging.html
  86. 1 1
      src/main/resources/templates/monitor.html
  87. 0 28
      src/test/java/com/YuyeTech/TPlat/LoggerTest.java
  88. 0 30
      src/test/java/com/YuyeTech/TPlat/LoggerTest2.java
  89. 0 13
      src/test/java/com/YuyeTech/TPlat/SmallshopApplicationTests.java
  90. 0 51
      src/test/java/com/YuyeTech/TPlat/repository/ProductCategoryRepositoryTest.java
  91. 0 51
      src/test/java/com/YuyeTech/TPlat/repository/UserInfoRepositoryTest.java
  92. 0 46
      src/test/java/com/YuyeTech/TPlat/service/impl/CategoryServiceImplTest.java

+ 12 - 12
pom.xml

@@ -279,20 +279,20 @@
         </dependency>
 
         <!--定制请求跳过ssl证书验证-->
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.apache.httpcomponents</groupId>-->
+<!--            <artifactId>httpclient</artifactId>-->
+<!--        </dependency>-->
 
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpmime</artifactId>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.apache.httpcomponents</groupId>-->
+<!--            <artifactId>httpmime</artifactId>-->
+<!--        </dependency>-->
 
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpcore</artifactId>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.apache.httpcomponents</groupId>-->
+<!--            <artifactId>httpcore</artifactId>-->
+<!--        </dependency>-->
         <!--定制请求跳过ssl证书验证-->
     </dependencies>
 

+ 10 - 4
src/main/java/com/YuyeTech/TPlat/aspect/AuthorizeFilter.java

@@ -2,8 +2,10 @@ package com.YuyeTech.TPlat.aspect;
 
 import com.YuyeTech.TPlat.VO.ResultVO;
 import com.YuyeTech.TPlat.constant.RedisConstant;
+import com.YuyeTech.TPlat.enums.RedisType;
 import com.YuyeTech.TPlat.enums.ResultEnum;
 import com.YuyeTech.TPlat.utils.JsonUtils;
+import com.YuyeTech.TPlat.utils.RedisSettingMap;
 import com.YuyeTech.TPlat.utils.ResultVOUtil;
 import com.YuyeTech.TPlat.utils.TokenRequestWrapper;
 import lombok.extern.slf4j.Slf4j;
@@ -29,6 +31,9 @@ public class AuthorizeFilter implements Filter {
     @Autowired
     StringRedisTemplate redisTemplate;
 
+    @Autowired
+    RedisSettingMap redisSettingMap;
+
     @Override
     public void init(FilterConfig filterConfig) throws ServletException {
 
@@ -60,7 +65,7 @@ public class AuthorizeFilter implements Filter {
         Integer platform = req.getIntHeader("platform");
 
         boolean isFilter = false;
-        Object userId = null;
+        String userId;
         String path = req.getServletPath();
         //静态资源放行
         String reg = ".+(.JPEG|.jpeg|.JPG|.jpg|.png|.PNG|.js|.css|.woff|.woff2|.ttf)$";
@@ -94,8 +99,9 @@ public class AuthorizeFilter implements Filter {
             response.getWriter().print(JsonUtils.toJson(resultVO));
             return;
         } else {
-            userId = redisTemplate.opsForHash().get(String.format(RedisConstant.TOKEN_PREFIX, token), "userId");
-            if (!StringUtils.isEmpty(userId)) {
+            //String.format(RedisConstant.TOKEN_PREFIX, token)
+            userId = redisSettingMap.getValue(RedisType.TOKEN, token);
+            if (StringUtils.hasText(userId)) {
                 isFilter = true;
             } else {
                 ResultVO resultVO = ResultVOUtil.error(ResultEnum.TOKEN_IS_ILLEGAL.getCode(), ResultEnum.TOKEN_IS_ILLEGAL.getMessage());
@@ -105,7 +111,7 @@ public class AuthorizeFilter implements Filter {
             }
         }
         if (isFilter) {
-            filterChain.doFilter(new TokenRequestWrapper((HttpServletRequest) servletRequest, userId.toString(),platform), response);
+            filterChain.doFilter(new TokenRequestWrapper((HttpServletRequest) servletRequest, userId,platform), response);
         }
 
     }

+ 2 - 0
src/main/java/com/YuyeTech/TPlat/common/service/CommonService.java

@@ -29,6 +29,8 @@ public interface CommonService<V, E,T> {
 
     Result<V> save(V entityVo);
 
+    V saveReturnVo(V entityVo);
+
     Result<T> delete(T id);
 
     //更新当前列表数据到缓存

+ 6 - 0
src/main/java/com/YuyeTech/TPlat/common/service/CommonServiceImpl.java

@@ -117,6 +117,12 @@ public class CommonServiceImpl<V, E, T> implements CommonService<V, E, T> {
         return Result.of(CopyUtil.copy(e, entityVoClass));
     }
 
+    @Override
+    public V saveReturnVo(V entityVo) {
+        E e = this.saveEntityVo(entityVo);
+        return CopyUtil.copy(e, entityVoClass);
+    }
+
     @Override
     public Result<T> delete(T id) {
         commonRepository.deleteById(id);

+ 1 - 0
src/main/java/com/YuyeTech/TPlat/config/security/SecurityConfig.java

@@ -58,6 +58,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
         // game 走 token验证流程
         web.ignoring().antMatchers(
                 "/game/**"
+                ,"/tPlat/**"
                 ,"/game_websocket/**"
                 ,"/static/**"
                 ,

+ 3 - 1
src/main/java/com/YuyeTech/TPlat/config/token/WebConfig.java

@@ -9,6 +9,7 @@ import org.springframework.web.filter.DelegatingFilterProxy;
 import javax.servlet.Filter;
 
 /**
+ * 配置gameFilter过滤器
  * @author:slambb
  * @date:2021/03/27
  */
@@ -44,7 +45,8 @@ public class WebConfig {
                 "/reward/*",
                 "/oss/*",
                 "/user_info/*",
-                "/wxlogin/*");
+                "/wxlogin/*",
+                "/tPlat/*");
         registration.setName("gameFilter");
         registration.setOrder(1);
         return registration;

+ 1 - 1
src/main/java/com/YuyeTech/TPlat/constant/RankingConstant.java

@@ -6,7 +6,7 @@ package com.YuyeTech.TPlat.constant;
  */
 public interface RankingConstant {
     //城市key
-    String cityKey = "city_%s_gameId_%s";
+    String cityKey = "%s_gameId_%s";
     //全国key 直接用gameId
     String chinaKey = "gameId_%s";
 }

+ 2 - 2
src/main/java/com/YuyeTech/TPlat/constant/RedisConstant.java

@@ -6,12 +6,12 @@ package com.YuyeTech.TPlat.constant;
  * @date:2019/12/13
  */
 public interface RedisConstant {
-    String TOKEN_PREFIX = "token_%s";
+    String TOKEN_PREFIX = "token:%s";
     //设置1个月
     Integer EXPIRE = 60*60*24*30;//7200;//2小时
 
     //短信信息
-    String SMS_PREFIX = "code_%s";
+    String SMS_PREFIX = "code:%s";
 
     Integer  CODE_EXPIRE = 300;//5分钟
 }

+ 0 - 22
src/main/java/com/YuyeTech/TPlat/dataobject/Pictures.java

@@ -1,22 +0,0 @@
-package com.YuyeTech.TPlat.dataobject;
-
-import lombok.Data;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-
-/**
- * @author:slambb
- * @date:2020/1/16
- */
-@Data
-@Entity
-public class Pictures {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    private Integer pictureId;
-    private Integer pictureType;
-    private String pictureUrl;
-}

+ 28 - 0
src/main/java/com/YuyeTech/TPlat/enums/PictureType.java

@@ -0,0 +1,28 @@
+package com.YuyeTech.TPlat.enums;
+
+/**
+ * 0:scroll,1:icon,2:cover,3:公共avatar,4:用户avatar
+ */
+public enum PictureType {
+    /**
+     * 游戏列表,轮播图
+     */
+    GAME_SCROLL,
+    /**
+     * 游戏图标
+     */
+    ICON,
+    /**
+     * 游戏封面
+     */
+    COVER,
+    /**
+     * 公共头像
+     */
+    PUBLIC_AVATAR,
+    /**
+     * 用户头像
+     */
+    USER_AVATAR
+
+}

+ 5 - 4
src/main/java/com/YuyeTech/TPlat/enums/RedisType.java

@@ -5,9 +5,10 @@ package com.YuyeTech.TPlat.enums;
  * @date:2022/7/12
  */
 public enum RedisType {
+    NULL,
     BLE_KEY,
-    NULL;
-
-    private RedisType() {
-    }
+    SMS,
+    TOKEN,
+    RANKING_CITY,
+    RANKING_CHINA
 }

+ 1 - 0
src/main/java/com/YuyeTech/TPlat/enums/ResultEnum.java

@@ -74,6 +74,7 @@ public enum ResultEnum {
     USER_NOT_ADDRESS(403,"用户地址不存在!"),
     USER_LIMIT_LOGIN(404,"用户限制登录!"),
     USER_LOGIN_LOCK(405,"用户保存繁忙,请重试操作!"),
+    USER_DATA_DOES_NOT_EXIST(400,"不存在用户关联信息!"),
 
     ;
     private Integer code;

+ 7 - 2
src/main/java/com/YuyeTech/TPlat/filter/gameFilter.java

@@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert;
 import com.YuyeTech.TPlat.VO.ResultVO;
 import com.YuyeTech.TPlat.common.pojo.Result;
 import com.YuyeTech.TPlat.constant.RedisConstant;
+import com.YuyeTech.TPlat.enums.RedisType;
 import com.YuyeTech.TPlat.enums.ResultEnum;
 import com.YuyeTech.TPlat.utils.*;
 import lombok.extern.slf4j.Slf4j;
@@ -40,6 +41,9 @@ public class gameFilter implements Filter {
     @Autowired
     private StringRedisTemplate redisTemplate;
 
+    @Autowired
+    RedisSettingMap redisSettingMap;
+
     @Override
     public void init(FilterConfig filterConfig) throws ServletException {
     }
@@ -103,7 +107,7 @@ public class gameFilter implements Filter {
             return;
         }
 
-        log.info("token:",token);
+        log.info("token:"+token);
         if (null == token || token.isEmpty()) {
             //没有token信息
             ResultVO resultVO = ResultVOUtil.error(ResultEnum.TOKEN_DOES_NOT_EXIST);
@@ -116,7 +120,8 @@ public class gameFilter implements Filter {
                 /**
                  * token使用redis管理,实时控制登录,下线等操作
                  */
-                String userId = redisTemplate.opsForHash().get(String.format(RedisConstant.TOKEN_PREFIX, token), "userId").toString();
+//                String.format(RedisConstant.TOKEN_PREFIX, token)
+                String userId = redisSettingMap.getValue(RedisType.TOKEN,token);
                 //String userId = jwtTokenUtil.getUserIdFromToken(authToken);
                 //if (!jwtTokenUtil.validateToken(authToken, userId)) {
                 //    log.info("secret 不可靠,validateToken:{}", jwtTokenUtil.validateToken(authToken, userId));

+ 3 - 0
src/main/java/com/YuyeTech/TPlat/form/FitnessForm.java

@@ -1,6 +1,7 @@
 package com.YuyeTech.TPlat.form;
 
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.validation.constraints.Future;
 import javax.validation.constraints.NotBlank;
@@ -18,10 +19,12 @@ public class FitnessForm {
     private String userId;
 
     @NotNull(message = "开始日期不能为空")
+    @DateTimeFormat(pattern = "yyyy/MM/dd")
     private Date startTime;
 
     @NotNull(message = "结束日期不能为空")
 //    @Future(message = "截止日期早于当前日期")
+    @DateTimeFormat(pattern = "yyyy/MM/dd")
     private Date endTime;
 
 

+ 2 - 0
src/main/java/com/YuyeTech/TPlat/form/UserForm.java

@@ -1,6 +1,7 @@
 package com.YuyeTech.TPlat.form;
 
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.constraints.NotBlank;
@@ -28,6 +29,7 @@ public class UserForm {
 
     @NotNull(message = "生日日期不能为空")
     @Past(message = "生日超过当前日期")
+    @DateTimeFormat(pattern = "yyyy/MM/dd")
     private Date birthday;
 
 //    @NotBlank(message = "签名不能为空")

+ 10 - 4
src/main/java/com/YuyeTech/TPlat/game/controller/BackstageManagerController.java

@@ -3,14 +3,15 @@ package com.YuyeTech.TPlat.game.controller;
 import com.YuyeTech.TPlat.constant.CookieConstant;
 import com.YuyeTech.TPlat.constant.RedisConstant;
 import com.YuyeTech.TPlat.dataobject.AdminInfo;
-import com.YuyeTech.TPlat.dataobject.UserInfo;
+import com.YuyeTech.TPlat.game.userinfo.projo.UserInfo;
 import com.YuyeTech.TPlat.enums.ResultEnum;
 import com.YuyeTech.TPlat.form.AdminForm;
 import com.YuyeTech.TPlat.service.AdminInfoService;
-import com.YuyeTech.TPlat.service.MainInfoService;
-import com.YuyeTech.TPlat.service.UserInfoService;
+import com.YuyeTech.TPlat.game.userinfo.service.MainInfoService;
+import com.YuyeTech.TPlat.game.userinfo.service.UserInfoService;
 import com.YuyeTech.TPlat.utils.AliyunOSSUtil;
 import com.YuyeTech.TPlat.utils.CookieUtil;
+import com.YuyeTech.TPlat.utils.RedisSettingMap;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -43,6 +44,9 @@ public class BackstageManagerController {
     @Autowired
     private StringRedisTemplate stringRedisTemplate;
 
+    @Autowired
+    private RedisSettingMap redisSettingMap;
+
     @Autowired
     private UserInfoService userInfoService;
 
@@ -95,6 +99,7 @@ public class BackstageManagerController {
 
     //login
     @RequestMapping("/adminLoginForm")
+    @Deprecated
     public ModelAndView adminLoginSubmit(@ModelAttribute("form") AdminForm adminForm,
                                          HttpServletResponse response,
                                          Map<String, Object> map) {
@@ -109,7 +114,7 @@ public class BackstageManagerController {
         String token = UUID.randomUUID().toString();
         Integer expire = RedisConstant.EXPIRE;
 
-        stringRedisTemplate.opsForValue().set(String.format(RedisConstant.TOKEN_PREFIX, token), adminInfo.getAdminName(), expire, TimeUnit.SECONDS);
+        stringRedisTemplate.opsForValue().set(redisSettingMap.getTokenKey(token), adminInfo.getAdminName(), expire, TimeUnit.SECONDS);
 
         //3. 设置token至cookie
         CookieUtil.set(response, CookieConstant.TOKEN, token, expire);
@@ -120,6 +125,7 @@ public class BackstageManagerController {
     }
 
     @GetMapping("/logout")
+    @Deprecated
     public ModelAndView logout(HttpServletRequest request,
                                HttpServletResponse response,
                                Map<String, Object> map) {

+ 2 - 2
src/main/java/com/YuyeTech/TPlat/game/controller/BackstageTagController.java

@@ -1,10 +1,10 @@
 package com.YuyeTech.TPlat.game.controller;
 
-import com.YuyeTech.TPlat.dataobject.UserInfo;
+import com.YuyeTech.TPlat.game.userinfo.projo.UserInfo;
 import com.YuyeTech.TPlat.dto.PageInfo;
 import com.YuyeTech.TPlat.dto.PageInfoDTO;
 import com.YuyeTech.TPlat.game.gameInfo.service.GameTagReferenceService;
-import com.YuyeTech.TPlat.service.UserInfoService;
+import com.YuyeTech.TPlat.game.userinfo.service.UserInfoService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.PageRequest;

+ 42 - 31
src/main/java/com/YuyeTech/TPlat/game/controller/LoginController.java

@@ -4,7 +4,12 @@ import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
 import com.YuyeTech.TPlat.dataobject.*;
+import com.YuyeTech.TPlat.enums.RedisType;
 import com.YuyeTech.TPlat.form.ClientForm;
+import com.YuyeTech.TPlat.game.userinfo.projo.MainInfo;
+import com.YuyeTech.TPlat.game.userinfo.projo.UserInfo;
+import com.YuyeTech.TPlat.game.userinfo.service.MainInfoService;
+import com.YuyeTech.TPlat.game.userinfo.service.UserInfoService;
 import com.YuyeTech.TPlat.service.*;
 import com.YuyeTech.TPlat.utils.*;
 import com.alibaba.fastjson.JSONObject;
@@ -37,7 +42,6 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.client.RestTemplate;
 import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
 
-import javax.annotation.Resource;
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 import javax.servlet.http.HttpServletRequest;
@@ -61,6 +65,9 @@ public class LoginController {
     @Autowired
     private StringRedisTemplate redisTemplate;
 
+    @Autowired
+    private RedisSettingMap redisSettingMap;
+
     @Autowired
     private MainInfoService mainInfoService;
 
@@ -167,8 +174,9 @@ public class LoginController {
             tokenMap.put("unionid", unionid);
 
             //2.设置token 到redis
-            redisTemplate.opsForHash().putAll(String.format(RedisConstant.TOKEN_PREFIX, token), tokenMap);
-            redisTemplate.expire(String.format(RedisConstant.TOKEN_PREFIX, token), expire, TimeUnit.SECONDS);
+//            redisTemplate.opsForHash().putAll(redisSettingMap.getTokenKey(token), tokenMap);
+//            redisTemplate.expire(redisSettingMap.getTokenKey(token), expire, TimeUnit.SECONDS);
+            redisSettingMap.putToken(token,tokenMap);
             //3.设置token到cookie
             CookieUtil.set(response, CookieConstant.TOKEN, token, expire);
             //TODO 可以增加自己的逻辑,关联业务相关数据
@@ -262,8 +270,9 @@ public class LoginController {
             }
             //2.设置token 到redis
             // redisTemplate.opsForValue().set(String.format(RedisConstant.TOKEN_PREFIX,token),session.getOpenid()+session.getSessionKey(),expire, TimeUnit.SECONDS);
-            redisTemplate.opsForHash().putAll(String.format(RedisConstant.TOKEN_PREFIX, token), tokenMap);
-            redisTemplate.expire(String.format(RedisConstant.TOKEN_PREFIX, token), expire, TimeUnit.SECONDS);
+//            redisTemplate.opsForHash().putAll(redisSettingMap.getTokenKey(token), tokenMap);
+//            redisTemplate.expire(redisSettingMap.getTokenKey(token), expire, TimeUnit.SECONDS);
+            redisSettingMap.putToken(token,tokenMap);
             //3.设置token到cookie
             CookieUtil.set(response, CookieConstant.TOKEN, token, expire);
             //TODO 可以增加自己的逻辑,关联业务相关数据
@@ -295,7 +304,7 @@ public class LoginController {
         //获取到请求后,查询cookie
 //        Cookie cookie = CookieUtil.get(request, CookieConstant.TOKEN);
         String token = request.getHeader("token");
-        Object sessionKey = redisTemplate.opsForHash().get(String.format(RedisConstant.TOKEN_PREFIX, token), "sessionKey");
+        Object sessionKey = redisTemplate.opsForHash().get(redisSettingMap.getTokenKey(token), "sessionKey");
         // 用户信息校验
         if (!wxService.getUserService().checkUserInfo(sessionKey.toString(), rawData, signature)) {
 //            return "user check failed";
@@ -342,7 +351,8 @@ public class LoginController {
         if (phoneNumber != null) {
             aliyunSMSUtil.sendSms(phoneNumber, code);
             //成功后保存code到redis
-            redisTemplate.opsForValue().set(String.format(RedisConstant.SMS_PREFIX, phoneNumber), code, expire, TimeUnit.SECONDS);
+//            redisTemplate.opsForValue().set(String.format(RedisConstant.SMS_PREFIX, phoneNumber), code, expire, TimeUnit.SECONDS);
+            redisSettingMap.setSMS(phoneNumber,code);
             log.info("getCode:" + code);
             return ResultVOUtil.success();
         } else {
@@ -406,7 +416,7 @@ public class LoginController {
 
             }
             //成功后保存code到redis
-            redisTemplate.opsForValue().set(String.format(RedisConstant.SMS_PREFIX, account), code, expire, TimeUnit.SECONDS);
+            redisSettingMap.setSMS(account,code);
             log.info("getCode:" + code);
             Map map = new HashMap();
             map.put("receiver",account);
@@ -430,8 +440,7 @@ public class LoginController {
     public ResultVO userBindPhoneNumber(@RequestParam("phoneNumber") String phoneNumber,
                                         @RequestParam("code") String code,
                                         @RequestParam("userId") String userId) {
-
-        String codeValue = redisTemplate.opsForValue().get(String.format(RedisConstant.SMS_PREFIX, phoneNumber));
+        String codeValue = redisSettingMap.getValue(RedisType.SMS,phoneNumber);
         if (!StringUtils.equals(codeValue, code)) {
             return ResultVOUtil.error(UserEnum.USER_CODE_ERROR.getCode(), UserEnum.USER_CODE_ERROR.getMessage());
         }
@@ -455,7 +464,7 @@ public class LoginController {
             mainInfo.setTelephoneNumber(phoneNumber);
             mainInfoService.addMainInfo(mainInfo);
             //TODO 写入成功后,删除redis里面保存的code
-            Boolean bSuccess = redisTemplate.delete(String.format(RedisConstant.SMS_PREFIX, phoneNumber));
+            Boolean bSuccess = redisSettingMap.deleteValue(RedisType.SMS,phoneNumber);
             if (!bSuccess) {
                 //删除不成功,redis不存在
                 log.info("redis 没有对应的token");
@@ -481,7 +490,7 @@ public class LoginController {
                                         @RequestParam("type") Integer type,
                                         @RequestParam("userId") String userId) {
 
-        String codeValue = redisTemplate.opsForValue().get(String.format(RedisConstant.SMS_PREFIX, account));
+        String codeValue = redisSettingMap.getValue(RedisType.SMS,account);
         if (!StringUtils.equals(codeValue, code)) {
             return ResultVOUtil.error(UserEnum.USER_CODE_ERROR.getCode(), UserEnum.USER_CODE_ERROR.getMessage());
         }
@@ -516,7 +525,7 @@ public class LoginController {
             }
             mainInfoService.addMainInfo(mainInfo);
             //TODO 写入成功后,删除redis里面保存的code
-            Boolean bSuccess = redisTemplate.delete(String.format(RedisConstant.SMS_PREFIX, account));
+            Boolean bSuccess = redisSettingMap.deleteValue(RedisType.SMS,account);
             if (!bSuccess) {
                 //删除不成功,redis不存在
                 log.info("redis 没有对应的token");
@@ -591,7 +600,7 @@ public class LoginController {
     @GetMapping("/SMS_login")
     @Deprecated
     public ResultVO userRegistrationAndSMSLogin(String phoneNumber, String code) {
-        String codeValue = redisTemplate.opsForValue().get(String.format(RedisConstant.SMS_PREFIX, phoneNumber));
+        String codeValue = redisSettingMap.getValue(RedisType.SMS,phoneNumber);
         if (!StringUtils.equals(codeValue, code)) {
             log.warn("【code校验】Redis 中查找不到验证码 {},==,{}", codeValue, code);
             return ResultVOUtil.error(UserEnum.USER_CODE_ERROR.getCode(), UserEnum.USER_CODE_ERROR.getMessage());
@@ -613,7 +622,7 @@ public class LoginController {
                 mainInfoService.addMainInfo(mainInfo);
             }
             //TODO 写入成功后,删除redis里面保存的code
-            Boolean bSuccess = redisTemplate.delete(String.format(RedisConstant.SMS_PREFIX, phoneNumber));
+            Boolean bSuccess = redisSettingMap.deleteValue(RedisType.SMS,phoneNumber);
             if (!bSuccess) {
                 //删除不成功,redis不存在
                 log.info("redis 没有对应的token");
@@ -621,8 +630,8 @@ public class LoginController {
 
             tokenMap.put("userId", mainInfo.getUserId());
 
-            redisTemplate.opsForHash().putAll(String.format(RedisConstant.TOKEN_PREFIX, token), tokenMap);
-            redisTemplate.expire(String.format(RedisConstant.TOKEN_PREFIX, token), expire, TimeUnit.SECONDS);
+            redisTemplate.opsForHash().putAll(redisSettingMap.getTokenKey(token), tokenMap);
+            redisTemplate.expire(redisSettingMap.getTokenKey(token), expire, TimeUnit.SECONDS);
 
             //返回一个token
             LoginVO loginVO = new LoginVO();
@@ -640,7 +649,7 @@ public class LoginController {
 
     @GetMapping("/SMS_login_from_type")
     public ResultVO userRegistrationAndSMSLogin(String account, String code, Integer type) {
-        String codeValue = redisTemplate.opsForValue().get(String.format(RedisConstant.SMS_PREFIX, account));
+        String codeValue = redisSettingMap.getValue(RedisType.SMS,account);
         if (!StringUtils.equals(codeValue, code)) {
             log.warn("【code校验】Redis 中查找不到验证码 {},==,{}", codeValue, code);
             return ResultVOUtil.error(UserEnum.USER_CODE_ERROR.getCode(), UserEnum.USER_CODE_ERROR.getMessage());
@@ -671,7 +680,7 @@ public class LoginController {
                 mainInfoService.addMainInfo(mainInfo);
             }
             //TODO 写入成功后,删除redis里面保存的code
-            Boolean bSuccess = redisTemplate.delete(String.format(RedisConstant.SMS_PREFIX, account));
+            Boolean bSuccess =redisSettingMap.deleteValue(RedisType.SMS, account);
             if (!bSuccess) {
                 //删除不成功,redis不存在
                 log.info("redis 没有对应的token");
@@ -679,9 +688,9 @@ public class LoginController {
 
             tokenMap.put("userId", mainInfo.getUserId());
 
-            redisTemplate.opsForHash().putAll(String.format(RedisConstant.TOKEN_PREFIX, token), tokenMap);
-            redisTemplate.expire(String.format(RedisConstant.TOKEN_PREFIX, token), expire, TimeUnit.SECONDS);
-
+//            redisTemplate.opsForHash().putAll(redisSettingMap.getTokenKey(token), tokenMap);
+//            redisTemplate.expire(redisSettingMap.getTokenKey(token), expire, TimeUnit.SECONDS);
+            redisSettingMap.putToken(token,tokenMap);
             //返回一个token
             LoginVO loginVO = new LoginVO();
             loginVO.setToken(token);
@@ -726,8 +735,8 @@ public class LoginController {
 
             //TODO 登录成功,返回对应的字段
             tokenMap.put("userId", mainInfo.getUserId());
-            redisTemplate.opsForHash().putAll(String.format(RedisConstant.TOKEN_PREFIX, token), tokenMap);
-            redisTemplate.expire(String.format(RedisConstant.TOKEN_PREFIX, token), expire, TimeUnit.SECONDS);
+            redisTemplate.opsForHash().putAll(redisSettingMap.getTokenKey(token), tokenMap);
+            redisTemplate.expire(redisSettingMap.getTokenKey(token), expire, TimeUnit.SECONDS);
 
             //返回一个token
             LoginVO loginVO = new LoginVO();
@@ -770,9 +779,9 @@ public class LoginController {
 
             //TODO 登录成功,返回对应的字段
             tokenMap.put("userId", mainInfo.getUserId());
-            redisTemplate.opsForHash().putAll(String.format(RedisConstant.TOKEN_PREFIX, token), tokenMap);
-            redisTemplate.expire(String.format(RedisConstant.TOKEN_PREFIX, token), expire, TimeUnit.SECONDS);
-
+//            redisTemplate.opsForHash().putAll(redisSettingMap.getTokenKey(token), tokenMap);
+//            redisTemplate.expire(redisSettingMap.getTokenKey(token), expire, TimeUnit.SECONDS);
+            redisSettingMap.putToken(token,tokenMap);
             //返回一个token
             LoginVO loginVO = new LoginVO();
             loginVO.setToken(token);
@@ -893,8 +902,10 @@ public class LoginController {
             tokenMap.put("appleId", appleInfo.getAppleId());
 
             //2.设置token 到redis
-            redisTemplate.opsForHash().putAll(String.format(RedisConstant.TOKEN_PREFIX, token), tokenMap);
-            redisTemplate.expire(String.format(RedisConstant.TOKEN_PREFIX, token), expire, TimeUnit.SECONDS);
+            //String.format(RedisConstant.TOKEN_PREFIX, token)
+//            redisTemplate.opsForHash().putAll(redisSettingMap.getTokenKey(token), tokenMap);
+//            redisTemplate.expire(redisSettingMap.getTokenKey(token), expire, TimeUnit.SECONDS);
+            redisSettingMap.putToken(token,tokenMap);
             //3.设置token到cookie
             CookieUtil.set(response, CookieConstant.TOKEN, token, expire);
             //TODO 可以增加自己的逻辑,关联业务相关数据
@@ -985,7 +996,7 @@ public class LoginController {
                                     @RequestParam("password") String password,
                                     @RequestParam("userId") String userId) {
 
-        String codeValue = redisTemplate.opsForValue().get(String.format(RedisConstant.SMS_PREFIX, account));
+        String codeValue = redisSettingMap.getValue(RedisType.SMS, account);
         if (!StringUtils.equals(codeValue, code)) {
             return ResultVOUtil.error(UserEnum.USER_CODE_ERROR.getCode(), UserEnum.USER_CODE_ERROR.getMessage());
         }
@@ -1005,7 +1016,7 @@ public class LoginController {
             mainInfo.setPassword(password);
             mainInfoService.addMainInfo(mainInfo);
             //TODO 写入成功后,删除redis里面保存的code
-            Boolean bSuccess = redisTemplate.delete(String.format(RedisConstant.SMS_PREFIX, account));
+            Boolean bSuccess = redisSettingMap.deleteValue(RedisType.SMS, account);
             if (!bSuccess) {
                 //删除不成功,redis不存在
                 log.info("redis 没有对应的token");

+ 14 - 8
src/main/java/com/YuyeTech/TPlat/game/controller/RankingController.java

@@ -2,10 +2,10 @@ package com.YuyeTech.TPlat.game.controller;
 
 import com.YuyeTech.TPlat.VO.*;
 import com.YuyeTech.TPlat.dataobject.Ranking;
-import com.YuyeTech.TPlat.dataobject.UserInfo;
+import com.YuyeTech.TPlat.game.userinfo.projo.UserInfo;
 import com.YuyeTech.TPlat.dto.UserDTO;
 import com.YuyeTech.TPlat.service.RankingService;
-import com.YuyeTech.TPlat.service.UserInfoService;
+import com.YuyeTech.TPlat.game.userinfo.service.UserInfoService;
 
 import com.YuyeTech.TPlat.constant.RankingConstant;
 import com.YuyeTech.TPlat.game.gameInfo.projo.GameInfo;
@@ -13,10 +13,12 @@ import com.YuyeTech.TPlat.dataobject.RankInfo;
 import com.YuyeTech.TPlat.enums.GameEnum;
 import com.YuyeTech.TPlat.game.gameInfo.service.GameInfoService;
 import com.YuyeTech.TPlat.service.RankInfoService;
+import com.YuyeTech.TPlat.utils.RedisSettingMap;
 import com.YuyeTech.TPlat.utils.ResultVOUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.data.redis.core.ZSetOperations;
 import org.springframework.stereotype.Controller;
@@ -36,6 +38,7 @@ import java.util.*;
 @RequestMapping("/ranking")
 @Slf4j
 public class RankingController {
+
     @Autowired
     private StringRedisTemplate stringRedisTemplate;
 
@@ -51,6 +54,9 @@ public class RankingController {
     @Autowired
     private GameInfoService gameInfoService;
 
+    @Autowired
+    private RedisSettingMap redisSettingMap;
+
     @ResponseBody
     @PostMapping("/add_rank_game")
     public ResultVO addRankInfo(@RequestParam(required = false) String gameId,
@@ -87,7 +93,7 @@ public class RankingController {
             return ResultVOUtil.error(GameEnum.NOT_RANK_GAME_INFO.getCode(), GameEnum.NOT_RANK_GAME_INFO.getMessage());
         }
         //1.先查游戏基本数据
-        GameInfo gameInfo = gameInfoService.findByGameId(rankInfo.getRObjectId());
+        GameInfo gameInfo = gameInfoService.findByGameId(rankInfo.getRObjectId(),true);
         GameVO gameVO = new GameVO();
         BeanUtils.copyProperties(gameInfo, gameVO);
         return ResultVOUtil.success(gameVO);
@@ -105,8 +111,8 @@ public class RankingController {
         //2. 存储一个市的key 值,存储一个全国的key 值。
         //3. cityKey 的拼接是市的 cityCode+gameId,chinaKey 全国的是 gameId
 
-        String cityKey = String.format(RankingConstant.cityKey, cityCode.substring(0, 4), gameId);
-        String chinaKey = String.format(RankingConstant.chinaKey, gameId);
+        String cityKey = redisSettingMap.getCityKey(cityCode, gameId);//String.format(RankingConstant.cityKey, cityCode.substring(0, 4), gameId);
+        String chinaKey = redisSettingMap.getChinaKey(gameId); //String.format(RankingConstant.chinaKey, gameId);
 
         ZSetOperations zSetOperations = stringRedisTemplate.opsForZSet();
 
@@ -226,17 +232,17 @@ public class RankingController {
                                     @RequestParam String userId) {
 
         //1.先查游戏基本数据
-        GameInfo gameInfo = gameInfoService.findByGameId(gameId);
+        GameInfo gameInfo = gameInfoService.findByGameId(gameId,true);
         GameVO gameVO = new GameVO();
         if (gameInfo == null) {
             return ResultVOUtil.error(GameEnum.NOT_GAME_INFO.getCode(), GameEnum.NOT_GAME_INFO.getMessage());
         }
         BeanUtils.copyProperties(gameInfo, gameVO);
         //cityKey 默认是全国
-        String cityKey = String.format(RankingConstant.chinaKey, gameInfo.getGameId());
+        String cityKey = redisSettingMap.getChinaKey(gameId);//String.format(RankingConstant.chinaKey, gameInfo.getGameId());
         if (type.equals("city")) {
             //1. 根据gameId 和 cityCode 来查询
-            cityKey = String.format(RankingConstant.cityKey, cityCode.substring(0, 4), gameInfo.getGameId());
+            cityKey = redisSettingMap.getCityKey(cityCode, gameInfo.getGameId());//String.format(RankingConstant.cityKey, cityCode.substring(0, 4), gameInfo.getGameId());
         }
 
         ZSetOperations zSetOperations = stringRedisTemplate.opsForZSet();

+ 173 - 153
src/main/java/com/YuyeTech/TPlat/game/gameInfo/controller/BackstageGameController.java

@@ -1,31 +1,32 @@
 package com.YuyeTech.TPlat.game.gameInfo.controller;
 
+import cn.hutool.core.date.DateUtil;
 import com.YuyeTech.TPlat.VO.ResultVO;
 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.config.GameConfigTime;
-import com.YuyeTech.TPlat.dataobject.*;
 import com.YuyeTech.TPlat.dto.GameTagDTO;
 import com.YuyeTech.TPlat.dto.MakeGameTagDTO;
 import com.YuyeTech.TPlat.enums.GameEnum;
+import com.YuyeTech.TPlat.enums.PictureType;
 import com.YuyeTech.TPlat.form.GameInfoForm;
-import com.YuyeTech.TPlat.game.bluetoothinfo.vo.BluetoothInfoVo;
 import com.YuyeTech.TPlat.game.gameInfo.projo.*;
 import com.YuyeTech.TPlat.game.gameInfo.service.*;
+import com.YuyeTech.TPlat.game.gameInfo.vo.GameInfoAndTagsVo;
 import com.YuyeTech.TPlat.game.gameInfo.vo.GameInfoVo;
-import com.YuyeTech.TPlat.service.*;
-import com.YuyeTech.TPlat.utils.AliyunOSSUtil;
-import com.YuyeTech.TPlat.utils.ImageUtils;
-import com.YuyeTech.TPlat.utils.KeyUtil;
-import com.YuyeTech.TPlat.utils.ResultVOUtil;
+import com.YuyeTech.TPlat.game.imageInfo.projo.Pictures;
+import com.YuyeTech.TPlat.game.imageInfo.service.PicturesService;
+import com.YuyeTech.TPlat.game.imageInfo.vo.PicturesVo;
+import com.YuyeTech.TPlat.utils.*;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Sort;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -36,6 +37,8 @@ import javax.validation.Valid;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -79,24 +82,27 @@ public class BackstageGameController {
     /**
      * 前端view跳转,配置菜单路径
      * 设置默认参数
+     *
      * @return
      */
     @GetMapping("gotoView")
-    public ModelAndView excelWorkPro() {
+    public ModelAndView gotoView() {
         //查询所有的类目
         List<GameCategory> categoryList = gameCategoryService.findAll();
         //allTags
         List<GameTag> gameTagList = gameTagService.findAll();
-        List<MakeGameTagDTO> allCustomTags = gameTagList.stream().map(e->{return new MakeGameTagDTO(e.getId(),e.getTitle(),e.getMode(),e.getIsDefault(),false);
+        List<MakeGameTagDTO> allCustomTags = gameTagList.stream().map(e -> {
+            return new MakeGameTagDTO(e.getId(), e.getTitle(), e.getMode(), e.getIsDefault(), false);
         }).collect(Collectors.toList());
         ModelAndView modelAndView = new ModelAndView("client/gameInfo");
-        modelAndView.addObject("categoryList", categoryList);
-        modelAndView.addObject("allCustomTags", allCustomTags);
+        modelAndView.addObject("categoryList", categoryList);//游戏分类
+        modelAndView.addObject("allCustomTags", allCustomTags);//游戏标签
         return modelAndView;
     }
 
     /**
      * 分页查询数据
+     *
      * @param vo
      * @return
      */
@@ -107,119 +113,128 @@ public class BackstageGameController {
         return gameInfoService.page(vo);
     }
 
+    /**
+     *   返回一个 map 游戏数据
+     *   map.put("gameInfo", gameInfo);
+     *   map.put("gamePicturesList", picturesList);
+     *   map.put("gameTags",gameTagDTOS);
+     * @param gameId
+     * @return
+     */
+    @PostMapping("findGameDetail")
+    @Decrypt
+    @Encrypt
+    public Result<?> findGameDetail(@RequestParam("gameId") String gameId){
+        Map map = gameInfoService.findByGameDetail(gameId,false);
+        return Result.of(map);
+    }
 
-    @PostMapping("/uploadImg")
-    public Result uploadImg(@RequestParam("scroll") MultipartFile[] scroll) {
-
-        ////存的项目的中模版图片
-        //String contextPath = "";
-        //File uploadIconFile = null, uploadCoverFile = null, uploadCarouselFile = null;
-        ////是否是添加新的,用bool 值判断
-        //Boolean BAddIcon = false, BAddCover = false, BAddCarousel = false;
-        //Pictures pictureIcon = new Pictures();
-        //Pictures pictureCover = new Pictures();
-        //try {
-        //    //轮播图
-        //    List<Pictures> picturesList = new ArrayList<>();
-        //    try {
-        //        for (int i = 0; i < scroll.length; i++) {
-        //            //获得文件
-        //            MultipartFile multipartFile = scroll[i];
-        //            String fileName = multipartFile.getOriginalFilename();
-        //            if (!"".equals(fileName.trim())) {
-        //                uploadCarouselFile = new File(fileName);
-        //                FileOutputStream os = new FileOutputStream(uploadCarouselFile);
-        //                os.write(multipartFile.getBytes());
-        //                os.close();
-        //                multipartFile.transferTo(uploadCarouselFile);
-        //                //上传到OSS
-        //                String pictureUrl = aliyunOSSUtil.upload(uploadCarouselFile, "pictures");
-        //                //1.向Pictures 添加数据
-        //                Pictures pictures1 = new Pictures();
-        //                pictures1.setPictureUrl(pictureUrl);
-        //                pictures1.setPictureType(0);
-        //                pictures1 = picturesService.addPictureAndFlush(pictures1);
-        //                picturesList.add(pictures1);
-        //                log.info(aliyunOSSUtil.addDomainName(pictures1.getPictureUrl()));
-        //
-        //                BAddCarousel = true;
-        //            }
-        //        }
-        //    } catch (FileNotFoundException e) {
-        //        e.printStackTrace();
-        //    }
-        //    //1.向gameInfo 添加数据 或者更新数据
-        //    GameInfo gameInfo = new GameInfo();
-        //    if (!StringUtils.isEmpty(gameInfoForm.getGameId())) {
-        //        gameInfo = gameInfoService.findByGameId(gameInfoForm.getGameId(), false);
-        //    } else {
-        //        String _id = KeyUtil.genUniqueKey();
-        //        gameInfoForm.setGameId(_id);
-        //    }
-        //    BeanUtils.copyProperties(gameInfoForm, gameInfo);
-        //
-        //    //如果上传的文件存在 uploadUrl != "" coverUrl != ""
-        //    if (BAddIcon)
-        //        gameInfo.setGameIcon(uploadUrl);
-        //    if (BAddCover)
-        //        gameInfo.setGamePicture(coverUrl);
-        //
-        //    //todo 后续修改成可以选择,后台
-        //    gameInfo.setGameRankingId(gameInfo.getGameId());
-        //    gameInfo.setGameRankingShow(1);
-        //    GameInfo gameInfoTemp = gameInfoService.addGameInfoAndFlush(gameInfo);
-        //    //保存tags引用
-        //    List<GameTagReference> gameTagReferenceList = new ArrayList<>();
-        //    for(int i=0;i<multiselectTag.length;i++){
-        //        GameTagReference gameTagReference = new GameTagReference();
-        //        gameTagReference.setGameId(gameInfoTemp.getGameId());
-        //        gameTagReference.setTagId(multiselectTag[i]);
-        //        gameTagReference.setStatus(1);
-        //        gameTagReferenceList.add(gameTagReference);
-        //
-        //    }
-        //    gameTagReferenceService.saveGameTagReference(gameTagReferenceList);
-        //
-        //    //把图片库数据和游戏信息绑定起来
-        //    if (BAddIcon) {
-        //        GamePicture gamePictureIcon = new GamePicture();
-        //        gamePictureIcon.setGpType(1);
-        //        gamePictureIcon.setGameId(gameInfoTemp.getGameId());
-        //        gamePictureIcon.setPictureId(pictureIcon.getPictureId());
-        //        gamePictureService.addGamePicture(gamePictureIcon);
-        //
-        //        map.put("icon", aliyunOSSUtil.addDomainName(pictureIcon.getPictureUrl()));
-        //    }
-        //
-        //    if (BAddCover) {
-        //        GamePicture gamePictureCover = new GamePicture();
-        //        gamePictureCover.setGpType(2);
-        //        gamePictureCover.setGameId(gameInfoTemp.getGameId());
-        //        gamePictureCover.setPictureId(pictureCover.getPictureId());
-        //        gamePictureService.addGamePicture(gamePictureCover);
-        //
-        //        map.put("cover", aliyunOSSUtil.addDomainName(pictureCover.getPictureUrl()));
-        //
-        //    }
-        //
-        //
-        //    //绑定轮播图 type =0
-        //    List<String> carouselUrlList = new ArrayList();
-        //
-        //    for (int i = 0; i < picturesList.size(); i++) {
-        //        GamePicture gamePictureList = new GamePicture();
-        //        gamePictureList.setGpType(0);
-        //        gamePictureList.setGameId(gameInfoTemp.getGameId());
-        //        gamePictureList.setPictureId(picturesList.get(i).getPictureId());
-        //        gamePictureService.addGamePicture(gamePictureList);
-        //
-        //        log.info("绑定轮播图");
-        //        carouselUrlList.add(aliyunOSSUtil.addDomainName(picturesList.get(i).getPictureUrl()));
-        //    }
-
-        return null;
+    @PostMapping("saveBaseInfo")
+    @Decrypt
+    @Encrypt
+    public Result<GameInfoVo> saveBaseInfo(GameInfoAndTagsVo vo) {
+        //1.向gameInfo 添加数据 或者更新数据
+        GameInfoVo saveVo = new GameInfoVo();
+        BeanUtils.copyProperties(vo, saveVo);
+        if(saveVo.getShowTime() == null || !StringUtils.hasText(saveVo.getShowTime().toString())){
+            try {
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                Date localDate = sdf.parse(gameConfig.getEndTime());
+                saveVo.setShowTime(localDate);
+            }catch (ParseException e){
+                return Result.of(null,false,"解析日期错误!");
+            }
+
+        }
+        GameInfoVo gameInfoVo = gameInfoService.saveReturnVo(saveVo);
+        //如果saveVO 不存在排行榜信息,则再存储一次GameId
+        if(gameInfoVo.getGameRankingId() == null){
+            gameInfoVo.setGameRankingId(gameInfoVo.getGameId());
+            gameInfoVo.setGameRankingShow(0);
+            gameInfoVo = gameInfoService.saveReturnVo(gameInfoVo);
+        }
+
+        //先删除对应的tag
+        gameTagReferenceService.deleteGameTagByGameId(gameInfoVo.getGameId());
+        List<GameTagReference> gameTagReferenceList = new ArrayList<>();
+        String[] tagIds = vo.getMultiSelectTag().split(",");
+        for (int i = 0; i < tagIds.length; i++) {
+            GameTagReference gameTagReference = new GameTagReference();
+            gameTagReference.setGameId(gameInfoVo.getGameId());
+            gameTagReference.setTagId(Integer.parseInt(tagIds[i]));
+            gameTagReference.setStatus(1);
+            gameTagReferenceList.add(gameTagReference);
+
+        }
+        //保存tags引用
+        gameTagReferenceService.saveGameTagReference(gameTagReferenceList);
+        return Result.of(gameInfoVo);
     }
 
+    /**
+     * 删除数据
+     * 删除时候,需要更新缓存列表
+     *
+     * @param id
+     * @return
+     */
+    @PostMapping("delete")
+    @Decrypt
+    @Encrypt
+    public Result delete(@RequestParam("id") String id) {
+        String resultID = gameInfoService.deleteAndCache(id);
+        //bluetoothInfoService.updateListToCache();
+        return Result.of(resultID);
+    }
+
+    /**
+     * 修改游戏对应图片
+     * @param file
+     * @param type
+     * @param gameId
+     * @return
+     */
+    @PostMapping("/uploadImg")
+    public Result uploadImg(@RequestParam("file") MultipartFile file,
+                            @RequestParam("type") String type,
+                            @RequestParam("gameId") String gameId) {
+        //1.向gameInfo 添加数据 或者更新数据
+        GameInfoVo gameInfoVo = gameInfoService.getVo(gameId);
+        if (gameInfoVo == null) {
+            return Result.of(null, false, "上传游戏图片失败!");
+        }
+        //存的项目的中模版图片
+        String contextPath = "";
+        File uploadIconFile = null;
+        try {
+            if (null != file) {
+                String filename = file.getOriginalFilename();
+                if (!"".equals(filename.trim())) {
+                    uploadIconFile = new File(filename);
+                    FileOutputStream os = new FileOutputStream(uploadIconFile);
+                    os.write(file.getBytes());
+                    os.close();
+                    file.transferTo(uploadIconFile);
+                    //保存图片
+                    picturesService.addPictureToTheGame(uploadIconFile,type,gameInfoVo);
+                    return Result.of(null, true, "上传成功");
+                }
+            }
+            //如果没有上传成功,返回失败
+            return Result.of(null, false, "上传失败");
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            if (!contextPath.equals("")) {
+                imageUtils.deleteImage(contextPath);
+            }
+            if (uploadIconFile != null)
+                uploadIconFile.delete();
+        }
+        return Result.of(null, false, "上传失败");
+    }
 
 
     @GetMapping("/list")
@@ -260,7 +275,7 @@ public class BackstageGameController {
                                HttpServletRequest req,
                                Map<String, Object> map) {
         String userId = req.getParameter("userId");
-        GameInfo gameInfo = gameInfoService.findByGameId(gameId);
+        GameInfo gameInfo = gameInfoService.findByGameId(gameId,true);
         map.put("gameInfo", gameInfo);
         //查找图片库对应的图片信息
         List<Integer> pictureIdList = gamePictureService.findGamePictureIDList(gameId);
@@ -284,16 +299,17 @@ public class BackstageGameController {
         List<GameTagDTO> gameTagDTOList = gameTagReferenceService.findGameTagByGameId(gameId);
         //allTags
         List<GameTag> gameTagList = gameTagService.findAll();
-        List<MakeGameTagDTO> allCustomTags = gameTagList.stream().map(e->{return new MakeGameTagDTO(e.getId(),e.getTitle(),e.getMode(),e.getIsDefault(),false);
+        List<MakeGameTagDTO> allCustomTags = gameTagList.stream().map(e -> {
+            return new MakeGameTagDTO(e.getId(), e.getTitle(), e.getMode(), e.getIsDefault(), false);
         }).collect(Collectors.toList());
-        for (int i =0;i<allCustomTags.size();i++){
-            for (int j =0;j<gameTagDTOList.size();j++){
-                if(allCustomTags.get(i).getTagId() == gameTagDTOList.get(j).getTagId()){
+        for (int i = 0; i < allCustomTags.size(); i++) {
+            for (int j = 0; j < gameTagDTOList.size(); j++) {
+                if (allCustomTags.get(i).getTagId() == gameTagDTOList.get(j).getTagId()) {
                     allCustomTags.get(i).setTagSelect(true);
                 }
             }
         }
-        map.put("allCustomTags",allCustomTags);
+        map.put("allCustomTags", allCustomTags);
 
         return new ModelAndView("/game/detail", map);
     }
@@ -301,6 +317,7 @@ public class BackstageGameController {
 
     /**
      * 添加新游戏
+     *
      * @param map
      * @return
      */
@@ -316,9 +333,10 @@ public class BackstageGameController {
 
         //allTags
         List<GameTag> gameTagList = gameTagService.findAll();
-        List<MakeGameTagDTO> allCustomTags = gameTagList.stream().map(e->{return new MakeGameTagDTO(e.getId(),e.getTitle(),e.getMode(),e.getIsDefault(),false);
+        List<MakeGameTagDTO> allCustomTags = gameTagList.stream().map(e -> {
+            return new MakeGameTagDTO(e.getId(), e.getTitle(), e.getMode(), e.getIsDefault(), false);
         }).collect(Collectors.toList());
-        map.put("allCustomTags",allCustomTags);
+        map.put("allCustomTags", allCustomTags);
 
         return new ModelAndView("/game/detail", map);
     }
@@ -435,7 +453,7 @@ public class BackstageGameController {
             GameInfo gameInfoTemp = gameInfoService.addGameInfoAndFlush(gameInfo);
             //保存tags引用
             List<GameTagReference> gameTagReferenceList = new ArrayList<>();
-            for(int i=0;i<multiselectTag.length;i++){
+            for (int i = 0; i < multiselectTag.length; i++) {
                 GameTagReference gameTagReference = new GameTagReference();
                 gameTagReference.setGameId(gameInfoTemp.getGameId());
                 gameTagReference.setTagId(multiselectTag[i]);
@@ -498,16 +516,17 @@ public class BackstageGameController {
 
             //allTags
             List<GameTag> gameTagList = gameTagService.findAll();
-            List<MakeGameTagDTO> allCustomTags = gameTagList.stream().map(e->{return new MakeGameTagDTO(e.getId(),e.getTitle(),e.getMode(),e.getIsDefault(),false);
+            List<MakeGameTagDTO> allCustomTags = gameTagList.stream().map(e -> {
+                return new MakeGameTagDTO(e.getId(), e.getTitle(), e.getMode(), e.getIsDefault(), false);
             }).collect(Collectors.toList());
-            for (int i =0;i<allCustomTags.size();i++){
-                for (int j =0;j<multiselectTag.length;j++){
-                    if(allCustomTags.get(i).getTagId() == multiselectTag[j]){
+            for (int i = 0; i < allCustomTags.size(); i++) {
+                for (int j = 0; j < multiselectTag.length; j++) {
+                    if (allCustomTags.get(i).getTagId() == multiselectTag[j]) {
                         allCustomTags.get(i).setTagSelect(true);
                     }
                 }
             }
-            map.put("allCustomTags",allCustomTags);
+            map.put("allCustomTags", allCustomTags);
 
             return new ModelAndView("/game/detail", map);
         } catch (Exception ex) {
@@ -544,7 +563,7 @@ public class BackstageGameController {
                                @RequestParam("cover") MultipartFile cover,
                                @RequestParam("scroll") MultipartFile[] scroll,
                                @Valid GameInfoForm gameInfoForm,
-                               @RequestParam("multiselectTag") Integer[]  multiselectTag,
+                               @RequestParam("multiselectTag") Integer[] multiselectTag,
                                Map<String, Object> map) {
 
         if (StringUtils.isEmpty(gameInfoForm.getShowTime())) {
@@ -679,7 +698,7 @@ public class BackstageGameController {
             //todo 如果tags更新,先删除旧的tags
             gameTagReferenceService.deleteGameTagByGameId(gameInfoTemp.getGameId());
             List<GameTagReference> gameTagReferenceList = new ArrayList<>();
-            for(int i=0;i<multiselectTag.length;i++){
+            for (int i = 0; i < multiselectTag.length; i++) {
                 GameTagReference gameTagReference = new GameTagReference();
                 gameTagReference.setGameId(gameInfoTemp.getGameId());
                 gameTagReference.setTagId(multiselectTag[i]);
@@ -737,16 +756,17 @@ public class BackstageGameController {
 
             //allTags
             List<GameTag> gameTagList = gameTagService.findAll();
-            List<MakeGameTagDTO> allCustomTags = gameTagList.stream().map(e->{return new MakeGameTagDTO(e.getId(),e.getTitle(),e.getMode(),e.getIsDefault(),false);
+            List<MakeGameTagDTO> allCustomTags = gameTagList.stream().map(e -> {
+                return new MakeGameTagDTO(e.getId(), e.getTitle(), e.getMode(), e.getIsDefault(), false);
             }).collect(Collectors.toList());
-            for (int i =0;i<allCustomTags.size();i++){
-                for (int j =0;j<multiselectTag.length;j++){
-                    if(allCustomTags.get(i).getTagId() == multiselectTag[j]){
+            for (int i = 0; i < allCustomTags.size(); i++) {
+                for (int j = 0; j < multiselectTag.length; j++) {
+                    if (allCustomTags.get(i).getTagId() == multiselectTag[j]) {
                         allCustomTags.get(i).setTagSelect(true);
                     }
                 }
             }
-            map.put("allCustomTags",allCustomTags);
+            map.put("allCustomTags", allCustomTags);
 
             return new ModelAndView("/game/detail", map);
         } catch (Exception ex) {
@@ -887,17 +907,17 @@ public class BackstageGameController {
     }
 
 
-    @PostMapping("/delete")
-    public ResultVO delete(@RequestParam(value = "gameId") String gameId,
-                           Map<String, Object> map) {
-
-        //1.向gameInfo 添加数据
-        log.info("删除的游戏id:" + gameId);
-        String str = gameInfoService.deleteByGameId(gameId);
-        map.put("msg", str);
-        return ResultVOUtil.success(map);
-
-    }
+//    @PostMapping("/delete")
+//    public ResultVO delete(@RequestParam(value = "gameId") String gameId,
+//                           Map<String, Object> map) {
+//
+//        //1.向gameInfo 添加数据
+//        log.info("删除的游戏id:" + gameId);
+//        String str = gameInfoService.deleteByGameId(gameId);
+//        map.put("msg", str);
+//        return ResultVOUtil.success(map);
+//
+//    }
 
     @PostMapping("/upload_folder")
     public ResultVO uploadFolder(@RequestParam("folder") MultipartFile folder) {

+ 4 - 0
src/main/java/com/YuyeTech/TPlat/game/gameInfo/controller/ClientGameInfoController.java

@@ -29,6 +29,10 @@ public class ClientGameInfoController {
     @Autowired
     private AliyunOSSUtil aliyunOSSUtil;
 
+    /**
+     * 随机获取AI信息
+     * @return
+     */
     @GetMapping("/ai_random_info")
     public ResultVO getRandomAIInfo(){
 

+ 18 - 3
src/main/java/com/YuyeTech/TPlat/game/gameInfo/controller/GameInfoController.java

@@ -51,6 +51,7 @@ public class GameInfoController {
     private GameConfigTime gameConfig;
 
     @GetMapping("/list")
+    @Deprecated
     public ResultVO getAllGame(
     ) {
         List<GameInfo> gameInfos = gameInfoService.findAll();
@@ -76,18 +77,23 @@ public class GameInfoController {
 
     }
 
-
+    /**
+     * 获取游戏详情
+     * @param gameId
+     * @return
+     */
     @GetMapping("/detail")
     public ResultVO getGameDetail(
             @RequestParam(value = "gameId") String gameId
     ) {
-        Map map = gameInfoService.findByGameDetail(gameId);
+        Map map = gameInfoService.findByGameDetail(gameId,true);
 
         return ResultVOUtil.success(map);
 
     }
 
     @PostMapping("/add_dontLogin")
+    @Deprecated
     public ResultVO addGameInfo(@Valid GameInfoForm gameInfoForm, HttpServletRequest request) {
 
         //文件上传
@@ -130,6 +136,7 @@ public class GameInfoController {
      * @return
      */
     @GetMapping("/recommend_list")
+    @Deprecated
     public ResultVO getRecommendAllGame(@RequestParam(value = "recommendType", required = false) Integer recommendType,
                                         @RequestParam(value = "userId", required = false) String userId,
                                         @RequestParam(value = "endTime", required = false) String endTime,
@@ -175,9 +182,11 @@ public class GameInfoController {
     }
     /**
      * 根据游戏类目,获取游戏列表
+     * 废弃
      * @return
      */
     @GetMapping("/list_from_category")
+    @Deprecated
     public ResultVO getGameListFromCategory(@RequestParam(value = "categoryType", required = false) Integer categoryType,
                                             @RequestParam(value = "userId", required = false) String userId,
                                             @RequestParam(value = "endTime", required = false) String endTime,
@@ -195,7 +204,13 @@ public class GameInfoController {
 
 
     /**
-     * 根据游戏类目,获取游戏列表
+     * 获取游戏列表
+     * @param categoryType 所属分类
+     * @param userId
+     * @param platform 平台
+     * @param endTime
+     * @param page
+     * @param size
      * @return
      */
     @GetMapping("/list_from_category_platform")

+ 2 - 1
src/main/java/com/YuyeTech/TPlat/game/gameInfo/projo/GameInfo.java

@@ -35,6 +35,7 @@ public class GameInfo {
     private Date showTime;
     /** 创建时间. */
     private Date createTime;
-
+    /** 更新时间 */
+    private Date updateTime;
 
 }

+ 6 - 1
src/main/java/com/YuyeTech/TPlat/game/gameInfo/repository/GamePicturesRepository.java

@@ -1,10 +1,12 @@
 package com.YuyeTech.TPlat.game.gameInfo.repository;
 
+import com.YuyeTech.TPlat.common.repository.CommonRepository;
 import com.YuyeTech.TPlat.game.gameInfo.projo.GamePicture;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
 
 import java.util.List;
 import java.util.Optional;
@@ -13,7 +15,9 @@ import java.util.Optional;
  * @author:slambb
  * @date:2020/1/16
  */
-public interface GamePicturesRepository extends JpaRepository<GamePicture,Integer> {
+// extends JpaRepository<GamePicture,Integer>
+@Repository
+public interface GamePicturesRepository extends CommonRepository<GamePicture,Integer> {
 
     //根据游戏id 查找对应的图片信息id
     List<GamePicture> findByGameId(String gameId);
@@ -26,4 +30,5 @@ public interface GamePicturesRepository extends JpaRepository<GamePicture,Intege
     List<Integer> findPictureIdListByGameId(String gameId);
 
     void deleteAllByGpTypeAndGameId(Integer type,String gameId);
+
 }

+ 1 - 4
src/main/java/com/YuyeTech/TPlat/game/gameInfo/service/GameInfoService.java

@@ -44,7 +44,7 @@ public interface GameInfoService extends CommonService<GameInfoVo, GameInfo, Str
     /**
      * 查询游戏详情
      */
-    Map findByGameDetail(String gameId);
+    Map findByGameDetail(String gameId,Boolean addDomain);
 
     /**
      * 添加游戏
@@ -57,9 +57,6 @@ public interface GameInfoService extends CommonService<GameInfoVo, GameInfo, Str
      */
     GameInfo addGameInfoAndFlush(GameInfo gameInfo);
 
-
-    GameInfo findByGameId(String gameId);
-
     /**
      * game info是否返回具有带前缀的url
      * @param gameId

+ 84 - 79
src/main/java/com/YuyeTech/TPlat/game/gameInfo/service/GameInfoServiceImpl.java

@@ -3,13 +3,18 @@ package com.YuyeTech.TPlat.game.gameInfo.service;
 import com.YuyeTech.TPlat.common.service.CommonServiceImpl;
 import com.YuyeTech.TPlat.dto.GameDTO;
 import com.YuyeTech.TPlat.dto.GameTagDTO;
+import com.YuyeTech.TPlat.enums.PictureType;
 import com.YuyeTech.TPlat.exception.UserException;
 import com.YuyeTech.TPlat.game.gameInfo.repository.GamePicturesRepository;
 import com.YuyeTech.TPlat.game.gameInfo.vo.GameInfoVo;
-import com.YuyeTech.TPlat.repository.PicturesRepository;
+import com.YuyeTech.TPlat.game.imageInfo.projo.Pictures;
+import com.YuyeTech.TPlat.game.imageInfo.repository.PicturesRepository;
 import com.YuyeTech.TPlat.game.gameInfo.projo.GameInfo;
 import com.YuyeTech.TPlat.game.gameInfo.repository.GameInfoRepository;
+import com.YuyeTech.TPlat.game.imageInfo.service.PicturesService;
 import com.YuyeTech.TPlat.utils.AliyunOSSUtil;
+import org.hibernate.Session;
+import org.hibernate.ejb.HibernateEntityManager;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
@@ -18,10 +23,13 @@ import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -34,14 +42,20 @@ import java.util.stream.Collectors;
 @Service
 @Transactional
 public class GameInfoServiceImpl extends CommonServiceImpl<GameInfoVo, GameInfo, String> implements GameInfoService {
+    @PersistenceContext
+    private EntityManager em;
+
     @Autowired
     private GameInfoRepository gameInfoRepository;
 
     @Autowired
     private GamePicturesRepository gamePicturesRepository;
 
+//    @Autowired
+//    private PicturesRepository picturesRepository;
+
     @Autowired
-    private PicturesRepository picturesRepository;
+    private PicturesService picturesService;
 
     @Autowired
     private AliyunOSSUtil aliyunOSSUtil;
@@ -60,7 +74,7 @@ public class GameInfoServiceImpl extends CommonServiceImpl<GameInfoVo, GameInfo,
      * @return
      */
     @Override
-    public List<GameDTO> findList(String userId, Integer categoryType,String endTime, Pageable pageable) {
+    public List<GameDTO> findList(String userId, Integer categoryType, String endTime, Pageable pageable) {
 
         //排序规则和分页
         Specification<GameInfo> specification = new Specification<GameInfo>() {
@@ -75,14 +89,14 @@ public class GameInfoServiceImpl extends CommonServiceImpl<GameInfoVo, GameInfo,
                 }
 
                 //结束日期
-                if (endTime != null && !endTime.trim().equals("")) {
-                    predicate.getExpressions().add(cb.lessThanOrEqualTo(root.get("showTime").as(String.class), endTime));
-                }
+//                if (endTime != null && !endTime.trim().equals("")) {
+//                    predicate.getExpressions().add(cb.lessThanOrEqualTo(root.get("showTime").as(String.class), endTime));
+//                }
 
                 return predicate;
             }
         };
-        List<GameDTO> gameDTOList = gameInfoRepository.findAll(specification,pageable).stream().map(e -> new GameDTO(
+        List<GameDTO> gameDTOList = gameInfoRepository.findAll(specification, pageable).stream().map(e -> new GameDTO(
                 e.getGameId(),
                 e.getGameName(),
                 aliyunOSSUtil.addDomainName(e.getGameIcon()),
@@ -93,7 +107,7 @@ public class GameInfoServiceImpl extends CommonServiceImpl<GameInfoVo, GameInfo,
                 e.getGameRankingId(),
                 e.getGameRankingShow().equals(1),
                 e.getCreateTime(),
-                gameTagReferenceService.findGameTagByGameId(e.getGameRankingId(),e.getGameId()),
+                gameTagReferenceService.findGameTagByGameId(e.getGameRankingId(), e.getGameId()),
                 e.getPlatform()
         )).collect(Collectors.toList());
         return gameDTOList;
@@ -114,19 +128,19 @@ public class GameInfoServiceImpl extends CommonServiceImpl<GameInfoVo, GameInfo,
                     predicate.getExpressions().add(cb.equal(root.get("gameType").as(String.class), categoryType));
                 }
 
-                Predicate p1 =  cb.equal(root.get("platform").as(String.class), platform);
-                Predicate p2 =   cb.equal(root.get("platform").as(String.class), 2);
-                predicate.getExpressions().add(cb.or(p1,p2));
+                Predicate p1 = cb.equal(root.get("platform").as(String.class), platform);
+                Predicate p2 = cb.equal(root.get("platform").as(String.class), 2);
+                predicate.getExpressions().add(cb.or(p1, p2));
 
                 //结束日期
-                if (endTime != null && !endTime.trim().equals("")) {
-                    predicate.getExpressions().add(cb.lessThanOrEqualTo(root.get("showTime").as(String.class), endTime));
-                }
+//                if (endTime != null && !endTime.trim().equals("")) {
+//                    predicate.getExpressions().add(cb.lessThanOrEqualTo(root.get("showTime").as(String.class), endTime));
+//                }
 
                 return predicate;
             }
         };
-        List<GameDTO> gameDTOList = gameInfoRepository.findAll(specification,pageable).stream().map(e -> new GameDTO(
+        List<GameDTO> gameDTOList = gameInfoRepository.findAll(specification, pageable).stream().map(e -> new GameDTO(
                 e.getGameId(),
                 e.getGameName(),
                 aliyunOSSUtil.addDomainName(e.getGameIcon()),
@@ -137,7 +151,7 @@ public class GameInfoServiceImpl extends CommonServiceImpl<GameInfoVo, GameInfo,
                 e.getGameRankingId(),
                 e.getGameRankingShow().equals(1),
                 e.getCreateTime(),
-                gameTagReferenceService.findGameTagByGameId(e.getGameRankingId(),e.getGameId()),
+                gameTagReferenceService.findGameTagByGameId(e.getGameRankingId(), e.getGameId()),
                 e.getPlatform()
         )).collect(Collectors.toList());
         return gameDTOList;
@@ -154,7 +168,7 @@ public class GameInfoServiceImpl extends CommonServiceImpl<GameInfoVo, GameInfo,
                 return e;
             }).collect(Collectors.toList());
 
-            return new PageImpl<GameInfo>(gameInfoList,pageable,gameInfos.getTotalElements());
+            return new PageImpl<GameInfo>(gameInfoList, pageable, gameInfos.getTotalElements());
         } else {
             Page<GameInfo> gameInfos = gameInfoRepository.findPageByGameType(categoryType, pageable);
             List<GameInfo> gameInfoList = gameInfos.stream().map(e -> {
@@ -163,7 +177,7 @@ public class GameInfoServiceImpl extends CommonServiceImpl<GameInfoVo, GameInfo,
                 return e;
             }).collect(Collectors.toList());
 
-            return new PageImpl<GameInfo>(gameInfoList,pageable,gameInfos.getTotalElements());
+            return new PageImpl<GameInfo>(gameInfoList, pageable, gameInfos.getTotalElements());
         }
     }
 
@@ -172,37 +186,43 @@ public class GameInfoServiceImpl extends CommonServiceImpl<GameInfoVo, GameInfo,
         return gameInfoRepository.findAll();
     }
 
+    /**
+     * 查询游戏详情
+     *
+     * @param gameId
+     * @param addDomain
+     * @return
+     */
     @Override
-    public Map findByGameDetail(String gameId) {
+    public Map findByGameDetail(String gameId, Boolean addDomain) {
         //1.先查游戏基本数据
-        GameInfo gameInfo = gameInfoRepository.findByGameId(gameId);
-
-        //修改url,添加访问域名
-        String gameIcon = gameInfo.getGameIcon();
-        if (gameIcon != null) {
-            String urlIcon = aliyunOSSUtil.addDomainName(gameIcon);
-            gameInfo.setGameIcon(urlIcon);
-        }
-        String gamePicture = gameInfo.getGamePicture();
-        if (gamePicture != null) {
-            String urlPicture = aliyunOSSUtil.addDomainName(gamePicture);
-            gameInfo.setGamePicture(urlPicture);
-        }
+        GameInfo gameInfo = findByGameId(gameId,addDomain);
 
-        //2.根据游戏id 在游戏图片 查询图片相关id
+        //2.根据游戏id 在游戏图片 查询图片相关id(后续废弃这个操作)
         List<Integer> pictureIds = gamePicturesRepository.findByGameId(gameId).stream().map(
                 e -> e.getPictureId()).collect(Collectors.toList());
 
         //3.根据图片id
-        List<String> picturesList = picturesRepository.findByPictureIdIn(pictureIds).stream().map(
-                e -> aliyunOSSUtil.addDomainName(e.getPictureUrl())
-        ).collect(Collectors.toList());
+        List<String> picturesList = new ArrayList<>();
+        //关联旧数据(这里是兼容处理旧图片)
+        if (pictureIds.size() != 0) {
+            if (addDomain) {
+                picturesList = picturesService.findAllByPictureIdListAndDomain(pictureIds);
+            } else {
+                picturesList = picturesService.findAllByPictureIdListAndNoDomain(pictureIds);
+            }
+        }
+        //再查询图片库是否还有新增的图片url
+        List<String> picturesList1 = picturesService.findByPictureTypeAndAssociatedId(PictureType.GAME_SCROLL.ordinal(), gameInfo.getGameId()).stream()
+                .map(e -> addDomain ? aliyunOSSUtil.addDomainName(e.getPictureUrl()) : e.getPictureUrl()).collect(Collectors.toList());
 
         List<GameTagDTO> gameTagDTOS = gameTagReferenceService.findGameTagByGameId(gameInfo.getGameRankingId(), gameInfo.getGameId());
+        picturesList.addAll(picturesList1);
+
         Map map = new HashMap();
         map.put("gameInfo", gameInfo);
         map.put("gamePicturesList", picturesList);
-        map.put("gameTags",gameTagDTOS);
+        map.put("gameTags", gameTagDTOS);
         return map;
     }
 
@@ -216,32 +236,12 @@ public class GameInfoServiceImpl extends CommonServiceImpl<GameInfoVo, GameInfo,
         return gameInfoRepository.saveAndFlush(gameInfo);
     }
 
-    @Override
-    public GameInfo findByGameId(String gameId) {
-
-        //1.先查游戏基本数据
-        GameInfo gameInfo = gameInfoRepository.findByGameId(gameId);
-        if(gameInfo!=null){
-            //修改url,添加访问域名
-            String gameIcon = gameInfo.getGameIcon();
-            if (gameIcon != null) {
-                String urlIcon = aliyunOSSUtil.addDomainName(gameIcon);
-                gameInfo.setGameIcon(urlIcon);
-            }
-            String gamePicture = gameInfo.getGamePicture();
-            if (gamePicture != null) {
-                String urlPicture = aliyunOSSUtil.addDomainName(gamePicture);
-                gameInfo.setGamePicture(urlPicture);
-            }
-        }
-        return gameInfo;
-    }
 
     @Override
     public GameInfo findByGameId(String gameId, Boolean bDomain) {
         //1.先查游戏基本数据
         GameInfo gameInfo = gameInfoRepository.findByGameId(gameId);
-        if(gameInfo!=null&&bDomain){
+        if (gameInfo != null && bDomain) {
             //修改url,添加访问域名
             String gameIcon = gameInfo.getGameIcon();
             if (gameIcon != null) {
@@ -254,6 +254,10 @@ public class GameInfoServiceImpl extends CommonServiceImpl<GameInfoVo, GameInfo,
                 gameInfo.setGamePicture(urlPicture);
             }
         }
+        //清楚对象缓存,避免update到数据库
+        Session session = em.unwrap(Session.class);
+        session.evict(gameInfo);
+
         return gameInfo;
     }
 
@@ -261,16 +265,16 @@ public class GameInfoServiceImpl extends CommonServiceImpl<GameInfoVo, GameInfo,
     public String deleteByGameId(String gameId) {
         try {
             gameInfoRepository.deleteById(gameId);
-        }catch (UserException e){
+        } catch (UserException e) {
             return "error";
         }
         return "success";
     }
 
     @Override
-    public List<GameDTO> findAllByRankingShow(String userId,Integer rankingShow ,Pageable pageable ) {
+    public List<GameDTO> findAllByRankingShow(String userId, Integer rankingShow, Pageable pageable) {
 
-        List<GameDTO> gameDTOList = gameInfoRepository.findAllByGameRankingShow(rankingShow,pageable).stream().map(e -> new GameDTO(
+        List<GameDTO> gameDTOList = gameInfoRepository.findAllByGameRankingShow(rankingShow, pageable).stream().map(e -> new GameDTO(
                 e.getGameId(),
                 e.getGameName(),
                 aliyunOSSUtil.addDomainName(e.getGameIcon()),
@@ -281,7 +285,7 @@ public class GameInfoServiceImpl extends CommonServiceImpl<GameInfoVo, GameInfo,
                 e.getGameRankingId(),
                 e.getGameRankingShow().equals(1),
                 e.getCreateTime(),
-                gameTagReferenceService.findGameTagByGameId(e.getGameRankingId(),e.getGameId()),
+                gameTagReferenceService.findGameTagByGameId(e.getGameRankingId(), e.getGameId()),
                 e.getPlatform()
         )).collect(Collectors.toList());
         return gameDTOList;
@@ -290,37 +294,38 @@ public class GameInfoServiceImpl extends CommonServiceImpl<GameInfoVo, GameInfo,
     @Override
     public List<GameDTO> findAllByRankingShowAndPlatform(String userId, Integer rankingShow, Integer platform, Pageable pageable) {
 
-        List<GameDTO> gameDTOList = gameInfoRepository.findAllByGameRankingShow(rankingShow,pageable).stream()
-                .filter(e->e.getPlatform().equals(platform) || e.getPlatform().equals(2) ).map(e -> new GameDTO(
-                e.getGameId(),
-                e.getGameName(),
-                aliyunOSSUtil.addDomainName(e.getGameIcon()),
-                e.getGameDescription(),
-                aliyunOSSUtil.addDomainName(e.getGamePicture()),
-                //获取收藏信息
-                favoritesService.findByUserIdAndFObjectId(userId, e.getGameId()),
-                e.getGameRankingId(),
-                e.getGameRankingShow().equals(1),
-                e.getCreateTime(),
-                gameTagReferenceService.findGameTagByGameId(e.getGameRankingId(),e.getGameId()),
-                e.getPlatform()
-        )).collect(Collectors.toList());
+        List<GameDTO> gameDTOList = gameInfoRepository.findAllByGameRankingShow(rankingShow, pageable).stream()
+                .filter(e -> e.getPlatform().equals(platform) || e.getPlatform().equals(2)).map(e -> new GameDTO(
+                        e.getGameId(),
+                        e.getGameName(),
+                        aliyunOSSUtil.addDomainName(e.getGameIcon()),
+                        e.getGameDescription(),
+                        aliyunOSSUtil.addDomainName(e.getGamePicture()),
+                        //获取收藏信息
+                        favoritesService.findByUserIdAndFObjectId(userId, e.getGameId()),
+                        e.getGameRankingId(),
+                        e.getGameRankingShow().equals(1),
+                        e.getCreateTime(),
+                        gameTagReferenceService.findGameTagByGameId(e.getGameRankingId(), e.getGameId()),
+                        e.getPlatform()
+                )).collect(Collectors.toList());
         return gameDTOList;
     }
 
     @Override
     public Page<GameInfo> fuzzySearchByGameName(Pageable pageable, String gameName) {
-        return gameInfoRepository.fuzzySearchByUsername(pageable,gameName);
+        return gameInfoRepository.fuzzySearchByUsername(pageable, gameName);
     }
 
     /**
      * 3D 根据游戏分类 获取游戏列表
+     *
      * @param categoryType
      * @param pageable
      * @return
      */
     @Override
     public List<GameInfo> TDFindList(Integer categoryType, Pageable pageable) {
-        return gameInfoRepository.findByGameType(categoryType,pageable);
+        return gameInfoRepository.findByGameType(categoryType, pageable);
     }
 }

+ 3 - 1
src/main/java/com/YuyeTech/TPlat/game/gameInfo/service/GamePictureService.java

@@ -1,6 +1,8 @@
 package com.YuyeTech.TPlat.game.gameInfo.service;
 
+import com.YuyeTech.TPlat.common.service.CommonService;
 import com.YuyeTech.TPlat.game.gameInfo.projo.GamePicture;
+import com.YuyeTech.TPlat.game.gameInfo.vo.GamePictureVo;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 
@@ -10,7 +12,7 @@ import java.util.List;
  * @author:slambb
  * @date:2020/6/24
  */
-public interface GamePictureService {
+public interface GamePictureService  extends CommonService<GamePictureVo, GamePicture, Integer> {
     GamePicture addGamePicture(GamePicture gamePicture);
 
     void deleteGamePictureByGpId(Integer gpId);

+ 8 - 1
src/main/java/com/YuyeTech/TPlat/game/gameInfo/service/GamePictureServiceImpl.java

@@ -1,8 +1,13 @@
 package com.YuyeTech.TPlat.game.gameInfo.service;
 
+import com.YuyeTech.TPlat.common.service.CommonService;
+import com.YuyeTech.TPlat.common.service.CommonServiceImpl;
+import com.YuyeTech.TPlat.game.gameInfo.projo.GameInfo;
 import com.YuyeTech.TPlat.game.gameInfo.projo.GamePicture;
 import com.YuyeTech.TPlat.game.gameInfo.repository.GamePicturesRepository;
 import com.YuyeTech.TPlat.game.gameInfo.service.GamePictureService;
+import com.YuyeTech.TPlat.game.gameInfo.vo.GameInfoVo;
+import com.YuyeTech.TPlat.game.gameInfo.vo.GamePictureVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -16,7 +21,9 @@ import java.util.List;
  * @date:2020/6/24
  */
 @Service
-public class GamePictureServiceImpl implements GamePictureService {
+@Transactional
+public class GamePictureServiceImpl extends CommonServiceImpl<GamePictureVo, GamePicture, Integer> implements GamePictureService {
+
     @Autowired
     private GamePicturesRepository gamePicturesRepository;
     @Override

+ 8 - 8
src/main/java/com/YuyeTech/TPlat/game/gameInfo/service/RecommendServiceImpl.java

@@ -57,10 +57,10 @@ public class RecommendServiceImpl implements RecommendService {
                 predicate.getExpressions().add(cb.equal(root.get("recommendType").as(String.class), recommendType));
 
                 //结束日期
-                if (endTime != null && !endTime.trim().equals("")) {
-                    //createTime
-                    predicate.getExpressions().add(cb.lessThanOrEqualTo(root.get("showTime").as(String.class), endTime));
-                }
+//                if (endTime != null && !endTime.trim().equals("")) {
+//                    //createTime
+//                    predicate.getExpressions().add(cb.lessThanOrEqualTo(root.get("showTime").as(String.class), endTime));
+//                }
 
                 return predicate;
             }
@@ -111,10 +111,10 @@ public class RecommendServiceImpl implements RecommendService {
                 Predicate predicate = cb.conjunction();
                 predicate.getExpressions().add(cb.equal(root.get("recommendType").as(String.class), recommendType));
                 //结束日期
-                if (endTime != null && !endTime.trim().equals("")) {
-                    //createTime
-                    predicate.getExpressions().add(cb.lessThanOrEqualTo(root.get("showTime").as(String.class), endTime));
-                }
+//                if (endTime != null && !endTime.trim().equals("")) {
+//                    //createTime
+//                    predicate.getExpressions().add(cb.lessThanOrEqualTo(root.get("showTime").as(String.class), endTime));
+//                }
 
                 return predicate;
             }

+ 41 - 0
src/main/java/com/YuyeTech/TPlat/game/gameInfo/vo/GameInfoAndTagsVo.java

@@ -0,0 +1,41 @@
+package com.YuyeTech.TPlat.game.gameInfo.vo;
+
+import com.YuyeTech.TPlat.common.pojo.PageCondition;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author:slambb
+ * @date:2022/07/15
+ */
+@Data
+public class GameInfoAndTagsVo extends PageCondition implements Serializable {
+
+    private String gameId;
+    private String gameName;
+    private String gameDescription;
+    private String gameIcon;
+    private String gamePicture;
+    private Integer gameStatus;
+    private Integer gameType;
+    private String gameWebUrl;
+    /** 排行榜的游戏id. */
+    private String gameRankingId;
+    /** 是否在排行榜显示的游戏 0 是隐藏,1是显示. */
+    private Integer gameRankingShow;
+    /** 显示的平台 0:android 1:ios 2:android & ios*/
+    private Integer platform;
+
+    /** 游戏显示时间. */
+    private Date showTime;
+    /** 创建时间. */
+    private Date createTime;
+    /** 更新时间 */
+    private Date updateTime;
+
+    private String multiSelectTag; //选择的标签
+
+
+}

+ 39 - 0
src/main/java/com/YuyeTech/TPlat/game/gameInfo/vo/GameInfoSimpleVo.java

@@ -0,0 +1,39 @@
+package com.YuyeTech.TPlat.game.gameInfo.vo;
+
+import com.YuyeTech.TPlat.common.pojo.PageCondition;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author:slambb
+ * @date:2022/07/15
+ */
+@Data
+public class GameInfoSimpleVo implements Serializable {
+
+    private String gameId;
+    private String gameName;
+    private String gameDescription;
+    private String gameIcon;
+    private String gamePicture;
+    private Integer gameStatus;
+    private Integer gameType;
+    private String gameWebUrl;
+    /** 排行榜的游戏id. */
+    private String gameRankingId;
+    /** 是否在排行榜显示的游戏 0 是隐藏,1是显示. */
+    private Integer gameRankingShow;
+    /** 显示的平台 0:android 1:ios 2:android & ios*/
+    private Integer platform;
+
+    /** 游戏显示时间. */
+    private Date showTime;
+    /** 创建时间. */
+    private Date createTime;
+    /** 更新时间 */
+    private Date updateTime;
+
+
+}

+ 2 - 0
src/main/java/com/YuyeTech/TPlat/game/gameInfo/vo/GameInfoVo.java

@@ -31,6 +31,8 @@ public class GameInfoVo extends PageCondition implements Serializable {
     private Date showTime;
     /** 创建时间. */
     private Date createTime;
+    /** 更新时间 */
+    private Date updateTime;
 
 
 }

+ 18 - 0
src/main/java/com/YuyeTech/TPlat/game/gameInfo/vo/GamePictureSimpleVo.java

@@ -0,0 +1,18 @@
+package com.YuyeTech.TPlat.game.gameInfo.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 游戏和图库的关联信息表
+ * @author:slambb
+ * @date:2020/1/16
+ */
+@Data
+public class GamePictureSimpleVo implements Serializable {
+    private Integer gpId; //表id
+    private Integer gpType;//关联类型
+    private String gameId;//游戏id
+    private Integer pictureId;//图片库id
+}

+ 23 - 0
src/main/java/com/YuyeTech/TPlat/game/gameInfo/vo/GamePictureVo.java

@@ -0,0 +1,23 @@
+package com.YuyeTech.TPlat.game.gameInfo.vo;
+
+import com.YuyeTech.TPlat.common.pojo.PageCondition;
+import lombok.Data;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+/**
+ * 游戏和图库的关联信息表
+ * @author:slambb
+ * @date:2020/1/16
+ */
+@Data
+public class GamePictureVo extends PageCondition implements Serializable {
+    private Integer gpId; //表id
+    private Integer gpType;//关联类型
+    private String gameId;//游戏id
+    private Integer pictureId;//图片库id
+}

+ 74 - 3
src/main/java/com/YuyeTech/TPlat/game/controller/BackstagePictureController.java → src/main/java/com/YuyeTech/TPlat/game/imageInfo/controller/BackstagePictureController.java

@@ -1,9 +1,21 @@
-package com.YuyeTech.TPlat.game.controller;
+package com.YuyeTech.TPlat.game.imageInfo.controller;
 
 import com.YuyeTech.TPlat.VO.ResultVO;
-import com.YuyeTech.TPlat.dataobject.Pictures;
-import com.YuyeTech.TPlat.service.PicturesService;
+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.config.AliyunConfig;
+import com.YuyeTech.TPlat.game.gameInfo.service.GamePictureService;
+import com.YuyeTech.TPlat.game.gameInfo.vo.GameInfoVo;
+import com.YuyeTech.TPlat.game.gameInfo.vo.GamePictureSimpleVo;
+import com.YuyeTech.TPlat.game.gameInfo.vo.GamePictureVo;
+import com.YuyeTech.TPlat.game.imageInfo.projo.Pictures;
+import com.YuyeTech.TPlat.game.imageInfo.service.PicturesService;
+import com.YuyeTech.TPlat.game.imageInfo.vo.PicturesAndGameSimpleVo;
+import com.YuyeTech.TPlat.game.imageInfo.vo.PicturesVo;
 import com.YuyeTech.TPlat.utils.AliyunOSSUtil;
+import com.YuyeTech.TPlat.utils.CopyUtil;
 import com.YuyeTech.TPlat.utils.ResultVOUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,11 +44,66 @@ import java.util.Map;
 public class BackstagePictureController {
     @Autowired
     private PicturesService picturesService;
+    @Autowired
+    private GamePictureService gamePictureService;
 
     @Autowired
     private AliyunOSSUtil aliyunOSSUtil;
 
+    @Autowired
+    private AliyunConfig aliyunConfig;
+
+    /**
+     * 前端view跳转,配置菜单路径
+     * 设置默认参数
+     *
+     * @return
+     */
+    @GetMapping("gotoView")
+    public ModelAndView gotoView() {
+        //查询所有的类目
+        String bucketName = aliyunConfig.getBucketName();
+        System.out.println(bucketName);
+        List<String> objectList = aliyunOSSUtil.getObjectList(bucketName);
+        ModelAndView modelAndView = new ModelAndView("client/imageInfo");
+        modelAndView.addObject("ossList", objectList);
+        return modelAndView;
+    }
+
+    /**
+     * 分页查询数据
+     *
+     * @param vo
+     * @return
+     */
+    @PostMapping("findAll")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<PicturesAndGameSimpleVo>> findAll(PicturesVo vo) {
+        PageInfo pageInfo = picturesService.pageByClass(vo,PicturesAndGameSimpleVo.class);
+        List<PicturesAndGameSimpleVo> list = pageInfo.getRows();
+        for (PicturesAndGameSimpleVo simpleVo :list){
+            GamePictureVo gamePictureVo = gamePictureService.getVo(simpleVo.getPictureId());
+            if(gamePictureVo !=null)
+                simpleVo.setGamePicture(CopyUtil.copy(gamePictureVo, GamePictureSimpleVo.class));
+
+        }
+        pageInfo.setRows(list);
+        return Result.of(pageInfo);
+    }
+
+
+    @PostMapping("/delete")
+    @Decrypt
+    @Encrypt
+    public Result delete(@RequestParam(value = "pictureId") Integer pictureId) {
+        picturesService.deletePictureById(pictureId);
+        return Result.of(null,true,"删除图片成功");
+    }
+
+
     @GetMapping("/list")
+    @Deprecated
     public ModelAndView list(@RequestParam(value = "page", defaultValue = "1") Integer page,
                              @RequestParam(value = "size", defaultValue = "10") Integer size,
                              HttpServletRequest req,
@@ -55,6 +122,7 @@ public class BackstagePictureController {
 
 
     @PostMapping("/upload")
+    @Deprecated
     public ModelAndView upload(
             @RequestParam(value = "page", defaultValue = "1") Integer page,
             @RequestParam(value = "size", defaultValue = "10") Integer size,
@@ -114,6 +182,7 @@ public class BackstagePictureController {
 
 
     @GetMapping("/deletePicture")
+    @Deprecated
     public ModelAndView deletePicture(@RequestParam(value = "pictureId") Integer pictureId,
                                       @RequestParam(value = "page", defaultValue = "1") Integer page,
                                       @RequestParam(value = "size", defaultValue = "10") Integer size,
@@ -127,6 +196,7 @@ public class BackstagePictureController {
 
 
     @PostMapping("/upload_multiple")
+    @Deprecated
     public ResultVO uploadPictures(HttpServletRequest request, HttpServletResponse response) throws Exception {
         log.info("{}", request);
         //存的项目的中模版图片
@@ -176,6 +246,7 @@ public class BackstagePictureController {
      * @return
      */
     @PostMapping("/upload_single_key")
+    @Deprecated
     public ResultVO uploadSingleBasedOnKey(
             HttpServletRequest request) {
         log.info("{}",request.getParameter("img_key"));

+ 3 - 3
src/main/java/com/YuyeTech/TPlat/game/controller/UploadController.java → src/main/java/com/YuyeTech/TPlat/game/imageInfo/controller/UploadController.java

@@ -1,8 +1,8 @@
-package com.YuyeTech.TPlat.game.controller;
+package com.YuyeTech.TPlat.game.imageInfo.controller;
 
 import com.YuyeTech.TPlat.VO.ResultVO;
-import com.YuyeTech.TPlat.repository.UserInfoRepository;
-import com.YuyeTech.TPlat.service.impl.UserInfoServiceImpl;
+import com.YuyeTech.TPlat.game.userinfo.repository.UserInfoRepository;
+import com.YuyeTech.TPlat.game.userinfo.service.UserInfoServiceImpl;
 import com.YuyeTech.TPlat.utils.ImageUtils;
 import com.YuyeTech.TPlat.utils.ResultVOUtil;
 import com.YuyeTech.TPlat.config.AliyunConfig;

+ 26 - 0
src/main/java/com/YuyeTech/TPlat/game/imageInfo/projo/Pictures.java

@@ -0,0 +1,26 @@
+package com.YuyeTech.TPlat.game.imageInfo.projo;
+
+import lombok.Data;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import java.util.Date;
+
+/**
+ * @author:slambb
+ * @date:2020/1/16
+ */
+@Data
+@Entity
+public class Pictures {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer pictureId;
+    private Integer pictureType; //0:游戏列表,1:icon,2:cover,3:公共avatar,4:avatar
+    private String pictureUrl;//图片url
+    private String associatedId;//关联使用的id,如游戏id,用户id等
+    private Date createTime;
+    private Date updateTime;
+}

+ 39 - 0
src/main/java/com/YuyeTech/TPlat/game/imageInfo/repository/PicturesRepository.java

@@ -0,0 +1,39 @@
+package com.YuyeTech.TPlat.game.imageInfo.repository;
+
+import com.YuyeTech.TPlat.common.repository.CommonRepository;
+import com.YuyeTech.TPlat.game.imageInfo.projo.Pictures;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 图片库相关数据查询
+ * @author:slambb
+ * @date:2020/1/16
+ */
+@Repository
+public interface PicturesRepository extends CommonRepository<Pictures,Integer> {
+    /**
+     * 查询图片列表
+     * @param ids
+     * @return
+     */
+    List<Pictures> findByPictureIdIn(List<Integer> ids);
+
+    /**
+     * 根据图片类型查询图片列表
+     * @return
+     */
+    List<Pictures> findByPictureType(Integer pictureType);
+
+    /**
+     * 根据图片类型和游戏id查询
+     *
+     * @param pictureType
+     * @param associatedId
+     * @return List<Pictures>
+     */
+    List<Pictures> findByPictureTypeAndAssociatedId(Integer pictureType,String associatedId);
+
+}

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

@@ -0,0 +1,77 @@
+package com.YuyeTech.TPlat.game.imageInfo.service;
+
+import com.YuyeTech.TPlat.common.service.CommonService;
+import com.YuyeTech.TPlat.game.gameInfo.vo.GameInfoVo;
+import com.YuyeTech.TPlat.game.imageInfo.projo.Pictures;
+import com.YuyeTech.TPlat.game.imageInfo.vo.PicturesVo;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * @author:slambb
+ * @date:2020/6/24
+ */
+public interface PicturesService  extends CommonService<PicturesVo, Pictures, Integer> {
+    /**
+     * 分页查询图片
+     * @param pageable
+     * @return
+     */
+    Page<Pictures> findAllByPageable(Pageable pageable);
+
+    Pictures addPicture(Pictures pictures);
+
+    Pictures addPictureAndFlush(Pictures pictures);
+
+    Pictures findById(Integer id);
+
+    void deletePictureById(Integer id);
+
+    /**
+     * 根据图片id 数组来 查找图片库对应的全部图片
+     * @param ids
+     * @return
+     */
+    List<Pictures> findAllByPictureIdList(List<Integer> ids);
+
+    /**
+     * 根据图片id 数组来 查找图片库对应的全部图片Url
+     * 不添加前缀
+     * @param ids
+     * @return
+     */
+    List<String> findAllByPictureIdListAndNoDomain(List<Integer> ids);
+    /**
+     * 根据图片id 数组来 查找图片库对应的全部图片Url
+     * 带前缀
+     * @param ids
+     * @return
+     */
+    List<String> findAllByPictureIdListAndDomain(List<Integer> ids);
+
+    /**
+     * 添加图片到游戏,并且关联信息
+     * @return
+     */
+    void addPictureToTheGame(File uploadIconFile, String type, GameInfoVo gameInfoVo);
+
+    PicturesVo findByGameIdAndPictureType();
+
+    /**
+     * 返回一个查询列表
+     * @param pictureType
+     * @param associatedId
+     * @return
+     */
+    List<Pictures> findByPictureTypeAndAssociatedId(Integer pictureType,String associatedId);
+
+    /**
+     * 根据id列表获取数据信息
+     * @param pictureIds
+     * @return
+     */
+    List<Pictures> findByPictureIdIn(List<Integer> pictureIds);
+}

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

@@ -0,0 +1,192 @@
+package com.YuyeTech.TPlat.game.imageInfo.service;
+
+import com.YuyeTech.TPlat.common.pojo.Result;
+import com.YuyeTech.TPlat.common.service.CommonServiceImpl;
+import com.YuyeTech.TPlat.enums.PictureType;
+import com.YuyeTech.TPlat.game.gameInfo.projo.GamePicture;
+import com.YuyeTech.TPlat.game.gameInfo.service.GameInfoService;
+import com.YuyeTech.TPlat.game.gameInfo.service.GamePictureService;
+import com.YuyeTech.TPlat.game.gameInfo.vo.GameInfoVo;
+import com.YuyeTech.TPlat.game.imageInfo.projo.Pictures;
+import com.YuyeTech.TPlat.game.imageInfo.repository.PicturesRepository;
+import com.YuyeTech.TPlat.game.imageInfo.service.PicturesService;
+import com.YuyeTech.TPlat.game.imageInfo.vo.PicturesVo;
+import com.YuyeTech.TPlat.utils.AliyunOSSUtil;
+import com.YuyeTech.TPlat.utils.CopyUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author:slambb
+ * @date:2020/6/24
+ */
+@Slf4j
+@Service
+@Transactional
+public class PicturesServiceImpl extends CommonServiceImpl<PicturesVo, Pictures, Integer> implements PicturesService {
+    @Autowired
+    private PicturesRepository picturesRepository;
+    @Autowired
+    private AliyunOSSUtil aliyunOSSUtil;
+
+    @Autowired
+    private GameInfoService gameInfoService;
+    @Autowired
+    private GamePictureService gamePictureService;
+
+
+    @Override
+    public Page<Pictures> findAllByPageable(Pageable pageable) {
+        return picturesRepository.findAll(pageable);
+    }
+
+    @Override
+    public Pictures addPicture(Pictures pictures) {
+        return picturesRepository.save(pictures);
+    }
+
+    @Override
+    public Pictures addPictureAndFlush(Pictures pictures) {
+        return picturesRepository.saveAndFlush(pictures);
+    }
+
+
+    @Override
+    public Pictures findById(Integer id) {
+        return picturesRepository.findById(id).orElse(null);
+    }
+
+    @Override
+    public void deletePictureById(Integer id) {
+
+        PicturesVo picturesVo = super.getVo(id);
+        if(picturesVo !=null){
+            picturesRepository.deleteById(id);
+        }
+        if (aliyunOSSUtil.deleteBlog(picturesVo.getPictureUrl())) {
+            //删除图片成功
+        }
+    }
+
+    @Override
+    public List<Pictures> findAllByPictureIdList(List<Integer> ids) {
+
+        List<Pictures> picturesList = picturesRepository.findByPictureIdIn(ids).stream().map(e -> {
+            e.setPictureUrl(aliyunOSSUtil.addDomainName(e.getPictureUrl()));
+            return e;
+        }).collect(Collectors.toList());
+
+        return picturesList;
+    }
+
+    @Override
+    public List<String> findAllByPictureIdListAndNoDomain(List<Integer> ids) {
+        List<String> picturesList = picturesRepository.findByPictureIdIn(ids).stream().map(Pictures::getPictureUrl).collect(Collectors.toList());
+        return picturesList;
+    }
+
+    @Override
+    public List<String> findAllByPictureIdListAndDomain(List<Integer> ids) {
+        List<String> picturesList = picturesRepository.findByPictureIdIn(ids).stream().map(
+                e -> aliyunOSSUtil.addDomainName(e.getPictureUrl())
+        ).collect(Collectors.toList());
+        return picturesList;
+    }
+
+    /**
+     * 保存游戏相关图片
+     * 1.查询图片库对应,信息查询是否存在关联数据
+     * 3.图片库存在对应图片,替换信息,此时处理删除oss上存储的图片
+     * 4.存储图片文件到oss,并且保存新的图片url到数据库
+     *
+     * @param uploadIconFile
+     * @param type
+     * @param gameInfoVo
+     */
+    @Override
+    public void addPictureToTheGame(File uploadIconFile, String type, GameInfoVo gameInfoVo) {
+        String uploadUrl = "";
+        //写入图片库
+        PicturesVo pictureIcon = new PicturesVo();
+        if (type.equals("icon")) {
+            List<Pictures> iconList = picturesRepository.findByPictureTypeAndAssociatedId(PictureType.ICON.ordinal(), gameInfoVo.getGameId());
+            if (iconList.size() > 1) {
+                throw new RuntimeException("icon 图片数量异常!");
+            }
+            //如果图片库存在游戏的icon
+            if (iconList.size() != 0) {
+                //删除图片库信息,删除oss信息
+                Pictures picture = iconList.get(0);
+                if (aliyunOSSUtil.deleteBlog(picture.getPictureUrl())) {
+                    //替换图片信息
+                    pictureIcon = CopyUtil.copy(picture, PicturesVo.class);
+                }
+            } else {
+                pictureIcon.setPictureType(PictureType.ICON.ordinal());
+            }
+            //游戏图标,上传到OSS
+            uploadUrl = aliyunOSSUtil.upload(uploadIconFile, "gameIcon");
+            gameInfoVo.setGameIcon(uploadUrl);
+            //更新游戏数据
+            gameInfoService.save(gameInfoVo);
+        } else if (type.equals("picture")) {
+            List<Pictures> coverList = picturesRepository.findByPictureTypeAndAssociatedId(PictureType.COVER.ordinal(), gameInfoVo.getGameId());
+            if (coverList.size() > 1) {
+                throw new RuntimeException("cover 图片异常!");
+            }
+            //如果图片库存在游戏的icon
+            if (coverList.size() != 0) {
+                //删除图片库信息,删除oss信息
+                Pictures picture = coverList.get(0);
+                if (aliyunOSSUtil.deleteBlog(picture.getPictureUrl())) {
+                    //替换图片信息
+                    pictureIcon = CopyUtil.copy(picture, PicturesVo.class);
+                }
+            } else {
+                pictureIcon.setPictureType(PictureType.COVER.ordinal());
+            }
+            //游戏封面,上传到OSS
+            uploadUrl = aliyunOSSUtil.upload(uploadIconFile, "pictures");
+            gameInfoVo.setGamePicture(uploadUrl);
+            //更新游戏数据
+            gameInfoService.save(gameInfoVo);
+        } else if (type.equals("scroll")) {
+            //保存数据时候,不做单独删除操作,仅新添加图片
+            //上传到OSS
+            uploadUrl = aliyunOSSUtil.upload(uploadIconFile, "pictures");
+            //向Pictures
+            pictureIcon.setPictureType(PictureType.GAME_SCROLL.ordinal());
+        }
+        //写入图库
+        pictureIcon.setPictureUrl(uploadUrl);
+        pictureIcon.setAssociatedId(gameInfoVo.getGameId());//记录一个gameId
+        super.saveReturnVo(pictureIcon);
+    }
+
+    @Override
+    public PicturesVo findByGameIdAndPictureType() {
+        return null;
+    }
+
+
+    @Override
+    public List<Pictures> findByPictureTypeAndAssociatedId(Integer pictureType, String associatedId) {
+        return picturesRepository.findByPictureTypeAndAssociatedId(pictureType, associatedId);
+    }
+
+
+    @Override
+    public List<Pictures> findByPictureIdIn(List<Integer> pictureIds) {
+        return null;
+    }
+}

+ 29 - 0
src/main/java/com/YuyeTech/TPlat/game/imageInfo/vo/PicturesAndGameSimpleVo.java

@@ -0,0 +1,29 @@
+package com.YuyeTech.TPlat.game.imageInfo.vo;
+
+import com.YuyeTech.TPlat.common.pojo.PageCondition;
+import com.YuyeTech.TPlat.game.gameInfo.vo.GameInfoSimpleVo;
+import com.YuyeTech.TPlat.game.gameInfo.vo.GamePictureSimpleVo;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author:slambb
+ * @date:2020/07/19
+ */
+@Data
+public class PicturesAndGameSimpleVo implements Serializable {
+    private Integer pictureId;
+    private Integer pictureType; //0:游戏列表,1:icon,2:cover,3:公共avatar,4:avatar
+    private String pictureUrl;//图片url
+    private String associatedId;//关联使用的id,如游戏id,用户id等
+    private Date createTime;
+    private Date updateTime;
+
+    //关联的游戏信息
+    private GameInfoSimpleVo gameInfo;
+    //关联表信息
+    private GamePictureSimpleVo gamePicture;
+
+}

+ 31 - 0
src/main/java/com/YuyeTech/TPlat/game/imageInfo/vo/PicturesAndGameVo.java

@@ -0,0 +1,31 @@
+package com.YuyeTech.TPlat.game.imageInfo.vo;
+
+import com.YuyeTech.TPlat.common.pojo.PageCondition;
+import com.YuyeTech.TPlat.game.gameInfo.vo.GameInfoSimpleVo;
+import com.YuyeTech.TPlat.game.gameInfo.vo.GameInfoVo;
+import com.YuyeTech.TPlat.game.gameInfo.vo.GamePictureSimpleVo;
+import com.YuyeTech.TPlat.game.gameInfo.vo.GamePictureVo;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author:slambb
+ * @date:2020/07/19
+ */
+@Data
+public class PicturesAndGameVo extends PageCondition implements Serializable {
+    private Integer pictureId;
+    private Integer pictureType; //0:游戏列表,1:icon,2:cover,3:公共avatar,4:avatar
+    private String pictureUrl;//图片url
+    private String associatedId;//关联使用的id,如游戏id,用户id等
+    private Date createTime;
+    private Date updateTime;
+
+    //关联的游戏信息
+    private GameInfoSimpleVo gameInfo;
+    //关联表信息
+    private GamePictureSimpleVo gamePicture;
+
+}

+ 25 - 0
src/main/java/com/YuyeTech/TPlat/game/imageInfo/vo/PicturesVo.java

@@ -0,0 +1,25 @@
+package com.YuyeTech.TPlat.game.imageInfo.vo;
+
+import com.YuyeTech.TPlat.common.pojo.PageCondition;
+import lombok.Data;
+
+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:2020/07/19
+ */
+@Data
+public class PicturesVo extends PageCondition implements Serializable {
+    private Integer pictureId;
+    private Integer pictureType; //0:游戏列表,1:icon,2:cover,3:公共avatar,4:avatar
+    private String pictureUrl;//图片url
+    private String associatedId;//关联使用的id,如游戏id,用户id等
+    private Date createTime;
+    private Date updateTime;
+}

+ 64 - 0
src/main/java/com/YuyeTech/TPlat/game/userData/controller/UserDataController.java

@@ -0,0 +1,64 @@
+package com.YuyeTech.TPlat.game.userData.controller;
+
+import cn.hutool.core.date.DateUtil;
+import com.YuyeTech.TPlat.annotation.Decrypt;
+import com.YuyeTech.TPlat.annotation.Encrypt;
+import com.YuyeTech.TPlat.common.controller.*;
+import com.YuyeTech.TPlat.common.pojo.PageInfo;
+import com.YuyeTech.TPlat.common.pojo.Result;
+import com.YuyeTech.TPlat.enums.ResultEnum;
+import com.YuyeTech.TPlat.game.gameInfo.vo.GamePictureSimpleVo;
+import com.YuyeTech.TPlat.game.gameInfo.vo.GamePictureVo;
+import com.YuyeTech.TPlat.game.imageInfo.vo.PicturesAndGameSimpleVo;
+import com.YuyeTech.TPlat.game.imageInfo.vo.PicturesVo;
+import com.YuyeTech.TPlat.game.userData.pojo.UserData;
+import com.YuyeTech.TPlat.game.userData.vo.UserDataSimpleVo;
+import com.YuyeTech.TPlat.game.userData.vo.UserDataVo;
+import com.YuyeTech.TPlat.game.userData.service.UserDataService;
+import com.YuyeTech.TPlat.utils.CopyUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/tPlat/userData/")
+public class UserDataController extends CommonController<UserDataVo, UserData, String> {
+    @Autowired
+    private UserDataService userDataService;
+
+    /**
+     * 获取hitCount ,不是同一天,重置信息
+     * @param userId
+     * @return
+     */
+    @PostMapping("getHitCount")
+    @Encrypt
+    public Result<?> getUserDataByUserId(@RequestParam(value = "userId") String userId) {
+        try {
+            return Result.of(userDataService.getHitCount(userId));
+        }catch (Exception e){
+            return Result.of(null,false,ResultEnum.USER_DATA_DOES_NOT_EXIST);
+        }
+
+    }
+
+    /**
+     * 保存hitCount ,如果保存时候,不是同一天,从当前数据算起
+     * @param userId
+     * @return
+     */
+    @PostMapping("uploadHitCount")
+    @Encrypt
+    public Result<?> uploadUserDataByUserId(@RequestParam("userId") String userId,
+                                                         @RequestParam("hitCount") Integer hitCount)
+    {
+        try {
+            return Result.of(userDataService.uploadHitCount(userId,hitCount));
+        }catch (Exception e){
+            return Result.of(null,false,ResultEnum.USER_DATA_DOES_NOT_EXIST);
+        }
+    }
+}

+ 25 - 0
src/main/java/com/YuyeTech/TPlat/game/userData/pojo/UserData.java

@@ -0,0 +1,25 @@
+package com.YuyeTech.TPlat.game.userData.pojo;
+
+import lombok.Data;
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Entity
+@Table(name = "user_data")
+@Data
+public class UserData implements Serializable {
+    @Id
+    private String id;//
+
+    private String userId;//
+
+    private Double weight;//当前体重,单位千克
+
+    private Integer hitCount;//当前用户击打沙袋的次数
+
+    private Date createTime;//创建时间
+
+    private Date updateTime;//修改时间
+
+}

+ 13 - 0
src/main/java/com/YuyeTech/TPlat/game/userData/repository/UserDataRepository.java

@@ -0,0 +1,13 @@
+package com.YuyeTech.TPlat.game.userData.repository;
+
+import com.YuyeTech.TPlat.common.repository.*;
+import com.YuyeTech.TPlat.game.userData.pojo.UserData;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface UserDataRepository extends CommonRepository<UserData, String> {
+
+    Optional<UserData> findByUserId(String userId);
+}

+ 24 - 0
src/main/java/com/YuyeTech/TPlat/game/userData/service/UserDataService.java

@@ -0,0 +1,24 @@
+package com.YuyeTech.TPlat.game.userData.service;
+
+import com.YuyeTech.TPlat.common.service.*;
+import com.YuyeTech.TPlat.game.userData.pojo.UserData;
+import com.YuyeTech.TPlat.game.userData.vo.UserDataSimpleVo;
+import com.YuyeTech.TPlat.game.userData.vo.UserDataVo;
+
+import java.util.Map;
+
+public interface UserDataService extends CommonService<UserDataVo, UserData, String> {
+
+    /**
+     * 根据用户名字查询数据
+     * @param userId
+     * @return
+     */
+    UserDataSimpleVo findSimpleByUserId(String userId);
+
+    UserDataVo findByUserId(String userId);
+
+    Map getHitCount(String userId);
+
+    Map uploadHitCount(String userId, Integer hitCount);
+}

+ 100 - 0
src/main/java/com/YuyeTech/TPlat/game/userData/service/UserDataServiceImpl.java

@@ -0,0 +1,100 @@
+package com.YuyeTech.TPlat.game.userData.service;
+
+import cn.hutool.core.date.DateUtil;
+import com.YuyeTech.TPlat.common.pojo.Result;
+import com.YuyeTech.TPlat.common.service.*;
+import com.YuyeTech.TPlat.game.userData.pojo.UserData;
+import com.YuyeTech.TPlat.game.userData.vo.UserDataSimpleVo;
+import com.YuyeTech.TPlat.game.userData.vo.UserDataVo;
+import com.YuyeTech.TPlat.game.userData.repository.UserDataRepository;
+import com.YuyeTech.TPlat.utils.CopyUtil;
+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;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+@Service
+@Transactional
+public class UserDataServiceImpl extends CommonServiceImpl<UserDataVo, UserData, String> implements UserDataService{
+
+    @PersistenceContext
+    private EntityManager em;
+    @Autowired
+    private UserDataRepository userDataRepository;
+
+
+    @Override
+    public UserDataSimpleVo findSimpleByUserId(String userId) {
+
+        Optional<UserData> optionalE = userDataRepository.findByUserId(userId);
+        if (!optionalE.isPresent()) {
+            return null;
+        }
+        return CopyUtil.copy(optionalE.get(), UserDataSimpleVo.class);
+    }
+
+
+    @Override
+    public UserDataVo findByUserId(String userId) {
+        Optional<UserData> optionalE = userDataRepository.findByUserId(userId);
+        if (!optionalE.isPresent()) {
+            return null;
+        }
+        return CopyUtil.copy(optionalE.get(), UserDataVo.class);
+    }
+
+
+    /**
+     * 获取hitCount,事务结束自动update到数据库
+     * @param userId
+     * @return
+     */
+    @Override
+    public Map getHitCount(String userId) {
+        Map map = new HashMap();
+        boolean isReset = false;
+        UserData userData = userDataRepository.findByUserId(userId).orElse(null);
+        if (userData == null) {
+            userData = new UserData();
+            userData.setUserId(userId);
+            userData.setHitCount(0);
+            userData.setWeight(0d);
+            userData.setCreateTime(DateUtil.date());
+            userData.setUpdateTime(DateUtil.date());
+            super.save(CopyUtil.copy(userData,UserDataVo.class));
+        }
+        if(!DateUtil.isSameDay(userData.getUpdateTime(),DateUtil.date())){
+            //假如不是同一天,重置
+            userData.setHitCount(0);
+            userData.setUpdateTime(DateUtil.date());
+            super.save(CopyUtil.copy(userData,UserDataVo.class));
+            isReset = true;
+        }
+        map.put("hitCount",userData.getHitCount());
+        map.put("isReset",isReset);
+        return   map;
+    }
+
+    @Override
+    public Map uploadHitCount(String userId, Integer hitCount) {
+        Map map = new HashMap();
+        boolean isReset = false;
+        Optional<UserData> optionalE = userDataRepository.findByUserId(userId);
+        if (!optionalE.isPresent()) {
+            throw new RuntimeException("不存在userData");
+        }
+        UserData userData = optionalE.get();
+        userData.setHitCount(hitCount);
+        userData.setUpdateTime(DateUtil.date());
+        super.save(CopyUtil.copy(userData,UserDataVo.class));
+        map.put("hitCount",userData.getHitCount());
+        map.put("isReset",isReset);
+        return   map;
+
+    }
+}

+ 21 - 0
src/main/java/com/YuyeTech/TPlat/game/userData/vo/UserDataSimpleVo.java

@@ -0,0 +1,21 @@
+package com.YuyeTech.TPlat.game.userData.vo;
+
+import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class UserDataSimpleVo implements Serializable {
+    private String id;//
+
+    private String userId;//
+
+    private Double weight;//当前体重,单位千克
+
+    private Integer hitCount;//当前用户击打沙袋的次数
+
+    private Date createTime;//创建时间
+
+    private Date updateTime;//修改时间
+
+}

+ 21 - 0
src/main/java/com/YuyeTech/TPlat/game/userData/vo/UserDataVo.java

@@ -0,0 +1,21 @@
+package com.YuyeTech.TPlat.game.userData.vo;
+
+import com.YuyeTech.TPlat. common.pojo.PageCondition;import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class UserDataVo extends PageCondition implements Serializable {
+    private String id;//
+
+    private String userId;//
+
+    private Double weight;//当前体重,单位千克
+
+    private Integer hitCount;//当前用户击打沙袋的次数
+
+    private Date createTime;//创建时间
+
+    private Date updateTime;//修改时间
+
+}

+ 36 - 4
src/main/java/com/YuyeTech/TPlat/game/controller/BackstageUserController.java → src/main/java/com/YuyeTech/TPlat/game/userinfo/controller/BackstageUserController.java

@@ -1,9 +1,14 @@
-package com.YuyeTech.TPlat.game.controller;
+package com.YuyeTech.TPlat.game.userinfo.controller;
 
-import com.YuyeTech.TPlat.dataobject.UserInfo;
+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.userinfo.projo.UserInfo;
 import com.YuyeTech.TPlat.enums.ResultEnum;
 import com.YuyeTech.TPlat.exception.UserException;
-import com.YuyeTech.TPlat.service.UserInfoService;
+import com.YuyeTech.TPlat.game.userinfo.service.UserInfoService;
+import com.YuyeTech.TPlat.game.userinfo.vo.UserInfoVo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -19,7 +24,7 @@ import java.util.Map;
  * @author:slambb
  * @date:2020/6/3
  */
-@Controller
+@RestController
 @RequestMapping("/backstage_user")
 @Slf4j
 public class BackstageUserController {
@@ -28,6 +33,32 @@ public class BackstageUserController {
     private UserInfoService userInfoService;
 
 
+    /**
+     * 前端view跳转,配置菜单路径
+     * 设置默认参数
+     *
+     * @return
+     */
+    @GetMapping("gotoView")
+    public ModelAndView gotoView() {
+        ModelAndView modelAndView = new ModelAndView("client/userInfo");
+        return modelAndView;
+    }
+
+    /**
+     * 分页查询数据
+     *
+     * @param vo
+     * @return
+     */
+    @PostMapping("findAll")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<UserInfoVo>> findAll(UserInfoVo vo) {
+        return userInfoService.page(vo);
+    }
+
+
     /**
      * 用户列表
      * @param page 第几页, 从1页开始
@@ -35,6 +66,7 @@ public class BackstageUserController {
      * @return
      */
     @GetMapping("/list")
+    @Deprecated
     public ModelAndView list(@RequestParam(value = "page", defaultValue = "1") Integer page,
                              @RequestParam(value = "size", defaultValue = "10") Integer size,
                              Map<String, Object> map) {

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

@@ -1,13 +1,13 @@
-package com.YuyeTech.TPlat.game.controller;
+package com.YuyeTech.TPlat.game.userinfo.controller;
 
 import com.YuyeTech.TPlat.VO.ResultVO;
 import com.YuyeTech.TPlat.constant.RedisConstant;
-import com.YuyeTech.TPlat.dataobject.UserInfo;
+import com.YuyeTech.TPlat.game.userinfo.projo.UserInfo;
 import com.YuyeTech.TPlat.enums.ResultEnum;
 import com.YuyeTech.TPlat.form.FeedbackForm;
 import com.YuyeTech.TPlat.game.gameInfo.service.GameInfoService;
-import com.YuyeTech.TPlat.service.MainInfoService;
-import com.YuyeTech.TPlat.service.UserInfoService;
+import com.YuyeTech.TPlat.game.userinfo.service.MainInfoService;
+import com.YuyeTech.TPlat.game.userinfo.service.UserInfoService;
 import com.YuyeTech.TPlat.utils.AliyunOSSUtil;
 import com.YuyeTech.TPlat.utils.ResultVOUtil;
 import lombok.extern.slf4j.Slf4j;

+ 39 - 5
src/main/java/com/YuyeTech/TPlat/game/controller/UserInfoController.java → src/main/java/com/YuyeTech/TPlat/game/userinfo/controller/UserInfoController.java

@@ -1,12 +1,20 @@
-package com.YuyeTech.TPlat.game.controller;
+package com.YuyeTech.TPlat.game.userinfo.controller;
 
 import com.YuyeTech.TPlat.dataobject.*;
 import com.YuyeTech.TPlat.dto.FriendInfoDTO;
 import com.YuyeTech.TPlat.dto.SignInDTO;
 import com.YuyeTech.TPlat.dto.UserDTO;
+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.imageInfo.projo.Pictures;
+import com.YuyeTech.TPlat.game.imageInfo.service.PicturesService;
+import com.YuyeTech.TPlat.game.imageInfo.vo.PicturesVo;
+import com.YuyeTech.TPlat.game.userinfo.projo.MainInfo;
+import com.YuyeTech.TPlat.game.userinfo.projo.UserInfo;
+import com.YuyeTech.TPlat.game.userinfo.service.MainInfoService;
+import com.YuyeTech.TPlat.game.userinfo.service.UserInfoService;
 import com.YuyeTech.TPlat.service.*;
 import com.YuyeTech.TPlat.utils.*;
 import com.YuyeTech.TPlat.VO.ResultVO;
@@ -46,6 +54,8 @@ public class UserInfoController {
     @Autowired
     private AliyunOSSUtil aliyunOSSUtil;
     @Autowired
+    private PicturesService picturesService;
+    @Autowired
     private UserInfoService userInfoService;
 
     @Autowired
@@ -136,6 +146,8 @@ public class UserInfoController {
                                  @Valid UserForm form) {
 //        String userId = request.getParameterValues("userId")[0];
         UserInfo userInfo = new UserInfo();
+        //写入图片库
+        PicturesVo pictureIcon = new PicturesVo();
         //存的项目的中模版图片
         String contextPath = "";
         File uploadFile = null;
@@ -163,23 +175,45 @@ public class UserInfoController {
                 userInfo.setWeight(0.0);
                 userInfo.setRegisterTime(new Date());
                 userInfo.setStatus(1);//1为新注册
+
+                //注册新用户时候,上传的图片
+                pictureIcon.setPictureUrl(uploadUrl);
+                pictureIcon.setPictureType(PictureType.USER_AVATAR.ordinal());
+                pictureIcon.setAssociatedId(userInfo.getUserId());
+
             } else {
-//                if (uploadUrl != "") {
-//                log.info("旧数据,设置头像地址=" + uploadUrl);
                 //这里判断处理,把旧的头像数据删除
                 //默认头像不用删除
                 if (!userInfo.getAvatarUrl().equals("publicAvatar/defaultAvatar.png") && userInfo.getAvatarUrl() != null && userInfo.getAvatarUrl().length() != 0) {
-                    if (aliyunOSSUtil.deleteBlog(userInfo.getAvatarUrl())) {
+                    //存在旧的数据,查找并且替换信息
+                    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);
                         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());

+ 1 - 1
src/main/java/com/YuyeTech/TPlat/dataobject/MainInfo.java → src/main/java/com/YuyeTech/TPlat/game/userinfo/projo/MainInfo.java

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

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

@@ -1,4 +1,4 @@
-package com.YuyeTech.TPlat.dataobject;
+package com.YuyeTech.TPlat.game.userinfo.projo;
 
 import lombok.Data;
 

+ 4 - 4
src/main/java/com/YuyeTech/TPlat/repository/MainInfoRepository.java → src/main/java/com/YuyeTech/TPlat/game/userinfo/repository/MainInfoRepository.java

@@ -1,8 +1,8 @@
-package com.YuyeTech.TPlat.repository;
+package com.YuyeTech.TPlat.game.userinfo.repository;
 
-import com.YuyeTech.TPlat.dataobject.MainInfo;
+import com.YuyeTech.TPlat.common.repository.CommonRepository;
+import com.YuyeTech.TPlat.game.userinfo.projo.MainInfo;
 import org.springframework.data.jpa.repository.JpaRepository;
-import sun.applet.Main;
 
 import java.util.Optional;
 
@@ -10,7 +10,7 @@ import java.util.Optional;
  * @author:slambb
  * @date:2019/12/31
  */
-public interface MainInfoRepository extends JpaRepository<MainInfo,String> {
+public interface MainInfoRepository extends CommonRepository<MainInfo,String> {
 
    Optional<MainInfo> findByTelephoneNumberAndPassword(String phoneNumber,String password);
    Optional<MainInfo> findByTelephoneNumber(String phoneNumber);

+ 4 - 3
src/main/java/com/YuyeTech/TPlat/repository/UserInfoRepository.java → src/main/java/com/YuyeTech/TPlat/game/userinfo/repository/UserInfoRepository.java

@@ -1,6 +1,7 @@
-package com.YuyeTech.TPlat.repository;
+package com.YuyeTech.TPlat.game.userinfo.repository;
 
-import com.YuyeTech.TPlat.dataobject.UserInfo;
+import com.YuyeTech.TPlat.common.repository.CommonRepository;
+import com.YuyeTech.TPlat.game.userinfo.projo.UserInfo;
 import io.lettuce.core.dynamic.annotation.Param;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -13,7 +14,7 @@ import java.util.List;
  * @author:slambb
  * @date:2019/12/5
  */
-public interface UserInfoRepository extends JpaRepository<UserInfo,String> {
+public interface UserInfoRepository extends CommonRepository<UserInfo,String> {
 
     /**
      * 根据用户id 列表获取用户

+ 5 - 3
src/main/java/com/YuyeTech/TPlat/service/MainInfoService.java → src/main/java/com/YuyeTech/TPlat/game/userinfo/service/MainInfoService.java

@@ -1,12 +1,14 @@
-package com.YuyeTech.TPlat.service;
+package com.YuyeTech.TPlat.game.userinfo.service;
 
-import com.YuyeTech.TPlat.dataobject.MainInfo;
+import com.YuyeTech.TPlat.common.service.CommonService;
+import com.YuyeTech.TPlat.game.userinfo.projo.MainInfo;
+import com.YuyeTech.TPlat.game.userinfo.vo.MainInfoVo;
 
 /**
  * @author:slambb
  * @date:2019/12/31
  */
-public interface MainInfoService {
+public interface MainInfoService extends CommonService<MainInfoVo, MainInfo, String> {
     MainInfo findMainInfoById(String userId);
     MainInfo findMainInfoByPhoneNumber(String phoneNumber);
     MainInfo findMainInfoByPhoneNumberAndPassword(String phoneNumber,String password);

+ 7 - 5
src/main/java/com/YuyeTech/TPlat/service/impl/MainInfoServiceImpl.java → src/main/java/com/YuyeTech/TPlat/game/userinfo/service/MainInfoServiceImpl.java

@@ -1,10 +1,12 @@
-package com.YuyeTech.TPlat.service.impl;
+package com.YuyeTech.TPlat.game.userinfo.service;
 
+import com.YuyeTech.TPlat.common.service.CommonServiceImpl;
 import com.YuyeTech.TPlat.enums.UserEnum;
 import com.YuyeTech.TPlat.exception.UserException;
-import com.YuyeTech.TPlat.dataobject.MainInfo;
-import com.YuyeTech.TPlat.repository.MainInfoRepository;
-import com.YuyeTech.TPlat.service.MainInfoService;
+import com.YuyeTech.TPlat.game.userinfo.projo.MainInfo;
+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 lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -17,7 +19,7 @@ import javax.transaction.Transactional;
  */
 @Service
 @Slf4j
-public class MainInfoServiceImpl implements MainInfoService {
+public class MainInfoServiceImpl extends CommonServiceImpl<MainInfoVo, MainInfo, String> implements MainInfoService {
 
     @Autowired
     private MainInfoRepository mainInfoRepository;

+ 6 - 4
src/main/java/com/YuyeTech/TPlat/service/UserInfoService.java → src/main/java/com/YuyeTech/TPlat/game/userinfo/service/UserInfoService.java

@@ -1,8 +1,10 @@
-package com.YuyeTech.TPlat.service;
+package com.YuyeTech.TPlat.game.userinfo.service;
 
-import com.YuyeTech.TPlat.dataobject.Pictures;
+import com.YuyeTech.TPlat.common.service.CommonService;
+import com.YuyeTech.TPlat.game.imageInfo.projo.Pictures;
 import com.YuyeTech.TPlat.dto.UserDTO;
-import com.YuyeTech.TPlat.dataobject.UserInfo;
+import com.YuyeTech.TPlat.game.userinfo.projo.UserInfo;
+import com.YuyeTech.TPlat.game.userinfo.vo.UserInfoVo;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 
@@ -12,7 +14,7 @@ import java.util.List;
  * @author:slambb
  * @date:2019/12/5
  */
-public interface UserInfoService {
+public interface UserInfoService extends CommonService<UserInfoVo, UserInfo, String> {
 
 //    UserInfo
 

+ 10 - 7
src/main/java/com/YuyeTech/TPlat/service/impl/UserInfoServiceImpl.java → src/main/java/com/YuyeTech/TPlat/game/userinfo/service/UserInfoServiceImpl.java

@@ -1,11 +1,14 @@
-package com.YuyeTech.TPlat.service.impl;
+package com.YuyeTech.TPlat.game.userinfo.service;
 
-import com.YuyeTech.TPlat.dataobject.Pictures;
+import com.YuyeTech.TPlat.common.service.CommonService;
+import com.YuyeTech.TPlat.common.service.CommonServiceImpl;
+import com.YuyeTech.TPlat.game.imageInfo.projo.Pictures;
 import com.YuyeTech.TPlat.dto.UserDTO;
-import com.YuyeTech.TPlat.repository.PicturesRepository;
-import com.YuyeTech.TPlat.dataobject.UserInfo;
-import com.YuyeTech.TPlat.repository.UserInfoRepository;
-import com.YuyeTech.TPlat.service.UserInfoService;
+import com.YuyeTech.TPlat.game.imageInfo.repository.PicturesRepository;
+import com.YuyeTech.TPlat.game.userinfo.projo.UserInfo;
+import com.YuyeTech.TPlat.game.userinfo.repository.UserInfoRepository;
+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.springframework.beans.factory.annotation.Autowired;
@@ -24,7 +27,7 @@ import java.util.stream.Collectors;
  * @date:2019/12/5
  */
 @Service
-public class UserInfoServiceImpl implements UserInfoService {
+public class UserInfoServiceImpl extends CommonServiceImpl<UserInfoVo, UserInfo, String> implements UserInfoService {
 
     @Autowired
     private UserInfoRepository userInfoRepository;

+ 25 - 0
src/main/java/com/YuyeTech/TPlat/game/userinfo/vo/MainInfoVo.java

@@ -0,0 +1,25 @@
+package com.YuyeTech.TPlat.game.userinfo.vo;
+
+import com.YuyeTech.TPlat.common.pojo.PageCondition;
+import lombok.Data;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+/**
+ * @author:slambb
+ * @date:2022/08/02
+ */
+@Data
+public class MainInfoVo extends PageCondition implements Serializable {
+    private String  userId;
+
+    private String username;
+    private String password;
+
+    private String telephoneNumber;
+
+    private String email;
+}

+ 43 - 0
src/main/java/com/YuyeTech/TPlat/game/userinfo/vo/UserInfoVo.java

@@ -0,0 +1,43 @@
+package com.YuyeTech.TPlat.game.userinfo.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/02
+ */
+@Data
+public class UserInfoVo extends PageCondition implements Serializable {
+
+    private String userId;
+
+    private String username;
+
+    private String gender;
+
+    /**
+     * 城市代码
+     */
+    private String cityCode;
+
+    private Date birthday;
+
+    private String signature;
+
+    private String avatarUrl;
+
+    private Double height;
+
+    private Double weight;
+
+    /** 创建时间. */
+    private Date registerTime;
+
+    private Integer status;
+}

+ 0 - 27
src/main/java/com/YuyeTech/TPlat/repository/PicturesRepository.java

@@ -1,27 +0,0 @@
-package com.YuyeTech.TPlat.repository;
-
-import com.YuyeTech.TPlat.dataobject.Pictures;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import java.util.List;
-import java.util.Optional;
-
-/**
- * @author:slambb
- * @date:2020/1/16
- */
-public interface PicturesRepository extends JpaRepository<Pictures,Integer> {
-    /**
-     * 查询图片列表
-     * @param ids
-     * @return
-     */
-    List<Pictures> findByPictureIdIn(List<Integer> ids);
-
-    /**
-     * 根据图片类型查询图片列表
-     * @return
-     */
-    List<Pictures> findByPictureType(Integer pictureType);
-
-}

+ 0 - 5
src/main/java/com/YuyeTech/TPlat/repository/UserLevelRepository.java

@@ -1,12 +1,7 @@
 package com.YuyeTech.TPlat.repository;
 
-import com.YuyeTech.TPlat.dataobject.UserInfo;
 import com.YuyeTech.TPlat.dataobject.UserLevel;
-import io.lettuce.core.dynamic.annotation.Param;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
 
 import java.util.List;
 import java.util.Optional;

+ 0 - 6
src/main/java/com/YuyeTech/TPlat/repository/UserWalletsRepository.java

@@ -1,14 +1,8 @@
 package com.YuyeTech.TPlat.repository;
 
-import com.YuyeTech.TPlat.dataobject.UserInfo;
 import com.YuyeTech.TPlat.dataobject.UserWallets;
-import io.lettuce.core.dynamic.annotation.Param;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
 
-import java.util.List;
 import java.util.Optional;
 
 /**

+ 0 - 36
src/main/java/com/YuyeTech/TPlat/service/PicturesService.java

@@ -1,36 +0,0 @@
-package com.YuyeTech.TPlat.service;
-
-import com.YuyeTech.TPlat.dataobject.Pictures;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
-
-import java.util.List;
-import java.util.Optional;
-
-/**
- * @author:slambb
- * @date:2020/6/24
- */
-public interface PicturesService {
-    /**
-     * 分页查询图片
-     * @param pageable
-     * @return
-     */
-    Page<Pictures> findAllByPageable(Pageable pageable);
-
-    Pictures addPicture(Pictures pictures);
-
-    Pictures addPictureAndFlush(Pictures pictures);
-
-    Pictures findById(Integer id);
-
-    void deletePictureById(Integer id);
-
-    /**
-     * 根据图片id 数组来 查找图片库对应的全部图片
-     * @param ids
-     * @return
-     */
-    List<Pictures> findAllByPictureIdList(List<Integer> ids);
-}

+ 0 - 64
src/main/java/com/YuyeTech/TPlat/service/impl/PicturesServiceImpl.java

@@ -1,64 +0,0 @@
-package com.YuyeTech.TPlat.service.impl;
-
-import com.YuyeTech.TPlat.dataobject.Pictures;
-import com.YuyeTech.TPlat.repository.PicturesRepository;
-import com.YuyeTech.TPlat.service.PicturesService;
-import com.YuyeTech.TPlat.utils.AliyunOSSUtil;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-/**
- * @author:slambb
- * @date:2020/6/24
- */
-@Service
-public class PicturesServiceImpl implements PicturesService {
-    @Autowired
-    private PicturesRepository picturesRepository;
-
-    @Autowired
-    private AliyunOSSUtil aliyunOSSUtil;
-
-    @Override
-    public Page<Pictures> findAllByPageable(Pageable pageable) {
-        return picturesRepository.findAll(pageable);
-    }
-
-    @Override
-    public Pictures addPicture(Pictures pictures) {
-        return picturesRepository.save(pictures);
-    }
-
-    @Override
-    public Pictures addPictureAndFlush(Pictures pictures) {
-        return picturesRepository.saveAndFlush(pictures);
-    }
-
-    @Override
-    public Pictures findById(Integer id) {
-        return picturesRepository.findById(id).orElse(null);
-    }
-
-    @Override
-    public void deletePictureById(Integer id) {
-        picturesRepository.deleteById(id);
-    }
-
-    @Override
-    public List<Pictures> findAllByPictureIdList(List<Integer> ids) {
-
-        List<Pictures> picturesList = picturesRepository.findByPictureIdIn(ids).stream().map(e -> {
-            e.setPictureUrl(aliyunOSSUtil.addDomainName(e.getPictureUrl()));
-            return e;
-        }).collect(Collectors.toList());
-
-        return picturesList;
-    }
-
-}

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

@@ -1,26 +1,11 @@
 package com.YuyeTech.TPlat.service.impl;
 
-import com.YuyeTech.TPlat.dataobject.Pictures;
-import com.YuyeTech.TPlat.dataobject.UserInfo;
 import com.YuyeTech.TPlat.dataobject.UserLevel;
-import com.YuyeTech.TPlat.dto.UserDTO;
-import com.YuyeTech.TPlat.repository.PicturesRepository;
-import com.YuyeTech.TPlat.repository.UserInfoRepository;
 import com.YuyeTech.TPlat.repository.UserLevelRepository;
-import com.YuyeTech.TPlat.service.UserInfoService;
 import com.YuyeTech.TPlat.service.UserLevelService;
-import com.YuyeTech.TPlat.utils.AliyunOSSUtil;
-import org.apache.commons.lang3.StringUtils;
 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 java.util.List;
-import java.util.PrimitiveIterator;
-import java.util.stream.Collectors;
-
 /**
  * 用户记录关卡信息
  * @author:slambb

+ 64 - 55
src/main/java/com/YuyeTech/TPlat/utils/AliyunOSSUtil.java

@@ -32,60 +32,61 @@ public class AliyunOSSUtil {
 
     /**
      * 上传
+     *
      * @param file
      * @return
      */
-    public String upload(File file,String fileType){
-        log.info("=========>OSS文件上传开始:"+file.getName());
-        String endpoint= aliyunConfig.getEndpoint();
-        String accessKeyId= aliyunConfig.getAccessKeyId();
-        String accessKeySecret= aliyunConfig.getAccessKeySecret();
-        String bucketName= aliyunConfig.getBucketName();
-        String fileHost= aliyunConfig.getFileHost();
-        if(fileType.equals("avatar")){
+    public String upload(File file, String fileType) {
+        log.info("=========>OSS文件上传开始:" + file.getName());
+        String endpoint = aliyunConfig.getEndpoint();
+        String accessKeyId = aliyunConfig.getAccessKeyId();
+        String accessKeySecret = aliyunConfig.getAccessKeySecret();
+        String bucketName = aliyunConfig.getBucketName();
+        String fileHost = aliyunConfig.getFileHost();
+        if (fileType.equals("avatar")) {
             //如果是头像,保存到头像文件夹里面
             fileHost = aliyunConfig.getFileAvatar();
-        }else if(fileType.equals("gameIcon")){
+        } else if (fileType.equals("gameIcon")) {
             fileHost = aliyunConfig.getFileGameIcon();
-        }else if(fileType.equals("pictures")){
+        } else if (fileType.equals("pictures")) {
             fileHost = aliyunConfig.getFilePictures();
-        }else if(fileType.equals("publicAvatar")){
+        } else if (fileType.equals("publicAvatar")) {
             //公共头像库,
             fileHost = aliyunConfig.getFilePublicAvatar();
         }
-        log.info(endpoint+"=========>OSS文件上传开始 fileHost:"+fileHost);
+        log.info(endpoint + "=========>OSS文件上传开始 fileHost:" + fileHost);
 
         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
         String dateStr = format.format(new Date());
 
-        if(null == file){
+        if (null == file) {
             return null;
         }
 
-        OSS ossClient = new OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
         try {
             //容器不存在,就创建
-            if(! ossClient.doesBucketExist(bucketName)){
+            if (!ossClient.doesBucketExist(bucketName)) {
                 ossClient.createBucket(bucketName);
                 CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
                 createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
                 ossClient.createBucket(createBucketRequest);
             }
             //创建文件路径
-            String fileUrl = fileHost+"/"+(dateStr + "/" + UUID.randomUUID().toString().replace("-","")+"-"+file.getName());
+            String fileUrl = fileHost + "/" + (dateStr + "/" + UUID.randomUUID().toString().replace("-", "") + "-" + file.getName());
             //上传文件
             PutObjectResult result = ossClient.putObject(new PutObjectRequest(bucketName, fileUrl, file));
             //设置权限 这里是公开读
-            ossClient.setBucketAcl(bucketName,CannedAccessControlList.PublicRead);
-            if(null != result){
-                log.info("==========>OSS文件上传成功,OSS地址:"+fileUrl);
+            ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
+            if (null != result) {
+                log.info("==========>OSS文件上传成功,OSS地址:" + fileUrl);
                 return fileUrl;
             }
-        }catch (OSSException oe){
+        } catch (OSSException oe) {
             log.error(oe.getMessage());
-        }catch (ClientException ce){
+        } catch (ClientException ce) {
             log.error(ce.getMessage());
-        }finally {
+        } finally {
             //关闭
             ossClient.shutdown();
         }
@@ -95,51 +96,55 @@ public class AliyunOSSUtil {
 
     /**
      * 删除
+     *
      * @param fileKey
      * @return
      */
     @Transactional
-    public Boolean deleteBlog(String fileKey){
+    public Boolean deleteBlog(String fileKey) {
         log.info("=========>OSS文件删除开始");
-        String endpoint= aliyunConfig.getEndpoint();
-        String accessKeyId= aliyunConfig.getAccessKeyId();
-        String accessKeySecret= aliyunConfig.getAccessKeySecret();
-        String bucketName= aliyunConfig.getBucketName();
-        String fileHost= aliyunConfig.getFileHost();
-
+        String endpoint = aliyunConfig.getEndpoint();
+        String accessKeyId = aliyunConfig.getAccessKeyId();
+        String accessKeySecret = aliyunConfig.getAccessKeySecret();
+        String bucketName = aliyunConfig.getBucketName();
+        String fileHost = aliyunConfig.getFileHost();
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
         try {
-            OSS ossClient = new OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);
-
-            if(!ossClient.doesBucketExist(bucketName)){
+            if (!ossClient.doesBucketExist(bucketName)) {
                 log.info("==============>您的Bucket不存在");
                 return false;
-            }else {
+            } else {
                 log.info("==============>开始删除Object");
-                ossClient.deleteObject(bucketName,fileKey);
-                log.info("==============>Object删除成功:"+fileKey);
+                ossClient.deleteObject(bucketName, fileKey);
+                log.info("==============>Object删除成功:" + fileKey);
                 return true;
             }
-        }catch (Exception ex){
-            log.info("删除Object失败",ex);
+        } catch (Exception ex) {
+            log.info("删除Object失败", ex);
             return false;
+        } finally {
+            if (ossClient != null) {
+                ossClient.shutdown();
+            }
         }
     }
 
     /**
      * 拼接并,返回oss 默认域名
+     *
      * @param fileKey
      * @return
      */
-    public String addDomainName(String fileKey){
-        if(StringUtils.isEmpty(fileKey))return fileKey;
+    public String addDomainName(String fileKey) {
+        if (StringUtils.isEmpty(fileKey)) return fileKey;
         Boolean bAdd = isHttpUrl(fileKey);
-        if(!bAdd){
-            if(aliyunConfig.getUsingDomain()){
+        if (!bAdd) {
+            if (aliyunConfig.getUsingDomain()) {
                 String url = aliyunConfig.getDomainName()
                         .concat("/")
                         .concat(fileKey);
                 return url;
-            }else{
+            } else {
                 String url = "https://"
                         .concat(aliyunConfig.getBucketName())
                         .concat(".")
@@ -149,19 +154,19 @@ public class AliyunOSSUtil {
                 return url;
             }
 
-        }else{
+        } else {
             return fileKey;
         }
 
     }
 
 
-    public String getDomainName(){
-        if(aliyunConfig.getUsingDomain()){
+    public String getDomainName() {
+        if (aliyunConfig.getUsingDomain()) {
             String url = aliyunConfig.getDomainName()
                     .concat("/");
             return url;
-        }else{
+        } else {
             String url = "https://"
                     .concat(aliyunConfig.getBucketName())
                     .concat(".")
@@ -170,8 +175,10 @@ public class AliyunOSSUtil {
             return url;
         }
     }
+
     /**
      * 判断字符串是否为URL
+     *
      * @param urls 用户头像key
      * @return true:是URL、false:不是URL
      */
@@ -188,30 +195,32 @@ public class AliyunOSSUtil {
         }
         return isurl;
     }
+
     /**
      * 查询文件名列表
+     *
      * @param bucketName
      * @return
      */
-    public List<String> getObjectList(String bucketName){
+    public List<String> getObjectList(String bucketName) {
         List<String> listRe = new ArrayList<>();
-        String endpoint= aliyunConfig.getEndpoint();
-        String accessKeyId= aliyunConfig.getAccessKeyId();
-        String accessKeySecret= aliyunConfig.getAccessKeySecret();
+        String endpoint = aliyunConfig.getEndpoint();
+        String accessKeyId = aliyunConfig.getAccessKeyId();
+        String accessKeySecret = aliyunConfig.getAccessKeySecret();
         try {
             log.info("===========>查询文件名列表");
-            OSSClient ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
+            OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
             ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
             //列出11111目录下今天所有文件
-            listObjectsRequest.setPrefix("11111/"+format.format(new Date())+"/");
+            listObjectsRequest.setPrefix("11111/" + format.format(new Date()) + "/");
             ObjectListing list = ossClient.listObjects(listObjectsRequest);
-            for(OSSObjectSummary objectSummary : list.getObjectSummaries()){
+            for (OSSObjectSummary objectSummary : list.getObjectSummaries()) {
                 System.out.println(objectSummary.getKey());
                 listRe.add(objectSummary.getKey());
             }
             return listRe;
-        }catch (Exception ex){
-            log.info("==========>查询列表失败",ex);
+        } catch (Exception ex) {
+            log.info("==========>查询列表失败", ex);
             return new ArrayList<>();
         }
     }

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

@@ -20,17 +20,17 @@ public class CodeDOM {
      */
     private CodeDOM(String tableName) {
         this.tableName = tableName;
-        basePackage_ = "com\\td\\Dawa\\game\\";
-        package_ = basePackage_ + StringUtil.camelCaseName(tableName).toLowerCase() + "\\";
+        basePackage_ = "com\\YuyeTech\\TPlat\\game\\";
+        package_ = basePackage_ + StringUtil.camelCaseName(tableName) + "\\";
         //System.getProperty("user.dir") 获取的是项目所在路径,如果我们是子项目,则需要添加一层路径
         basePath = System.getProperty("user.dir") + "\\src\\main\\java\\" + package_;
-        basePackage_ = "com\\td\\Dawa\\";
+        basePackage_ = "com\\YuyeTech\\TPlat\\";
     }
 
     /**
      * 数据连接相关
      */
-    private static final String URL = "jdbc:mysql://42.192.165.168:3306/wada?serverTimezone=GMT%2B8&characterEncoding=utf-8";
+    private static final String URL = "jdbc:mysql://42.192.165.168:3306/tplattest?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&useSSL=false&serverTimezone=GMT%2b8";
     private static final String USERNAME = "root";
     private static final String PASSWORD = "9ab8fad748dead93";
     private static final String DRIVER_CLASSNAME = "com.mysql.jdbc.Driver";
@@ -240,7 +240,7 @@ public class CodeDOM {
                         "import org.springframework.web.bind.annotation.*;\n" +
                         "\n" +
                         "@RestController\n" +
-                        "@RequestMapping(\"/game/" + StringUtil.camelCaseName(tableName) + "/\")\n" +
+                        "@RequestMapping(\"/tPlat/" + StringUtil.camelCaseName(tableName) + "/\")\n" +
                         "public class " + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Controller extends CommonController<" + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Vo, " + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + ", " + t + "> {"
         );
         stringBuffer.append("\n");
@@ -356,7 +356,7 @@ public class CodeDOM {
          */
         private static String typeMapping(String dbType) {
             String javaType;
-            if ("int|integer".contains(dbType)) {
+            if ("int|integer|tinyint".contains(dbType)) {
                 javaType = "Integer";
             } else if ("float|double|decimal|real".contains(dbType)) {
                 javaType = "Double";
@@ -550,7 +550,7 @@ public class CodeDOM {
     }
 
     public static void main(String[] args) {
-        String[] tables = {""};
+        String[] tables = {"user_data"};
         for (String table : tables) {
             String msg = new CodeDOM(table).create();
             System.out.println(msg);

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

@@ -1,6 +1,6 @@
 package com.YuyeTech.TPlat.utils;
 
-import com.YuyeTech.TPlat.service.MainInfoService;
+import com.YuyeTech.TPlat.game.userinfo.service.MainInfoService;
 import org.springframework.beans.factory.annotation.Autowired;
 
 /**

+ 113 - 0
src/main/java/com/YuyeTech/TPlat/utils/RedisSettingMap.java

@@ -2,6 +2,9 @@ package com.YuyeTech.TPlat.utils;
 
 import cn.hutool.crypto.asymmetric.RSA;
 import cn.hutool.json.JSONUtil;
+import com.YuyeTech.TPlat.constant.RankingConstant;
+import com.YuyeTech.TPlat.constant.RedisConstant;
+import com.YuyeTech.TPlat.enums.RedisType;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.TypeReference;
 import com.YuyeTech.TPlat.sys.syssetting.service.SysSettingService;
@@ -15,6 +18,10 @@ import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
 
 /**
  *
@@ -122,4 +129,110 @@ public class RedisSettingMap {
     }
 
 
+    /**
+     * ranking 排行榜相关操作
+     */
+    /**
+     * 获取城市key
+     * @param cityCode
+     * @param gameId
+     * @return
+     */
+    public String getCityKey(String cityCode,String gameId){
+        return  applicationName.concat(":city:").concat(String.format(RankingConstant.cityKey, cityCode.substring(0, 4), gameId));
+    }
+
+    /**
+     * 获取全国key
+     * @param gameId
+     * @return
+     */
+    public String getChinaKey(String gameId){
+        return applicationName.concat(":china:").concat(String.format(RankingConstant.chinaKey, gameId));
+    }
+
+    /**
+     * token相关操作
+     */
+    /**
+     * 根据token生成对应的key
+     * @param token
+     * @return
+     */
+    public String getTokenKey(String token){
+        return applicationName.concat(":").concat(String.format(RedisConstant.TOKEN_PREFIX, token));
+    }
+    /**
+     * 对应token存放 map 信息
+     * @param token
+     * @param tokenMap
+     */
+    public void putToken(String token, Map<String, String> tokenMap){
+        Integer expire = RedisConstant.EXPIRE;//过期时间
+        redisTemplate.opsForHash().putAll(getTokenKey(token), tokenMap);
+        redisTemplate.expire(getTokenKey(token), expire, TimeUnit.SECONDS);
+    }
+
+
+    /**
+     * SMS相关操作
+     */
+    /**
+     * 短信key
+     * @param key
+     * @return
+     */
+    public String getSMSKey(String key){
+       return applicationName.concat(":").concat(String.format(RedisConstant.SMS_PREFIX, key));
+    }
+
+    /**
+     * 设置短信缓存
+     * @param key
+     * @param code
+     */
+    public void setSMS(String key,String code){
+        Integer expire = RedisConstant.CODE_EXPIRE;//过期时间
+        redisTemplate.opsForValue().set(getSMSKey(key), code, expire, TimeUnit.SECONDS);
+    }
+
+
+    /**
+     * 根据类型获取缓存值
+     * @param redisType
+     * @param key
+     * @return
+     */
+    public String getValue(RedisType redisType,String key){
+        switch (redisType){
+            case SMS:
+                /**
+                 * 获取短信key对应的值
+                 */
+                 return redisTemplate.opsForValue().get(getSMSKey(key));
+            case TOKEN:
+                /**
+                 * 获取token的key对应userId
+                 */
+                return redisTemplate.opsForHash().get(getTokenKey(key), "userId").toString();
+            default: return null;
+        }
+    }
+
+    /**
+     * 根据类型删除缓存值
+     * @param redisType
+     * @param key
+     * @return
+     */
+    public Boolean deleteValue(RedisType redisType,String key){
+        switch (redisType){
+            case SMS:
+                /**
+                 * 删除短信key的值
+                 */
+                return redisTemplate.delete(getSMSKey(key));
+            default: return null;
+        }
+    }
 }

+ 0 - 4
src/main/resources/application-dev.yml

@@ -75,7 +75,3 @@ userWallets:
 #是否需要输入验证码
 captcha:
   enable: false
-
-# 瓦达项目url
-meta-pal:
-  url: https://lionworld.metestsvr.com/marketserver/game

+ 0 - 4
src/main/resources/application-prd.yml

@@ -74,7 +74,3 @@ userWallets:
 #是否需要输入验证码
 captcha:
   enable: true
-
-# 瓦达项目url
-meta-pal:
-  url:

+ 351 - 430
src/main/resources/static/client/js/gameInfo.js

@@ -1,28 +1,42 @@
 let tableIns;
-let tablePlayerLog;
-let tablePlayerProfit;
-let tree;
-let userId;
-let bHasData = false;
 let openIndex;
+let multiSelectTag;
+
 let mainTableUrl = "/backstage_game/findAll";
-let mainSaveUrl = "/backstage_game/save";
+let mainSaveUrl = "/backstage_game/saveBaseInfo";
 let mainDeleteUrl = "/backstage_game/delete";
-// let mainUnbindUrl = "/backstage_game/unbind";
-
-layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util', 'upload'], function () {
+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*$/, '只能填写正整数'],//必填,且只能输入正整数
     });
-
-    let element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
-    let laydate = layui.laydate;
-    tree = layui.tree;
-    // let height = document.documentElement.clientHeight;
-    //用户列表
+    /**
+     * 渲染图片查看
+     */
+    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
@@ -42,14 +56,10 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util', 'uplo
         }
         //响应后数据处理
         , parseData: function (res) { //res 即为原始返回的数据
-            $("#addForm")[0].reset();
-            userId = null;
-            form.render();
-            var data = res.data;
+            let data = res.data;
             console.log("返回的地址数据:", data);
-            if (data.rows && data.rows.length > 0) {
-                bHasData = true;
-            }
+            // if (data.rows && data.rows.length > 0) {
+            // }
             return {
                 "flag": res.flag, //解析接口状态
                 "msg": res.msg, //解析提示文本
@@ -62,27 +72,31 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util', 'uplo
         , cols: [[
             {field: 'gameId', title: '游戏ID', sort: true}
             , {field: 'gameName', title: '游戏名称', sort: true}
-            , {field: 'gameDescription', title: '游戏描述', sort: true}
+            , {field: 'gameDescription', title: '游戏描述',hide:true, sort: true}
             , {field: 'gameIcon', title: '游戏图标', templet: '#gameIcon'}
             , {field: 'gamePicture', title: '游戏图片', templet: '#gamePicture'}
             , {
                 field: 'gameStatus', title: '游戏状态', templet: function (d) {
-                    if (d.gameStatus == 0) {
-                        return '<span style="color: green">正常</span>';
-                    } else if (d.gameStatus == 1) {
-                        return '<span style="color: red">下</span>';
+                    if (d.gameStatus == 1) {
+                        return '<span style="color: green">上线</span>';
+                    } else if (d.gameStatus == 0) {
+                        return '<span style="color: red">下线</span>';
                     } else {
                         return '未添加:' + d.gameStatus;
                     }
                 }, sort: true
             }
             , {
-                field: 'gameType', title: '类目编号', templet: function (d) {
-                    if (d.gameType == 1) {
-                        return '<span style="color: red">游戏</span>';
-                    } else if (d.gameType == 2) {
-                        return '<span style="color: green">视频</span>';
-                    } else {
+                field: 'gameType', title: '所属分类', templet: function (d) {
+                    let isHas = false;
+                    for (let i = 0; i < categoryList.length; i++) {
+                        let category = categoryList[i];
+                        if(d.gameType === category.categoryType){
+                            isHas = true;
+                            return '<span style="color: green">'+category.categoryName+'</span>';
+                        }
+                    }
+                    if(!isHas){
                         return '其他:' + d.gameType;
                     }
                 }, sort: true
@@ -97,7 +111,7 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util', 'uplo
                     } else if (d.gameRankingShow == 1) {
                         return '<span style="color: green">显示</span>';
                     } else {
-                        return '其他:' + d.gameType;
+                        return '其他:' + d.gameRankingShow;
                     }
                 }, sort: true
             }
@@ -115,8 +129,9 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util', 'uplo
                     }
                 }, sort: true
             }
-            , {field: 'showTime', title: '游戏显示时间', sort: true}
+            , {field: 'showTime', 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'}
         ]]
         , defaultToolbar: ['', 'exports', 'print']
@@ -125,20 +140,42 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util', 'uplo
         , cellMinWidth: 80
     });
 
+    //渲染步骤条
+    step.render({
+        elem: '#stepForm',
+        filter: 'stepForm',
+        width: '100%', //设置容器宽度
+        stepWidth: '600px',
+        height: '1000px',
+        stepItems: [{
+            title: '填入游戏基本信息'
+        }, {
+            title: '上传游戏对应图片'
+        }, {
+            title: '完成'
+        }]
+    });
 
-    //常规使用 - 普通图片上传
-    var uploadInstIcon = upload.render({
+    /**
+     * 添加新游戏信息时候图片上传
+     */
+    let uploadIcon = upload.render({
         elem: '#iconAdd'
-        , url: 'https://httpbin.org/post' //此处用的是第三方的 http 请求演示,实际使用时改成您自己的上传接口即可。
-        , auto: false
+        , url: ctx + mainUploadUrl
+        , data: {
+            type: 'icon', gameId: function () {
+                return $('#newGameId').val();
+            }
+        }
+        // , auto: false
         , before: function (obj) {
             //预读本地文件示例,不支持ie8
             obj.preview(function (index, file, result) {
-                $('#demo1').attr('src', result); //图片链接(base64)
+                $('#iconImageAdd').attr('src', result); //图片链接(base64)
             });
-
-            element.progress('demo', '0%'); //进度条复位
+            // element.progress('iconProgress', '0%'); //进度条复位
             layer.msg('上传中', {icon: 16, time: 0});
+            // console.log("before" + JSON.stringify(obj));
         }
         , done: function (res) {
             //如果上传失败
@@ -147,36 +184,98 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util', 'uplo
             }
             //上传成功的一些操作
             //……
-            $('#demoText').html(''); //置空上传失败的状态
+            $('#iconTextAdd').html(''); //置空上传失败的状态
+            // console.log("done" + JSON.stringify(res));
+            layer.msg('上传成功', {icon: 1});
         }
         , error: function () {
             //演示失败状态,并实现重传
-            var demoText = $('#demoText');
+            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 () {
-                uploadInst.upload();
+                uploadIcon.upload();
             });
         }
-        //进度条
-        , progress: function (n, elem, e) {
-            element.progress('demo', n + '%'); //可配合 layui 进度条元素使用
-            if (n == 100) {
-                layer.msg('上传完毕', {icon: 1});
+    });
+
+    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});
+        //     }
+        // }
     });
 
-    var uploadInstPicture = upload.render({
-        elem: '#pictureAdd'
-        , url: 'https://httpbin.org/post' //此处用的是第三方的 http 请求演示,实际使用时改成您自己的上传接口即可。
-        , auto: false
+    //多图片上传
+    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) {
-                $('#demo1').attr('src', result); //图片链接(base64)
+                $('#scrollImageListAdd').append('<img src="' + result + '" alt="' + file.name + '" class="layui-upload-img">')
             });
+        }
+        , done: function (res) {
+            //上传完毕
+            layer.msg('上传完毕', {icon: 1});
+        }
+    });
 
-            element.progress('demo', '0%'); //进度条复位
+    /**
+     * 修改信息时候图片上传
+     */
+    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) {
@@ -184,59 +283,96 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util', 'uplo
             if (res.code > 0) {
                 return layer.msg('上传失败');
             }
-            //上传成功的一些操作
-            //……
-            $('#demoText').html(''); //置空上传失败的状态
+            $('#iconText').html('');
+            layer.msg('上传成功', {icon: 1});
         }
         , error: function () {
             //演示失败状态,并实现重传
-            var demoText = $('#demoText');
+            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 () {
-                uploadInst.upload();
+                modifyIcon.upload();
             });
         }
-        //进度条
-        , progress: function (n, elem, e) {
-            element.progress('demo', n + '%'); //可配合 layui 进度条元素使用
-            if (n == 100) {
-                layer.msg('上传完毕', {icon: 1});
+    });
+
+    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();
+            });
         }
     });
 
-    //多图片上传
-    upload.render({
-        elem: '#scrollAdd'
-        , url: '' //此处配置你自己的上传接口即可
+    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) {
-                $('#demo2').append('<img src="' + result + '" alt="' + file.name + '" class="layui-upload-img">')
+                $('#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 'query':
-                //根据用户地址查询
-                findByUserAddress(form);
-                break;
-            case 'playerLogReload':
-                playerLogReload();
-                break;
-
             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");
 
@@ -255,75 +391,17 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util', 'uplo
                 $('#platformAdd').append(new Option("IOS", "1"));
                 $('#platformAdd').append(new Option("同时支持两个平台", "2", true));
 
-                //加载标签选择组件
-                layui.config({
-                    base: ctx + '/common/layui/'
-                }).extend({
-                    xmSelect: 'xm-select'
-                }).use(['xmSelect'], function () {
-                    let xmSelect = layui.xmSelect;
-                    let dataArray = [];
-                    for (let i = 0; i < allCustomTags.length; i++) {
-                        let tag = allCustomTags[i];
-                        dataArray.push({name: tag.tagName, value: tag.tagId})
-                    }
-                    //渲染多选
-                    let multiselectTagAdd = xmSelect.render({
-                        el: '#multiselectTagAdd',
-                        data: dataArray
-                    })
-
-                })
-
-                layui.config({
-                    base: ctx + '/common/step-lay/'
-                }).use(['form', 'step'], function () {
-                    var $ = layui.$
-                        , form = layui.form
-                        , step = layui.step;
-
-                    step.render({
-                        elem: '#stepForm',
-                        filter: 'stepForm',
-                        width: '100%', //设置容器宽度
-                        stepWidth: '750px',
-                        height: '500px',
-                        stepItems: [{
-                            title: '填写入款信息'
-                        }, {
-                            title: '确认入款信息'
-                        }, {
-                            title: '完成'
-                        }]
-                    });
-
-
-                    form.on('submit(formStep)', function (data) {
-                        step.next('#stepForm');
-                        return false;
-                    });
-
-                    form.on('submit(formStep2)', function (data) {
-                        step.next('#stepForm');
-                        return false;
-                    });
-
-                    $('.pre').click(function () {
-                        step.pre('#stepForm');
-                    });
-
-                    $('.next').click(function () {
-                        step.next('#stepForm');
-                    });
-                })
-
-
                 form.render("select");
 
 
                 $("#addForm")[0].reset();
+                form.render();
+                //重置图片信息
+                $('#iconImageAdd').attr('src', '');
+                $('#pictureImageAdd').attr('src', '');
+
+
                 // form.val("addForm", defaultBLEData);
-                // form.render();
                 openIndex = layer.open({
                     type: 1,  //可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
                     title: ['新增数据', 'font-size:18px;'],//数组第二项可以写任意css样式;如果你不想显示标题栏,你可以title: false
@@ -337,39 +415,79 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util', 'uplo
     //监听行工具事件
     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;
 
-            $('#bluetoothType').find("option").remove();
-            $('#bluetoothType').append(new Option("普通绑带", "1", data.bluetoothType === 1));
-            $('#bluetoothType').append(new Option("沙袋绑带", "2", data.bluetoothType === 2));
-            $('#bluetoothType').append(new Option("手柄蓝牙", "3", data.bluetoothType === 3));
+                $('#gameStatus').find("option").remove();
+                $('#gameStatus').append(new Option("下线", "0", gameInfo.gameStatus === 0));
+                $('#gameStatus').append(new Option("上线", "1", gameInfo.gameStatus === 1));
 
-            $('#isShare').find("option").remove();
-            $('#isShare').append(new Option("不共享", "0", true));
-            $('#isShare').append(new Option("共享", "1",));
-            form.render("select");
+                $('#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));
+                }
 
-            $("#tableId").css("display", "block");
-            $("input[name='itemId']").attr("readonly", "readonly");
+                $('#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));
 
-            $("#tableTime").css("display", "block");
-            $("#saveBtn").css("display", "block");
-            $("#addBtn").css("display", "none");
-            //回显操作表单
-            $("#comForm").form(data);
-            form.render();
+                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">')
+                }
 
-            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')
+                $("#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) {
+            layer.confirm('真的删除这个游戏么?', function (index) {
                 // console.log(ctx + mainDeleteUrl);
-                $.post(ctx + mainDeleteUrl, {id: data.bluetoothId}, function (data) {
+                $.post(ctx + mainDeleteUrl, {id: data.gameId}, function (data) {
                     if (!data.flag) {
                         layer.msg(data.msg, {icon: 2, time: 2000}, function () {
                         });
@@ -380,34 +498,75 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util', 'uplo
                 });
                 layer.close(index);
             });
-        } else if (obj.event === 'unBind') {
-            // layer.confirm('真的解除绑定么?', function (index) {
-            //     $.post(ctx + mainUnbindUrl, {id: data.bluetoothId}, function (data) {
-            //         if (!data.flag) {
-            //             layer.msg(data.msg, {icon: 2, time: 2000}, function () {
-            //             });
-            //             return;
-            //         }
-            //         tableIns.reload();
-            //     });
-            //     layer.close(index);
-            // });
         }
     });
 
 
     //日期选择器
-    laydate.render({
-        elem: '#showTimeDate',
-        format: "yyyy-MM-dd HH:mm:ss"
-    });
+    // ['#showTimeDate', '#AddShowTimeDate'].forEach((el, index) => {
+    //     laydate.render({
+    //         elem:el,
+    //         format: "yyyy-MM-dd HH:mm:ss"
+    //     });
+    // });
 
     //监听提交
     form.on('submit(comFilter)', function (data) {
-        comFormSave(false);
+        comFormSave();
     });
-    form.on('submit(comAddFilter)', function (data) {
-        comFormAdd();
+
+    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");
@@ -449,38 +608,17 @@ function findByUserAddress(form) {
 /**
  * 提交保存
  */
-function comFormSave(isAddNew) {
+function comFormSave() {
     let comForm = $("#comForm").serializeObject();
-    if (!comForm.bluetoothId && !isAddNew) {
+    if (!comForm.gameId) {
         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 () {
-            });
-            return;
-        }
-        layer.close(openIndex);
-        if (isAddNew) {
-            if (!bHasData) {
-                findByUserAddress();
-            } else {
-                tableIns.reload();
-            }
-        } else {
-            tableIns.reload();
-        }
-
-    });
-}
+    let selectStr = xmSelect.get('#multiselectTag', true).getValue('valueStr');
+    comForm.multiSelectTag = selectStr;
 
-
-function comFormAdd() {
-    let addForm = $("#addForm").serializeObject();
-    console.log(addForm);
-    $.post(ctx + mainSaveUrl, addForm, function (data) {
+    $.post(ctx + mainSaveUrl, comForm, function (data) {
         if (!data.flag) {
             layer.msg(data.msg, {icon: 2, time: 2000}, function () {
             });
@@ -490,220 +628,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) {
-        }
-    });
-}

+ 143 - 0
src/main/resources/static/client/js/imageInfo.js

@@ -0,0 +1,143 @@
+let tableIns;
+let tree;
+let userId;
+let bHasData = false;
+let mainTableUrl = "/backstage_picture/findAll";
+let mainDeleteUrl = "/backstage_picture/delete";
+layui.config({
+    base: ctx + '/common/'
+}).extend({
+    dragMove: 'dragMove/dragMove'
+})
+layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util','dragMove'], function () {
+    let table = layui.table, form = layui.form,dragMove = layui.dragMove;
+    form.verify({
+        // positiveInteger: [/^(([0-9]+[\.]?[0-9]+)|[1-9])$/, '只能填写正整数'],//必填,且只能输入正整数
+        positiveInteger: [/^[1-9]\d*$/, '只能填写正整数'],//必填,且只能输入正整数
+    });
+
+    let element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
+    let laydate = layui.laydate;
+    tree = layui.tree;
+
+    //执行示例
+    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倍
+    });
+
+    // let height = document.documentElement.clientHeight;
+    //用户列表
+    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 即为原始返回的数据
+            var data = res.data;
+            console.log("返回的地址数据:", data);
+            if (data!=null&&data.rows && data.rows.length > 0) {
+                bHasData = true;
+            }
+            return {
+                "flag": res.flag, //解析接口状态
+                "msg": res.msg, //解析提示文本
+                "records": data.records, //解析数据长度
+                "rows": data.rows //解析数据列表
+            };
+        }
+        , toolbar: '#mainTableToolbarDemo'
+        , title: '列表'
+        , cols: [[
+            {field: 'pictureId', title: '图片ID', sort: true}
+            ,
+            {   //0是游戏列表图片,1是icon,2是cover,3是公共avatar
+                field: 'pictureType', title: '设备类型', templet: function (d) {
+                 if (d.pictureType == 0) {
+                        return '<span style="color: green">游戏列表</span>';
+                    } else if (d.pictureType == 1) {
+                        return '<span style="color: red">图标</span>';
+                    } else if (d.pictureType == 2) {
+                        return '<span style="color: blue">封面</span>';
+                    } else if (d.pictureType == 3) {
+                        return '<span style="color: blueviolet">公共avatar</span>';
+                    } else {
+                        return '未添加:' + d.pictureType;
+                    }
+                }, sort: true
+            }
+            ,
+            {
+                field: 'gamePicture', title: '是否关联着游戏数据', templet: function (d) {
+                    if (d.gamePicture !== null) {
+                        return '<span style="color: green">存在游戏数据</span>';
+                    } else {
+                        return '<span style="color: red">没有游戏数据</span>';
+                    }
+                }, sort: true
+            }
+            ,
+            {
+                field: 'associatedId', title: '关联id', templet: function (d) {
+                    if (d.associatedId !== null) {
+                        return '<span style="color: green">'+d.associatedId+'</span>';
+                    } else {
+                        return '<span style="color: red">没有关联id</span>';
+                    }
+                }, sort: true
+            }
+
+            , {field: 'pictureUrl', title: '游戏图片', templet: '#pictureUrl'}
+            , {field: 'createTime', title: '创建时间', hide: true}
+            , {field: 'updateTime', title: '更新时间', hide: true}
+            , {fixed: 'right', title: '操作', width: 140, toolbar: '#mainTableBarDemo'}
+        ]]
+        , defaultToolbar: ['', 'exports', 'print']
+        , page: true
+        // , height: height
+        , cellMinWidth: 80
+    });
+
+    //头工具栏事件
+    table.on('toolbar(test)', function (obj) {
+    });
+
+    //监听行工具事件
+    table.on('tool(test)', function (obj) {
+        let data = obj.data;
+       if (obj.event === 'del') {
+            layer.confirm('真的删除行么?', function (index) {
+                console.log(data);
+                $.post(ctx + mainDeleteUrl, {pictureId: data.pictureId}, function (data) {
+                    if (!data.flag) {
+                        layer.msg(data.msg, {icon: 2, time: 2000}, function () {
+                        });
+                        return;
+                    }
+                    obj.del();
+                    tableIns.reload();
+                });
+                layer.close(index);
+            });
+        }
+    });
+
+
+});
+

+ 595 - 0
src/main/resources/static/client/js/userInfo.js

@@ -0,0 +1,595 @@
+let tableIns;
+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";
+
+
+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: "registerTime"}
+        , 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: '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: '创建时间', 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});
+        }
+    });
+
+    //头工具栏事件
+    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();
+                let query = {
+                    page: {
+                        curr: 1 //重新从第 1 页开始
+                    }
+                    , done: function (res, curr, count) {
+                        //完成后重置where,解决下一次请求携带旧数据
+                        // this.where = {};
+                    }
+                };
+                if (!queryByLoginName) {
+                    queryByLoginName = "";
+                }
+                //设定异步数据接口的额外参数
+                query.where = {username: 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 === '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();
+    });
+}

+ 20 - 0
src/main/resources/static/common/dragMove/dragMove.css

@@ -0,0 +1,20 @@
+/**
+ @ Name:layui.dragMove 图片查看器
+ @ Author:FQSong
+ @ License:MIT 
+ */
+ 
+/* 样式加载完毕的标识 */
+html #layuicss-dragMove{display: none; position: absolute; width: 1989px;} 
+ 
+ 
+/* 组件样式 */ 
+.dragMove-skin .layui-layer-content {overflow: hidden !important;}
+.layui-dragMove {position: relative; width: 100%; height: 100%; display: -webkit-flex; display: flex; flex-direction:column;}
+.layui-dragMove .dragMove-img {position: relative; width: 100%; height: 100%; overflow: hidden; -webkit-flex: 1;  flex: 1; background-color:#eee;}
+.layui-dragMove .dragMove-img img {position: absolute; left: 0; top: 0; user-select:none; cursor: grab;}
+.layui-dragMove .dragMove-btn {width:100%; padding: 10px 0; text-align:center; -webkit-flex: none;  flex: none;}
+.layui-dragMove .dragMove-btn .layui-btn {height: 28px; line-height: 28px;}
+.layui-icon-loading {position: absolute; left: 50%; top: 50%; display: block; width: 36px; height: 36px; font-size: 36px; line-height: 36px; }
+
+.transitioning {-webkit-transition: -webkit-transform .24s ease-out; transition: transform .24s ease-out;}

+ 261 - 0
src/main/resources/static/common/dragMove/dragMove.js

@@ -0,0 +1,261 @@
+/**
+ @ Name:layui.dragMove 图片查看器
+ @ Author:FQSong
+ @ License:MIT 
+ */
+ 
+layui.define('layer', function(exports){ 
+  var $ = layui.$
+  ,layer = layui.layer
+  
+  //字符常量
+  ,MOD_NAME = 'dragMove', ELEM = '.layui-dragMove'
+  
+  //外部接口
+  ,dragMove = {
+    index: layui.dragMove ? (layui.dragMove.index + 10000) : 0
+    
+    //设置全局项
+    ,set: function(options){
+      var that = this;
+      that.config = $.extend({}, that.config, options);
+      return that;
+    }
+    
+    //事件监听
+    ,on: function(events, callback){
+      return layui.onevent.call(this, MOD_NAME, events, callback);
+    }
+  }
+    
+  //构造器
+  ,Class = function(options){
+    var that = this;
+    that.index = ++dragMove.index;
+    that.config = $.extend({}, that.config, dragMove.config, options);
+    that.render();
+  };
+  
+  //默认配置
+  Class.prototype.config = {
+    layerArea: ["960px","720px"],
+    layerShade: 0.6,
+    layerMove: 0,
+    maxZoom: 1
+  };
+  
+  //渲染视图
+  Class.prototype.render = function(){
+    var that = this
+    ,options = that.config
+    ,dragMoveView = "<div class='layui-dragMove'>"
+    + "<div class='dragMove-img'>"
+    +   "<span class='layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop'></span>"
+    + "</div>"
+    + "<div class='dragMove-btn'>"
+    +   "<button type='button' class='layui-btn layui-btn-sm' data-method='default'>默认大小</button>"
+    +   "<button type='button' class='layui-btn layui-btn-sm' data-method='real'>实际大小</button>"
+    +   "<button type='button' class='layui-btn layui-btn-sm' data-method='zoomin'>放大</button>"
+    +   "<button type='button' class='layui-btn layui-btn-sm' data-method='zoomout'>缩小</button>"
+    + "</div>"
+    + "</div>";
+
+    options.elem = $(options.elem);
+
+    options.elem.on("click","img",function(e){
+      let imgObj =  $(this),
+      imgSrc = imgObj.attr("src"),
+      imgTitle = imgObj.attr("alt") || imgSrc.replace(/(.*\/)*([^.]+).*/ig,"$2");
+      
+      layer.open({
+        type: 1,
+        resize: 0,
+        btn: 0,
+        skin: "dragMove-skin",
+        move: options.layerMove,
+        area: options.layerArea,
+        shade: options.layerShade,
+        title: imgTitle,
+        content: dragMoveView,
+        success: function(layero){
+          var imgbox = layero.find(".dragMove-img");
+          options.imgboxWidth = imgbox.innerWidth();
+          options.imgboxHeight = imgbox.innerHeight();
+
+          var nImg = new Image();
+          nImg.src = imgSrc;
+          if (nImg.complete) { 
+            imgbox.empty().append(nImg);
+            that.init(nImg)
+          } else {
+            nImg.onload = function () {
+              imgbox.empty().append(nImg);
+              that.init(nImg)
+            }
+          }
+        }
+      });
+    });    
+  }
+
+  //
+  Class.prototype.init = function(img){
+    var that = this
+    ,options = that.config;
+
+    let $img = $(img),
+    parent = $img.closest(".layui-dragMove"),
+    zoomData = {};
+
+    zoomData.img = img;
+    zoomData.imgWidth = img.width;
+    zoomData.imgHeight = img.height;
+
+    zoomData.zoomSize = Math.min(Math.min(options.imgboxWidth / zoomData.imgWidth, options.imgboxHeight / zoomData.imgHeight), 1);
+    zoomData.left = (options.imgboxWidth - zoomData.imgWidth * zoomData.zoomSize) / 2;
+    zoomData.top = (options.imgboxHeight - zoomData.imgHeight * zoomData.zoomSize) / 2;
+    zoomData.defaultZoom = zoomData.zoomSize;
+
+    that.zoomData = zoomData;
+    $img.css({ "transform-origin": "0 0", "transform": "matrix(" + zoomData.zoomSize + ",0,0," + zoomData.zoomSize + "," + zoomData.left + "," + zoomData.top + ")" });
+
+    $img.on("mousedown", function (e) {
+      e.preventDefault();      
+      let currentX = e.clientX,
+      currentY = e.clientY;
+      $img.removeClass("transitioning").css({"cursor": "grabbing"});
+
+      $(document).on("mousemove", function (even) {
+        let moveX = even.clientX - currentX,
+        moveY = even.clientY - currentY;
+        $img.css({ "transform": "matrix(" + zoomData.zoomSize + ",0,0," + zoomData.zoomSize + "," + (zoomData.left + moveX) + "," + (zoomData.top + moveY) + ")" });
+      });
+      $(document).on("mouseup", function (even) {
+        var matrix = $img.css("transform").slice(7, -1).split(','),
+        center = that.getCenter(parseFloat(matrix[4]), parseFloat(matrix[5]), zoomData);
+
+        zoomData.left = center.left;
+        zoomData.top = center.top;
+
+        $img.addClass("transitioning").css({
+          "transform": "matrix(" + zoomData.zoomSize + ",0,0," + zoomData.zoomSize + "," + zoomData.left + "," + zoomData.top + ")",
+          "cursor": "grab"
+        });
+
+        $(document).off("mousemove");
+        $(document).off("mouseup");
+      });
+    });
+
+    parent.on("click", "button", function (e) {
+      e.preventDefault();
+      var method = $(this).attr("data-method"),
+      scaleSize = 0;
+      switch (method) {
+        case "default":
+          scaleSize = zoomData.defaultZoom;
+          break;
+        case "real":
+          scaleSize = 1;
+          break;
+        case "zoomin":
+          scaleSize = zoomData.zoomSize * 1.2;
+          scaleSize = scaleSize > options.maxZoom ? options.maxZoom : scaleSize;
+          break;
+        case "zoomout":
+          scaleSize = zoomData.zoomSize / 1.2;
+          scaleSize = scaleSize < zoomData.defaultZoom ? zoomData.defaultZoom : scaleSize;
+          break;
+      
+        default:
+          break;
+      }
+      scaleSize && that.scaleZoom(scaleSize);
+    });
+    
+    //鼠标滚轮
+    parent.on("mousewheel", function (e) {
+      e.preventDefault();
+      let scaleSize = 0;
+      if (e.originalEvent.wheelDelta > 0) {
+        scaleSize = zoomData.zoomSize * 1.2;
+      } else {
+        scaleSize = zoomData.zoomSize / 1.2;
+      }
+      scaleSize = Math.min(Math.max(scaleSize, zoomData.defaultZoom),options.maxZoom);
+      that.scaleZoom(scaleSize);
+    });
+
+    $img.on("transitionend webkitTransitionend", function () {
+      $(this).removeClass("transitioning")
+    });
+
+  };
+
+  Class.prototype.scaleZoom = function(index){
+    var that = this
+    ,options = that.config
+    ,zoomData = that.zoomData;
+    
+    zoomData.left = zoomData.left - zoomData.imgWidth * (index - zoomData.zoomSize) / 2;
+    zoomData.top = zoomData.top -  zoomData.imgHeight * (index - zoomData.zoomSize) / 2;
+    zoomData.zoomSize = index;   
+
+    var center = that.getCenter(zoomData.left,zoomData.top,zoomData);
+    zoomData.left = center.left;
+    zoomData.top = center.top;
+     
+    $(zoomData.img).addClass("transitioning").css({          
+      "transform":"matrix("+ zoomData.zoomSize +",0,0," + zoomData.zoomSize +","+zoomData.left+","+zoomData.top+")"
+    });  
+  };
+
+  Class.prototype.getCenter = function(x,y,zoomData){
+    var that = this
+    ,options = that.config
+    ,zoomData = that.zoomData;
+    
+    let newleft,newtop;
+    newleft = (function(){
+      var left;
+      if(zoomData.imgWidth * zoomData.zoomSize < options.imgboxWidth){
+        left = (options.imgboxWidth - zoomData.imgWidth * zoomData.zoomSize) / 2;
+      }else{
+        left = Math.max(Math.min(0,x), options.imgboxWidth - zoomData.imgWidth * zoomData.zoomSize);
+      }
+      return left;
+    })();
+    newtop = (function(){
+      var top;
+      if(zoomData.imgHeight * zoomData.zoomSize < options.imgboxHeight){
+        top = (options.imgboxHeight - zoomData.imgHeight * zoomData.zoomSize) / 2;
+      }else{
+        top = Math.max(Math.min(0, y), options.imgboxHeight - zoomData.imgHeight * zoomData.zoomSize);
+      }
+      return top;
+    })();
+    return {left:newleft,top:newtop} 
+  };
+
+  Class.prototype.decimal = function(num){
+    var result = parseFloat(num);
+    if (isNaN(result)) {
+      return false;
+    }
+    result = Math.round(num * 100) / 100;
+    return result;
+  };
+
+  //核心入口
+  dragMove.render = function(options){
+    var ins = new Class(options);
+    return ins;
+  };
+  
+  //加载组件所需样式
+  layui.link(layui.cache.base + 'dragMove/dragMove.css', function(){
+    //样式加载完毕的回调
+  }, MOD_NAME); 
+  
+  exports(MOD_NAME, dragMove);
+});

+ 1 - 1
src/main/resources/static/common/step-lay/step.js

@@ -94,6 +94,6 @@
             $(elem).find('.layui-carousel-arrow[lay-type=sub]').trigger('click');
         }
     };
-    layui.link('step-lay/step.css');
+    layui.link(ctx + '/common/step-lay/step.css');
     exports('step', step);
 });

+ 143 - 161
src/main/resources/templates/client/gameInfo.html

@@ -3,16 +3,24 @@
 <!--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>
-    <link th:href="@{/common/step-lay/step.css}" rel="stylesheet" type="text/css"/>
+
+    <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">
+            <div class="layui-card-body" id="cardBody">
                 <!-- 表格主体 -->
                 <table class="layui-hide" id="mainTable" lay-filter="test"></table>
                 <!-- 模板 -->
@@ -39,19 +47,19 @@
                 </script>
 
                 <script type="text/html" id="gamePicture">
-                    <img  src="{{domainName}}{{d.gamePicture}}" style="" width="50" height="50" alt="">
+                    <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="50" height="50" alt="">
+                    <img src="{{domainName}}{{d.gameIcon}}" style="" width="60" height="60" alt="">
                 </script>
 
 
-                <!--<script type="text/html" id="gameStatus">-->
-                <!--    <select id="demoCity1" class="layui-border" lay-ignore>-->
-                <!--        <option th:each="prop,iterStat : ${propList}"  th:value="${prop.id}" th:text="${prop.itemName }">-->
-                <!--        </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>
 
@@ -64,63 +72,108 @@
                     <div class="layui-form-item">
                         <label class="layui-form-label">游戏ID</label>
                         <div class="layui-input-block">
-                            <input type="text" name="gameId" autocomplete="off" placeholder="gameId"
+                            <input type="text" id="modifyGameId" name="gameId" autocomplete="off" placeholder="gameId"
                                    class="layui-input" readonly="readonly">
                         </div>
                     </div>
-                    <div class="layui-form-item" id="tableId">
-                        <label class="layui-form-label">游戏名称</label>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">名字</label>
                         <div class="layui-input-block">
-                            <input type="text" name="gameName" autocomplete="off" placeholder="userId"
-                                   class="layui-input" readonly="readonly">
+                            <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>
+                        <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">
+                            <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>
+                        <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">
+                            <select name="gameType" id="gameType" lay-verify="required"
+                                    lay-filter="xmFilter">
+                                <option value="">请选择</option>
+                            </select>
                         </div>
                     </div>
-                    <div class="layui-form-item" hidden="hidden">
-                        <label class="layui-form-label">设备状态</label>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">展示平台</label>
                         <div class="layui-input-block">
-                            <input type="text" name="bluetoothStatus" autocomplete="off" placeholder="bluetoothStatus"
-                                   class="layui-input" readonly="readonly" lay-verify="required">
+                            <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>
+                        <label class="layui-form-label">简介</label>
                         <div class="layui-input-block">
-                            <select name="bluetoothType" id="bluetoothType" lay-verify="required" lay-filter="xmFilter">
-                                <option value="">请选择</option>
-                            </select>
+                            <textarea name="gameDescription" placeholder="请输入内容" class="layui-textarea"></textarea>
                         </div>
                     </div>
                     <div class="layui-form-item">
-                        <label class="layui-form-label">是否分享</label>
+                        <label class="layui-form-label">地址</label>
                         <div class="layui-input-block">
-                            <select name="isShare" id="isShare" lay-verify="required" lay-filter="xmFilter">
-                                <option value="">请选择</option>
-                            </select>
+                            <input type="text" name="gameWebUrl" autocomplete="off" placeholder="gameWebUrl"
+                                   class="layui-input" >
                         </div>
                     </div>
-                    <div class="layui-form-item" hidden="hidden">
-                        <label class="layui-form-label">设备标识</label>
+
+                    <div class="layui-form-item">
+                        <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">
+                            <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>
@@ -130,7 +183,7 @@
                             </div>
                         </div>
                     </div>
-                    <div class="layui-form-item" id="tableTime">
+                    <div class="layui-form-item" id="tableUpdateTime">
                         <div class="layui-inline">
                             <label class="layui-form-label">更新时间</label>
                             <div class="layui-input-block">
@@ -139,11 +192,8 @@
                             </div>
                         </div>
                     </div>
-                    <!-- 隐藏域 -->
-                    <!--<input type="text" name="userId" hidden="hidden"/>-->
-
                     <div class="layui-form-item">
-                        <a id="saveBtn" class="layui-btn" type="submit" lay-submit lay-filter="comFilter">保存</a>
+                        <a id="saveBtn" class="layui-btn" type="submit" lay-submit lay-filter="comFilter">保存数据修改</a>
                     </div>
                 </form>
 
@@ -154,27 +204,27 @@
     <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"  style="margin: 0 auto;">
+                <div class="layui-carousel" id="stepForm" lay-filter="stepForm" style="margin: 0 auto;">
                     <div carousel-item>
                         <div>
-                            <form id="addForm" class="layui-form layui-form-pane" lay-filter="addForm">
+                            <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>
+                                    <label class="layui-form-label">名字</label>
                                     <div class="layui-input-block">
                                         <input type="text" name="gameName" autocomplete="off" placeholder="gameName"
-                                               class="layui-input" >
+                                               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="showTimeDate" autocomplete="off" placeholder="showTime"
-                                               class="layui-input">
-                                    </div>
-                                </div>
-                                <div class="layui-form-item">
-                                    <label class="layui-form-label">游戏状态</label>
+                                    <label class="layui-form-label">状态</label>
                                     <div class="layui-input-block">
                                         <select name="gameStatus" id="gameStatusAdd" lay-verify="required"
                                                 lay-filter="xmFilter">
@@ -183,7 +233,7 @@
                                     </div>
                                 </div>
                                 <div class="layui-form-item">
-                                    <label class="layui-form-label">游戏所属分类</label>
+                                    <label class="layui-form-label">所属分类</label>
                                     <div class="layui-input-block">
                                         <select name="gameType" id="gameTypeAdd" lay-verify="required"
                                                 lay-filter="xmFilter">
@@ -192,7 +242,7 @@
                                     </div>
                                 </div>
                                 <div class="layui-form-item">
-                                    <label class="layui-form-label">游戏支持展示平台(0:Android,1:IOS,2:同时支持两个平台)</label>
+                                    <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>
@@ -200,40 +250,52 @@
                                     </div>
                                 </div>
                                 <div class="layui-form-item">
-                                    <label class="layui-form-label">游戏模式标签类型(可多选)</label>
+                                    <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>
+                                    <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>
+                                    <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="demo1">
-                                                <p id="demoText"></p>
-                                            </div>
-                                            <div style="width: 95px;">
-                                                <div class="layui-progress layui-progress-big" lay-showpercent="yes" lay-filter="demo">
-                                                    <div class="layui-progress-bar" lay-percent=""></div>
-                                                </div>
+                                                <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>
@@ -243,14 +305,14 @@
                                         <div class="layui-upload">
                                             <button type="button" class="layui-btn" id="pictureAdd">上传封面</button>
                                             <div class="layui-upload-list">
-                                                <img class="layui-upload-img" id="demo1">
-                                                <p id="demoText"></p>
-                                            </div>
-                                            <div style="width: 95px;">
-                                                <div class="layui-progress layui-progress-big" lay-showpercent="yes" lay-filter="demo">
-                                                    <div class="layui-progress-bar" lay-percent=""></div>
-                                                </div>
+                                                <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>
@@ -261,63 +323,16 @@
                                             <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="demo2"></div>
+                                                <div class="layui-upload-list" id="scrollImageListAdd"></div>
                                             </blockquote>
                                         </div>
                                     </div>
                                 </div>
-
-
-                                <div class="layui-form-item">
-                                    <a id="addBtn" class="layui-btn" type="submit" lay-submit lay-filter="comAddFilter">新增</a>
-                                </div>
-                            </form>
-                        </div>
-                        <div>
-                            <form class="layui-form" style="margin: 0 auto;max-width: 460px;padding-top: 40px;">
-                                <div class="layui-form-item">
-                                    <label class="layui-form-label">游戏ID:</label>
-                                    <div class="layui-input-block">
-                                        <div class="layui-form-mid layui-word-aux">639537</div>
-                                    </div>
-                                </div>
-                                <div class="layui-form-item">
-                                    <label class="layui-form-label">账户余额:</label>
-                                    <div class="layui-input-block">
-                                        <div class="layui-form-mid layui-word-aux">3000 元(保险箱:1000,现金:2000)</div>
-                                    </div>
-                                </div>
-                                <div class="layui-form-item">
-                                    <label class="layui-form-label">入款金额:</label>
-                                    <div class="layui-input-block">
-                                        <div class="layui-form-mid layui-word-aux">
-                                            <span style="font-size: 18px;color: #333;">1800 元</span>
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="layui-form-item">
-                                    <label class="layui-form-label">入款类型:</label>
-                                    <div class="layui-input-block">
-                                        <div class="layui-form-mid layui-word-aux">保险箱</div>
-                                    </div>
-                                </div>
-                                <div class="layui-form-item">
-                                    <label class="layui-form-label">入款方式:</label>
-                                    <div class="layui-input-block">
-                                        <div class="layui-form-mid layui-word-aux">人工入款</div>
-                                    </div>
-                                </div>
-                                <div class="layui-form-item">
-                                    <label class="layui-form-label">备注说明:</label>
-                                    <div class="layui-input-block">
-                                        <div class="layui-form-mid layui-word-aux">备注说明</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;确认入款&emsp;
+                                            &emsp;确认
                                         </button>
                                     </div>
                                 </div>
@@ -328,13 +343,13 @@
                                 <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 style="font-size: 14px;color: #666;margin-top: 20px;">预计两小时到账</div>-->
                             </div>
                             <div style="text-align: center;margin-top: 50px;">
-                                <button class="layui-btn next">再入一笔</button>
-                                <button class="layui-btn layui-btn-primary">查看账单</button>
+                                <button class="layui-btn newGameInfo">再添加一个</button>
+                                <button class="layui-btn layui-btn-primary updateGameInfo">查看已有游戏</button>
                             </div>
                         </div>
                     </div>
@@ -342,39 +357,6 @@
             </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">

+ 47 - 0
src/main/resources/templates/client/imageInfo.html

@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<!--解决idea thymeleaf 表达式模板报红波浪线-->
+<!--suppress ALL -->
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+    <!-- 引入公用部分 -->
+    <script th:replace="common/head::static"></script>
+
+
+        <style type="text/css">
+            .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-header">背包列表</div>-->
+            <div class="layui-card-body" id="cardBody">
+                <!-- 表格主体 -->
+                <table class="layui-hide" id="mainTable" lay-filter="test"></table>
+                <!-- 模板 -->
+                <script type="text/html" id="mainTableToolbarDemo">
+
+                </script>
+
+                <script type="text/html" id="mainTableBarDemo">
+                    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
+                </script>
+                <script type="text/html" id="pictureUrl">
+                    <img  src="{{domainName}}{{d.pictureUrl}}" style="" width="60" height="60" alt="">
+                </script>
+            </div>
+        </div>
+
+    </div>
+
+</div>
+</body>
+<script type="text/javascript" th:inline="javascript">
+    //新增数据表单
+    // defaultBLEData = {"bluetoothName": [[${defaultName}]],"bluetoothMac": [[${defaultMac}]]};
+</script>
+<script th:src="@{/client/js/imageInfo.js}"></script>
+</html>

+ 369 - 0
src/main/resources/templates/client/userInfo.html

@@ -0,0 +1,369 @@
+<!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;">
+                        <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>
+                    </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="avatarPicture">
+                    <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>-->
+            </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">
+    //新增数据表单
+    // defaultBLEData = {"bluetoothName": [[${defaultName}]],"bluetoothMac": [[${defaultMac}]]};
+    categoryList = [[${categoryList}]];
+    allCustomTags = [[${allCustomTags}]];
+</script>
+<script th:src="@{/client/js/userInfo.js}"></script>
+</html>

+ 2 - 2
src/main/resources/templates/logging.html

@@ -39,8 +39,8 @@
         //动态获取域名或ip
         let hostname = window.location.hostname;
         port = window.location.port;
-        websocket = new WebSocket("ws://"+hostname+":" + port + ctx + "/websocket/logging");
-        console.log("ws://"+hostname+":" + port + ctx + "/websocket/logging");
+        websocket = new WebSocket("wss://"+hostname+":" + port + ctx + "/websocket/logging");
+        console.log("wss://"+hostname+":" + port + ctx + "/websocket/logging");
     } else {
         console.error("不支持WebSocket");
     }

+ 1 - 1
src/main/resources/templates/monitor.html

@@ -95,7 +95,7 @@
         //动态获取域名或ip
         let hostname = window.location.hostname;
         port = window.location.port;
-        websocket = new WebSocket("ws://"+hostname+":" + port + ctx + "/websocket/monitor");
+        websocket = new WebSocket("wss://"+hostname+":" + port + ctx + "/websocket/monitor");
     } else {
         console.error("不支持WebSocket");
     }

+ 0 - 28
src/test/java/com/YuyeTech/TPlat/LoggerTest.java

@@ -1,28 +0,0 @@
-package com.YuyeTech.TPlat;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-/**
- * create by slambb
- * 2019-11-28
- * */
-@RunWith(SpringRunner.class)
-@SpringBootTest
-//@Slf4j
-public class LoggerTest {
-
-    private final Logger logger = LoggerFactory.getLogger(LoggerTest.class);
-
-
-    @Test
-    public void test1(){
-        logger.debug("debug..");
-        logger.info("info...");
-        logger.error("error...");
-    }
-}

+ 0 - 30
src/test/java/com/YuyeTech/TPlat/LoggerTest2.java

@@ -1,30 +0,0 @@
-package com.YuyeTech.TPlat;
-
-
-import lombok.extern.java.Log;
-import lombok.extern.slf4j.Slf4j;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-
-@RunWith(SpringRunner.class)
-@SpringBootTest
-@Slf4j
-public class LoggerTest2 {
-
-    @Test
-    public void test2() {
-//        log.debug("debug..");
-//        log
-
-        log.debug("debug..");
-        log.info("info...");
-        String name = "slambb";
-        String password = "123";
-        log.info("name:{},password:{}",name,password);
-        log.error("error...");
-
-    }
-}

+ 0 - 13
src/test/java/com/YuyeTech/TPlat/SmallshopApplicationTests.java

@@ -1,13 +0,0 @@
-package com.YuyeTech.TPlat;
-
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-
-@SpringBootTest
-class SmallshopApplicationTests {
-
-    @Test
-    void contextLoads() {
-    }
-
-}

+ 0 - 51
src/test/java/com/YuyeTech/TPlat/repository/ProductCategoryRepositoryTest.java

@@ -1,51 +0,0 @@
-package com.YuyeTech.TPlat.repository;
-
-import com.YuyeTech.TPlat.dataobject.ProductCategory;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import javax.transaction.Transactional;
-import java.util.Arrays;
-import java.util.List;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class ProductCategoryRepositoryTest {
-
-        @Autowired
-        private  ProductCategoryRepository repository;
-
-        @Test
-        public void findOneTest(){
-            ProductCategory productCategory = repository.findById(1).orElse(null);
-            System.out.println(productCategory.toString());
-        }
-
-        /**
-         * @Transactional
-         * test : 完全回滚,
-         * service: 方法抛出异常时候回滚,把对应数据库数据删除。
-         * */
-        @Test
-        @Transactional
-        public void saveTest(){
-            //更新属性,先查出对象数据,判断权限,属性之类,在更新
-            //值不同才会DynamicUpdate,更新数据,时间;
-            ProductCategory productCategory = new ProductCategory("男生最爱",11);
-            ProductCategory result = repository.save(productCategory);
-            Assert.assertNotNull(result);
-//            Assert.assertNotEquals(null,result);
-        }
-
-        @Test
-        public void findByCategoryTypeInTest(){
-            List<Integer> list = Arrays.asList(2,10,4);
-
-            List<ProductCategory> result = repository.findByCategoryTypeIn(list);
-            Assert.assertNotEquals(0,result.size());
-        }
-}

+ 0 - 51
src/test/java/com/YuyeTech/TPlat/repository/UserInfoRepositoryTest.java

@@ -1,51 +0,0 @@
-package com.YuyeTech.TPlat.repository;
-
-import com.YuyeTech.TPlat.utils.KeyUtil;
-import com.YuyeTech.TPlat.dataobject.UserInfo;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import java.util.Date;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class UserInfoRepositoryTest {
-    @Autowired
-    private UserInfoRepository userInfoRepository;
-
-    @Test
-    public void findUserInfoOneTest(){
-        UserInfo userInfo = userInfoRepository.findById("1").orElse(null);
-        System.out.println(userInfo.toString());
-    }
-
-    @Test
-    public void ModifyUserInfo(){
-//        UserInfo userInfo = new UserInfo();
-//        UserInfo userInfo = userInfoRepository.findById("1").orElse(null);
-
-        UserInfo userInfo = new UserInfo();
-        userInfo.setUserId(KeyUtil.genUniqueKey());
-        userInfo.setUsername("peng");
-        userInfo.setBirthday(new Date());
-        userInfo.setRegisterTime(new Date());
-        userInfo.setHeight(120.0);
-        userInfo.setWeight(130.0);
-        userInfo.setAvatarUrl("http://xxxx.jpg");
-        userInfo.setGender("女");
-        userInfo.setSignature("我很帅111");
-        userInfo.setStatus(1);
-
-        UserInfo  result = userInfoRepository.save(userInfo);
-        Assert.assertNotEquals(null,result);
-    }
-
-    @Test
-    public void DeleteUserInfo(){
-        userInfoRepository.deleteById("sadf");
-    }
-}

+ 0 - 46
src/test/java/com/YuyeTech/TPlat/service/impl/CategoryServiceImplTest.java

@@ -1,46 +0,0 @@
-package com.YuyeTech.TPlat.service.impl;
-
-import com.YuyeTech.TPlat.dataobject.ProductCategory;
-import org.junit.Assert;
-import org.junit.jupiter.api.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import java.util.List;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest
-class CategoryServiceImplTest {
-
-    //cate 类实现的测试
-    @Autowired
-    private CategoryServiceImpl categoryService;
-
-    @Test
-    void findOne() {
-//        ProductCategory productCategory = categoryService.findOne(1);
-//        Assert.assertEquals(new Integer(1), productCategory.getCategoryId());
-    }
-
-    @Test
-    void findAll() {
-        List<ProductCategory> productCategoryList = categoryService.findAll();
-        Assert.assertNotEquals(0,productCategoryList.size());
-    }
-
-    @Test
-    void findByCategoryTypeIn() {
-//        List<ProductCategory> productCategoryList = categoryService.findByCategoryTypeIn(Arrays.asList(2,3,4));
-//        Assert.assertNotEquals(0,productCategoryList.size());
-    }
-
-    @Test
-    void save() {
-//        ProductCategory productCategory = new ProductCategory("宅男必备",5);
-//        ProductCategory result = categoryService.save(productCategory);
-//        Assert.assertNotEquals(null,result);
-
-    }
-}