Преглед изворни кода

添加后台模板,修复记录背包数据问题

slambb пре 4 година
родитељ
комит
8ff1150409
74 измењених фајлова са 3833 додато и 195 уклоњено
  1. 13 0
      src/main/java/com/td/boss/BossApplication.java
  2. 3 2
      src/main/java/com/td/boss/aspect/SafetyAspect.java
  3. 5 2
      src/main/java/com/td/boss/config/enums/ResultEnum.java
  4. 1 1
      src/main/java/com/td/boss/config/security/SecurityConfig.java
  5. 9 0
      src/main/java/com/td/boss/filter/gameFilter.java
  6. 27 0
      src/main/java/com/td/boss/game/comcntorder/repository/ComCntOrderRepository.java
  7. 14 0
      src/main/java/com/td/boss/game/comcntorder/service/ComCntOrderService.java
  8. 20 0
      src/main/java/com/td/boss/game/comcntorder/service/ComCntOrderServiceImpl.java
  9. 22 0
      src/main/java/com/td/boss/game/comcntorder/vo/ComCntOrderDateVo.java
  10. 24 0
      src/main/java/com/td/boss/game/comcntorder/vo/ComCntOrderPayTypeSumVo.java
  11. 6 0
      src/main/java/com/td/boss/game/comconfigland/pojo/ComConfigLand.java
  12. 4 0
      src/main/java/com/td/boss/game/comconfigland/service/ComConfigLandService.java
  13. 6 0
      src/main/java/com/td/boss/game/comconfigland/service/ComConfigLandServiceImpl.java
  14. 6 0
      src/main/java/com/td/boss/game/comconfigland/vo/ComConfigLandVo.java
  15. 4 0
      src/main/java/com/td/boss/game/comfruit/service/ComFruitService.java
  16. 7 0
      src/main/java/com/td/boss/game/comfruit/service/ComFruitServiceImpl.java
  17. 101 0
      src/main/java/com/td/boss/game/commallseed/controller/ComMallSeedController.java
  18. 4 0
      src/main/java/com/td/boss/game/commallseed/service/ComMallSeedService.java
  19. 6 0
      src/main/java/com/td/boss/game/commallseed/service/ComMallSeedServiceImpl.java
  20. 21 3
      src/main/java/com/td/boss/game/complayergoods/controller/ComPlayerGoodsController.java
  21. 2 0
      src/main/java/com/td/boss/game/complayergoods/pojo/ComPlayerGoods.java
  22. 12 0
      src/main/java/com/td/boss/game/complayergoods/repository/ComPlayerGoodsRepository.java
  23. 5 0
      src/main/java/com/td/boss/game/complayergoods/service/ComPlayerGoodsService.java
  24. 7 0
      src/main/java/com/td/boss/game/complayergoods/service/ComPlayerGoodsServiceImpl.java
  25. 23 0
      src/main/java/com/td/boss/game/complayergoods/vo/ComPlayerGoodsTypeSumVo.java
  26. 2 0
      src/main/java/com/td/boss/game/complayergoods/vo/ComPlayerGoodsVo.java
  27. 33 2
      src/main/java/com/td/boss/game/complayerland/controller/ComPlayerLandController.java
  28. 4 0
      src/main/java/com/td/boss/game/complayerland/vo/ComPlayerLandAndPlantVo.java
  29. 5 0
      src/main/java/com/td/boss/game/complayerland/vo/ComPlayerLandSimpleVo.java
  30. 6 5
      src/main/java/com/td/boss/game/complayerlog/vo/ComPlayerLogVo.java
  31. 123 86
      src/main/java/com/td/boss/game/complayers/controller/ComPlayersController.java
  32. 10 0
      src/main/java/com/td/boss/game/complayers/pojo/ComPlayers.java
  33. 12 14
      src/main/java/com/td/boss/game/comsnbfreeze/controller/ComSnbFreezeController.java
  34. 22 1
      src/main/java/com/td/boss/game/comsnbtran/repository/ComSnbTranRepository.java
  35. 11 0
      src/main/java/com/td/boss/game/comsnbtran/service/ComSnbTranService.java
  36. 14 0
      src/main/java/com/td/boss/game/comsnbtran/service/ComSnbTranServiceImpl.java
  37. 18 0
      src/main/java/com/td/boss/game/comsnbtran/vo/ComSnbTranDateVo.java
  38. 23 0
      src/main/java/com/td/boss/game/comsnbtran/vo/ComSnbTranTranTypeSumVo.java
  39. 12 1
      src/main/java/com/td/boss/game/comusers/controller/ComUsersController.java
  40. 10 0
      src/main/java/com/td/boss/game/comusers/pojo/ComUsers.java
  41. 4 0
      src/main/java/com/td/boss/game/comusers/repository/ComUsersRepository.java
  42. 11 0
      src/main/java/com/td/boss/game/comusers/service/ComUsersService.java
  43. 11 0
      src/main/java/com/td/boss/game/comusers/service/ComUsersServiceImpl.java
  44. 2 0
      src/main/java/com/td/boss/game/comusers/vo/ComUsersSimpleVo.java
  45. 10 0
      src/main/java/com/td/boss/game/comusers/vo/ComUsersVo.java
  46. 231 0
      src/main/java/com/td/boss/sys/sysGame/controller/sysGamePropertyController.java
  47. 211 0
      src/main/java/com/td/boss/sys/sysGame/controller/sysGameUsersController.java
  48. 9 4
      src/main/java/com/td/boss/sys/sysmenu/controller/SysMenuController.java
  49. 9 0
      src/main/java/com/td/boss/sys/sysmenu/service/SysMenuServiceImpl.java
  50. 4 0
      src/main/java/com/td/boss/sys/sysusermenu/service/SysUserMenuServiceImpl.java
  51. 4 7
      src/main/resources/application.yml
  52. 62 19
      src/main/resources/static/common/common.js
  53. 22 0
      src/main/resources/static/sys/aComCNTAndSNB/css/CNTAndSNB.css
  54. 361 0
      src/main/resources/static/sys/aComCNTAndSNB/js/CNTAndSNB.js
  55. 22 0
      src/main/resources/static/sys/aComConfig/css/seedConfig.css
  56. 100 0
      src/main/resources/static/sys/aComConfig/js/fruitConfig.js
  57. 126 0
      src/main/resources/static/sys/aComConfig/js/landConfig.js
  58. 111 0
      src/main/resources/static/sys/aComConfig/js/seedConfig.js
  59. 22 0
      src/main/resources/static/sys/aComPlayerGoods/css/playerGoods.css
  60. 103 0
      src/main/resources/static/sys/aComPlayerGoods/js/playerGoods.js
  61. 22 0
      src/main/resources/static/sys/aComUser/css/user.css
  62. 507 0
      src/main/resources/static/sys/aComUser/js/user.js
  63. 260 0
      src/main/resources/static/sys/aComUser/js/userPlayerGoods.js
  64. 189 0
      src/main/resources/static/sys/aComUser/js/userPlayerLands.js
  65. 2 0
      src/main/resources/static/sys/menu/js/menu.js
  66. 5 48
      src/main/resources/view/index.html
  67. 92 0
      src/main/resources/view/sys/aComCNTAnbSNB/CNTAndSNB.html
  68. 85 0
      src/main/resources/view/sys/aComConfig/fruitConfig.html
  69. 95 0
      src/main/resources/view/sys/aComConfig/landConfig.html
  70. 106 0
      src/main/resources/view/sys/aComConfig/seedConfig.html
  71. 36 0
      src/main/resources/view/sys/aComPlayerGoods/playerGoods.html
  72. 163 0
      src/main/resources/view/sys/aComUser/user.html
  73. 96 0
      src/main/resources/view/sys/aComUser/userPlayerGoods.html
  74. 83 0
      src/main/resources/view/sys/aComUser/userPlayerLands.html

+ 13 - 0
src/main/java/com/td/boss/BossApplication.java

@@ -1,4 +1,6 @@
 package com.td.boss;
+import com.td.boss.game.comusers.pojo.ComUsers;
+import com.td.boss.game.comusers.service.ComUsersService;
 import com.td.boss.sys.sysmenu.vo.SysMenuVo;
 import com.td.boss.sys.syssetting.service.SysSettingService;
 import com.td.boss.sys.syssetting.vo.SysSettingVo;
@@ -71,6 +73,9 @@ class IndexController {
     @Autowired
     private SysShortcutMenuService sysShortcutMenuService;
 
+    @Autowired
+    private ComUsersService comUsersService;
+
     @Value("${server.servlet.context-path:}")
     private String contextPath;
 
@@ -157,6 +162,14 @@ class IndexController {
         log.info("index后端公钥:" + publicKey);
         modelAndView.addObject("publicKey", publicKey);
 
+        //获取一个全平台的用户数据
+        Long allComUserCount =  comUsersService.findAllCount();
+        modelAndView.addObject("allComUserCount", allComUserCount);
+
+        Long todayComUserCount = comUsersService.newToday();
+        modelAndView.addObject("todayComUserCount", todayComUserCount);
+
+
         return modelAndView;
     }
 

+ 3 - 2
src/main/java/com/td/boss/aspect/SafetyAspect.java

@@ -53,7 +53,8 @@ public class SafetyAspect {
      * 下面需要验证加密
      *  "execution(public * com.td.boss.game.*.controller.*.*(..))"
      */
-    @Pointcut(value = "execution(public * com.td.boss.sys.*.controller.*.*(..))  ")
+    @Pointcut(value = "execution(public * com.td.boss.sys.*.controller.*.*(..)) || " +
+            "execution(public * com.td.boss.*.controller.*.*(..))")
     public void safetyAspect() {}
 
     /**
@@ -62,7 +63,7 @@ public class SafetyAspect {
     @Around(value = "safetyAspect()")
     public Object around(ProceedingJoinPoint pjp) {
        try {
-
+            log.info("---------------进入aop---------------");
            //判断api加密开关是否开启
            if("N".equals(SysSettingUtil.getSysSetting().getSysApiEncrypt())){
                return pjp.proceed(pjp.getArgs());

+ 5 - 2
src/main/java/com/td/boss/config/enums/ResultEnum.java

@@ -23,9 +23,10 @@ public enum ResultEnum {
     USER_VERIFICATION_ERROR(402,"签名校验失败"),
 
     USER_NOT_ADDRESS(403,"用户地址不存在!"),
+    USER_LIMIT_LOGIN(404,"用户限制登录!"),
 
     //角色数据
-    PLAYER_DOES_NOT_EXIST(500,"不存在角色信息!"),
+    PLAYER_DOES_NOT_EXIST(500,"不存在角色信息!"),
     PLAYER_DOES_NOT_ATTRIBUTES(501,"battle player 数据不存在!"),
 
     PLAYER_GOODS_LIMIT_ERROR(510,"背包超过预设长度!"),
@@ -59,8 +60,10 @@ public enum ResultEnum {
     SEED_DATE_ERROR(805,"未到成熟时间!"),
     SEED_AMOUNT_ERROR(806,"背包数量不对!"),
     SEED_PLAY_ERROR(807,"支付价格不对!"),
+    SEED_PLAY_DIAMOND_ERROR(808,"钻石不足以兑换支付!"),
+    SEED_IS_EXCHANGE(809,"种子已经兑换过!"),
 
-    FRUIT_AMOUNT_IS_ZERO_AND_NOT_MULTIPLE(808,"请输入20的倍数出售果实!"),
+    FRUIT_AMOUNT_IS_ZERO_AND_NOT_MULTIPLE(808,"请输入出售果实的数量!"),
     ;
     private Integer code;
 

+ 1 - 1
src/main/java/com/td/boss/config/security/SecurityConfig.java

@@ -56,7 +56,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
     @Override
     public void configure(WebSecurity web) throws Exception {
         // game 走 token验证流程
-        web.ignoring().antMatchers("/game/**","/game_websocket/**");
+        web.ignoring().antMatchers("/game/**","/game_websocket/**","/static/**");
     }
 
     @Override

+ 9 - 0
src/main/java/com/td/boss/filter/gameFilter.java

@@ -7,6 +7,7 @@ import com.td.boss.util.JsonUtils;
 import com.td.boss.util.JwtTokenUtil;
 import com.td.boss.util.TokenRequestWrapper;
 import io.jsonwebtoken.ExpiredJwtException;
+import io.jsonwebtoken.SignatureException;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -82,6 +83,10 @@ public class gameFilter implements Filter {
                 log.info("userId:{}", userId);
                 //todo 后面需要校验时间,加入可切换 secret 校验
                 log.info("validateToken:{}", jwtTokenUtil.validateToken(authToken, userId));
+                // 加入secret校验
+                if(!jwtTokenUtil.validateToken(authToken, userId)){
+                    log.info("secret 不可靠,validateToken:{}", jwtTokenUtil.validateToken(authToken, userId));
+                }
                 if (!StringUtils.isEmpty(userId)) {
                     filterChain.doFilter(new TokenRequestWrapper((HttpServletRequest) servletRequest, userId), response);
                 } else {
@@ -93,6 +98,10 @@ public class gameFilter implements Filter {
                 //token过期
                 response.setCharacterEncoding("utf-8");
                 response.getWriter().print(JsonUtils.toJson(Result.of(null,false,ResultEnum.TOKEN_OUT_OF_DATE.getMessage(), ResultEnum.TOKEN_OUT_OF_DATE.getCode())));
+            } catch (SignatureException e){
+                //secret校验密钥不对
+                response.setCharacterEncoding("utf-8");
+                response.getWriter().print(JsonUtils.toJson(Result.of(authToken,false,ResultEnum.TOKEN_IS_ILLEGAL.getMessage(),ResultEnum.TOKEN_IS_ILLEGAL.getCode())));
             }
 
         }

+ 27 - 0
src/main/java/com/td/boss/game/comcntorder/repository/ComCntOrderRepository.java

@@ -2,13 +2,40 @@ package com.td.boss.game.comcntorder.repository;
 
 import com.td.boss.common.repository.*;
 import com.td.boss.game.comcntorder.pojo.ComCntOrder;
+import com.td.boss.game.comcntorder.vo.ComCntOrderPayTypeSumVo;
 import com.td.boss.game.comcntorder.vo.ComCntOrderVo;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
+import java.util.Date;
+import java.util.List;
 import java.util.Optional;
 
 @Repository
 public interface ComCntOrderRepository extends CommonRepository<ComCntOrder, String> {
 
     Optional<ComCntOrder> findByTxHash(String tx);
+
+    List<ComCntOrder> findByUserIdAndPayType(String userId,Integer payType);
+
+    //SELECT pay_type,sum(pay_amount) from com_cnt_order WHERE pay_type = 4
+
+    /**
+     * 返回一个降序的pay_type 统计
+     *
+     * @return
+     */
+    @Query(value = "SELECT new com.td.boss.game.comcntorder.vo.ComCntOrderPayTypeSumVo(u.payType,sum(u.payAmount)) from ComCntOrder u GROUP BY u.payType ORDER BY sum(u.payAmount) desc", nativeQuery = false)
+    List<ComCntOrderPayTypeSumVo> findCNTSumByPayType();
+
+
+    /**
+     * 根据开始结束时间获取payType 统计数据
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    @Query(value = "SELECT new com.td.boss.game.comcntorder.vo.ComCntOrderPayTypeSumVo(u.payType,sum(u.payAmount)) FROM  ComCntOrder u  where u.createTime >= :startTime and u.createTime<= :endTime GROUP BY u.payType ORDER BY sum(u.payAmount) desc")
+    List<ComCntOrderPayTypeSumVo> findCNTSumByPayTypeFromDate(Date startTime, Date endTime);
+
 }

+ 14 - 0
src/main/java/com/td/boss/game/comcntorder/service/ComCntOrderService.java

@@ -2,11 +2,25 @@ package com.td.boss.game.comcntorder.service;
 
 import com.td.boss.common.service.*;
 import com.td.boss.game.comcntorder.pojo.ComCntOrder;
+import com.td.boss.game.comcntorder.vo.ComCntOrderPayTypeSumVo;
 import com.td.boss.game.comcntorder.vo.ComCntOrderVo;
 
+import java.util.Date;
+import java.util.List;
 import java.util.Optional;
 
 public interface ComCntOrderService extends CommonService<ComCntOrderVo, ComCntOrder, String> {
 
     ComCntOrderVo findByTx(String tx);
+
+    List<ComCntOrder>  findByUserIdAndPayType(String userId,Integer payType);
+
+    //返回一个全部总量
+    List<ComCntOrderPayTypeSumVo> findAllCNTSumGroupByPayType();
+
+    //返回一个日期查找的总量
+    List<ComCntOrderPayTypeSumVo> findAllCNTSumGroupByPayTypeFromDate(Date startTime, Date endTime);
+
+
+
 }

+ 20 - 0
src/main/java/com/td/boss/game/comcntorder/service/ComCntOrderServiceImpl.java

@@ -2,6 +2,7 @@ package com.td.boss.game.comcntorder.service;
 
 import com.td.boss.common.service.*;
 import com.td.boss.game.comcntorder.pojo.ComCntOrder;
+import com.td.boss.game.comcntorder.vo.ComCntOrderPayTypeSumVo;
 import com.td.boss.game.comcntorder.vo.ComCntOrderVo;
 import com.td.boss.game.comcntorder.repository.ComCntOrderRepository;
 import com.td.boss.util.CopyUtil;
@@ -10,6 +11,8 @@ 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.List;
 import java.util.Optional;
 
 @Service
@@ -31,4 +34,21 @@ public class ComCntOrderServiceImpl extends CommonServiceImpl<ComCntOrderVo, Com
             return CopyUtil.copy(comCntOrder.get(), ComCntOrderVo.class);
         }
     }
+
+    @Override
+    public List<ComCntOrder> findByUserIdAndPayType(String userId, Integer payType) {
+        return comCntOrderRepository.findByUserIdAndPayType(userId,payType);
+    }
+
+    @Override
+    public List<ComCntOrderPayTypeSumVo> findAllCNTSumGroupByPayType() {
+        return comCntOrderRepository.findCNTSumByPayType();
+    }
+
+
+    @Override
+    public List<ComCntOrderPayTypeSumVo> findAllCNTSumGroupByPayTypeFromDate(Date startTime,Date endTime) {
+        return comCntOrderRepository.findCNTSumByPayTypeFromDate(startTime, endTime);
+    }
+
 }

+ 22 - 0
src/main/java/com/td/boss/game/comcntorder/vo/ComCntOrderDateVo.java

@@ -0,0 +1,22 @@
+package com.td.boss.game.comcntorder.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @author:slambb
+ * @date:2022/1/25
+ */
+@Data
+public class ComCntOrderDateVo {
+    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
+    private Date startTime;
+    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
+    private Date endTime;
+}

+ 24 - 0
src/main/java/com/td/boss/game/comcntorder/vo/ComCntOrderPayTypeSumVo.java

@@ -0,0 +1,24 @@
+package com.td.boss.game.comcntorder.vo;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * @author:slambb
+ * @date:2022/1/25
+ */
+@Getter
+@Setter
+@ToString
+public class ComCntOrderPayTypeSumVo {
+    private Integer payType;
+    private String cntSum;
+
+    public ComCntOrderPayTypeSumVo(Integer payType, String cntSum) {
+        this.payType = payType;
+        this.cntSum = cntSum;
+    }
+
+}

+ 6 - 0
src/main/java/com/td/boss/game/comconfigland/pojo/ComConfigLand.java

@@ -33,6 +33,12 @@ public class ComConfigLand implements Serializable {
 
     private Double leaseMultiple;//租赁的倍数
 
+    private Integer rental1;//3个月租赁费用CNT
+
+    private Integer rental2;//1年租赁费用CNT
+
+    private Integer rental3;//5年月租赁费用CNT
+
     private Integer isPlant;//是否种植
 
     private Date plantStart;//种植开始时间

+ 4 - 0
src/main/java/com/td/boss/game/comconfigland/service/ComConfigLandService.java

@@ -4,6 +4,10 @@ import com.td.boss.common.service.*;
 import com.td.boss.game.comconfigland.pojo.ComConfigLand;
 import com.td.boss.game.comconfigland.vo.ComConfigLandVo;
 
+import java.util.List;
+
 public interface ComConfigLandService extends CommonService<ComConfigLandVo, ComConfigLand, Integer> {
     ComConfigLand findById(Integer id);
+
+    List<ComConfigLand> findConfigLandAll();
 }

+ 6 - 0
src/main/java/com/td/boss/game/comconfigland/service/ComConfigLandServiceImpl.java

@@ -9,6 +9,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
+import java.util.List;
 
 @Service
 @Transactional
@@ -24,4 +25,9 @@ public class ComConfigLandServiceImpl extends CommonServiceImpl<ComConfigLandVo,
     public ComConfigLand findById(Integer id) {
         return comConfigLandRepository.findById(id).orElse(null);
     }
+
+    @Override
+    public List<ComConfigLand> findConfigLandAll() {
+        return comConfigLandRepository.findAll();
+    }
 }

+ 6 - 0
src/main/java/com/td/boss/game/comconfigland/vo/ComConfigLandVo.java

@@ -28,6 +28,12 @@ public class ComConfigLandVo  implements Serializable { //extends PageCondition
 
     private Double leaseMultiple;//租赁的倍数
 
+    private Integer rental1;//3个月租赁费用CNT
+
+    private Integer rental2;//1年租赁费用CNT
+
+    private Integer rental3;//5年月租赁费用CNT
+
     private Integer isPlant;//是否种植
 
     private Date plantStart;//种植开始时间

+ 4 - 0
src/main/java/com/td/boss/game/comfruit/service/ComFruitService.java

@@ -4,6 +4,10 @@ import com.td.boss.common.service.*;
 import com.td.boss.game.comfruit.pojo.ComFruit;
 import com.td.boss.game.comfruit.vo.ComFruitVo;
 
+import java.util.List;
+
 public interface ComFruitService extends CommonService<ComFruitVo, ComFruit, Integer> {
     ComFruitVo findById(Integer id);
+
+    List<ComFruit> findFruitAll();
 }

+ 7 - 0
src/main/java/com/td/boss/game/comfruit/service/ComFruitServiceImpl.java

@@ -10,6 +10,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
+import java.util.List;
 import java.util.Optional;
 
 @Service
@@ -30,4 +31,10 @@ public class ComFruitServiceImpl extends CommonServiceImpl<ComFruitVo, ComFruit,
             return CopyUtil.copy(comMallSeed.get(), ComFruitVo.class);
         }
     }
+
+
+    @Override
+    public List<ComFruit> findFruitAll() {
+        return comFruitRepository.findAll();
+    }
 }

+ 101 - 0
src/main/java/com/td/boss/game/commallseed/controller/ComMallSeedController.java

@@ -1,5 +1,6 @@
 package com.td.boss.game.commallseed.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.td.boss.common.controller.*;
 import com.td.boss.common.pojo.Result;
 import com.td.boss.config.enums.ResultEnum;
@@ -10,6 +11,12 @@ import com.td.boss.game.complayergoods.pojo.ComPlayerGoods;
 import com.td.boss.game.complayergoods.service.ComPlayerGoodsService;
 import com.td.boss.game.complayergoods.vo.ComPlayerGoodsSimpleVo;
 import com.td.boss.game.complayergoods.vo.ComPlayerGoodsVo;
+import com.td.boss.game.complayerlog.pojo.ComPlayerLog;
+import com.td.boss.game.complayerlog.service.ComPlayerLogService;
+import com.td.boss.game.complayerlog.vo.ComPlayerLogVo;
+import com.td.boss.game.complayers.controller.ComPlayersController;
+import com.td.boss.game.complayers.pojo.ComPlayers;
+import com.td.boss.game.complayers.service.ComPlayersService;
 import com.td.boss.game.comsnbtran.service.ComSnbTranService;
 import com.td.boss.game.comsnbtran.vo.ComSnbTranVo;
 import com.td.boss.game.comusers.service.ComUsersService;
@@ -38,6 +45,12 @@ public class ComMallSeedController extends CommonController<ComMallSeedVo, ComMa
     @Autowired
     private ComSnbTranService comSnbTranService;
 
+    @Autowired
+    private ComPlayerLogService comPlayerLogService;
+
+    @Autowired
+    private ComPlayersService comPlayersService;
+
     /**
      * 获取商城种子
      *
@@ -143,4 +156,92 @@ public class ComMallSeedController extends CommonController<ComMallSeedVo, ComMa
     }
 
 
+
+    /**
+     * 用钻石兑换一份辣椒种子
+     *
+     * @param userId
+     * @return
+     */
+    @PostMapping("exchangeSeeds")
+    @ResponseBody
+    @Transactional(rollbackFor = Exception.class)
+    public Result<Map> exchangeSeedsFunction(
+            @RequestParam(value = "userId") String userId,
+            @RequestParam(value = "diamondAmount") Integer diamondAmount,
+            @RequestParam(value = "seedId") Integer seedId
+    ) {
+        // 处理itemType,种子id ,获取种子类型,设置种子不同的数据
+        Integer itemType = seedId;
+        ComMallSeedVo seedVo = comMallSeedService.findById(seedId);
+        Map map = new HashMap();
+        if (seedVo == null) {
+            map.put("msg", "非法操作:所修改的种子不存在服务器中!");
+            //return Result.of(map);
+            return Result.of(map, false, ResultEnum.SEED_DATA_ERROR.getMessage(), ResultEnum.SEED_DATA_ERROR.getCode());
+        }
+
+        ComPlayers player = comPlayersService.findByUserId(userId);
+        if(player.getIsExchange().equals(1)){
+            map.put("msg", "非法操作:已兑换过种子!");
+            return Result.of(map, false, ResultEnum.SEED_IS_EXCHANGE.getMessage(), ResultEnum.SEED_IS_EXCHANGE.getCode());
+        }
+
+        JSONObject jsonObject = JSONObject.parseObject(player.getData());
+        Integer _diamond = Integer.parseInt(jsonObject.getString("Diamond"));
+        if(_diamond<diamondAmount){
+            return Result.of(map, false, ResultEnum.SEED_PLAY_DIAMOND_ERROR.getMessage(), ResultEnum.SEED_PLAY_DIAMOND_ERROR.getCode());
+        }
+        jsonObject.put("Diamond",_diamond - diamondAmount);
+        //设置已经兑换的状态
+        player.setIsExchange(1);
+        //更新游戏状态
+        player.setData(jsonObject.toString());
+        comPlayersService.addComPlayers(player);
+        //合法操作记录到仓库中
+        //todo 添加一个辣椒种子
+        ComPlayerGoods entityVo = comPlayerGoodsService.findByUserIdAndIndexAndType(userId, itemType, 0);
+        Integer _selfBeforeAmount = 0;
+        if (entityVo == null) {
+            //创建一个新种子
+            entityVo = new ComPlayerGoods();
+            entityVo.setGoodsIndex(itemType);
+            entityVo.setGoodsType(0);
+            entityVo.setAmount(1);
+            entityVo.setName(seedVo.getName());
+            entityVo.setPictureName(seedVo.getPicture());
+            entityVo.setUserId(userId);
+        } else {
+            _selfBeforeAmount = entityVo.getAmount();
+            Integer _amount = entityVo.getAmount() + 1;
+            entityVo.setAmount(_amount);
+        }
+        /** 购买成功后,记录到仓库中*/
+        ComPlayerGoodsVo comPlayerGoodsVo = CopyUtil.copy(entityVo, ComPlayerGoodsVo.class);
+        comPlayerGoodsService.save(comPlayerGoodsVo);
+
+        /**
+         * todo 记录 PlayerLog
+         */
+        //当前用户
+        ComPlayerLog _selfPlayerLog = new ComPlayerLog();
+        _selfPlayerLog.setUserId(userId);
+        _selfPlayerLog.setTId(entityVo.getGoodsIndex());
+        _selfPlayerLog.setTName(entityVo.getName());
+        _selfPlayerLog.setTType(4);//兑换种子
+        _selfPlayerLog.setTAmount(1);
+        _selfPlayerLog.setBeforeAmount(_selfBeforeAmount);
+        ////交易后的数据
+        _selfPlayerLog.setAfterAmount(entityVo.getAmount());
+        _selfPlayerLog.setLMultiple(0);//收获时候,会有一个倍数
+        ComPlayerLogVo _selfPlayerLogVo = CopyUtil.copy(_selfPlayerLog, ComPlayerLogVo.class);
+        comPlayerLogService.save(_selfPlayerLogVo);
+
+        map.put("seed", entityVo.getGoodsIndex());
+        map.put("playerData",player.getData());
+        map.put("isExchange",player.getIsExchange());
+
+        return Result.of(map);
+    }
+
 }

+ 4 - 0
src/main/java/com/td/boss/game/commallseed/service/ComMallSeedService.java

@@ -4,7 +4,11 @@ import com.td.boss.common.service.*;
 import com.td.boss.game.commallseed.pojo.ComMallSeed;
 import com.td.boss.game.commallseed.vo.ComMallSeedVo;
 
+import java.util.List;
+
 public interface ComMallSeedService extends CommonService<ComMallSeedVo, ComMallSeed, Integer> {
 
     ComMallSeedVo findById(Integer id);
+
+    List<ComMallSeed>  findMallSeedAll();
 }

+ 6 - 0
src/main/java/com/td/boss/game/commallseed/service/ComMallSeedServiceImpl.java

@@ -10,6 +10,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
+import java.util.List;
 import java.util.Optional;
 
 @Service
@@ -32,4 +33,9 @@ public class ComMallSeedServiceImpl extends CommonServiceImpl<ComMallSeedVo, Com
             return CopyUtil.copy(comMallSeed.get(), ComMallSeedVo.class);
         }
     }
+
+    @Override
+    public List<ComMallSeed> findMallSeedAll() {
+        return comMallSeedRepository.findAll();
+    }
 }

+ 21 - 3
src/main/java/com/td/boss/game/complayergoods/controller/ComPlayerGoodsController.java

@@ -302,10 +302,12 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
         }
         //todo 销售果实时候,收取5%手续费,最少出售20的倍数
         //   1.判定销售数量, 如果果实输入是0,或者不是20的倍数,返回提示
-        if (amount.equals(0) || amount % 20 != 0) {
+        // || amount % 20 != 0
+        if (amount.equals(0)) {
             return Result.of(null, false, ResultEnum.FRUIT_AMOUNT_IS_ZERO_AND_NOT_MULTIPLE.getMessage(), ResultEnum.FRUIT_AMOUNT_IS_ZERO_AND_NOT_MULTIPLE.getCode());
         }
         try {
+            Integer _selfBeforeFruitAmount = comPlayerGoodsSimpleVo.getAmount();
             if (comPlayerGoodsSimpleVo.getAmount().equals(amount)) {
                 //如果库存量和出售的果实数量一样,删除
                 comPlayerGoodsService.delete(comPlayerGoodsSimpleVo.getGoodsId());
@@ -315,7 +317,7 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
                 comPlayerGoodsService.save(comPlayerGoodsVo);
             }
             //todo 收取手续费之后
-            int _endAmount = (int) (amount * 0.95);
+            int _endAmount = (int) (amount * 1);
             //添加SNB
             ComUsersVo comUsersVo = comUsersService.findByUserId(userId);
             //交易前的snb数据
@@ -338,13 +340,29 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
             _snbTran.setTranAmount(amount); //此数量会操作背包记录
             _snbTran.setTranPrice(comFruitVo.getPriceSnb());
             //"出售果实价格:" + comFruitVo.getPriceSnb() + ",数量:" + amount
-            _snbTran.setTranDescribe("扣除5%手续费后果实数量为:" + _endAmount + ",销售价格:" + _saleSnb);
+            _snbTran.setTranDescribe("手续费系数:1,最终果实数量为:" + _endAmount + ",销售价格:" + _saleSnb);
             _snbTran.setIsAdd(1);//增加收入
             _snbTran.setBeforeSnb(_beforeSnb);
             _snbTran.setTranSnb(_saleSnb);
             _snbTran.setAfterSnb(_currentSnb);
             comSnbTranService.save(_snbTran);
 
+            /**
+             * todo 出售果实时候,记录操作 PlayerLog
+             */
+            //当前用户
+            ComPlayerLog _saleFruitPlayerLog = new ComPlayerLog();
+            _saleFruitPlayerLog.setUserId(userId);
+            _saleFruitPlayerLog.setTId(comFruitVo.getId());
+            _saleFruitPlayerLog.setTName(comFruitVo.getName());
+            _saleFruitPlayerLog.setTType(5);//出售水果时候,type设置5
+            _saleFruitPlayerLog.setTAmount(amount);
+            _saleFruitPlayerLog.setBeforeAmount(_selfBeforeFruitAmount);
+            ////交易后的数据
+            _saleFruitPlayerLog.setAfterAmount(comPlayerGoodsSimpleVo.getAmount());
+            _saleFruitPlayerLog.setLMultiple(0);//收获时候,会有一个倍数
+            ComPlayerLogVo _saleFruitPlayerLogVo = CopyUtil.copy(_saleFruitPlayerLog, ComPlayerLogVo.class);
+            comPlayerLogService.save(_saleFruitPlayerLogVo);
         } catch (Exception e) {
             throw new RuntimeException(e.getMessage());
         }

+ 2 - 0
src/main/java/com/td/boss/game/complayergoods/pojo/ComPlayerGoods.java

@@ -24,4 +24,6 @@ public class ComPlayerGoods implements Serializable {
 
     private Integer amount;//数量
 
+    private Date createTime;
+
 }

+ 12 - 0
src/main/java/com/td/boss/game/complayergoods/repository/ComPlayerGoodsRepository.java

@@ -2,7 +2,9 @@ package com.td.boss.game.complayergoods.repository;
 
 import com.td.boss.common.repository.*;
 import com.td.boss.game.complayergoods.pojo.ComPlayerGoods;
+import com.td.boss.game.complayergoods.vo.ComPlayerGoodsTypeSumVo;
 import com.td.boss.game.complayergoods.vo.ComPlayerGoodsVo;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
@@ -15,4 +17,14 @@ public interface ComPlayerGoodsRepository extends CommonRepository<ComPlayerGood
 
 
     List<ComPlayerGoods> findAllByUserId(String userId);
+
+
+
+    /**
+     * 返回一个降序的goods_type统计
+     *
+     * @return
+     */
+    @Query(value = "SELECT new com.td.boss.game.complayergoods.vo.ComPlayerGoodsTypeSumVo(u.goodsType,sum(u.amount)) from ComPlayerGoods u GROUP BY u.goodsType ORDER BY sum(u.amount) desc", nativeQuery = false)
+    List<ComPlayerGoodsTypeSumVo> findAmountSumByGoodsType();
 }

+ 5 - 0
src/main/java/com/td/boss/game/complayergoods/service/ComPlayerGoodsService.java

@@ -3,6 +3,7 @@ package com.td.boss.game.complayergoods.service;
 import com.td.boss.common.service.*;
 import com.td.boss.game.complayergoods.pojo.ComPlayerGoods;
 import com.td.boss.game.complayergoods.vo.ComPlayerGoodsSimpleVo;
+import com.td.boss.game.complayergoods.vo.ComPlayerGoodsTypeSumVo;
 import com.td.boss.game.complayergoods.vo.ComPlayerGoodsVo;
 
 import java.util.List;
@@ -19,4 +20,8 @@ public interface ComPlayerGoodsService extends CommonService<ComPlayerGoodsVo, C
     ComPlayerGoods findByUserIdAndIndexAndType(String userId,Integer index, Integer type);
 
     List<ComPlayerGoods> findAllByUserId(String userId);
+
+
+    //
+    List<ComPlayerGoodsTypeSumVo> findAllGroupByGoodsType();
 }

+ 7 - 0
src/main/java/com/td/boss/game/complayergoods/service/ComPlayerGoodsServiceImpl.java

@@ -3,6 +3,7 @@ package com.td.boss.game.complayergoods.service;
 import com.td.boss.common.service.*;
 import com.td.boss.game.complayergoods.pojo.ComPlayerGoods;
 import com.td.boss.game.complayergoods.vo.ComPlayerGoodsSimpleVo;
+import com.td.boss.game.complayergoods.vo.ComPlayerGoodsTypeSumVo;
 import com.td.boss.game.complayergoods.vo.ComPlayerGoodsVo;
 import com.td.boss.game.complayergoods.repository.ComPlayerGoodsRepository;
 import com.td.boss.util.CopyUtil;
@@ -34,4 +35,10 @@ public class ComPlayerGoodsServiceImpl extends CommonServiceImpl<ComPlayerGoodsV
     public List<ComPlayerGoods> findAllByUserId(String userId) {
         return comPlayerGoodsRepository.findAllByUserId(userId);
     }
+
+
+    @Override
+    public List<ComPlayerGoodsTypeSumVo> findAllGroupByGoodsType() {
+        return comPlayerGoodsRepository.findAmountSumByGoodsType();
+    }
 }

+ 23 - 0
src/main/java/com/td/boss/game/complayergoods/vo/ComPlayerGoodsTypeSumVo.java

@@ -0,0 +1,23 @@
+package com.td.boss.game.complayergoods.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * @author:slambb
+ * @date:2022/1/25
+ */
+@Getter
+@Setter
+@ToString
+public class ComPlayerGoodsTypeSumVo {
+    private Integer goodsType;
+    private Long amount;
+
+    public ComPlayerGoodsTypeSumVo(Integer goodsType, Long amount) {
+        this.goodsType = goodsType;
+        this.amount = amount;
+    }
+
+}

+ 2 - 0
src/main/java/com/td/boss/game/complayergoods/vo/ComPlayerGoodsVo.java

@@ -20,4 +20,6 @@ public class ComPlayerGoodsVo extends PageCondition implements Serializable {
 
     private Integer amount;//数量
 
+    private Date createTime;
+
 }

+ 33 - 2
src/main/java/com/td/boss/game/complayerland/controller/ComPlayerLandController.java

@@ -90,6 +90,9 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                 comPlayerLandAndPlantVo.setLeaseDays(allDays);
                 Integer leaseDays = DateUtil.getDays(leaseDaysMill).intValue() <= 0 ? 0 : DateUtil.getDays(leaseDaysMill).intValue();
                 comPlayerLandAndPlantVo.setLeaseDaysRemaining(leaseDays);
+                //返回一个租赁时间毫秒
+                comPlayerLandAndPlantVo.setLeaseDaysMill(leaseDaysMill);
+
                 // 如果种植了,返回一个种植数据
                 if (comPlayerLandAndPlantVo.getIsPlant().equals(1)) {
                     ComMallSeedVo comMallSeedVo = comMallSeedService.findById(comPlayerLandAndPlantVo.getPlantId());
@@ -100,6 +103,8 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                     Date _harvestTime = DateUtil.getNowDateMinusDay(comMallSeedVo.getMaturity());
                     // 两个时间差, 逻辑是_harvestTime 时间慢慢接近种植时间
                     long diff = comPlayerLandAndPlantVo.getPlantStart().getTime() - _harvestTime.getTime();
+                    //种植的剩余时间毫秒
+                    comPlayerLandAndPlantVo.setPlantDaysMill(diff);
                     if (diff <= 0) {
                         //说明可以收获了
                         comPlayerLandAndPlantVo.setPlantDaysRemaining(0);
@@ -145,15 +150,35 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
         }
         ComPlayerLandSimpleVo comPlayerLandSimpleVo = CopyUtil.copy(comPlayerLand, ComPlayerLandSimpleVo.class);
         //todo 返回一个计算的天数和小时,解决跨时区的问题
+        //租赁的剩余天数
+        Long leaseDaysMill = comPlayerLandSimpleVo.getLeaseTime().getTime() - DateUtil.getNowDate().getTime();
+        //租赁的剩余天数
+        //精确到毫秒计算判断时间,先判断一下是否过期,和购买土地时候轮询通用,这里不影响购买土地
+        if (leaseDaysMill <= 0) {
+            //todo 1.土地租赁到期,删除土地租赁数据
+            comPlayerLandService.delete(comPlayerLand.getId());
+            //todo 2.把删除的这个土地的数据记录到com_explain_land中去
+            ComExplainLandVo comExplainLandVo = new ComExplainLandVo();
+            comExplainLandVo = CopyUtil.copy(comPlayerLand, ComExplainLandVo.class);
+            comExplainLandVo.setLandId(comPlayerLand.getConfigLandId());
+            comExplainLandVo.setLandCreate(comPlayerLand.getCreateTime());
+            comExplainLandVo.setExplainType(0);
+            comExplainLandVo.setExplainDescribe("getState获取土地状态时候:土地租赁过期回收");
+            comExplainLandVo.setCreateTime(new Date());
+            comExplainLandVo.setUpdateTime(new Date());
+            comExplainLandService.save(comExplainLandVo);
+            //过期了返回一个状态
+            return Result.of(null, false, ResultEnum.LAND_LEASE_EXPIRED.getMessage(), ResultEnum.LAND_LEASE_EXPIRED.getCode());
+        }
         //土地时间
         //租赁的总时间 = 租赁时间 - 土地数据的创建时间
         Long leaseAllMill = comPlayerLandSimpleVo.getLeaseTime().getTime() - comPlayerLandSimpleVo.getCreateTime().getTime();
         Integer allDays = DateUtil.getDays(leaseAllMill).intValue() <= 0 ? 0 : DateUtil.getDays(leaseAllMill).intValue();
         comPlayerLandSimpleVo.setLeaseDays(allDays);
-        //租赁的剩余天数
-        Long leaseDaysMill = comPlayerLandSimpleVo.getLeaseTime().getTime() - DateUtil.getNowDate().getTime();
         Integer leaseDays = DateUtil.getDays(leaseDaysMill).intValue() <= 0 ? 0 : DateUtil.getDays(leaseDaysMill).intValue();
         comPlayerLandSimpleVo.setLeaseDaysRemaining(leaseDays);
+        //返回一个租赁时间毫秒
+        comPlayerLandSimpleVo.setLeaseDaysMill(leaseDaysMill);
 
         return Result.of(comPlayerLandSimpleVo);
     }
@@ -272,12 +297,18 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
             Integer leaseDays = DateUtil.getDays(leaseDaysMill).intValue() <= 0 ? 0 : DateUtil.getDays(leaseDaysMill).intValue();
             comPlayerLandAndPlantVo.setLeaseDaysRemaining(leaseDays);
 
+            //返回一个租赁时间毫秒
+            comPlayerLandAndPlantVo.setLeaseDaysMill(leaseDaysMill);
+
             //种子时间
             //当前时间 > 种植时间+成熟期  = 说明可以收获了
             //获取当前时间 - 植物的成熟期 = 收获时间,收获时间 >= 种植时间,即可以收获
             Date _harvestTime = DateUtil.getNowDateMinusDay(comMallSeedVo.getMaturity());
             // 两个时间差, 逻辑是_harvestTime 时间慢慢接近种植时间
             long diff = comPlayerLandAndPlantVo.getPlantStart().getTime() - _harvestTime.getTime();
+            //种植的剩余时间毫秒
+            comPlayerLandAndPlantVo.setPlantDaysMill(diff);
+
             if (diff <= 0) {
                 //说明可以收获了
                 comPlayerLandAndPlantVo.setPlantDaysRemaining(0);

+ 4 - 0
src/main/java/com/td/boss/game/complayerland/vo/ComPlayerLandAndPlantVo.java

@@ -41,6 +41,10 @@ public class ComPlayerLandAndPlantVo implements Serializable {
 
     private Integer leaseDays;//返回一个租赁的全部天数
 
+    private Long leaseDaysMill;//返回一个租赁剩余时间毫秒
+
+    private Long plantDaysMill;//返回一个种植剩余时间毫秒
+
     private Integer plantMature;//成熟期
 
     private String landDescribe;//土地描述

+ 5 - 0
src/main/java/com/td/boss/game/complayerland/vo/ComPlayerLandSimpleVo.java

@@ -39,6 +39,11 @@ public class ComPlayerLandSimpleVo implements Serializable {
 
     private Integer leaseDays;//返回一个租赁的全部天数
 
+    private Long leaseDaysMill;//返回一个租赁剩余时间毫秒
+
+    private Long plantDaysMill;//返回一个种植剩余时间毫秒
+
+
     private Integer plantMature;//成熟期
 
     private String landDescribe;//土地描述

+ 6 - 5
src/main/java/com/td/boss/game/complayerlog/vo/ComPlayerLogVo.java

@@ -1,5 +1,6 @@
 package com.td.boss.game.complayerlog.vo;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.td.boss. common.pojo.PageCondition;import lombok.Data;
 import java.io.Serializable;
 import java.util.Date;
@@ -11,19 +12,19 @@ public class ComPlayerLogVo extends PageCondition implements Serializable {
 
     private String userId;//用户id
 
-
+    @JsonProperty
     private Integer tId;//操作目标id,比如进入背包的是收获时候操作:水果
-
+    @JsonProperty
     private Integer tType;//目标类型,操作对象的类型 0:水果
-
+    @JsonProperty
     private String tName;//对象名字
-
+    @JsonProperty
     private Integer tAmount;//交易数量,单笔交易记录限制百万单位级别
 
     private Integer beforeAmount;//交易前的数量
 
     private Integer afterAmount;//交易后的数量
-
+    @JsonProperty
     private Integer lMultiple;//如果是操作土地相关,land 数据,记录一下倍数
 
     private Date createTime;//

+ 123 - 86
src/main/java/com/td/boss/game/complayers/controller/ComPlayersController.java

@@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSONObject;
 import com.td.boss.common.controller.*;
 import com.td.boss.common.pojo.Result;
 import com.td.boss.config.enums.ResultEnum;
+import com.td.boss.game.comcntorder.pojo.ComCntOrder;
+import com.td.boss.game.comcntorder.service.ComCntOrderService;
 import com.td.boss.game.complayers.pojo.ComPlayers;
 import com.td.boss.game.complayers.vo.ComPlayersVo;
 import com.td.boss.game.complayers.service.ComPlayersService;
@@ -15,7 +17,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.json.JsonObject;
+import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 @Slf4j
@@ -24,18 +28,23 @@ import java.util.Map;
 public class ComPlayersController extends CommonController<ComPlayersVo, ComPlayers, Integer> {
     @Autowired
     private ComPlayersService comPlayersService;
+
+    @Autowired
+    private ComCntOrderService comCntOrderService;
+
     /**
      * 创建玩家
+     *
      * @param userId
      * @return
      */
     @PostMapping("createPlayer")
     public Result<Map> createPlayer(@RequestParam(value = "userId") String userId,
-                                    @RequestParam(value = "name")String name,
-                                    @RequestParam(value = "avatar")String avatar) {
+                                    @RequestParam(value = "name") String name,
+                                    @RequestParam(value = "avatar") String avatar) {
         //todo 疑问avatar获取渠道?
         ComPlayers player = comPlayersService.findByUserId(userId);
-        if(player == null){
+        if (player == null) {
             //player 不存在
             player = new ComPlayers();
             player.setUserId(userId);
@@ -46,44 +55,67 @@ public class ComPlayersController extends CommonController<ComPlayersVo, ComPlay
         ComPlayers addPlayer = comPlayersService.addComPlayers(player);
 
         Map map = new HashMap();
-        map.put("avatar",addPlayer.getAvatar());
-        map.put("name",addPlayer.getName());
-        map.put("attributeType",addPlayer.getAttributeType());
+        map.put("avatar", addPlayer.getAvatar());
+        map.put("name", addPlayer.getName());
+        map.put("attributeType", addPlayer.getAttributeType());
         return Result.of(map);
     }
 
+    /**
+     * 获取玩家是否租赁过的信息
+     *
+     * @param userId
+     * @return
+     */
+    @GetMapping("getPlayerExchangeState")
+    public Result<Map> getPlayerExchangeState(@RequestParam(value = "userId") String userId) {
+        ComPlayers player = comPlayersService.findByUserId(userId);
+        if (player == null) {
+            //player 不存在
+            return Result.of(null, false, ResultEnum.PLAYER_DOES_NOT_EXIST.getMessage(), ResultEnum.PLAYER_DOES_NOT_EXIST.getCode());
+        }
+
+        Map map = new HashMap();
+        map.put("isExchange", player.getIsExchange().equals(1) ? true : false);
+        //返回一个是否租赁过的字段
+        List<ComCntOrder> comCntOrderList = comCntOrderService.findByUserIdAndPayType(userId, 1);
+        map.put("isLeased", comCntOrderList.size() > 0 ? true : false);
+        return Result.of(map);
+    }
 
     /**
      * 获取玩家信息
+     *
      * @param userId
      * @return
      */
     @GetMapping("getPlayer")
     public Result<Map> getPlayer(@RequestParam(value = "userId") String userId) {
         ComPlayers player = comPlayersService.findByUserId(userId);
-        if(player == null){
+        if (player == null) {
             //player 不存在
-            return  Result.of(null,false,ResultEnum.PLAYER_DOES_NOT_EXIST.getMessage(),ResultEnum.PLAYER_DOES_NOT_EXIST.getCode());
+            return Result.of(null, false, ResultEnum.PLAYER_DOES_NOT_EXIST.getMessage(), ResultEnum.PLAYER_DOES_NOT_EXIST.getCode());
         }
         Map map = new HashMap();
-        map.put("playerId",player.getId());
-        map.put("avatar",player.getAvatar());
-        map.put("name",player.getName());
-        map.put("attributeType",player.getAttributeType());
+        map.put("playerId", player.getId());
+        map.put("avatar", player.getAvatar());
+        map.put("name", player.getName());
+        map.put("attributeType", player.getAttributeType());
         return Result.of(map);
     }
 
     /**
      * 获取玩家信息并且携带属性
+     *
      * @param userId
      * @return
      */
     @GetMapping("getPlayerAndBattleAttribute")
     public Result<Map> getPlayerAndBattleAttribute(@RequestParam(value = "userId") String userId,
-                                                   @RequestParam(value = "name")String name,
-                                                   @RequestParam(value = "avatar")String avatar) {
+                                                   @RequestParam(value = "name") String name,
+                                                   @RequestParam(value = "avatar") String avatar) {
         ComPlayers player = comPlayersService.findByUserId(userId);
-        if(player == null){
+        if (player == null) {
             // todo player 如果角色不存在的话,直接创建一个。
             player = new ComPlayers();
             player.setUserId(userId);
@@ -93,37 +125,41 @@ public class ComPlayersController extends CommonController<ComPlayersVo, ComPlay
             player = comPlayersService.addComPlayers(player);
         }
         Map map = new HashMap();
-        map.put("playerId",player.getId());
-        map.put("avatar",player.getAvatar());
-        map.put("name",player.getName());
+        map.put("playerId", player.getId());
+        map.put("avatar", player.getAvatar());
+        map.put("name", player.getName());
         return Result.of(map);
     }
 
 
     @PostMapping("playerPushInfo")
     public Result<Map> playerPushInfoFun(@RequestParam(value = "userId") String userId,
-                                         @RequestParam(value = "playerData")String playerData) {
+                                         @RequestParam(value = "playerData") String playerData) {
         ComPlayers player = comPlayersService.findByUserId(userId);
-        if(player == null){
+        if (player == null) {
             // todo player 如果角色不存在的话,直接创建一个。
             player = new ComPlayers();
             player.setUserId(userId);
             player.setAttributeType(0);
             player.setName("");
             player.setData(playerData);
+            player.setIsExchange(0);
+            player.setCreateTime(new Date());
             player = comPlayersService.addComPlayers(player);
-        }else{
+        } else {
             player.setData(playerData);
             player = comPlayersService.addComPlayers(player);
         }
+        player.setUpdateTime(new Date());
         //log.info(playerData);
         Map map = new HashMap();
-        map.put("playerData",player.getData());
+        map.put("playerData", player.getData());
         return Result.of(map);
     }
 
     /**
      * 拉取数据
+     *
      * @param userId
      * @return
      */
@@ -133,7 +169,7 @@ public class ComPlayersController extends CommonController<ComPlayersVo, ComPlay
 
         ComPlayers player = comPlayersService.findByUserId(userId);
         //判断是否为空,初始化一个基础数据
-        if(player == null){
+        if (player == null) {
             player = new ComPlayers();
             player.setUserId(userId);
             player.setName("");
@@ -145,37 +181,38 @@ public class ComPlayersController extends CommonController<ComPlayersVo, ComPlay
         }
         //log.info(playerData);
         Map map = new HashMap();
-        map.put("playerData",player.getData());
+        map.put("playerData", player.getData());
         return Result.of(map);
     }
 
     /**
      * 组合游戏数据
+     *
      * @return
      */
-    private String PlayerData(){
+    private String PlayerData() {
         JSONObject object = new JSONObject();
         //BFirstLoadGame: 1,//只要push数据,就证明已经开始第一次游戏了
-        object.put("BFirstLoadGame",0);
+        object.put("BFirstLoadGame", 0);
         //date
-        object.put("GameYear",0);
-        object.put("GameMonth",0);
-        object.put("GameDay",0);
-        object.put("GameDate","0000/00/01");
+        object.put("GameYear", 0);
+        object.put("GameMonth", 0);
+        object.put("GameDay", 0);
+        object.put("GameDate", "0000/00/01");
 
         /**
          * 新增 CNT 和 SNB
          */
-        object.put("CNT",0);
-        object.put("SNB",0);
-        object.put("Golden",2000);
-        object.put("Diamond",100);
-        object.put("WorkerLV",0);
-        object.put("WorkerNum",0);
+        object.put("CNT", 0);
+        object.put("SNB", 0);
+        object.put("Golden", 2000);
+        object.put("Diamond", 100);
+        object.put("WorkerLV", 0);
+        object.put("WorkerNum", 0);
 
         //this.CharacterInfoArray = [];
-        object.put("WorkerCapacity",5);
-        object.put("TerritoryStateArray",new int[]{1, 1, 1, 1, 1, 1, 1, 1});//全开地图
+        object.put("WorkerCapacity", 5);
+        object.put("TerritoryStateArray", new int[]{1, 1, 1, 1, 1, 1, 1, 1});//全开地图
 
         /**
          * 添加建筑往后添加,到时候ManageBuildings 脚本 会初始化根据顺序
@@ -183,7 +220,7 @@ public class ComPlayersController extends CommonController<ComPlayersVo, ComPlay
          * BuildingNumArray  ---相关 GetBuildingNumArray 获取建筑数量
          * BuildingFrameArray ---相关 ManageUI  添加面板是否解锁之类的相关预制
          */
-        object.put("BuildingStateArray",new int[]{1, //公路
+        object.put("BuildingStateArray", new int[]{1, //公路
                 1,  //路铲
                 1,  //拆迁
                 1,  //农舍
@@ -217,7 +254,7 @@ public class ComPlayersController extends CommonController<ComPlayersVo, ComPlay
                 1, //Holy Farmland
                 1 //Holy Farmland seed
         });
-        object.put("BuildingLockStateArray",new int[]{ 1, //公路
+        object.put("BuildingLockStateArray", new int[]{1, //公路
                 1,  //路铲
                 1,  //拆迁
                 1,  //农舍
@@ -252,40 +289,40 @@ public class ComPlayersController extends CommonController<ComPlayersVo, ComPlay
                 1, //Holy Farmland seed
         });
         //建筑物数量
-        object.put("BuildingNumArray",new int[]{
-                0, //公路
-                0,  //路铲
-                0,  //拆迁
-                4,  //农舍
-                1,  //单元楼
-                1,  //别墅
-                4, //农田
-                1,//伐木场
-                1, //矿坑
-                2, //加工厂
-                2,//冷饮摊
-                1,//贩卖机
-                1,//面包房
-                1,//早餐车
-                1, //饮茶店
-                1,//点心店
-                1, //美食店
-                1,//西餐厅
-                1, //花店
-                1, //美发店
-                1,//洋装店
-                1, //珠宝店
-                1, //电影院
-                1,//路灯
-                1, //绿化带
-                1, //花坛
-                1,//喷泉
-                1, //警察局
-                1,//游乐场
-                1,  //蓝色城堡
-                1,  //粉色城堡
-                0, //Holy Farmland
-                0, //Holy Farmland seed
+        object.put("BuildingNumArray", new int[]{
+                        0, //公路
+                        0,  //路铲
+                        0,  //拆迁
+                        4,  //农舍
+                        1,  //单元楼
+                        1,  //别墅
+                        4, //农田
+                        1,//伐木场
+                        1, //矿坑
+                        2, //加工厂
+                        2,//冷饮摊
+                        1,//贩卖机
+                        1,//面包房
+                        1,//早餐车
+                        1, //饮茶店
+                        1,//点心店
+                        1, //美食店
+                        1,//西餐厅
+                        1, //花店
+                        1, //美发店
+                        1,//洋装店
+                        1, //珠宝店
+                        1, //电影院
+                        1,//路灯
+                        1, //绿化带
+                        1, //花坛
+                        1,//喷泉
+                        1, //警察局
+                        1,//游乐场
+                        1,  //蓝色城堡
+                        1,  //粉色城堡
+                        0, //Holy Farmland
+                        0, //Holy Farmland seed
                 }
         );
 
@@ -334,29 +371,29 @@ public class ComPlayersController extends CommonController<ComPlayersVo, ComPlay
         //    _diamondNumArray[i]=0;
         //}
         //StringUtils.join(_diamondNumArray,"_")
-        object.put("DiamondNumArray",_diamondNumArray);
+        object.put("DiamondNumArray", _diamondNumArray);
         //StringUtils.join(new int[]{0, 0, 0, 0, 0, 0, 0},"_")
         object.put("EveryDayRewardsArray", new int[]{0, 0, 0, 0, 0, 0, 0});
-        object.put("LastTimeEveryDayRewardsDate","0000/00/00");
-        object.put("LastTimeLuckDate","0000/00/00");
-        object.put("FoodTradeState",1);
-        object.put("WoodTradeState",1);
-        object.put("MineralTradeState",1);
+        object.put("LastTimeEveryDayRewardsDate", "0000/00/00");
+        object.put("LastTimeLuckDate", "0000/00/00");
+        object.put("FoodTradeState", 1);
+        object.put("WoodTradeState", 1);
+        object.put("MineralTradeState", 1);
 
         //转盘分享给钻石金币
-        object.put("shareGive",new int[]{200, 5});
+        object.put("shareGive", new int[]{200, 5});
         //签到分享给钻石金币
-        object.put("signInGive",new int[]{200, 5});
+        object.put("signInGive", new int[]{200, 5});
         //每个月 给的 低保
-        object.put("EveryGive",new int[]{500, 10});
+        object.put("EveryGive", new int[]{500, 10});
         //公共分享
-        object.put("publicGive",new int[]{200, 50});
+        object.put("publicGive", new int[]{200, 50});
         //每天抽奖次数
-        object.put("LotteryTimes",10);
+        object.put("LotteryTimes", 10);
 
         //object.put("TaskIconCountClick",-1);
 
 
-        return  object.toString();
+        return object.toString();
     }
 }

+ 10 - 0
src/main/java/com/td/boss/game/complayers/pojo/ComPlayers.java

@@ -21,6 +21,16 @@ public class ComPlayers implements Serializable {
 
     private Integer attributeType;//属性表类型,默认0为player
 
+    /**
+     * 新增一个是否领取的
+     */
+    private Integer isExchange;// 0 未领取,1 领取
+
+
     private String data;//暂时存储用户数据
 
+    private Date createTime;
+
+    private Date updateTime;
+
 }

+ 12 - 14
src/main/java/com/td/boss/game/comsnbfreeze/controller/ComSnbFreezeController.java

@@ -119,6 +119,7 @@ public class ComSnbFreezeController extends CommonController<ComSnbFreezeVo, Com
             return Result.of(map);
         }
         //如果数量够,写入修改对应操作
+        Integer _beforeSnb = comUsersVo.getSnb();
         Integer _snb = comUsersVo.getSnb() - snbAmount;
         comUsersVo.setSnb(_snb);
         comUsersService.save(comUsersVo);
@@ -145,9 +146,9 @@ public class ComSnbFreezeController extends CommonController<ComSnbFreezeVo, Com
         _snbTran.setTranAmount(snbAmount); //此数量会操作背包记录
         _snbTran.setTranPrice(snbAmount);
         //"出售果实价格:" + comFruitVo.getPriceSnb() + ",数量:" + amount
-        _snbTran.setTranDescribe("兑换cnt时候冻结的用户数据");
+        _snbTran.setTranDescribe("兑换cnt时候冻结的用户数据");
         _snbTran.setIsAdd(0);//减少
-        _snbTran.setBeforeSnb(comUsersVo.getSnb());
+        _snbTran.setBeforeSnb(_beforeSnb);
         _snbTran.setTranSnb(snbAmount);
         _snbTran.setAfterSnb(_snb);
         comSnbTranService.save(_snbTran);
@@ -192,7 +193,7 @@ public class ComSnbFreezeController extends CommonController<ComSnbFreezeVo, Com
         }
 
         if (isSuccess.equals(1)) {
-            //1 成功,解冻
+            //1 成功
             comSnbFreezeVo.setIsSuccess(1);
             comSnbFreezeVo.setFreeze(0);
             map.put("msg", "交易成功");
@@ -200,6 +201,7 @@ public class ComSnbFreezeController extends CommonController<ComSnbFreezeVo, Com
         } else {
             //交易失败,返回snb给用户
             ComUsersVo comUsersVo = comUsersService.findByUserId(comSnbFreezeVo.getUserId());
+            Integer _beforeSnb = comUsersVo.getSnb();
             Integer _snb = comUsersVo.getSnb() + comSnbFreezeVo.getSnb();
             comUsersVo.setSnb(_snb);
             comUsersService.save(comUsersVo);
@@ -208,8 +210,6 @@ public class ComSnbFreezeController extends CommonController<ComSnbFreezeVo, Com
             comSnbFreezeVo.setIsSuccess(2);
             map.put("msg", "交易失败,返回SNB给用户成功");
             comSnbFreezeService.save(comSnbFreezeVo);
-
-
             /**
              * todo 解冻交易失败 snb数据记录
              */
@@ -218,13 +218,13 @@ public class ComSnbFreezeController extends CommonController<ComSnbFreezeVo, Com
             _snbTran.setTranId(comSnbFreezeVo.getId());
             _snbTran.setUserId(comSnbFreezeVo.getUserId());
             _snbTran.setTranName("解冻操作");
-            _snbTran.setTranType(1);
+            _snbTran.setTranType(2);
             _snbTran.setTranAmount(comSnbFreezeVo.getSnb()); //此数量会操作背包记录
             _snbTran.setTranPrice(comSnbFreezeVo.getSnb());
             //"出售果实价格:" + comFruitVo.getPriceSnb() + ",数量:" + amount
-            _snbTran.setTranDescribe("兑换cnt失败时候解冻的用户数据");
+            _snbTran.setTranDescribe("兑换cnt失败时候解冻的用户数据");
             _snbTran.setIsAdd(1);//增加
-            _snbTran.setBeforeSnb(comUsersVo.getSnb());
+            _snbTran.setBeforeSnb(_beforeSnb);
             _snbTran.setTranSnb(comSnbFreezeVo.getSnb());
             _snbTran.setAfterSnb(_snb);
             comSnbTranService.save(_snbTran);
@@ -313,6 +313,10 @@ public class ComSnbFreezeController extends CommonController<ComSnbFreezeVo, Com
                     comPlayerLand.setConfigLandId(comConfigLand.getId());
                     comPlayerLand.setUserId(id.toString());
                     comPlayerLand.setName(comConfigLand.getName());
+                    //todo 续租问题,如果用户续租,保留之前的状态
+                    //初始化一下未种植参数
+                    comPlayerLand.setIsPlant(0);
+                    comPlayerLand.setCreateTime(new Date());
                     isNewPlant = true;
                 }
                 //todo 可能续租
@@ -380,15 +384,9 @@ public class ComSnbFreezeController extends CommonController<ComSnbFreezeVo, Com
                 }
                 //租赁土地
                 comPlayerLand.setIsLease(1);
-
-                //初始化一下未种植参数
-                comPlayerLand.setIsPlant(0);
-                comPlayerLand.setCreateTime(new Date());
                 comPlayerLand.setUpdateTime(new Date());
-
                 //记录一下租赁费用
                 comPlayerLand.setRentalExpenses(_backCNT);
-
                 //ComPlayerLandVo comPlayerLandVo = CopyUtil.copy(comPlayerLand, ComPlayerLandVo.class);
                 comPlayerLandService.AddComPlayerLand(comPlayerLand);
                 //返回土地对象

+ 22 - 1
src/main/java/com/td/boss/game/comsnbtran/repository/ComSnbTranRepository.java

@@ -2,13 +2,34 @@ package com.td.boss.game.comsnbtran.repository;
 
 import com.td.boss.common.repository.*;
 import com.td.boss.game.comsnbtran.pojo.ComSnbTran;
+import com.td.boss.game.comsnbtran.vo.ComSnbTranTranTypeSumVo;
 import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
+import java.util.Date;
+import java.util.List;
+
 @Repository
 public interface ComSnbTranRepository extends CommonRepository<ComSnbTran, String> {
 
     Page<ComSnbTran> findAllByUserId(String userId, Pageable pageable);
+
+
+    /**
+     * 返回一个降序的pay_type 统计
+     * @return
+     */
+    @Query(value = "SELECT new com.td.boss.game.comsnbtran.vo.ComSnbTranTranTypeSumVo(u.tranType,sum(u.tranSnb)) from ComSnbTran u GROUP BY u.tranType ORDER BY sum(u.tranSnb) desc", nativeQuery = false)
+    List<ComSnbTranTranTypeSumVo> findSnbSumByTranType();
+
+    /**
+     * 根据开始结束时间获取payType 统计数据
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    @Query(value = "SELECT new com.td.boss.game.comsnbtran.vo.ComSnbTranTranTypeSumVo(u.tranType,sum(u.tranSnb)) FROM  ComSnbTran u  where u.createTime >= :startTime and u.createTime<= :endTime GROUP BY u.tranType ORDER BY sum(u.tranSnb) desc")
+    List<ComSnbTranTranTypeSumVo> findCNTSumByPayTypeFromDate(Date startTime, Date endTime);
 }

+ 11 - 0
src/main/java/com/td/boss/game/comsnbtran/service/ComSnbTranService.java

@@ -1,12 +1,23 @@
 package com.td.boss.game.comsnbtran.service;
 
 import com.td.boss.common.service.*;
+import com.td.boss.game.comcntorder.vo.ComCntOrderPayTypeSumVo;
 import com.td.boss.game.comsnbtran.pojo.ComSnbTran;
+import com.td.boss.game.comsnbtran.vo.ComSnbTranTranTypeSumVo;
 import com.td.boss.game.comsnbtran.vo.ComSnbTranVo;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
 
+import java.util.Date;
+import java.util.List;
+
 public interface ComSnbTranService extends CommonService<ComSnbTranVo, ComSnbTran, String> {
     Page<ComSnbTran> findAllByUserId(String userId, Pageable pageable);
+
+    List<ComSnbTranTranTypeSumVo> findAllSNBSumGroupByPayType();
+
+
+    //按日期返回一个snb消费记录
+    List<ComSnbTranTranTypeSumVo> findAllSNBSumGroupByPayTypeFromDate(Date startTime, Date endTime);
 }

+ 14 - 0
src/main/java/com/td/boss/game/comsnbtran/service/ComSnbTranServiceImpl.java

@@ -1,7 +1,9 @@
 package com.td.boss.game.comsnbtran.service;
 
 import com.td.boss.common.service.*;
+import com.td.boss.game.comcntorder.vo.ComCntOrderPayTypeSumVo;
 import com.td.boss.game.comsnbtran.pojo.ComSnbTran;
+import com.td.boss.game.comsnbtran.vo.ComSnbTranTranTypeSumVo;
 import com.td.boss.game.comsnbtran.vo.ComSnbTranVo;
 import com.td.boss.game.comsnbtran.repository.ComSnbTranRepository;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -12,6 +14,8 @@ 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.List;
 
 @Service
 @Transactional
@@ -27,4 +31,14 @@ public class ComSnbTranServiceImpl extends CommonServiceImpl<ComSnbTranVo, ComSn
     public Page<ComSnbTran> findAllByUserId(String userId, Pageable pageable) {
         return comSnbTranRepository.findAllByUserId(userId,pageable);
     }
+
+    @Override
+    public List<ComSnbTranTranTypeSumVo> findAllSNBSumGroupByPayType() {
+        return comSnbTranRepository.findSnbSumByTranType();
+    }
+
+    @Override
+    public List<ComSnbTranTranTypeSumVo> findAllSNBSumGroupByPayTypeFromDate(Date startTime, Date endTime) {
+        return comSnbTranRepository.findCNTSumByPayTypeFromDate(startTime, endTime);
+    }
 }

+ 18 - 0
src/main/java/com/td/boss/game/comsnbtran/vo/ComSnbTranDateVo.java

@@ -0,0 +1,18 @@
+package com.td.boss.game.comsnbtran.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author:slambb
+ * @date:2022/1/25
+ */
+@Data
+public class ComSnbTranDateVo {
+    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
+    private Date startTime;
+    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
+    private Date endTime;
+}

+ 23 - 0
src/main/java/com/td/boss/game/comsnbtran/vo/ComSnbTranTranTypeSumVo.java

@@ -0,0 +1,23 @@
+package com.td.boss.game.comsnbtran.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * @author:slambb
+ * @date:2022/1/25
+ */
+@Getter
+@Setter
+@ToString
+public class ComSnbTranTranTypeSumVo {
+    private Integer tranType;
+    private Long snbSum;
+
+    public ComSnbTranTranTypeSumVo(Integer tranType, Long snbSum) {
+        this.tranType = tranType;
+        this.snbSum = snbSum;
+    }
+
+}

+ 12 - 1
src/main/java/com/td/boss/game/comusers/controller/ComUsersController.java

@@ -199,14 +199,25 @@ public class ComUsersController extends CommonController<ComUsersVo, ComUsers, S
                 comUsersVo.setDiamond(0);
                 comUsersVo.setCnt(0);
                 comUsersVo.setSnb(0);
+                comUsersVo.setLimitTran(0);
+                comUsersVo.setLimitLogin(0);
                 comUsersVo.setAddress(address);
+                comUsersVo.setLastLogin(new Date());
+                comUsersVo.setCreateTime(new Date());
                 comUsersService.save(comUsersVo);
             }else{
+                //如果是黑名单限制登录的用户,限制登录
+                if(comUsersVo.getLimitLogin().equals(1)){
+                    map.put("msg", "当前用户限制登录,请联系游戏管理人员!");
+                    return Result.of(map,false,ResultEnum.USER_LIMIT_LOGIN.getMessage(),ResultEnum.USER_LIMIT_LOGIN.getCode());
+                }
                 //记录一下用户的Address
                 if(comUsersVo.getAddress() == null){
                     comUsersVo.setAddress(address);
-                    comUsersService.save(comUsersVo);
                 }
+                //维护一个最后登录时间
+                comUsersVo.setLastLogin(new Date());
+                comUsersService.save(comUsersVo);
             }
             //生成token
             final String token = jwtTokenUtil.generateToken(comUsersVo.getUserId());

+ 10 - 0
src/main/java/com/td/boss/game/comusers/pojo/ComUsers.java

@@ -21,4 +21,14 @@ public class ComUsers implements Serializable {
     private Integer snb;//
 
     private String address;//记录一个用户钱包地址
+
+    private Integer limitLogin;//是否限制登录 0:否,1:是
+
+    private Integer limitTran;//是否限制交易 0:否,1:是
+
+    private Date lastLogin;//最后登录时间
+
+    private Date createTime;//创建时间
+
+    private Date updateTime;//更新时间
 }

+ 4 - 0
src/main/java/com/td/boss/game/comusers/repository/ComUsersRepository.java

@@ -2,6 +2,7 @@ package com.td.boss.game.comusers.repository;
 
 import com.td.boss.common.repository.*;
 import com.td.boss.game.comusers.pojo.ComUsers;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
 import java.util.Optional;
@@ -11,4 +12,7 @@ public interface ComUsersRepository extends CommonRepository<ComUsers, String> {
     Optional<ComUsers> findByUserId(String userId);
 
     Optional<ComUsers> findByAddress(String address);
+
+    @Query(value = "SELECT COUNT(*) FROM com_users WHERE TO_DAYS(DATE_FORMAT(create_time,'%y-%m-%d')) = TO_DAYS(NOW())",nativeQuery = true)
+    Long newToday();
 }

+ 11 - 0
src/main/java/com/td/boss/game/comusers/service/ComUsersService.java

@@ -15,4 +15,15 @@ public interface ComUsersService extends CommonService<ComUsersVo, ComUsers, Str
 
 
     ComUsersVo findByAddress(String address);
+
+    /**
+     * 全部注册数量
+     * @return
+     */
+    Long findAllCount();
+    /**
+     * 今日新增
+     * @return
+     */
+    Long newToday();
 }

+ 11 - 0
src/main/java/com/td/boss/game/comusers/service/ComUsersServiceImpl.java

@@ -42,4 +42,15 @@ public class ComUsersServiceImpl extends CommonServiceImpl<ComUsersVo, ComUsers,
             return CopyUtil.copy(comUsers.get(), ComUsersVo.class);
         }
     }
+
+
+    @Override
+    public Long findAllCount() {
+        return comUsersRepository.count();
+    }
+
+    @Override
+    public Long newToday() {
+        return comUsersRepository.newToday();
+    }
 }

+ 2 - 0
src/main/java/com/td/boss/game/comusers/vo/ComUsersSimpleVo.java

@@ -17,4 +17,6 @@ public class ComUsersSimpleVo implements Serializable {
     private Integer snb;//
 
     private String address;//记录一个用户钱包地址
+
+    private Integer limitTran;//是否限制交易 0:否,1:是
 }

+ 10 - 0
src/main/java/com/td/boss/game/comusers/vo/ComUsersVo.java

@@ -18,4 +18,14 @@ public class ComUsersVo extends PageCondition implements Serializable {
 
     private String address;//记录一个用户钱包地址
 
+    private Integer limitLogin;//是否限制登录 0:否,1:是
+
+    private Integer limitTran;//是否限制交易 0:否,1:是
+
+    private Date lastLogin;//最后登录时间
+
+    private Date createTime;//创建时间
+
+    private Date updateTime;//更新时间
+
 }

+ 231 - 0
src/main/java/com/td/boss/sys/sysGame/controller/sysGamePropertyController.java

@@ -0,0 +1,231 @@
+package com.td.boss.sys.sysGame.controller;
+
+import com.td.boss.annotation.Decrypt;
+import com.td.boss.annotation.Encrypt;
+import com.td.boss.common.controller.CommonController;
+import com.td.boss.common.pojo.PageInfo;
+import com.td.boss.common.pojo.Result;
+import com.td.boss.game.comcntorder.service.ComCntOrderService;
+import com.td.boss.game.comcntorder.vo.ComCntOrderDateVo;
+import com.td.boss.game.comcntorder.vo.ComCntOrderPayTypeSumVo;
+import com.td.boss.game.comcntorder.vo.ComCntOrderVo;
+import com.td.boss.game.comconfigland.pojo.ComConfigLand;
+import com.td.boss.game.comconfigland.service.ComConfigLandService;
+import com.td.boss.game.comconfigland.vo.ComConfigLandVo;
+import com.td.boss.game.comfruit.pojo.ComFruit;
+import com.td.boss.game.comfruit.service.ComFruitService;
+import com.td.boss.game.comfruit.vo.ComFruitVo;
+import com.td.boss.game.commallseed.pojo.ComMallSeed;
+import com.td.boss.game.commallseed.service.ComMallSeedService;
+import com.td.boss.game.commallseed.vo.ComMallSeedVo;
+import com.td.boss.game.complayergoods.service.ComPlayerGoodsService;
+import com.td.boss.game.complayergoods.vo.ComPlayerGoodsTypeSumVo;
+import com.td.boss.game.comsnbtran.service.ComSnbTranService;
+import com.td.boss.game.comsnbtran.vo.ComSnbTranDateVo;
+import com.td.boss.game.comsnbtran.vo.ComSnbTranTranTypeSumVo;
+import com.td.boss.game.comusers.pojo.ComUsers;
+import com.td.boss.game.comusers.service.ComUsersService;
+import com.td.boss.game.comusers.vo.ComUsersVo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.servlet.ModelAndView;
+
+import java.util.List;
+
+@Slf4j
+@RestController
+@RequestMapping("/sys/sysProperty/")
+public class sysGamePropertyController extends CommonController<ComUsersVo, ComUsers, String> {
+    @Autowired
+    private ComUsersService comUsersService;
+
+    @Autowired
+    private ComPlayerGoodsService comPlayerGoodsService;
+
+    @Autowired
+    private ComSnbTranService comSnbTranService;
+
+    @Autowired
+    private ComCntOrderService comCntOrderService;
+
+    @Autowired
+    private ComMallSeedService comMallSeedService;
+
+    @Autowired
+    private ComConfigLandService comConfigLandService;
+
+    @Autowired
+    private ComFruitService comFruitService;
+
+
+    @GetMapping("CNTAndSNB")
+    public ModelAndView CNTAndSNB(){
+
+        return new ModelAndView("sys/aComCNTAnbSNB/CNTAndSNB");
+    }
+
+
+
+    //土地租赁消耗总CNT数量,今日新增土地租赁消耗CNT数量
+    @PostMapping("findAllCNTGroupByPayType")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<ComCntOrderPayTypeSumVo>> findAllCNTGroupByPayType(ComCntOrderVo comCntOrderVo){
+        List<ComCntOrderPayTypeSumVo> comCntOrderPayTypeSumVoList =  comCntOrderService.findAllCNTSumGroupByPayType();
+        PageInfo<ComCntOrderPayTypeSumVo> pageInfo = new PageInfo<>();
+        pageInfo.setPage(1);//页码
+        pageInfo.setPageSize(5);//页面大小
+        pageInfo.setRows(comCntOrderPayTypeSumVoList);//分页结果
+        pageInfo.setRecords(comCntOrderPayTypeSumVoList.size());//总记录数
+        pageInfo.setTotal(1);//总页数
+        return Result.of(pageInfo);
+    }
+
+    @PostMapping("findAllCNTSumGroupByPayTypeFromDate")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<ComCntOrderPayTypeSumVo>> findAllCNTSumGroupByPayTypeFromDate(ComCntOrderDateVo comCntOrderDateVo){
+        List<ComCntOrderPayTypeSumVo> comCntOrderPayTypeSumVoList =  comCntOrderService.findAllCNTSumGroupByPayTypeFromDate(comCntOrderDateVo.getStartTime(),comCntOrderDateVo.getEndTime());
+        PageInfo<ComCntOrderPayTypeSumVo> pageInfo = new PageInfo<>();
+        pageInfo.setPage(1);//页码
+        pageInfo.setPageSize(5);//页面大小
+        pageInfo.setRows(comCntOrderPayTypeSumVoList);//分页结果
+        pageInfo.setRecords(comCntOrderPayTypeSumVoList.size());//总记录数
+        pageInfo.setTotal(1);//总页数
+        return Result.of(pageInfo);
+    }
+
+    //snb购买种子的总消耗
+    @PostMapping("findAllSNBGroupByPayType")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<ComSnbTranTranTypeSumVo>> findAllSNBGroupByPayType(ComCntOrderVo comCntOrderVo){
+        List<ComSnbTranTranTypeSumVo> comSnbTranTranTypeSumVoList =  comSnbTranService.findAllSNBSumGroupByPayType();
+        PageInfo<ComSnbTranTranTypeSumVo> pageInfo = new PageInfo<>();
+        pageInfo.setPage(1);//页码
+        pageInfo.setPageSize(5);//页面大小
+        pageInfo.setRows(comSnbTranTranTypeSumVoList);//分页结果
+        pageInfo.setRecords(comSnbTranTranTypeSumVoList.size());//总记录数
+        pageInfo.setTotal(1);//总页数
+        return Result.of(pageInfo);
+    }
+
+    @PostMapping("findAllSNBSumGroupByPayTypeFromDate")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<ComSnbTranTranTypeSumVo>> findAllSNBSumGroupByPayTypeFromDate(ComSnbTranDateVo comSnbTranDateVo){
+        List<ComSnbTranTranTypeSumVo> comSnbTranTranTypeSumVoList =  comSnbTranService.findAllSNBSumGroupByPayTypeFromDate(comSnbTranDateVo.getStartTime(),comSnbTranDateVo.getEndTime());
+        PageInfo<ComSnbTranTranTypeSumVo> pageInfo = new PageInfo<>();
+        pageInfo.setPage(1);//页码
+        pageInfo.setPageSize(5);//页面大小
+        pageInfo.setRows(comSnbTranTranTypeSumVoList);//分页结果
+        pageInfo.setRecords(comSnbTranTranTypeSumVoList.size());//总记录数
+        pageInfo.setTotal(1);//总页数
+        return Result.of(pageInfo);
+    }
+
+    @GetMapping("playerGoods")
+    public ModelAndView playerGoods(){
+
+        return new ModelAndView("sys/aComPlayerGoods/playerGoods");
+    }
+
+    @PostMapping("findAllGroupByGoodsType")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<ComPlayerGoodsTypeSumVo>> findAllGroupByGoodsType(){
+        List<ComPlayerGoodsTypeSumVo> comPlayerGoodsTypeSumVoList =  comPlayerGoodsService.findAllGroupByGoodsType();
+        PageInfo<ComPlayerGoodsTypeSumVo> pageInfo = new PageInfo<>();
+        pageInfo.setPage(1);//页码
+        pageInfo.setPageSize(5);//页面大小
+        pageInfo.setRows(comPlayerGoodsTypeSumVoList);//分页结果
+        pageInfo.setRecords(comPlayerGoodsTypeSumVoList.size());//总记录数
+        pageInfo.setTotal(1);//总页数
+        return Result.of(pageInfo);
+    }
+
+
+
+    //获取种子设置页面
+    @GetMapping("seedConfig")
+    public ModelAndView seedConfig(){
+        return new ModelAndView("sys/aComConfig/seedConfig");
+    }
+
+    //todo 后续种子多需要扩展,这里暂时这样写
+    @PostMapping("findAllSeedConfig")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<ComMallSeed>> findAllSeedConfig(){
+        List<ComMallSeed> comMallSeedList =  comMallSeedService.findMallSeedAll();
+        PageInfo<ComMallSeed> pageInfo = new PageInfo<>();
+        pageInfo.setPage(1);//页码
+        pageInfo.setPageSize(10);//页面大小
+        pageInfo.setRows(comMallSeedList);//分页结果
+        pageInfo.setRecords(comMallSeedList.size());//总记录数
+        pageInfo.setTotal(1);//总页数
+        return Result.of(pageInfo);
+    }
+
+    @PostMapping("saveSeedConfig")
+    @Decrypt
+    @Encrypt
+    public Result saveSeedConfig(ComMallSeedVo comMallSeedVo){
+        return comMallSeedService.save(comMallSeedVo);
+    }
+
+
+    //获取土地设置页面
+    @GetMapping("landConfig")
+    public ModelAndView landConfig(){
+        return new ModelAndView("sys/aComConfig/landConfig");
+    }
+    @PostMapping("findAllLandConfig")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<ComConfigLand>> findAllLandConfig(){
+        List<ComConfigLand> comConfigLandList =  comConfigLandService.findConfigLandAll();
+        PageInfo<ComConfigLand> pageInfo = new PageInfo<>();
+        pageInfo.setPage(1);//页码
+        pageInfo.setPageSize(comConfigLandList.size());//页面大小
+        pageInfo.setRows(comConfigLandList);//分页结果
+        pageInfo.setRecords(comConfigLandList.size());//总记录数
+        pageInfo.setTotal(1);//总页数
+        return Result.of(pageInfo);
+    }
+    @PostMapping("saveLandConfig")
+    @Decrypt
+    @Encrypt
+    public Result saveLandConfig(ComConfigLandVo comConfigLandVo){
+        return comConfigLandService.save(comConfigLandVo);
+    }
+    //获取果实销售价格
+    @GetMapping("fruitConfig")
+    public ModelAndView fruitConfig(){
+        return new ModelAndView("sys/aComConfig/fruitConfig");
+    }
+
+    @PostMapping("findAllFruitConfig")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<ComFruit>> findAllFruitConfig(){
+        List<ComFruit> comFruitList =  comFruitService.findFruitAll();
+        PageInfo<ComFruit> pageInfo = new PageInfo<>();
+        pageInfo.setPage(1);//页码
+        pageInfo.setPageSize(comFruitList.size());//页面大小
+        pageInfo.setRows(comFruitList);//分页结果
+        pageInfo.setRecords(comFruitList.size());//总记录数
+        pageInfo.setTotal(1);//总页数
+        return Result.of(pageInfo);
+    }
+    @PostMapping("saveFruitConfig")
+    @Decrypt
+    @Encrypt
+    public Result saveFruitConfig(ComFruitVo comFruitVo){
+        return comFruitService.save(comFruitVo);
+    }
+}

+ 211 - 0
src/main/java/com/td/boss/sys/sysGame/controller/sysGameUsersController.java

@@ -0,0 +1,211 @@
+package com.td.boss.sys.sysGame.controller;
+
+import com.td.boss.annotation.Decrypt;
+import com.td.boss.annotation.Encrypt;
+import com.td.boss.common.controller.CommonController;
+import com.td.boss.common.pojo.PageInfo;
+import com.td.boss.common.pojo.Result;
+import com.td.boss.game.comcntorder.service.ComCntOrderService;
+import com.td.boss.game.comcntorder.vo.ComCntOrderPayTypeSumVo;
+import com.td.boss.game.comcntorder.vo.ComCntOrderVo;
+import com.td.boss.game.complayergoods.pojo.ComPlayerGoods;
+import com.td.boss.game.complayergoods.service.ComPlayerGoodsService;
+import com.td.boss.game.complayergoods.vo.ComPlayerGoodsVo;
+import com.td.boss.game.complayerland.pojo.ComPlayerLand;
+import com.td.boss.game.complayerland.service.ComPlayerLandService;
+import com.td.boss.game.complayerland.vo.ComPlayerLandVo;
+import com.td.boss.game.complayerlog.service.ComPlayerLogService;
+import com.td.boss.game.complayerlog.vo.ComPlayerLogVo;
+import com.td.boss.game.comsnbtran.service.ComSnbTranService;
+import com.td.boss.game.comsnbtran.vo.ComSnbTranVo;
+import com.td.boss.game.comusers.pojo.ComUsers;
+import com.td.boss.game.comusers.service.ComUsersService;
+import com.td.boss.game.comusers.vo.ComUsersVo;
+import com.td.boss.sys.sysuser.vo.SysUserVo;
+import com.td.boss.util.JwtTokenUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@RestController
+@RequestMapping("/sys/sysComUsers/")
+public class sysGameUsersController extends CommonController<ComUsersVo, ComUsers, String> {
+    @Autowired
+    private ComUsersService comUsersService;
+
+    @Autowired
+    private ComSnbTranService comSnbTranService;
+
+    @Autowired
+    private ComCntOrderService comCntOrderService;
+
+    @Autowired
+    private ComPlayerLogService comPlayerLogService;
+
+    @Autowired
+    private ComPlayerLandService comPlayerLandService;
+
+    @Autowired
+    private ComPlayerGoodsService comPlayerGoodsService;
+
+    @Autowired
+    private JwtTokenUtil jwtTokenUtil;
+
+    @Value("${spring.profiles.active}")
+    private String active;
+
+    @GetMapping("user")
+    public ModelAndView user(){
+        return new ModelAndView("sys/aComUser/user");
+    }
+
+    @PostMapping("findGameUserByAddress")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<ComUsersVo>> findGameUserByAddress(ComUsersVo comUsersVo){
+        ComUsersVo comUsersVo1 = new ComUsersVo();
+        ArrayList<ComUsersVo> comUsersVoList = new ArrayList<>();
+        if(comUsersVo.getAddress() != null){
+            comUsersVo1 = comUsersService.findByAddress(comUsersVo.getAddress());
+            comUsersVoList.add(comUsersVo1);
+        }
+        PageInfo<ComUsersVo> pageInfo = new PageInfo<>();
+        pageInfo.setPage(1);//页码
+        pageInfo.setPageSize(2);//页面大小
+        pageInfo.setRows(comUsersVoList);//分页结果
+        pageInfo.setRecords(comUsersVoList.size());//总记录数
+        pageInfo.setTotal(1);//总页数
+        return Result.of(pageInfo);
+    }
+
+    @PostMapping("findSNBTranByUserId")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<ComSnbTranVo>> findSNBTranByUserId(ComSnbTranVo comSnbTranVo){
+        return comSnbTranService.page(comSnbTranVo);
+    }
+
+
+    @PostMapping("findCNTTranByUserId")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<ComCntOrderVo>> findCNTTranByUserId(ComCntOrderVo comCntOrderVo){
+        return comCntOrderService.page(comCntOrderVo);
+    }
+
+    @PostMapping("findPlayerLogPage")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<ComPlayerLogVo>> findCNTTranByUserId(ComPlayerLogVo comPlayerLogVo){
+        return comPlayerLogService.page(comPlayerLogVo);
+    }
+
+
+
+    @GetMapping("userPlayerGoods")
+    public ModelAndView userPlayerGoods(){
+        return new ModelAndView("sys/aComUser/userPlayerGoods");
+    }
+
+
+    @PostMapping("findPlayerGoodsByAddress")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<ComPlayerGoodsVo>> findPlayerGoodsByAddress(ComUsersVo comUsersVo){
+
+        if(comUsersVo.getAddress() != null){
+            //查询用户id
+            ComUsersVo _comUsersVo = comUsersService.findByAddress(comUsersVo.getAddress());
+            if(!_comUsersVo.equals(null)){
+                //如果存在用户数据,继续查询背包
+                ComPlayerGoodsVo comPlayerGoodsVo = new ComPlayerGoodsVo();
+                comPlayerGoodsVo.setUserId(_comUsersVo.getUserId());
+                comPlayerGoodsVo.setPage(comUsersVo.getPage());
+                comPlayerGoodsVo.setRows(comUsersVo.getRows());
+                comPlayerGoodsVo.setSidx(comUsersVo.getSidx());
+                comPlayerGoodsVo.setSord(comUsersVo.getSord());
+                return comPlayerGoodsService.page(comPlayerGoodsVo);
+            }
+        }
+        //没数据随便返回一个空的
+        ArrayList<ComPlayerGoodsVo> comPlayerGoodsVos = new ArrayList<>();
+        PageInfo<ComPlayerGoodsVo> pageInfo = new PageInfo<>();
+        pageInfo.setPage(1);//页码
+        pageInfo.setPageSize(1);//页面大小
+        pageInfo.setRows(comPlayerGoodsVos);//分页结果
+        pageInfo.setRecords(comPlayerGoodsVos.size());//总记录数
+        pageInfo.setTotal(1);//总页数
+        return Result.of(pageInfo);
+    }
+    @PostMapping("playerGoodsSave")
+    @Decrypt
+    @Encrypt
+    public Result<ComPlayerGoodsVo> playerGoodsSave(ComPlayerGoodsVo comPlayerGoodsVo){
+        return comPlayerGoodsService.save(comPlayerGoodsVo);
+    }
+
+    @GetMapping("userPlayerLands")
+    public ModelAndView userPlayerLands(){
+        return new ModelAndView("sys/aComUser/userPlayerLands");
+    }
+
+    @PostMapping("findPlayerLandByAddress")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<ComPlayerLandVo>> findPlayerLandByAddress(ComUsersVo comUsersVo){
+        if(comUsersVo.getAddress() != null){
+            //查询用户id
+            ComUsersVo _comUsersVo = comUsersService.findByAddress(comUsersVo.getAddress());
+            if(!_comUsersVo.equals(null)){
+                //如果存在用户数据,继续查询背包
+                ComPlayerLandVo comPlayerLandVo = new ComPlayerLandVo();
+                comPlayerLandVo.setUserId(_comUsersVo.getUserId());
+                comPlayerLandVo.setPage(comUsersVo.getPage());
+                comPlayerLandVo.setRows(comUsersVo.getRows());
+                comPlayerLandVo.setSidx(comUsersVo.getSidx());
+                comPlayerLandVo.setSord(comUsersVo.getSord());
+                return comPlayerLandService.page(comPlayerLandVo);
+            }
+        }
+
+        //没数据随便返回一个空的
+        ArrayList<ComPlayerLandVo> comPlayerLandVos = new ArrayList<>();
+        PageInfo<ComPlayerLandVo> pageInfo = new PageInfo<>();
+        pageInfo.setPage(1);//页码
+        pageInfo.setPageSize(1);//页面大小
+        pageInfo.setRows(comPlayerLandVos);//分页结果
+        pageInfo.setRecords(comPlayerLandVos.size());//总记录数
+        pageInfo.setTotal(1);//总页数
+        return Result.of(pageInfo);
+    }
+    @PostMapping("playerLandSave")
+    @Decrypt
+    @Encrypt
+    public Result<ComPlayerLandVo> playerLandSave(ComPlayerLandVo comPlayerLandVo){
+        return comPlayerLandService.save(comPlayerLandVo);
+    }
+
+    @PostMapping("findPlayerLandByUserId")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<ComPlayerLandVo>> findPlayerLandByUserId(ComPlayerLandVo comPlayerLandVo){
+        return comPlayerLandService.page(comPlayerLandVo);
+    }
+
+    @PostMapping("findPlayerGoodsByUserId")
+    @Decrypt
+    @Encrypt
+    public Result<PageInfo<ComPlayerGoodsVo>> findPlayerGoodsByUserId(ComPlayerGoodsVo comPlayerGoodsVo){
+        return comPlayerGoodsService.page(comPlayerGoodsVo);
+    }
+
+}

+ 9 - 4
src/main/java/com/td/boss/sys/sysmenu/controller/SysMenuController.java

@@ -8,10 +8,7 @@ import com.td.boss.sys.sysmenu.pojo.SysMenu;
 import com.td.boss.sys.sysmenu.service.SysMenuService;
 import com.td.boss.sys.sysmenu.vo.SysMenuVo;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.ModelAndView;
 
 import java.util.List;
@@ -27,6 +24,14 @@ public class SysMenuController extends CommonController<SysMenuVo, SysMenu, Stri
         return new ModelAndView("sys/menu/menu");
     }
 
+    @PostMapping("save1")
+    @ResponseBody
+    public ModelAndView menu(SysMenuVo sysMenuVo){
+        super.save(sysMenuVo);
+        return new ModelAndView("sys/menu/menu");
+    }
+
+
     /**
      * 分层级
      */

+ 9 - 0
src/main/java/com/td/boss/sys/sysmenu/service/SysMenuServiceImpl.java

@@ -7,6 +7,7 @@ import com.td.boss.sys.sysmenu.repository.SysMenuRepository;
 import com.td.boss.sys.sysmenu.vo.SysMenuVo;
 import com.td.boss.sys.sysusermenu.service.SysUserMenuService;
 import com.td.boss.sys.sysusermenu.vo.SysUserMenuVo;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -20,6 +21,7 @@ import java.util.List;
 
 @Service
 @Transactional
+@Slf4j
 public class SysMenuServiceImpl extends CommonServiceImpl<SysMenuVo, SysMenu, String> implements SysMenuService{
 
     @PersistenceContext
@@ -119,4 +121,11 @@ public class SysMenuServiceImpl extends CommonServiceImpl<SysMenuVo, SysMenu, St
         }
         return childList;
     }
+
+
+    @Override
+    public Result<SysMenuVo> save(SysMenuVo entityVo) {
+        log.info(entityVo.toString());
+        return super.save(entityVo);
+    }
 }

+ 4 - 0
src/main/java/com/td/boss/sys/sysusermenu/service/SysUserMenuServiceImpl.java

@@ -7,6 +7,7 @@ import com.td.boss.sys.sysusermenu.pojo.SysUserMenu;
 import com.td.boss.sys.sysusermenu.repository.SysUserMenuRepository;
 import com.td.boss.sys.sysusermenu.vo.SysUserMenuVo;
 import com.td.boss.util.CopyUtil;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -19,6 +20,7 @@ import java.util.Comparator;
 import java.util.List;
 
 @Service
+@Slf4j
 @Transactional
 public class SysUserMenuServiceImpl extends CommonServiceImpl<SysUserMenuVo, SysUserMenu, String> implements SysUserMenuService{
 
@@ -33,6 +35,8 @@ public class SysUserMenuServiceImpl extends CommonServiceImpl<SysUserMenuVo, Sys
         List<SysUserMenuVo> sysUserMenuVoList = CopyUtil.copyList(sysUserMenuRepository.findByUserId(userId), SysUserMenuVo.class);
         sysUserMenuVoList.forEach((sysUserMenuVo) -> {
             SysMenuVo sysMenuVo = sysUserMenuVo.getSysMenu();
+            //log.info(sysUserMenuVo.getUserMenuId());
+            //log.info(sysMenuVo.toString());
             if(StringUtils.isEmpty(sysMenuVo.getMenuParentId())){
                 //上级节点
                 menuVoList.add(sysMenuVo);

+ 4 - 7
src/main/resources/application.yml

@@ -17,6 +17,7 @@ spring:
   #修改thymeleaf访问根路径
   thymeleaf:
     prefix: classpath:/view/
+    cache: false
 
   #mvc接收参数时对日期进行格式化
   mvc:
@@ -35,14 +36,10 @@ spring:
 
 # token 参数
 jwt:
-  secret: secret        # 密钥
+  secret: secret      # 密钥
   expiration: 7200000   # 过期时间
   token: Authorization  # 请求头
 
-#是否需要输入验证码
-captcha:
-  enable: false
-
 ---
 ##### local 配置 #######
 spring:
@@ -88,7 +85,7 @@ spring:
       connection-test-query: SELECT 1
 #是否需要输入验证码
 captcha:
-  enable: false
+  enable: true
 
 ---
 ##### prod 配置 #######
@@ -111,4 +108,4 @@ spring:
       connection-test-query: SELECT 1
 #是否需要输入验证码
 captcha:
-  enable: false
+  enable: true

+ 62 - 19
src/main/resources/static/common/common.js

@@ -4,30 +4,36 @@
 aesUtil = {
 
     //获取key,
-    genKey : function (length = 16) {
+    genKey: function (length = 16) {
         let random = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
         let str = "";
         for (let i = 0; i < length; i++) {
-            str  = str + random.charAt(Math.random() * random.length)
+            str = str + random.charAt(Math.random() * random.length)
         }
         return str;
     },
 
     //加密
-    encrypt : function (plaintext,key) {
+    encrypt: function (plaintext, key) {
         if (plaintext instanceof Object) {
             //JSON.stringify
             plaintext = JSON.stringify(plaintext)
         }
-        let encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(plaintext), CryptoJS.enc.Utf8.parse(key), {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
+        let encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(plaintext), CryptoJS.enc.Utf8.parse(key), {
+            mode: CryptoJS.mode.ECB,
+            padding: CryptoJS.pad.Pkcs7
+        });
         return encrypted.toString();
     },
 
     //解密
-    decrypt : function (ciphertext,key) {
-        let decrypt = CryptoJS.AES.decrypt(ciphertext, CryptoJS.enc.Utf8.parse(key), {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
+    decrypt: function (ciphertext, key) {
+        let decrypt = CryptoJS.AES.decrypt(ciphertext, CryptoJS.enc.Utf8.parse(key), {
+            mode: CryptoJS.mode.ECB,
+            padding: CryptoJS.pad.Pkcs7
+        });
         let decString = CryptoJS.enc.Utf8.stringify(decrypt).toString();
-        if(decString.charAt(0) === "{" || decString.charAt(0) === "[" ){
+        if (decString.charAt(0) === "{" || decString.charAt(0) === "[") {
             //JSON.parse
             decString = JSON.parse(decString);
         }
@@ -69,7 +75,7 @@ rsaUtil = {
     decrypt: function (ciphertext, privateKey) {
         privateKey && rsaUtil.thisKeyPair.setPrivateKey(privateKey);
         let decString = rsaUtil.thisKeyPair.decrypt(ciphertext);
-        if(decString.charAt(0) === "{" || decString.charAt(0) === "[" ){
+        if (decString.charAt(0) === "{" || decString.charAt(0) === "[") {
             //JSON.parse
             decString = JSON.parse(decString);
         }
@@ -84,11 +90,11 @@ jQueryExtend = {
     /**
      * 是否已经进行jq的ajax加密重写
      */
-    ajaxExtendFlag : false,
+    ajaxExtendFlag: false,
     /**
      * 扩展jquery对象方法
      */
-    fnExtend : function(){
+    fnExtend: function () {
         /**
          * 拓展表单对象:用于将对象序列化为JSON对象
          */
@@ -161,9 +167,9 @@ jQueryExtend = {
     /**
      * 重写jq的ajax加密,并保留原始ajax,命名为_ajax
      */
-    ajaxExtend : function(){
+    ajaxExtend: function () {
         //判断api加密开关
-        if(sessionStorage.getItem('sysApiEncrypt') === "Y" && !jQueryExtend.ajaxExtendFlag){
+        if (sessionStorage.getItem('sysApiEncrypt') === "Y" && !jQueryExtend.ajaxExtendFlag) {
             jQueryExtend.ajaxExtendFlag = true;
             let _ajax = $.ajax;//首先备份下jquery的ajax方法
             $.ajax = function (opt) {
@@ -228,6 +234,43 @@ jQueryExtend = {
  * 常用工具方法
  */
 commonUtil = {
+    /**
+     * 格式化时间函数
+     * @param time
+     * @param cFormat
+     * @returns {string|null}
+     */
+    parseTime(time, cFormat) {
+        if (arguments.length === 0) {
+            return null
+        }
+        const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
+        let date
+        if (typeof time === 'object') {
+            date = time
+        } else {
+            if (('' + time).length === 10) time = parseInt(time) * 1000
+            date = new Date(time)
+        }
+        const formatObj = {
+            y: date.getFullYear(),
+            m: date.getMonth() + 1,
+            d: date.getDate(),
+            h: date.getHours(),
+            i: date.getMinutes(),
+            s: date.getSeconds(),
+            a: date.getDay()
+        }
+        const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
+            let value = formatObj[key]
+            if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1]
+            if (result.length > 0 && value < 10) {
+                value = '0' + value
+            }
+            return value || 0
+        })
+        return time_str
+    },
     /**
      * 获取当前时间,并格式化输出为:2018-05-18 14:21:46
      */
@@ -295,16 +338,16 @@ commonUtil = {
      * @param arrTree
      * @param userTreeString
      */
-    checkedForLayuiTree:function (arrTree, userTreeString) {
-        for(let tree of arrTree){
+    checkedForLayuiTree: function (arrTree, userTreeString) {
+        for (let tree of arrTree) {
             //默认全部展开
-            tree.spread=true;
+            tree.spread = true;
             //递归子节点
-            if(tree.children && tree.children.length > 0){
-                tree.children = this.checkedForLayuiTree(tree.children,userTreeString);
-            }else{
+            if (tree.children && tree.children.length > 0) {
+                tree.children = this.checkedForLayuiTree(tree.children, userTreeString);
+            } else {
                 //是否包含(勾选子节点默认会勾上父节点,如果勾选父节点,默认会全部勾上所有子节点)
-                if(userTreeString.search(tree.id) !== -1){
+                if (userTreeString.search(tree.id) !== -1) {
                     tree.checked = true;
                 }
             }

+ 22 - 0
src/main/resources/static/sys/aComCNTAndSNB/css/CNTAndSNB.css

@@ -0,0 +1,22 @@
+body {
+    padding: 20px;
+    background-color: #F2F2F2;
+}
+
+.layui-form-label {
+    width: 120px !important;
+}
+
+.layui-input-block {
+    display: -webkit-box !important;
+}
+
+.layui-table-tool-temp {
+    padding-right: 0;
+}
+
+#queryByLoginName {
+    display: unset;
+    width: 100px;
+    margin-left: 10px;
+}

+ 361 - 0
src/main/resources/static/sys/aComCNTAndSNB/js/CNTAndSNB.js

@@ -0,0 +1,361 @@
+let tableSumCNT;
+let tableDateSumCNT;
+let tableSumSNB;
+let tableDateSumSNB;
+let tree;
+let startDate = new Date(new Date(new Date().toLocaleDateString()).getTime()),
+    endDate = new Date(new Date(new Date().toLocaleDateString()).getTime() + 24 * 60 * 60 * 1000 - 1);
+let snbStartDate = startDate, snbEndDate = endDate;
+
+layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], function () {
+    let table = layui.table;
+    let form = layui.form;//select、单选、复选等依赖form
+    let element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
+    let laydate = layui.laydate;
+    tree = layui.tree;
+    let height = document.documentElement.clientHeight * 0.4;
+    tableSumCNT = table.render({
+        elem: '#cntTable'
+        , url: ctx + "/sys/sysProperty/findAllCNTGroupByPayType"
+        , method: 'POST'
+        //请求前参数处理
+        , request: {
+            pageName: 'page' //页码的参数名称,默认:page
+            , limitName: 'rows' //每页数据量的参数名,默认:limit
+        }
+        , 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);
+            //这里应该是反回一个用户,后台做成了页面数据。但是只带一条数据
+            return {
+                "flag": res.flag, //解析接口状态
+                "msg": res.msg, //解析提示文本
+                "records": data.records, //解析数据长度
+                "rows": data.rows //解析数据列表
+            };
+        }
+        , toolbar: '#cntTableToolbarDemo'
+        , title: 'CNT消费统计'
+        , cols: [[
+            {
+                field: 'payType', title: '交易类型', templet: function (d) {
+                    if (d.payType == 1) {  // 自定义内容
+                        return '<span style="color: red">土地租赁</span>';
+                    } else if (d.payType == 4) {
+                        return '<span style="color: red">购买种子</span>';
+                    } else {
+                        return '待添加:' + d.payType;
+                    }
+                }
+            }
+            , {field: 'cntSum', title: '消费的CNT总量'}
+        ]]
+        , defaultToolbar: ['', 'exports', 'print']
+        , page: false
+        , height: height
+        , cellMinWidth: 80
+    });
+
+    tableDateSumCNT = table.render({
+        elem: '#cntDateTable'
+        , url: ctx + "/sys/sysProperty/findAllCNTSumGroupByPayTypeFromDate"
+        , method: 'POST'
+        , where: {
+            startTime: commonUtil.parseTime(startDate),
+            endTime: commonUtil.parseTime(endDate)
+        }
+        //请求前参数处理
+        , request: {
+            pageName: 'page' //页码的参数名称,默认:page
+            , limitName: 'rows' //每页数据量的参数名,默认:limit
+        }
+        , 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);
+            //这里应该是反回一个用户,后台做成了页面数据。但是只带一条数据
+            return {
+                "flag": res.flag, //解析接口状态
+                "msg": res.msg, //解析提示文本
+                "records": data.records, //解析数据长度
+                "rows": data.rows //解析数据列表
+            };
+        }
+        , toolbar: '#cntDateTableToolbarDemo'
+        , title: 'CNT日期消费统计'
+        , cols: [[
+            {
+                field: 'payType', title: '交易类型', templet: function (d) {
+                    if (d.payType == 1) {  // 自定义内容
+                        return '<span style="color: red">土地租赁</span>';
+                    } else if (d.payType == 4) {
+                        return '<span style="color: red">购买种子</span>';
+                    } else {
+                        return '待添加:' + d.payType;
+                    }
+                }
+            }
+            , {field: 'cntSum', title: '消费的CNT总量'}
+        ]]
+        , defaultToolbar: ['', 'exports', 'print']
+        , page: false
+        , height: height
+        , cellMinWidth: 80
+    });
+
+
+    tableSumSNB = table.render({
+        elem: '#snbTable'
+        , url: ctx + "/sys/sysProperty/findAllSNBGroupByPayType"
+        , method: 'POST'
+        //请求前参数处理
+        , request: {
+            pageName: 'page' //页码的参数名称,默认:page
+            , limitName: 'rows' //每页数据量的参数名,默认:limit
+        }
+        , 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);
+            //这里应该是反回一个用户,后台做成了页面数据。但是只带一条数据
+            return {
+                "flag": res.flag, //解析接口状态
+                "msg": res.msg, //解析提示文本
+                "records": data.records, //解析数据长度
+                "rows": data.rows //解析数据列表
+            };
+        }
+        , toolbar: '#snbTableToolbarDemo'
+        , title: 'SNB消费统计'
+        , cols: [[
+            {
+                field: 'tranType', title: '交易类型', templet: function (d) {
+                    if (d.tranType == 3) {  // 自定义内容
+                        return '<span style="color: red">购买种子</span>';
+                    } else if (d.tranType == 0) {
+                        return '<span style="color: green">出售水果</span>';
+                    } else if (d.tranType == 1) {
+                        return '<span style="color: red">SNB兑换CNT冻结</span>';
+                    } else if (d.tranType == 2) {
+                        return '<span style="color: green">SNB兑换CNT解冻</span>';
+                    } else {
+                        return '待添加:' + d.payType;
+                    }
+                }
+            }
+            , {field: 'snbSum', title: '消费的Snb总量'}
+        ]]
+        , defaultToolbar: ['', 'exports', 'print']
+        , page: false
+        , height: height
+        , cellMinWidth: 80
+    });
+
+    tableDateSumSNB = table.render({
+        elem: '#snbDateTable'
+        , url: ctx + "/sys/sysProperty/findAllSNBSumGroupByPayTypeFromDate"
+        , method: 'POST'
+        //请求前参数处理
+        , request: {
+            pageName: 'page' //页码的参数名称,默认:page
+            , limitName: 'rows' //每页数据量的参数名,默认:limit
+        }
+        , where: {
+            startTime: commonUtil.parseTime(snbStartDate),
+            endTime: commonUtil.parseTime(snbEndDate)
+        }
+        , 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);
+            //这里应该是反回一个用户,后台做成了页面数据。但是只带一条数据
+            return {
+                "flag": res.flag, //解析接口状态
+                "msg": res.msg, //解析提示文本
+                "records": data.records, //解析数据长度
+                "rows": data.rows //解析数据列表
+            };
+        }
+        , toolbar: '#snbDateTableToolbarDemo'
+        , title: 'SNB日消费日期'
+        , cols: [
+            [{
+                field: 'tranType', title: '交易类型', templet: function (d) {
+                    if (d.tranType == 3) {  // 自定义内容
+                        return '<span style="color: red">购买种子</span>';
+                    } else if (d.tranType == 0) {
+                        return '<span style="color: green">出售水果</span>';
+                    } else if (d.tranType == 1) {
+                        return '<span style="color: red">SNB兑换CNT冻结</span>';
+                    } else if (d.tranType == 2) {
+                        return '<span style="color: green">SNB兑换CNT解冻</span>';
+                    } else {
+                        return '待添加:' + d.payType;
+                    }
+                }
+            }
+                , {field: 'snbSum', title: '消费的Snb总量'}
+            ]]
+        , defaultToolbar: ['', 'exports', 'print']
+        , page: false
+        , height: height
+        , cellMinWidth: 80
+    });
+
+
+    //头工具栏事件
+    table.on('toolbar(test)', function (obj) {
+        switch (obj.event) {
+            case 'snbReload':
+                sumSnbReload();
+                break;
+            case 'cntReload':
+                sumCntReload();
+                break;
+            case 'cntDateReload':
+                searchFromDate();
+                break;
+            case 'snbDateReload':
+                searchSNBFromDate();
+                break;
+
+        }
+    });
+
+    //监听行工具事件
+    table.on('tool(test)', function (obj) {
+        let data = obj.data;
+        //编辑
+        if (obj.event === 'edit') {
+            console.log("edit");
+            //回显操作表单
+            $("#comUserForm").form(data);
+            form.render();
+        }
+    });
+    laydate.render({
+        elem: '#cntDate'
+        , type: 'datetime'
+        , value: commonUtil.parseTime(startDate) + ' - ' + commonUtil.parseTime(endDate)
+        , isInitValue: true
+        , range: true
+        , done: function (_value, _date, _endDate) {
+            // console.log(_value, _date, _endDate)
+            let _array = _value.split(' - ');
+            startDate = _array[0];
+            endDate = _array[1];
+            // console.log(startDate, endDate)
+            searchFromDate();
+        }
+    });
+
+    laydate.render({
+        elem: '#snbDate'
+        , type: 'datetime'
+        , value: commonUtil.parseTime(snbStartDate) + ' - ' + commonUtil.parseTime(snbEndDate)
+        , isInitValue: true
+        , range: true
+        , done: function (_value, _date, _endDate) {
+            // console.log(_value, _date, _endDate)
+            let _array = _value.split(' - ');
+            snbStartDate = _array[0];
+            snbEndDate = _array[1];
+            // console.log(snbStartDate, snbEndDate)
+            searchSNBFromDate();
+        }
+    });
+});
+
+function sumSnbReload() {
+    tableSumSNB.reload({
+        page: false
+        , method: 'POST'
+        , url: ctx + "/sys/sysProperty/findAllSNBGroupByPayType"
+        , done: function (res, curr, count) {
+            // console.log(res, curr, count);
+            //this.where={};
+            //不清空,有问题:搜索条件会保留
+            //清空,  有问题:分页的时候没有搜索条件了,分页会受到影响
+        }
+    });
+}
+
+function sumCntReload() {
+    tableSumCNT.reload({
+        page: false
+        , method: 'POST'
+        , url: ctx + "/sys/sysProperty/findAllCNTGroupByPayType"
+        , done: function (res, curr, count) {
+            // console.log(res, curr, count);
+            // this.where={};
+            //不清空,有问题:搜索条件会保留
+            //清空,  有问题:分页的时候没有搜索条件了,分页会受到影响
+        }
+    });
+}
+
+
+function searchFromDate() {
+    tableDateSumCNT.reload({
+        page: false
+        , method: 'POST'
+        , url: ctx + "/sys/sysProperty/findAllCNTSumGroupByPayTypeFromDate"
+        , where: {
+            startTime: commonUtil.parseTime(startDate),
+            endTime: commonUtil.parseTime(endDate)
+        }
+        , done: function (res, curr, count) {
+            // console.log(res, curr, count);
+            // this.where={};
+            //不清空,有问题:搜索条件会保留
+            //清空,  有问题:分页的时候没有搜索条件了,分页会受到影响
+        }
+    });
+}
+
+function searchSNBFromDate() {
+    tableDateSumSNB.reload({
+        page: false
+        , method: 'POST'
+        , url: ctx + "/sys/sysProperty/findAllSNBSumGroupByPayTypeFromDate"
+        , where: {
+            startTime: commonUtil.parseTime(snbStartDate),
+            endTime: commonUtil.parseTime(snbEndDate)
+        }
+        , done: function (res, curr, count) {
+            // console.log(res, curr, count);
+            // this.where={};
+            //不清空,有问题:搜索条件会保留
+            //清空,  有问题:分页的时候没有搜索条件了,分页会受到影响
+        }
+    });
+}

+ 22 - 0
src/main/resources/static/sys/aComConfig/css/seedConfig.css

@@ -0,0 +1,22 @@
+body {
+    padding: 20px;
+    background-color: #F2F2F2;
+}
+
+.layui-form-label {
+    width: 120px !important;
+}
+
+.layui-input-block {
+    display: -webkit-box !important;
+}
+
+.layui-table-tool-temp {
+    padding-right: 0;
+}
+
+#queryByLoginName {
+    display: unset;
+    width: 100px;
+    margin-left: 10px;
+}

+ 100 - 0
src/main/resources/static/sys/aComConfig/js/fruitConfig.js

@@ -0,0 +1,100 @@
+let tableIns;
+let tree;
+layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], function () {
+    let table = layui.table;
+    let form = layui.form;//select、单选、复选等依赖form
+
+    form.verify({
+        positiveNumberRequiredTrue: [/^(([0-9]+[\.]?[0-9]+)|[1-9])$/, '只能填写正数'],//必填,且只能输入正数
+        positiveWholeNumberRequiredTrue: [/^[+]{0,1}(\d+)$/, '只能填写正整数'],//必填,且只能输入正整数
+    });
+
+    let element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
+    let laydate = layui.laydate;
+    tree = layui.tree;
+    let height = document.documentElement.clientHeight * 0.8; //随便设置下,和操作表单大概一样
+    //用户列表
+    tableIns = table.render({
+        elem: '#fruitConfigTable'
+        , url: ctx + "/sys/sysProperty/findAllFruitConfig"
+        , method: 'POST'
+        , 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(res);
+            return {
+                "flag": res.flag, //解析接口状态
+                "msg": res.msg, //解析提示文本
+                "records": data.records, //解析数据长度
+                "rows": data.rows //解析数据列表
+            };
+        }
+        , toolbar: '#fruitConfigTableToolbarDemo'
+        , title: '果实列表'
+        , cols: [[
+            {field: 'id', title: '水果id', hide: true}
+            , {field: 'name', title: '名字'}
+            , {field: 'priceSnb', title: '出售SNB价格'}
+            , {field: 'priceCnt', title: '出售CNT价格', hide: true}
+            , {field: 'fruitDescribe', title: '果实描述'}
+            , {field: 'createTime', title: '创建时间', hide: true}
+            , {field: 'updateTime', title: '更新时间', hide: true}
+            , {fixed: 'right', title: '操作', toolbar: '#fruitConfigTableBarDemo'}
+        ]]
+        , defaultToolbar: ['', 'exports', 'print']
+        , page: false
+        , height: height
+        , cellMinWidth: 80
+    });
+
+    //监听行工具事件
+    table.on('tool(test)', function (obj) {
+        let data = obj.data;
+        //编辑
+        if (obj.event === 'edit') {
+            // console.log("edit");
+            //回显操作表单
+            $("#fruitConfigForm").form(data);
+            form.render();
+        }
+    });
+
+    //监听提交
+    form.on('submit(fruitConfigFilter)', function (data) {
+        // layer.alert(JSON.stringify(data.field), {
+        //     title: '最终的提交信息'
+        // })
+        fruitConfigSave();
+    });
+});
+
+/**
+ * 提交保存
+ */
+function fruitConfigSave() {
+    let fruitConfigForm = $("#fruitConfigForm").serializeObject();
+    // console.log(seedConfigForm);
+    if (!fruitConfigForm.id) {
+        layer.msg("选择编辑的果实", {icon: 2, time: 1000}, function () {
+        });
+        return;
+    }
+    let nowTime = commonUtil.getNowTime();
+    fruitConfigForm.updateTime = nowTime;
+    $("input[name='updateTime']").val(nowTime);
+    $.post(ctx + "/sys/sysProperty/saveFruitConfig", fruitConfigForm, function (data) {
+        if (!data.flag) {
+            layer.msg(data.msg, {icon: 2, time: 2000}, function () {
+            });
+            return;
+        }
+        tableIns.reload();
+    });
+}

+ 126 - 0
src/main/resources/static/sys/aComConfig/js/landConfig.js

@@ -0,0 +1,126 @@
+let tableIns;
+let tree;
+
+layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], function () {
+    let table = layui.table;
+    let form = layui.form;//select、单选、复选等依赖form
+    //form自定义校验,使用在标签上lay-verify="phoneRequiredFalse"      非必填项验证:新增部分:(^$)|
+    form.verify({
+        positiveNumberRequiredTrue:[/^(([0-9]+[\.]?[0-9]+)|[1-9])$/,'只能填写正数'],//必填,且只能输入正数
+        positiveWholeNumberRequiredTrue:[/^[+]{0,1}(\d+)$/,'只能填写正整数'],//必填,且只能输入正整数
+    });
+
+    let element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
+    let laydate = layui.laydate;
+    tree = layui.tree;
+    let height = document.documentElement.clientHeight * 0.8; //随便设置下,和操作表单大概一样
+    //用户列表
+    tableIns = table.render({
+        elem: '#landConfigTable'
+        , url: ctx + "/sys/sysProperty/findAllLandConfig"
+        , method: 'POST'
+        , 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(res);
+            return {
+                "flag": res.flag, //解析接口状态
+                "msg": res.msg, //解析提示文本
+                "records": data.records, //解析数据长度
+                "rows": data.rows //解析数据列表
+            };
+        }
+        , toolbar: '#landConfigTableToolbarDemo'
+        , title: '土地列表'
+        , cols: [[
+            {field: 'id', title: '土地号'}
+            , {field: 'name', title: '名字'}
+            , {
+                field: 'initMultiple', title: '初始化租赁倍数', templet: function (d) {
+                    if (d.initMultiple == 0) {
+                        return '<span style="color: red">固定倍数1</span>';
+                    } else {
+                        return d.initMultiple;
+                    }
+                }
+            }
+            , {field: 'rental2', title: '租赁1年消费CNT'}
+            , {field: 'rental3', title: '租赁5年消费CNT'}
+            , {field: 'landDescribe', title: '土地描述'}
+            , {field: 'createTime', title: '创建时间', hide: true}
+            , {field: 'updateTime', title: '更新时间', hide: true}
+            , {fixed: 'right', title: '操作', toolbar: '#landConfigTableBarDemo'}
+        ]]
+        , defaultToolbar: ['', 'exports', 'print']
+        , page: false
+        , height: height
+        , cellMinWidth: 80
+    });
+
+    //监听行工具事件
+    table.on('tool(test)', function (obj) {
+        let data = obj.data;
+        //编辑
+        if (obj.event === 'edit') {
+            // console.log("edit");
+            //回显操作表单
+            $("#landConfigForm").form(data);
+            if (0 === data.initMultiple) {
+                //attr("readonly", "readonly")
+                $("#landMultipleId").css("display", "none");
+                $("input[name='initMultiple']").attr("lay-verify", "");
+            } else {
+                $("#landMultipleId").css("display", "block");
+                $("input[name='initMultiple']").attr("lay-verify", "positiveNumberRequiredTrue|positiveWholeNumberRequiredTrue");
+                $("input[name='initMultiple']").removeAttr("readonly");
+            }
+            form.render();
+        }
+    });
+    //监听提交
+    form.on('submit(landConfigFilter)', function(data){
+        // layer.alert(JSON.stringify(data.field), {
+        //     title: '最终的提交信息'
+        // })
+        landConfigSave();
+    });
+});
+
+/**
+ * 提交保存
+ */
+function landConfigSave() {
+    let landConfigForm = $("#landConfigForm").serializeObject();
+    // console.log(seedConfigForm);
+    if (!landConfigForm.id) {
+        layer.msg("选择编辑的土地", {icon: 2, time: 1000}, function () {
+        });
+        return;
+    }
+
+    //id超过12的土地不能设置0倍
+    if (0 == landConfigForm.initMultiple && landConfigForm.id > 12) {
+        layer.msg("多倍土地不能设置0倍!", {icon: 2, time: 1000}, function () {
+        });
+        return;
+    }
+
+    let nowTime = commonUtil.getNowTime();
+    landConfigForm.updateTime = nowTime;
+    $("input[name='updateTime']").val(nowTime);
+    $.post(ctx + "/sys/sysProperty/saveLandConfig", landConfigForm, function (data) {
+        if (!data.flag) {
+            layer.msg(data.msg, {icon: 2, time: 2000}, function () {
+            });
+            return;
+        }
+        tableIns.reload();
+    });
+}

+ 111 - 0
src/main/resources/static/sys/aComConfig/js/seedConfig.js

@@ -0,0 +1,111 @@
+let tableIns;
+let tree;
+layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], function () {
+    let table = layui.table;
+    let form = layui.form;//select、单选、复选等依赖form
+    //form自定义校验,使用在标签上lay-verify="phoneRequiredFalse"      非必填项验证:新增部分:(^$)|
+    form.verify({
+        positiveNumberRequiredTrue:[/^(([0-9]+[\.]?[0-9]+)|[1-9])$/,'只能填写正数'],//必填,且只能输入正数
+        positiveWholeNumberRequiredTrue:[/^[+]{0,1}(\d+)$/,'只能填写正整数'],//必填,且只能输入正整数
+    });
+    let element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
+    let laydate = layui.laydate;
+    tree = layui.tree;
+    let height = document.documentElement.clientHeight*0.8; //随便设置下,和操作表单大概一样
+    //用户列表
+    tableIns = table.render({
+        elem: '#seedConfigTable'
+        , url: ctx + "/sys/sysProperty/findAllSeedConfig"
+        , method: 'POST'
+        , 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(res);
+            return {
+                "flag": res.flag, //解析接口状态
+                "msg": res.msg, //解析提示文本
+                "records": data.records, //解析数据长度
+                "rows": data.rows //解析数据列表
+            };
+        }
+        , toolbar: '#seedConfigTableToolbarDemo'
+        , title: '种子列表'
+        , cols: [[
+             {field: 'id', title: 'ID', hide: true}
+            ,{field: 'mallType', title: '商品类型', hide: true}
+            , {field: 'picture', title: '图片名字', hide: true}
+            , {field: 'name', title: '种子名字'}
+            , {field: 'maturity', title: '成熟期(天)'}
+            , {field: 'planting', title: '种植时间', hide: true}
+            , {field: 'harvestId', title: '果实id', hide: true}
+            , {field: 'harvestQuantity', title: '收获数量', hide: true}
+            , {field: 'harvestCount', title: '收获次数', hide: true}
+            , {field: 'harvest1', title: '3个月收获', hide: true}
+            , {field: 'harvest2', title: '1年收获量'}
+            , {field: 'harvest3', title: '5年收获量'}
+            , {field: 'harvestName', title: '收获名字',hide:true}
+            , {field: 'priceCnt', title: '售价(CNT)'}
+            , {field: 'priceSnb', title: '售价(SNB)'}
+            , {field: 'seedDescribe', title: '种子描述'}
+            , {field: 'withered', title: '枯萎期',hide:true}
+            , {field: 'createTime', title: '创建时间', hide: true}
+            , {field: 'updateTime', title: '更新时间', hide: true}
+            , {fixed: 'right', title: '操作', toolbar: '#seedConfigTableBarDemo'}
+        ]]
+        , defaultToolbar: ['', 'exports', 'print']
+        , page: false
+        , height: height
+        , cellMinWidth: 80
+    });
+
+    //监听行工具事件
+    table.on('tool(test)', function (obj) {
+        let data = obj.data;
+        //编辑
+        if (obj.event === 'edit') {
+            // console.log("edit");
+            //回显操作表单
+            $("#seedConfigForm").form(data);
+            form.render();
+        }
+    });
+
+    //监听提交
+    form.on('submit(seedConfigFilter)', function (data) {
+        // layer.alert(JSON.stringify(data.field), {
+        //     title: '最终的提交信息'
+        // })
+        seedConfigSave();
+    });
+});
+
+/**
+ * 提交保存
+ */
+function seedConfigSave() {
+    let seedConfigForm = $("#seedConfigForm").serializeObject();
+    // console.log(seedConfigForm);
+    if (!seedConfigForm.id) {
+        layer.msg("选择编辑的种子", {icon: 2, time: 1000}, function () {
+        });
+        return;
+    }
+    let nowTime = commonUtil.getNowTime();
+    seedConfigForm.updateTime = nowTime;
+    $("input[name='updateTime']").val(nowTime);
+    $.post(ctx + "/sys/sysProperty/saveSeedConfig", seedConfigForm, function (data) {
+        if (!data.flag) {
+            layer.msg(data.msg, {icon: 2, time: 2000}, function () {
+            });
+            return;
+        }
+        tableIns.reload();
+    });
+}

+ 22 - 0
src/main/resources/static/sys/aComPlayerGoods/css/playerGoods.css

@@ -0,0 +1,22 @@
+body {
+    padding: 20px;
+    background-color: #F2F2F2;
+}
+
+.layui-form-label {
+    width: 120px !important;
+}
+
+.layui-input-block {
+    display: -webkit-box !important;
+}
+
+.layui-table-tool-temp {
+    padding-right: 0;
+}
+
+#queryByLoginName {
+    display: unset;
+    width: 100px;
+    margin-left: 10px;
+}

+ 103 - 0
src/main/resources/static/sys/aComPlayerGoods/js/playerGoods.js

@@ -0,0 +1,103 @@
+let tablePlayerGoods;
+let tableDateSumCNT;
+let tableSumSNB;
+let tableDateSumSNB;
+let tree;
+let startDate = new Date(new Date(new Date().toLocaleDateString()).getTime()),
+    endDate = new Date(new Date(new Date().toLocaleDateString()).getTime() + 24 * 60 * 60 * 1000 - 1);
+let snbStartDate = startDate, snbEndDate = endDate;
+
+layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], function () {
+    let table = layui.table;
+    let form = layui.form;//select、单选、复选等依赖form
+    let element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
+    let laydate = layui.laydate;
+    tree = layui.tree;
+    let height = document.documentElement.clientHeight * 0.4;
+    tablePlayerGoods = table.render({
+        elem: '#playerGoodsTable'
+        , url: ctx + "/sys/sysProperty/findAllGroupByGoodsType"
+        , method: 'POST'
+        //请求前参数处理
+        , request: {
+            pageName: 'page' //页码的参数名称,默认:page
+            , limitName: 'rows' //每页数据量的参数名,默认:limit
+        }
+        , 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);
+            //这里应该是反回一个用户,后台做成了页面数据。但是只带一条数据
+            return {
+                "flag": res.flag, //解析接口状态
+                "msg": res.msg, //解析提示文本
+                "records": data.records, //解析数据长度
+                "rows": data.rows //解析数据列表
+            };
+        }
+        , toolbar: '#playerGoodsTableToolbarDemo'
+        , title: '仓库统计'
+        , cols: [[
+            {
+                field: 'goodsType', title: '仓库物品的类型', templet: function (d) {
+                    if (d.goodsType == 0) {
+                        return '<span style="color: green">种子</span>';
+                    } else if (d.goodsType == 1) {
+                        return '<span style="color: green">果实</span>';
+                    } else {
+                        return '待添加:' + d.goodsType;
+                    }
+                }
+            }
+            , {field: 'amount', title: '仓库的数量'}
+        ]]
+        , defaultToolbar: ['', 'exports', 'print']
+        , page: false
+        , height: height
+        , cellMinWidth: 80
+    });
+
+
+    //头工具栏事件
+    table.on('toolbar(test)', function (obj) {
+        switch (obj.event) {
+            case 'playerGoodsReload':
+                reloadPlayerGoods();
+                break;
+        }
+    });
+
+    //监听行工具事件
+    table.on('tool(test)', function (obj) {
+        let data = obj.data;
+        //编辑
+        if (obj.event === 'edit') {
+            console.log("edit");
+            //回显操作表单
+            $("#comUserForm").form(data);
+            form.render();
+        }
+    });
+
+});
+
+function reloadPlayerGoods() {
+    tablePlayerGoods.reload({
+        page: false
+        , method: 'POST'
+        , url: ctx + "/sys/sysProperty/findAllGroupByGoodsType"
+        , done: function (res, curr, count) {
+            // console.log(res, curr, count);
+            // this.where={};
+            //不清空,有问题:搜索条件会保留
+            //清空,  有问题:分页的时候没有搜索条件了,分页会受到影响
+        }
+    });
+}

+ 22 - 0
src/main/resources/static/sys/aComUser/css/user.css

@@ -0,0 +1,22 @@
+body {
+    padding: 20px;
+    background-color: #F2F2F2;
+}
+
+.layui-form-label {
+    width: 120px !important;
+}
+
+.layui-input-block {
+    display: -webkit-box !important;
+}
+
+.layui-table-tool-temp {
+    padding-right: 0;
+}
+
+#queryByLoginName {
+    display: unset;
+    width: 100px;
+    margin-left: 10px;
+}

+ 507 - 0
src/main/resources/static/sys/aComUser/js/user.js

@@ -0,0 +1,507 @@
+let tableIns;
+let tableCNT;
+let tableSNB;
+let tablePlayerLog;
+let tree;
+layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], function () {
+    let table = layui.table;
+    let form = layui.form;//select、单选、复选等依赖form
+    form.verify({
+        positiveNumberRequiredTrue: [/^(([0-9]+[\.]?[0-9]+)|[1-9])$/, '只能填写正数'],//必填,且只能输入正数
+        positiveWholeNumberRequiredTrue: [/^[+]{0,1}(\d+)$/, '只能填写正整数'],//必填,且只能输入正整数
+    });
+
+    let element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
+    let laydate = layui.laydate;
+    tree = layui.tree;
+    let height = document.documentElement.clientHeight * 0.5; //随便设置下,和操作表单大概一样
+    //用户列表
+    tableIns = table.render({
+        elem: '#userTable'
+        , url: ctx + "/sys/sysComUsers/findGameUserByAddress"
+        , method: 'POST'
+        //请求前参数处理
+        // , request: {
+        //     pageName: 'page' //页码的参数名称,默认:page
+        //     , limitName: 'rows' //每页数据量的参数名,默认:limit
+        // }
+        , 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.rows.length > 0) {
+                if (!data.rows[0]) {
+                    layer.msg("没有查询到用户数据", {icon: 2, time: 2000}, function () {
+                    });
+                    return;
+                }
+                // 加上时间排序
+                let _findData = {userId: data.rows[0].userId, sidx: "desc", sord: "createTime"};
+                if (!tableSNB) {
+                    initSNBTable(table, _findData);
+                } else {
+                    //如果已经初始化,刷新当前用户信息
+                    snbReload(_findData);
+                }
+                if (!tableCNT) {
+                    initCNTTable(table, _findData);
+                } else {
+                    //如果已经初始化,刷新当前用户信息
+                    cntReload(_findData);
+                }
+
+                if (!tablePlayerLog) {
+                    initPlayerLog(table, _findData);
+                } else {
+                    playerLogReload(_findData);
+                }
+            }
+
+            return {
+                "flag": res.flag, //解析接口状态
+                "msg": res.msg, //解析提示文本
+                "records": data.records, //解析数据长度
+                "rows": data.rows //解析数据列表
+            };
+        }
+        , toolbar: '#userTableToolbarDemo'
+        , title: '用户列表'
+        , cols: [[
+            {field: 'userId', title: '用户id'}
+            , {field: 'gold', title: '金币', hide: true}
+            , {field: 'diamond', title: '钻石', hide: true}
+            , {field: 'cnt', title: 'CNT', hide: true}
+            , {field: 'snb', title: 'SNB'}
+            , {field: 'address', title: '钱包地址', hide: true}
+            , {
+                field: 'limitLogin', title: '限制登录', templet: function (d) {
+                    if (d.limitLogin == 1) {  // 自定义内容
+                        return '<span style="color: red">限制</span>';
+                    } else {
+                        return "未限制";
+                    }
+                }
+            }
+            , {
+                field: 'limitTran', title: '限制交易', templet: function (d) {
+                    if (d.limitTran == 1) {  // 自定义内容
+                        return '<span style="color: red">限制</span>';
+                    } else {
+                        return "未限制";
+                    }
+                }
+            }
+            , {field: 'lastLogin', title: '最近登录时间', hide: true}
+            , {fixed: 'right', title: '操作', toolbar: '#userTableBarDemo'}
+        ]]
+        , defaultToolbar: ['', 'exports', 'print']
+        , page: false
+        , height: height
+        , cellMinWidth: 80
+    });
+
+    //头工具栏事件
+    table.on('toolbar(test)', function (obj) {
+        switch (obj.event) {
+            case 'addData':
+                layer.msg("点击增加按钮!");
+                break;
+            case 'query':
+                //根据用户地址查询
+                findByUserAddress(form);
+                break;
+            case 'snbReload':
+                snbReload();
+                break;
+            case 'cntReload':
+                cntReload();
+                break;
+            case 'playerLogReload':
+                playerLogReload();
+                break;
+        }
+    });
+
+    //监听行工具事件
+    table.on('tool(test)', function (obj) {
+        let data = obj.data;
+        //编辑
+        if (obj.event === 'edit') {
+            // console.log("edit");
+            //回显操作表单
+            $("#comUserForm").form(data);
+            form.render();
+        }
+    });
+
+
+    //日期选择器
+    laydate.render({
+        elem: '#expiredTimeDate',
+        format: "yyyy-MM-dd HH:mm:ss"
+    });
+
+    //监听提交
+    form.on('submit(comUserFilter)', function (data) {
+        // layer.alert(JSON.stringify(data.field), {
+        //     title: '最终的提交信息'
+        // })
+        comUserFormSave();
+    });
+});
+
+
+function findByUserAddress(form) {
+    //重置数据
+    $("#comUserForm")[0].reset();
+    form.render();
+    // "TUNkoeP5LxSKh45rwspcWu3DaKRVERfEiu" 测试
+    let queryByAddress = $("#queryByAddress").val();
+    //获取菜单数据
+    // $.post(ctx + "/sys/sysComUsers/findGameUserByAddress", {address: queryByAddress}, function (res) {
+    //     console.log("comUsersVo:", res.data)
+    // });
+    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/findGameUserByAddress"
+        , where: {address: queryByAddress}
+        , done: function (res, curr, count) {
+            // console.log(res, curr, count);
+            $("input[name='queryByAddress']").val(queryByAddress);
+            //this.where={};
+            //不清空,有问题:搜索条件会保留
+            //清空,  有问题:分页的时候没有搜索条件了,分页会受到影响
+        }
+    });
+}
+
+/**
+ * 提交保存
+ */
+function comUserFormSave() {
+    let comUserForm = $("#comUserForm").serializeObject();
+    // console.log(comUserForm);
+    if (!comUserForm.userId) {
+        layer.msg("选择编辑的用户", {icon: 2, time: 1000}, function () {
+        });
+        return;
+    }
+    $.post(ctx + "/sys/sysComUsers/save", comUserForm, function (data) {
+        if (!data.flag) {
+            layer.msg(data.msg, {icon: 2, time: 2000}, function () {
+            });
+            return;
+        }
+        tableIns.reload();
+    });
+}
+
+function initSNBTable(table, data) {
+    // console.log("initSNBTable");
+    //用户SNB明细,这里直接处理了
+    tableSNB = table.render({
+        elem: '#comSnbTranTable'
+        , url: ctx + "/sys/sysComUsers/findSNBTranByUserId"
+        , 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 即为原始返回的数据
+            var data = res.data;
+            return {
+                "flag": res.flag, //解析接口状态
+                "msg": res.msg, //解析提示文本
+                "records": data.records, //解析数据长度
+                "rows": data.rows //解析数据列表
+            };
+        }
+        , toolbar: '#comSnbTranTableToolbarDemo'
+        , title: 'SNB列表'
+        , cols: [[
+            {field: 'id', title: 'ID', hide: true}
+            , {field: 'userId', title: 'userId'}
+            , {field: 'tranId', title: '操作对象的id'}
+            , {field: 'tranName', title: '交易操作', width: 100}
+            , {
+                field: 'tranType', title: '交易类型', width: 120, templet: function (d) {
+                    if (d.tranType == 0) {  // 自定义内容
+                        return '<span style="color: green">出售果实</span>';
+                    } else if (d.tranType == 1) {
+                        return '<span style="color: red">转CNT冻结</span>';
+                    } else if (d.tranType == 2) {
+                        return '<span style="color: green">转CNT解冻</span>';
+                    } else if (d.tranType == 3) {
+                        return '<span style="color: red">SNB购买种子</span>';
+                    } else {
+                        return '<span style="color: red">待添加:</span>' + d.tranType;
+                    }
+                }
+            }
+            , {field: 'tranAmount', title: '交易数量'}
+            , {field: 'tranPrice', title: '交易价格'}
+            , {field: 'tranDescribe', title: '交易描述'}
+            , {
+                field: 'isAdd', title: '状态', width: 80, templet: function (d) {
+                    if (d.isAdd == 0) {  // 自定义内容
+                        return '<span style="color: red">减少</span>';
+                    } else {
+                        return '<span style="color: green">增加</span>';
+                    }
+                }
+            }
+            , {field: 'beforeSnb', title: '交易之前的snb'}
+            , {field: 'tranSnb', title: '交易的snb'}
+            , {field: 'afterSnb', title: '交易完成后的snb'}
+            , {field: 'createTime', title: '创建时间'}
+            , {field: 'updateTime', title: '更新时间', hide: true}
+        ]]
+        , defaultToolbar: ['', 'exports', 'print']
+        , page: true
+        , height: 500
+        , cellMinWidth: 80
+    });
+}
+
+
+function snbReload(data) {
+    // console.log("snbReload where:", this.where, data);
+    tableSNB.reload({
+        page: {
+            curr: 1 //重新从第 1 页开始
+            , limit: 10
+        }
+        , method: 'POST'
+        , url: ctx + "/sys/sysComUsers/findSNBTranByUserId"
+        , where: data
+        , done: function (res, curr, count) {
+            // console.log(res, curr, count);
+            //this.where={};
+            //不清空,有问题:搜索条件会保留
+            //清空,  有问题:分页的时候没有搜索条件了,分页会受到影响
+        }
+    });
+}
+
+
+function initCNTTable(table, data) {
+    //用户CNT明细,这里直接处理了
+    // console.log("initCNTTable");
+    tableCNT = table.render({
+        elem: '#comCntOrderTable'
+        , url: ctx + "/sys/sysComUsers/findCNTTranByUserId"
+        , 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 即为原始返回的数据
+            var data = res.data;
+            return {
+                "flag": res.flag, //解析接口状态
+                "msg": res.msg, //解析提示文本
+                "records": data.records, //解析数据长度
+                "rows": data.rows //解析数据列表
+            };
+        }
+        , toolbar: '#comCntOrderTableToolbarDemo'
+        , title: 'CNT列表'
+        , cols: [[
+            {field: 'id', title: 'ID', hide: true}
+            , {field: 'userId', title: 'userId', width: 260}
+            , {field: 'address', title: '钱包地址', hide: true}
+            , {
+                field: 'payType', title: '交易的类型', width: 100, templet: function (d) {
+                    if (d.payType == 1) {  // 自定义内容
+                        return '<span style="color: green">土地租赁</span>';
+                    } else if (d.payType == 4) {
+                        return '<span style="color: green">购买种子</span>';
+                    } else {
+                        return '<span style="color: green">待添加:</span>' + d.payType;
+                    }
+                }
+            }
+            , {field: 'payAmount', title: '交易数量(CNT)', width: 150}
+            , {
+                field: 'itemType', title: '项目类型', width: 500, templet: function (d) {
+                    //todo 土地操作修改 比如倍数+id = 1or12 2or12 3or12
+                    // String[] itemArray = item_type.split("or");
+                    // Integer playCycle = Integer.parseInt(itemArray[0]); //土地周期,比如3个月,1年,5年等
+                    // Integer configLandId = Integer.parseInt(itemArray[1]); //itemType
+                    let _itemType = d.itemType;
+                    if (_itemType.indexOf('or') === -1) {
+                        return '购买种子:id=' + '<span style="color: red">' + _itemType + '</span>';
+                    } else {
+                        let _itemArray = _itemType.split("or")
+                        let _configLandId = parseInt(_itemArray[1]); //itemType
+                        let _landCycle = "3个月";
+                        let _playCycle = parseInt(_itemArray[0]); //土地周期,比如3个月,1年,5年等
+                        if (_playCycle == 2) {
+                            _landCycle = "1年";
+                        } else if (_playCycle == 3) {
+                            _landCycle = "5年";
+                        }
+                        return '租赁土地' + '<span style="color: red">' + _configLandId + '</span>' + '号,周期:'
+                            + '<span style="color: red">' + _landCycle + '</span>';
+                    }
+                }
+            }
+            , {field: 'txHash', title: 'txHash'}
+            , {field: 'cntDescribe', title: '交易描述', hide: true}
+            , {field: 'createTime', title: '创建时间'}
+            , {field: 'updateTime', title: '更新时间', hide: true}
+        ]]
+        , defaultToolbar: ['', 'exports', 'print']
+        , page: true
+        , height: 500
+        , cellMinWidth: 80
+    });
+}
+
+function cntReload(data) {
+    // console.log("cntReload where:", this.where, data);
+    tableCNT.reload({
+        page: {
+            curr: 1 //重新从第 1 页开始
+            , limit: 10
+        }
+        , method: 'POST'
+        , url: ctx + "/sys/sysComUsers/findCNTTranByUserId"
+        , where: data
+        , done: function (res, curr, count) {
+            // console.log(res, curr, count);
+            // this.where={};
+            //不清空,有问题:搜索条件会保留
+            //清空,  有问题:分页的时候没有搜索条件了,分页会受到影响
+        }
+    });
+}
+
+
+/**
+ * 用户操作日志
+ * @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: green">购买种子</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 {
+                        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: 'lMultiple', title: 'land倍数', width: 80}
+            , {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) {
+        }
+    });
+}

+ 260 - 0
src/main/resources/static/sys/aComUser/js/userPlayerGoods.js

@@ -0,0 +1,260 @@
+let tableIns;
+let tableCNT;
+let tableSNB;
+let tablePlayerLog;
+let tree;
+layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], function () {
+    let table = layui.table;
+    let form = layui.form;//select、单选、复选等依赖form
+    form.verify({
+        positiveNumberRequiredTrue: [/^(([0-9]+[\.]?[0-9]+)|[1-9])$/, '只能填写正数'],//必填,且只能输入正数
+        positiveWholeNumberRequiredTrue: [/^[+]{0,1}(\d+)$/, '只能填写正整数'],//必填,且只能输入正整数
+    });
+
+    let element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
+    let laydate = layui.laydate;
+    tree = layui.tree;
+    let height = document.documentElement.clientHeight * 0.5; //随便设置下,和操作表单大概一样
+    //用户列表
+    tableIns = table.render({
+        elem: '#userPlayerGoodsTable'
+        , url: ctx + "/sys/sysComUsers/findPlayerGoodsByAddress"
+        , 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.rows.length > 0) {
+                let _findData = {userId: data.rows[0].userId, sidx: "desc", sord: "createTime"};
+                if (!tablePlayerLog) {
+                    initPlayerLog(table, _findData);
+                } else {
+                    playerLogReload(_findData);
+                }
+            }
+
+            return {
+                "flag": res.flag, //解析接口状态
+                "msg": res.msg, //解析提示文本
+                "records": data.records, //解析数据长度
+                "rows": data.rows //解析数据列表
+            };
+        }
+        , toolbar: '#userPlayerGoodsTableToolbarDemo'
+        , title: '用户仓库列表'
+        , cols: [[
+            {field: 'goodsId', title: '背包id', hide: true}
+            , {field: 'userId', title: '用户id'}
+            , {field: 'goodsIndex', title: '物品id'}
+            , {
+                field: 'goodsType', title: '物品类型', templet: function (d) {
+                    if (d.goodsType == 0) {
+                        return '<span style="color: red">种子</span>';
+                    } else if (d.goodsType == 1) {
+                        return '<span style="color: green">果实</span>';
+                    } else {
+                        return '未添加:' + d.goodsType;
+                    }
+                }
+            }
+            , {field: 'name', title: '物品名称'}
+            , {field: 'amount', title: '数量'}
+            , {fixed: 'right', title: '操作', toolbar: '#userPlayerGoodsTableBarDemo'}
+        ]]
+        , defaultToolbar: ['', 'exports', 'print']
+        , page: true
+        , height: height
+        , cellMinWidth: 80
+    });
+
+    //头工具栏事件
+    table.on('toolbar(test)', function (obj) {
+        switch (obj.event) {
+            case 'query':
+                //根据用户地址查询
+                findByUserAddress(form);
+                break;
+            case 'playerLogReload':
+                playerLogReload();
+                break;
+        }
+    });
+
+    //监听行工具事件
+    table.on('tool(test)', function (obj) {
+        let data = obj.data;
+        //编辑
+        if (obj.event === 'edit') {
+            // console.log("edit");
+            //回显操作表单
+            $("#comUsePlayerGoodsForm").form(data);
+            form.render();
+        }
+    });
+
+
+    //日期选择器
+    laydate.render({
+        elem: '#expiredTimeDate',
+        format: "yyyy-MM-dd HH:mm:ss"
+    });
+
+    //监听提交
+    form.on('submit(comUserPlayerGoodsFilter)', function (data) {
+        comUserPlayerGoodsFormSave();
+    });
+});
+
+
+function findByUserAddress(form) {
+    //重置数据
+    $("#comUsePlayerGoodsForm")[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/findPlayerGoodsByAddress"
+        , 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 comUserPlayerGoodsFormSave() {
+    let comUsePlayerGoodsForm = $("#comUsePlayerGoodsForm").serializeObject();
+    if (!comUsePlayerGoodsForm.goodsId) {
+        layer.msg("选择编辑的对象", {icon: 2, time: 1000}, function () {
+        });
+        return;
+    }
+    $.post(ctx + "/sys/sysComUsers/playerGoodsSave", comUsePlayerGoodsForm, function (data) {
+        if (!data.flag) {
+            layer.msg(data.msg, {icon: 2, time: 2000}, function () {
+            });
+            return;
+        }
+        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: green">购买种子</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 {
+                        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: 'lMultiple', title: 'land倍数', width: 80}
+            , {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) {
+        }
+    });
+}

+ 189 - 0
src/main/resources/static/sys/aComUser/js/userPlayerLands.js

@@ -0,0 +1,189 @@
+let tableIns;
+let tableCNT;
+let tableSNB;
+let tablePlayerLog;
+let tree;
+layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], function () {
+    let table = layui.table;
+    let form = layui.form;//select、单选、复选等依赖form
+    form.verify({
+        positiveNumberRequiredTrue: [/^(([0-9]+[\.]?[0-9]+)|[1-9])$/, '只能填写正数'],//必填,且只能输入正数
+        positiveWholeNumberRequiredTrue: [/^[+]{0,1}(\d+)$/, '只能填写正整数'],//必填,且只能输入正整数
+    });
+
+    let element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
+    let laydate = layui.laydate;
+    tree = layui.tree;
+    let height = document.documentElement.clientHeight * 0.8; //随便设置下,和操作表单大概一样
+    //用户列表
+    tableIns = table.render({
+        elem: '#userPlayerLandTable'
+        , url: ctx + "/sys/sysComUsers/findPlayerLandByAddress"
+        , 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);
+            return {
+                "flag": res.flag, //解析接口状态
+                "msg": res.msg, //解析提示文本
+                "records": data.records, //解析数据长度
+                "rows": data.rows //解析数据列表
+            };
+        }
+        , toolbar: '#userPlayerLandTableToolbarDemo'
+        , title: '用户仓库列表'
+        , cols: [[
+            {field: 'id', title: 'ID', hide: true}
+            , {field: 'userId', title: '用户id'}
+            , {field: 'configLandId', title: '土地号',width:70}
+            , {field: 'name', title: '土地名称'}
+            , {
+                field: 'isLease', title: '是否租赁',width:80, templet: function (d) {
+                    if (d.isLease == 1) {
+                        return '<span style="color: green">已租赁</span>';
+                    } else if (d.isLease == 0) {
+                        return '<span style="color: grey">未租赁</span>';
+                    } else {
+                        return '未添加:' + d.isLease;
+                    }
+                }
+            }
+            ,
+            , {field: 'leaseTime', title: '租赁结束日期'}
+            , {field: 'leaseMultiple', title: '倍数',width:70}
+            ,{
+                field: 'leaseDate', title: '类型',width:80, templet: function (d) {
+                    //1是3个月,2是1年,3是5年
+                    if (d.leaseDate == 1) {
+                        return '<span style="color: red">三个月</span>';
+                    } else if (d.leaseDate == 2) {
+                        return '<span style="color: green">1年</span>';
+                    } else if (d.leaseDate == 3) {
+                        return '<span style="color: blue">5年</span>';
+                    }{
+                        return '未添加:' + d.goodsType;
+                    }
+                }
+            }
+            , {field: 'isPlant', title: '是否种植',width:80, templet: function (d) {
+                    //1是3个月,2是1年,3是5年
+                    if (d.isPlant == 0) {
+                        return '<span style="color: red">未种植</span>';
+                    } else if (d.isPlant == 1) {
+                        return '<span style="color: green">已种植</span>';
+                    }
+                }}
+            , {field: 'plantId', title: '种子id',width:70}
+            , {field: 'plantStart', title: '开始种子时间'}
+            , {fixed: 'right', title: '操作', toolbar: '#userPlayerLandTableBarDemo'}
+        ]]
+        , defaultToolbar: ['', 'exports', 'print']
+        , page: true
+        , height: height
+        , cellMinWidth: 80
+    });
+
+    //头工具栏事件
+    table.on('toolbar(test)', function (obj) {
+        switch (obj.event) {
+            case 'query':
+                //根据用户地址查询
+                findByUserAddress(form);
+                break;
+            case 'playerLogReload':
+                playerLogReload();
+                break;
+        }
+    });
+
+    //监听行工具事件
+    table.on('tool(test)', function (obj) {
+        let data = obj.data;
+        //编辑
+        if (obj.event === 'edit') {
+            console.log(data);
+            //回显操作表单
+            $("#comUsePlayerLandForm").form(data);
+            form.render();
+        }
+    });
+
+
+    //日期选择器
+    laydate.render({
+        elem: '#leaseTime',
+        format: "yyyy-MM-dd HH:mm:ss"
+    });
+    laydate.render({
+        elem: '#plantStart',
+        format: "yyyy-MM-dd HH:mm:ss"
+    });
+    //监听提交
+    form.on('submit(comUserPlayerLandFilter)', function (data) {
+        comUserPlayerLandFormSave();
+    });
+});
+
+
+function findByUserAddress(form) {
+    //重置数据
+    $("#comUsePlayerLandForm")[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/findPlayerLandByAddress"
+        , 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 comUserPlayerLandFormSave() {
+    let comUsePlayerLandForm = $("#comUsePlayerLandForm").serializeObject();
+    if (!comUsePlayerLandForm.id) {
+        layer.msg("选择编辑的土地对象", {icon: 2, time: 1000}, function () {
+        });
+        return;
+    }
+    $.post(ctx + "/sys/sysComUsers/playerLandSave", comUsePlayerLandForm, function (data) {
+        if (!data.flag) {
+            layer.msg(data.msg, {icon: 2, time: 2000}, function () {
+            });
+            return;
+        }
+        tableIns.reload();
+    });
+}

+ 2 - 0
src/main/resources/static/sys/menu/js/menu.js

@@ -6,6 +6,7 @@ layui.use(['element', 'form', 'table', 'layer', 'tree', 'util'], function () {
 
     //获取菜单数据
     $.post(ctx + "/sys/sysMenu/listByTier", {}, function (data) {
+        console.log("listByTier:", data);
         //数据说明:id对应id,title对应menuName,href对应menuPath
         let treeData = commonUtil.updateKeyForLayuiTree(data.data);
 
@@ -81,6 +82,7 @@ function menuFormSave() {
     if(menuForm.menuParentId === "0"){
         menuForm.menuParentId = "";
     }
+    console.log(menuForm);
     $.post(ctx + "/sys/sysMenu/save", menuForm, function (data) {
         layer.msg("保存成功", {icon: 1,time: 2000}, function () {});
 

+ 5 - 48
src/main/resources/view/index.html

@@ -29,7 +29,7 @@
             <ul class="layui-nav layui-layout-right">
                 <li class="layui-nav-item">
                     <a href="javascript:;">
-                        <img src="https://avatar.gitee.com/uploads/0/5137900_huanzi-qch.png!avatar100?1562729811"
+                        <img src="https://cnt.landownership.live/favicon.ico"
                              class="layui-nav-img">
                         <span th:text="${loginUser.userName}">XXX</span>
                     </a>
@@ -59,20 +59,6 @@
                         </li>
                     </div>
                 </ul>
-                <ul class="layui-nav layui-nav-tree" lay-filter="test"  th:style="${' background-color:' + sys.sysColor + ' !important;'}">
-                    <!-- 动态读取加载系统菜单 -->
-                    <div th:each="menu,iterStat : ${menuList}">
-                        <li class="layui-nav-item" th:unless="${#lists.size(menu.children)} eq 0">
-                            <a th:text="${menu.menuName}" href="javascript:;">XXX</a>
-                            <dl class="layui-nav-child" th:each="childMenu,iterStat : ${menu.children}">
-                                <dd><a class="huanzi-menu" th:data-url="${#request.getContextPath() + childMenu.menuPath}" th:data-id="${childMenu.menuId}" th:text="${childMenu.menuName}" href="javascript:;">XXX</a></dd>
-                            </dl>
-                        </li>
-                        <li class="layui-nav-item" th:if="${#lists.size(menu.children)} eq 0">
-                            <a class="huanzi-menu" th:data-url="${#request.getContextPath() + menu.menuPath}" th:data-id="${menu.menuId}" th:text="${menu.menuName}" href="javascript:;">XXX</a>
-                        </li>
-                    </div>
-                </ul>
             </div>
 
         </div>
@@ -98,14 +84,10 @@
                                         欢迎你,<span th:text="${loginUser.userName}"></span>
                                         <br/>
                                         <br/>
-                                        <p>Base Admin是一套简单通用的后台管理系统,主要功能有:权限管理、菜单管理、用户管理,系统设置、实时日志,实时监控,API加密,以及登录用户修改密码、配置个性菜单等</p>
+                                        <p th:utext="'目前全部用户数量:'+${allComUserCount} + ',今日新增数量:'+${todayComUserCount}"> </p>
                                         <br/>
                                         <br/>
-                                        <p>作者:huanzi-qch</p>
-                                        <p>博客:https://www.cnblogs.com/huanzi-qch</p>
-                                        <p>github:https://github.com/huanzi-qch</p>
-                                        <p>gitee:https://gitee.com/huanzi-qch</p>
-                                        <p>QQ交流群:1015379123</p>
+
                                     </div>
                                 </div>
                             </div>
@@ -117,32 +99,7 @@
                                     </div>
                                 </div>
                             </div>
-                            <div class="layui-col-md6">
-                                <div class="layui-card">
-                                    <div class="layui-card-header">AD广告位(长期招租,如有需要请私信)</div>
-                                    <div class="layui-card-body">
-                                        <a target="_blank" href="https://s.click.taobao.com/zb70Vtu">阿里云服务器(ECS)等,高性能服务器,就选阿里云</a><br/>
-                                        <a target="_blank" href="https://s.click.taobao.com/q9rZYtu">虚机+服务器,独享虚机服务 1c1g 3M带宽</a><br/>
-                                        <a target="_blank" href="https://s.click.taobao.com/2khzUtu">云服务器,企业级云服务器特惠5折</a><br/>
-                                        <a target="_blank" href="https://s.click.taobao.com/vLrzUtu">全民云计算,1核1G仅需293元/年</a><br/>
-                                        <a target="_blank" href="https://s.click.taobao.com/8PG0Vtu">云服务器,低至323元/年</a><br/>
-                                        <a target="_blank" href="https://s.click.taobao.com/L110Vtu">云服务器,十倍性能提升,最佳性价比</a><br/>
-                                    </div>
-                                </div>
-                            </div>
-                            <div class="layui-col-md12">
-                                <div class="layui-card">
-                                    <div class="layui-card-header">AD广告位(长期招租,如有需要请私信)</div>
-                                    <div class="layui-card-body">
-                                        <a target="_blank" href="https://s.click.taobao.com/zb70Vtu">阿里云服务器(ECS)等,高性能服务器,就选阿里云</a><br/>
-                                        <a target="_blank" href="https://s.click.taobao.com/q9rZYtu">虚机+服务器,独享虚机服务 1c1g 3M带宽</a><br/>
-                                        <a target="_blank" href="https://s.click.taobao.com/2khzUtu">云服务器,企业级云服务器特惠5折</a><br/>
-                                        <a target="_blank" href="https://s.click.taobao.com/vLrzUtu">全民云计算,1核1G仅需293元/年</a><br/>
-                                        <a target="_blank" href="https://s.click.taobao.com/8PG0Vtu">云服务器,低至323元/年</a><br/>
-                                        <a target="_blank" href="https://s.click.taobao.com/L110Vtu">云服务器,十倍性能提升,最佳性价比</a><br/>
-                                    </div>
-                                </div>
-                            </div>
+
                         </div>
                     </div>
                 </div>
@@ -151,7 +108,7 @@
 
         <!-- 底部固定区域 -->
         <div class="layui-footer" th:utext="${sys.sysBottomText}">
-            © XXX系统
+            © 系统
         </div>
     </div>
     <script th:inline="javascript">

+ 92 - 0
src/main/resources/view/sys/aComCNTAnbSNB/CNTAndSNB.html

@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<!--解决idea thymeleaf 表达式模板报红波浪线-->
+<!--suppress ALL -->
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+    <!-- 引入公用部分 -->
+    <script th:replace="common/head::static"></script>
+    <!-- 游戏数据用户相关样式 -->
+    <link th:href="@{/sys/aComCNTAndSNB/css/CNTAndSNB.css}" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div class="layui-row layui-col-space15">
+    <div class="layui-col-md12">
+        <h5>*** 红色标记部分为消费,绿色标记部分为产出***</h5>
+    </div>
+    <div class="layui-col-md6">
+        <div class="layui-card">
+            <div class="layui-card-header">CNT统计</div>
+            <div class="layui-card-body">
+                <!-- 表格主体 -->
+                <table class="layui-hide" id="cntTable" lay-filter="test"></table>
+                <!-- 模板 -->
+                <script type="text/html" id="cntTableToolbarDemo">
+                    <div class="layui-btn-container">
+                        <button class="layui-btn layui-btn-sm" lay-event="cntReload">刷新</button>
+                    </div>
+                </script>
+            </div>
+        </div>
+    </div>
+    <div class="layui-col-md6">
+        <div class="layui-card">
+            <div class="layui-card-header">
+                <label class="layui-form-label" >CNT筛选日期:</label>
+                <div class="layui-input-inline" style="width: 300px;">
+                    <input type="text" class="layui-input" id="cntDate" placeholder=" - ">
+                </div>
+            </div>
+            <div class="layui-card-body">
+                <!-- 表格主体 -->
+                <table class="layui-hide" id="cntDateTable" lay-filter="test"></table>
+                <!-- 模板 -->
+                <script type="text/html" id="cntDateTableToolbarDemo">
+                    <div class="layui-btn-container">
+                        <button class="layui-btn layui-btn-sm" lay-event="cntDateReload">刷新</button>
+                    </div>
+                </script>
+            </div>
+        </div>
+    </div>
+
+    <div class="layui-col-md6">
+        <div class="layui-card">
+            <div class="layui-card-header">SNB统计</div>
+            <div class="layui-card-body">
+                <!-- 表格主体 -->
+                <table class="layui-hide" id="snbTable" lay-filter="test"></table>
+                <!-- 模板 -->
+                <script type="text/html" id="snbTableToolbarDemo">
+                    <div class="layui-btn-container">
+                        <button class="layui-btn layui-btn-sm" lay-event="snbReload">刷新</button>
+                    </div>
+                </script>
+            </div>
+        </div>
+
+    </div>
+    <div class="layui-col-md6">
+        <div class="layui-card">
+            <div class="layui-card-header">
+                <label class="layui-form-label" >SNB筛选日期:</label>
+                <div class="layui-input-inline" style="width: 300px;">
+                    <input type="text" class="layui-input" id="snbDate" placeholder=" - ">
+                </div>
+            </div>
+            <div class="layui-card-body">
+                <!-- 表格主体 -->
+                <table class="layui-hide" id="snbDateTable" lay-filter="test"></table>
+                <!-- 模板 -->
+                <script type="text/html" id="snbDateTableToolbarDemo">
+                    <div class="layui-btn-container">
+                        <button class="layui-btn layui-btn-sm" lay-event="snbDateReload">刷新</button>
+                    </div>
+                </script>
+            </div>
+        </div>
+    </div>
+</div>
+</body>
+<!-- js -->
+<script th:src="@{/sys/aComCNTAndSNB/js/CNTAndSNB.js}"></script>
+</html>

+ 85 - 0
src/main/resources/view/sys/aComConfig/fruitConfig.html

@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<!--解决idea thymeleaf 表达式模板报红波浪线-->
+<!--suppress ALL -->
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+    <!-- 引入公用部分 -->
+    <script th:replace="common/head::static"></script>
+    <!-- 游戏数据用户相关样式 -->
+    <link th:href="@{/sys/aComConfig/css/seedConfig.css}" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div class="layui-row layui-col-space15">
+    <!-- 树 -->
+    <div class="layui-col-md9">
+        <div class="layui-card">
+            <div class="layui-card-header">出售果实设置,即转换snb等</div>
+            <div class="layui-card-body">
+                <!-- 表格主体 -->
+                <table class="layui-hide" id="fruitConfigTable" lay-filter="test"></table>
+                <script type="text/html" id="fruitConfigTableBarDemo">
+                    <a class="layui-btn layui-btn-xs" lay-event="edit">编辑<i class="layui-icon layui-icon-edit"></i></a>
+                </script>
+            </div>
+        </div>
+
+    </div>
+    <!-- 操作表单 -->
+    <div class="layui-col-md3">
+        <div class="layui-card">
+            <div class="layui-card-header">操作表单</div>
+            <div class="layui-card-body">
+                <form id="fruitConfigForm" class="layui-form layui-form-pane">
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">名字</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="name" autocomplete="off" placeholder="名字"
+                                   class="layui-input" readonly = "readonly">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">兑换价格SNB</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="priceSnb" autocomplete="off" placeholder="兑换价格SNB"
+                                   class="layui-input" lay-verify="positiveNumberRequiredTrue|positiveWholeNumberRequiredTrue">
+                        </div>
+                    </div>
+                    <!--<div class="layui-form-item">-->
+                    <!--    <label class="layui-form-label">兑换价格CNT</label>-->
+                    <!--    <div class="layui-input-block">-->
+                    <!--        <input type="text" name="priceCnt" autocomplete="off" placeholder="兑换价格CNT"-->
+                    <!--               class="layui-input" lay-verify="positiveNumberRequiredTrue|positiveWholeNumberRequiredTrue">-->
+                    <!--    </div>-->
+                    <!--</div>-->
+                    <div class="layui-form-item layui-form-text">
+                        <label class="layui-form-label">果实描述</label>
+                        <div class="layui-input-block">
+                            <textarea name="fruitDescribe" placeholder="请输入内容" class="layui-textarea"></textarea>
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <div class="layui-inline">
+                            <label class="layui-form-label">更新时间</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="updateTime" autocomplete="off" class="layui-input"
+                                       readonly="readonly">
+                            </div>
+                        </div>
+                    </div>
+                    <!-- 隐藏域 -->
+                    <input type="text" name="id" hidden="hidden"/>
+                    <div class="layui-form-item">
+                        <div class="layui-input-block">
+                            <a class="layui-btn" type="submit" lay-submit lay-filter="fruitConfigFilter">保存</a>
+                        </div>
+                    </div>
+                </form>
+
+            </div>
+        </div>
+    </div>
+</div>
+</body>
+<!-- js -->
+<script th:src="@{/sys/aComConfig/js/fruitConfig.js}"></script>
+</html>

+ 95 - 0
src/main/resources/view/sys/aComConfig/landConfig.html

@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<!--解决idea thymeleaf 表达式模板报红波浪线-->
+<!--suppress ALL -->
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+    <!-- 引入公用部分 -->
+    <script th:replace="common/head::static"></script>
+    <!-- 游戏数据用户相关样式 -->
+    <link th:href="@{/sys/aComConfig/css/seedConfig.css}" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div class="layui-row layui-col-space15">
+    <!-- 树 -->
+    <div class="layui-col-md9">
+        <div class="layui-card">
+            <div class="layui-card-header">土地</div>
+            <div class="layui-card-body">
+                <!-- 表格主体 -->
+                <table class="layui-hide" id="landConfigTable" lay-filter="test"></table>
+                <script type="text/html" id="landConfigTableBarDemo">
+                    <a class="layui-btn layui-btn-xs" lay-event="edit">编辑<i class="layui-icon layui-icon-edit"></i></a>
+                </script>
+            </div>
+        </div>
+
+    </div>
+    <!-- 操作表单 -->
+    <div class="layui-col-md3">
+        <div class="layui-card">
+            <div class="layui-card-header">操作表单</div>
+            <div class="layui-card-body">
+                <form id="landConfigForm" class="layui-form layui-form-pane">
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">土地名字</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="name" autocomplete="off" placeholder="名字"
+                                   class="layui-input">
+                        </div>
+                    </div>
+                    <div class="layui-form-item"  id="landMultipleId">
+                        <label class="layui-form-label">初始化的倍数</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="initMultiple" lay-verify="positiveNumberRequiredTrue|positiveWholeNumberRequiredTrue"
+                                   autocomplete="off" placeholder="倍数"
+                                   class="layui-input">
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">1年租赁费用CNT</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="rental2" autocomplete="off" placeholder="1年租赁费用"
+                                   class="layui-input" lay-verify="positiveNumberRequiredTrue|positiveWholeNumberRequiredTrue">
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">5年租赁费用CNT</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="rental3" autocomplete="off" placeholder="5年租赁费用"
+                                   class="layui-input" lay-verify="positiveNumberRequiredTrue|positiveWholeNumberRequiredTrue">
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item layui-form-text">
+                        <label class="layui-form-label">土地描述</label>
+                        <div class="layui-input-block">
+                            <textarea name="landDescribe" placeholder="请输入内容" class="layui-textarea"></textarea>
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <div class="layui-inline">
+                            <label class="layui-form-label">更新时间</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="updateTime" autocomplete="off" class="layui-input"
+                                       readonly="readonly">
+                            </div>
+                        </div>
+                    </div>
+                    <!-- 隐藏域 -->
+                    <input type="text" name="id" hidden="hidden"/>
+                    <div class="layui-form-item">
+                        <div class="layui-input-block">
+                            <a class="layui-btn" type="submit" lay-submit lay-filter="landConfigFilter">保存</a>
+                        </div>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+</body>
+<!-- js -->
+<script th:src="@{/sys/aComConfig/js/landConfig.js}"></script>
+</html>

+ 106 - 0
src/main/resources/view/sys/aComConfig/seedConfig.html

@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<!--解决idea thymeleaf 表达式模板报红波浪线-->
+<!--suppress ALL -->
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+    <!-- 引入公用部分 -->
+    <script th:replace="common/head::static"></script>
+    <!-- 游戏数据用户相关样式 -->
+    <link th:href="@{/sys/aComConfig/css/seedConfig.css}" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div class="layui-row layui-col-space15">
+    <!-- 树 -->
+    <div class="layui-col-md9">
+        <div class="layui-card">
+            <div class="layui-card-header">种子列表</div>
+            <div class="layui-card-body">
+                <!-- 表格主体 -->
+                <table class="layui-hide" id="seedConfigTable" lay-filter="test"></table>
+                <script type="text/html" id="seedConfigTableBarDemo">
+                    <a class="layui-btn layui-btn-xs" lay-event="edit">编辑<i class="layui-icon layui-icon-edit"></i></a>
+                </script>
+            </div>
+        </div>
+
+    </div>
+    <!-- 操作表单 -->
+    <div class="layui-col-md3">
+        <div class="layui-card">
+            <div class="layui-card-header">操作表单</div>
+            <div class="layui-card-body">
+                <form id="seedConfigForm" class="layui-form layui-form-pane">
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">种子名</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="name" autocomplete="off" placeholder="种子名字"
+                                   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="maturity" autocomplete="off" placeholder="输入天数"
+                                   class="layui-input" lay-verify="positiveWholeNumberRequiredTrue">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">1年收获量</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="harvest2" autocomplete="off" placeholder="输入收获量"
+                                   class="layui-input" lay-verify="positiveNumberRequiredTrue|positiveWholeNumberRequiredTrue" >
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">5年收获量</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="harvest3" autocomplete="off" placeholder="输入收获量"
+                                   class="layui-input" lay-verify="positiveNumberRequiredTrue|positiveWholeNumberRequiredTrue" >
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">出售价(CNT)</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="priceCnt" autocomplete="off" placeholder="CNT"
+                                   class="layui-input" lay-verify="positiveNumberRequiredTrue|positiveWholeNumberRequiredTrue">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">出售价(SNB)</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="priceSnb" autocomplete="off" placeholder="SNB"
+                                   class="layui-input" lay-verify="positiveNumberRequiredTrue|positiveWholeNumberRequiredTrue">
+                        </div>
+                    </div>
+                    <div class="layui-form-item layui-form-text">
+                        <label class="layui-form-label">种子描述</label>
+                        <div class="layui-input-block">
+                            <textarea name="seedDescribe" placeholder="请输入内容" class="layui-textarea"></textarea>
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <div class="layui-inline">
+                            <label class="layui-form-label">更新时间</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="updateTime" autocomplete="off" class="layui-input"
+                                       readonly="readonly">
+                            </div>
+                        </div>
+                    </div>
+                    <!-- 隐藏域 -->
+                    <input type="text" name="id" hidden="hidden"/>
+                    <div class="layui-form-item">
+                        <div class="layui-input-block">
+                            <a class="layui-btn"type="submit" lay-submit lay-filter="seedConfigFilter">保存</a>
+                        </div>
+                    </div>
+                </form>
+
+            </div>
+        </div>
+    </div>
+</div>
+</body>
+<!-- js -->
+<script th:src="@{/sys/aComConfig/js/seedConfig.js}"></script>
+</html>

+ 36 - 0
src/main/resources/view/sys/aComPlayerGoods/playerGoods.html

@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<!--解决idea thymeleaf 表达式模板报红波浪线-->
+<!--suppress ALL -->
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+    <!-- 引入公用部分 -->
+    <script th:replace="common/head::static"></script>
+    <!-- 游戏数据用户相关样式 -->
+    <link th:href="@{/sys/aComPlayerGoods/css/playerGoods.css}" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div class="layui-row layui-col-space15">
+    <div class="layui-col-md12">
+        <h5>*** 红色标记部分为消费,绿色标记部分为产出***</h5>
+    </div>
+    <!--仓库为兑换的snb,统计用户总体snb-->
+    <div class="layui-col-md6">
+        <div class="layui-card">
+            <div class="layui-card-header">仓库数据统计</div>
+            <div class="layui-card-body">
+                <!-- 表格主体 -->
+                <table class="layui-hide" id="playerGoodsTable" lay-filter="test"></table>
+                <!-- 模板 -->
+                <script type="text/html" id="playerGoodsTableToolbarDemo">
+                    <div class="layui-btn-container">
+                        <button class="layui-btn layui-btn-sm" lay-event="playerGoodsReload">刷新</button>
+                    </div>
+                </script>
+            </div>
+        </div>
+    </div>
+</div>
+</body>
+<!-- js -->
+<script th:src="@{/sys/aComPlayerGoods/js/playerGoods.js}"></script>
+</html>

+ 163 - 0
src/main/resources/view/sys/aComUser/user.html

@@ -0,0 +1,163 @@
+<!DOCTYPE html>
+<!--解决idea thymeleaf 表达式模板报红波浪线-->
+<!--suppress ALL -->
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+    <!-- 引入公用部分 -->
+    <script th:replace="common/head::static"></script>
+    <!-- 游戏数据用户相关样式 -->
+    <link th:href="@{/sys/aComUser/css/user.css}" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div class="layui-row layui-col-space15">
+    <!-- 树 -->
+    <div class="layui-col-md6">
+        <div class="layui-card">
+            <div class="layui-card-header">用户列表</div>
+            <div class="layui-card-body">
+                <!-- 表格主体 -->
+                <table class="layui-hide" id="userTable" lay-filter="test"></table>
+                <!-- 模板 -->
+                <script type="text/html" id="userTableToolbarDemo">
+                    <div class="layui-form-item">
+                        <div class="layui-inline">
+                            <label class="layui-form-label">钱包地址</label>
+                            <div class="layui-input-inline" style="width: 300px;">
+                                <input type="text" id="queryByAddress" name="queryByAddress" autocomplete="off"
+                                       placeholder="输入钱包地址" class="layui-input layui-btn-sm">
+                            </div>
+                        </div>
+                        <div class="layui-inline">
+                            <button class="layui-btn layui-btn-sm" style="padding: 0 10px;" lay-event="query">查询<i
+                                    class="layui-icon layui-icon-search"></i></button>
+                        </div>
+                    </div>
+                </script>
+                <script type="text/html" id="userTableBarDemo">
+                    <a class="layui-btn layui-btn-xs" lay-event="edit">编辑<i class="layui-icon layui-icon-edit"></i></a>
+                </script>
+            </div>
+        </div>
+
+    </div>
+    <!-- 操作表单 -->
+    <div class="layui-col-md6">
+        <div class="layui-card">
+            <div class="layui-card-header">操作表单</div>
+            <div class="layui-card-body">
+                <form id="comUserForm" class="layui-form layui-form-pane">
+                    <!--<div class="layui-form-item">-->
+                    <!--    <label class="layui-form-label">金币</label>-->
+                    <!--    <div class="layui-input-block">-->
+                    <!--        <input type="text" name="gold" autocomplete="off" placeholder="金币"-->
+                    <!--               class="layui-input" readonly="readonly" lay-verify="positiveWholeNumberRequiredTrue">-->
+                    <!--    </div>-->
+                    <!--</div>-->
+                    <!--<div class="layui-form-item">-->
+                    <!--    <label class="layui-form-label">钻石</label>-->
+                    <!--    <div class="layui-input-block">-->
+                    <!--        <input type="text" name="diamond" autocomplete="off" placeholder="钻石"-->
+                    <!--               class="layui-input" readonly="readonly" lay-verify="positiveWholeNumberRequiredTrue">-->
+                    <!--    </div>-->
+                    <!--</div>-->
+                    <!--<div class="layui-form-item">-->
+                    <!--    <label class="layui-form-label">CNT</label>-->
+                    <!--    <div class="layui-input-block">-->
+                    <!--        <input type="text" name="cnt" autocomplete="off" placeholder="CNT"-->
+                    <!--               class="layui-input" readonly="readonly" lay-verify="positiveWholeNumberRequiredTrue">-->
+                    <!--    </div>-->
+                    <!--</div>-->
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">SNB</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="snb" autocomplete="off" placeholder="SNB"
+                                   class="layui-input" lay-verify="positiveWholeNumberRequiredTrue">
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">是否限制登录</label>
+                        <div class="layui-input-block">
+                            <input type="radio" name="limitLogin" value=1 title="是">
+                            <input type="radio" name="limitLogin" value=0 title="否">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">是否限制交易</label>
+                        <div class="layui-input-block">
+                            <input type="radio" name="limitTran" value=1 title="是">
+                            <input type="radio" name="limitTran" value=0 title="否">
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item">
+                        <div class="layui-inline">
+                            <label class="layui-form-label">最近登录时间</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="lastLogin" autocomplete="off" class="layui-input"
+                                       readonly="readonly">
+                            </div>
+                        </div>
+                    </div>
+                    <!-- 隐藏域 -->
+                    <input type="text" name="userId" hidden="hidden"/>
+                    <input type="text" name="address" hidden="hidden"/>
+
+                    <div class="layui-form-item">
+                        <div class="layui-input-block">
+                            <a class="layui-btn" type="submit" lay-submit lay-filter="comUserFilter" >保存</a>
+                        </div>
+                    </div>
+                </form>
+
+            </div>
+        </div>
+    </div>
+    <div class="layui-col-md12">
+        <div class="layui-card">
+            <div class="layui-card-header">用户SNB明细</div>
+            <div class="layui-card-body">
+                <!-- 表格主体 -->
+                <table class="layui-hide" id="comSnbTranTable" lay-filter="test"></table>
+                <!-- 模板 -->
+                <script type="text/html" id="comSnbTranTableToolbarDemo">
+                    <div class="layui-btn-container">
+                        <button class="layui-btn layui-btn-sm" lay-event="snbReload">刷新</button>
+                    </div>
+                </script>
+            </div>
+        </div>
+        <div class="layui-card">
+            <div class="layui-card-header">用户CNT明细</div>
+            <div class="layui-card-body">
+                <!-- 表格主体 -->
+                <table class="layui-hide" id="comCntOrderTable" lay-filter="test"></table>
+                <!-- 模板 -->
+                <script type="text/html" id="comCntOrderTableToolbarDemo">
+                    <div class="layui-btn-container">
+                        <button class="layui-btn layui-btn-sm" lay-event="cntReload">刷新</button>
+                    </div>
+                </script>
+            </div>
+        </div>
+
+        <div class="layui-card">
+            <div class="layui-card-header">用户仓库操作列表</div>
+            <div class="layui-card-body">
+                <!-- 表格主体 -->
+                <table class="layui-hide" id="comPlayerLogTable" lay-filter="test"></table>
+                <!-- 模板 -->
+                <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>
+</body>
+<!-- js -->
+<script th:src="@{/sys/aComUser/js/user.js}"></script>
+</html>

+ 96 - 0
src/main/resources/view/sys/aComUser/userPlayerGoods.html

@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<!--解决idea thymeleaf 表达式模板报红波浪线-->
+<!--suppress ALL -->
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+    <!-- 引入公用部分 -->
+    <script th:replace="common/head::static"></script>
+    <!-- 游戏数据用户相关样式 -->
+    <link th:href="@{/sys/aComUser/css/user.css}" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div class="layui-row layui-col-space15">
+    <!-- 树 -->
+    <div class="layui-col-md6">
+        <div class="layui-card">
+            <div class="layui-card-header">用户仓库列表</div>
+            <div class="layui-card-body">
+                <!-- 表格主体 -->
+                <table class="layui-hide" id="userPlayerGoodsTable" lay-filter="test"></table>
+                <!-- 模板 -->
+                <script type="text/html" id="userPlayerGoodsTableToolbarDemo">
+                    <div class="layui-form-item">
+                        <div class="layui-inline">
+                            <label class="layui-form-label">钱包地址</label>
+                            <div class="layui-input-inline" style="width: 300px;">
+                                <input type="text" id="queryByAddress" name="queryByAddress" autocomplete="off"
+                                       placeholder="输入钱包地址" class="layui-input layui-btn-sm">
+                            </div>
+                        </div>
+                        <div class="layui-inline">
+                            <button class="layui-btn layui-btn-sm" style="padding: 0 10px;" lay-event="query">查询<i
+                                    class="layui-icon layui-icon-search"></i></button>
+                        </div>
+                    </div>
+                </script>
+                <script type="text/html" id="userPlayerGoodsTableBarDemo">
+                    <a class="layui-btn layui-btn-xs" lay-event="edit">编辑<i class="layui-icon layui-icon-edit"></i></a>
+                </script>
+            </div>
+        </div>
+
+    </div>
+    <!-- 操作表单 -->
+    <div class="layui-col-md6">
+        <div class="layui-card">
+            <div class="layui-card-header">操作表单</div>
+            <div class="layui-card-body">
+                <form id="comUsePlayerGoodsForm" class="layui-form layui-form-pane">
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">物品名字</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="name" autocomplete="off" placeholder="物品名字"
+                                   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="amount" autocomplete="off" placeholder="物品数量"
+                                   class="layui-input" lay-verify="positiveWholeNumberRequiredTrue">
+                        </div>
+                    </div>
+                    <!-- 隐藏域 -->
+                    <input type="text" name="goodsId" hidden="hidden"/>
+
+                    <div class="layui-form-item">
+                        <div class="layui-input-block">
+                            <a class="layui-btn" type="submit" lay-submit lay-filter="comUserPlayerGoodsFilter" >保存</a>
+                        </div>
+                    </div>
+                </form>
+
+            </div>
+        </div>
+    </div>
+    <div class="layui-col-md12">
+        <div class="layui-card">
+            <div class="layui-card-header">用户仓库操作列表</div>
+            <div class="layui-card-body">
+                <!-- 表格主体 -->
+                <table class="layui-hide" id="comPlayerLogTable" lay-filter="test"></table>
+                <!-- 模板 -->
+                <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>
+</body>
+<!-- js -->
+<script th:src="@{/sys/aComUser/js/userPlayerGoods.js}"></script>
+</html>

+ 83 - 0
src/main/resources/view/sys/aComUser/userPlayerLands.html

@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<!--解决idea thymeleaf 表达式模板报红波浪线-->
+<!--suppress ALL -->
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+    <!-- 引入公用部分 -->
+    <script th:replace="common/head::static"></script>
+    <!-- 游戏数据用户相关样式 -->
+    <link th:href="@{/sys/aComUser/css/user.css}" rel="stylesheet" type="text/css"/>
+</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">
+                <!-- 表格主体 -->
+                <table class="layui-hide" id="userPlayerLandTable" lay-filter="test"></table>
+                <!-- 模板 -->
+                <script type="text/html" id="userPlayerLandTableToolbarDemo">
+                    <div class="layui-form-item">
+                        <div class="layui-inline">
+                            <label class="layui-form-label">钱包地址</label>
+                            <div class="layui-input-inline" style="width: 300px;">
+                                <input type="text" id="queryByAddress" name="queryByAddress" autocomplete="off"
+                                       placeholder="输入钱包地址" class="layui-input layui-btn-sm">
+                            </div>
+                        </div>
+                        <div class="layui-inline">
+                            <button class="layui-btn layui-btn-sm" style="padding: 0 10px;" lay-event="query">查询<i
+                                    class="layui-icon layui-icon-search"></i></button>
+                        </div>
+                    </div>
+                </script>
+                <script type="text/html" id="userPlayerLandTableBarDemo">
+                    <a class="layui-btn layui-btn-xs" lay-event="edit">编辑<i class="layui-icon layui-icon-edit"></i></a>
+                </script>
+            </div>
+        </div>
+
+    </div>
+    <!-- 操作表单 -->
+    <div class="layui-col-md6">
+        <div class="layui-card">
+            <div class="layui-card-header">操作表单</div>
+            <div class="layui-card-body">
+                <form id="comUsePlayerLandForm" class="layui-form layui-form-pane">
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">租赁时间</label>
+                        <div class="layui-input-block">
+                            <div class="layui-input-inline">
+                                <input type="text" class="layui-input" name="leaseTime" id="leaseTime"  autocomplete="off" timeFormat="yyyy-MM-dd HH:mm:ss" placeholder="yyyy-MM-dd HH:mm:ss">
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">种植时间</label>
+                        <div class="layui-input-block">
+                            <div class="layui-input-inline">
+                                <input type="text" class="layui-input" name="plantStart" id="plantStart"  autocomplete="off"  timeFormat="yyyy-MM-dd HH:mm:ss" placeholder="yyyy-MM-dd HH:mm:ss">
+                            </div>
+                        </div>
+                    </div>
+                    <!-- 隐藏域 -->
+                    <input type="text" name="id" hidden="hidden"/>
+
+                    <div class="layui-form-item">
+                        <div class="layui-input-block">
+                            <a class="layui-btn" type="submit" lay-submit lay-filter="comUserPlayerLandFilter" >保存</a>
+                        </div>
+                    </div>
+                </form>
+
+            </div>
+        </div>
+    </div>
+
+</div>
+</body>
+<!-- js -->
+<script th:src="@{/sys/aComUser/js/userPlayerLands.js}"></script>
+</html>