Browse Source

1.添加了两个后台html界面。
2.修改了redis缓存读取

slambb 3 years ago
parent
commit
6f8bf1ae95
20 changed files with 599 additions and 115 deletions
  1. 7 0
      src/main/java/com/td/boss/BossApplication.java
  2. 9 0
      src/main/java/com/td/boss/common/service/ComConfigService.java
  3. 12 0
      src/main/java/com/td/boss/common/service/ComConfigServiceImpl.java
  4. 39 23
      src/main/java/com/td/boss/filter/gameFilter.java
  5. 2 12
      src/main/java/com/td/boss/game/commallseed/controller/ComMallSeedController.java
  6. 9 7
      src/main/java/com/td/boss/game/complayercultivate/serivce/ComPlayerCultivateSerivce.java
  7. 33 21
      src/main/java/com/td/boss/game/complayercultivate/serivce/ComPlayerCultivateSerivceImpl.java
  8. 5 20
      src/main/java/com/td/boss/game/complayergoods/controller/ComPlayerGoodsController.java
  9. 3 9
      src/main/java/com/td/boss/game/complayerland/controller/ComPlayerLandController.java
  10. 8 8
      src/main/java/com/td/boss/game/complayerlog/service/ComPlayerLogServiceImpl.java
  11. 10 1
      src/main/java/com/td/boss/game/comusers/controller/ComUsersController.java
  12. 66 6
      src/main/java/com/td/boss/sys/sysGame/controller/sysGamePropertyController.java
  13. 7 7
      src/main/java/com/td/boss/util/DappUtil.java
  14. 5 1
      src/main/resources/static/sys/aComCNTAndSNB/js/CNTAndSNB.js
  15. 33 0
      src/main/resources/static/sys/aComConfig/js/comConfig.js
  16. 46 0
      src/main/resources/static/sys/aComConfig/js/gameConfig.js
  17. 4 0
      src/main/resources/static/sys/aComUser/js/user.js
  18. 15 0
      src/main/resources/static/sys/aComUser/js/userPlayerGoods.js
  19. 147 0
      src/main/resources/view/sys/aComConfig/comConfig.html
  20. 139 0
      src/main/resources/view/sys/aComConfig/gameConfig.html

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

@@ -1,4 +1,5 @@
 package com.td.boss;
+import com.td.boss.common.service.ComConfigService;
 import com.td.boss.game.comusers.pojo.ComUsers;
 import com.td.boss.game.comusers.service.ComUsersService;
 import com.td.boss.sys.sysmenu.vo.SysMenuVo;
@@ -88,6 +89,9 @@ class IndexController {
     @Autowired
     private ComUsersService comUsersService;
 
+    @Autowired
+    private ComConfigService comConfigService;
+
     @Value("${server.servlet.context-path:}")
     private String contextPath;
 
@@ -117,6 +121,9 @@ class IndexController {
                 SysSettingLimitVo sysSettingLimitVo = sysSettingLimitService.get("1").getData();
                 SysSettingLimitUtil.setSysSettingLimitMap(sysSettingLimitVo);
 
+                //更新Redis数据
+                comConfigService.updateList();
+
                 //获取本机内网IP
                 log.info("启动成功:" + "http://" + InetAddress.getLocalHost().getHostAddress() + ":" + port + contextPath);
             } catch (UnknownHostException e) {

+ 9 - 0
src/main/java/com/td/boss/common/service/ComConfigService.java

@@ -1,5 +1,6 @@
 package com.td.boss.common.service;
 
+import com.td.boss.common.pojo.ComConfig;
 import com.td.boss.game.complayersattri.vo.ComPlayersLuckyLandLevelUpVo;
 
 import java.util.List;
@@ -11,4 +12,12 @@ public interface ComConfigService {
 
     <T> List<T> selectListByKey(String key, Class<T> clazz);
     <T> T selectByKey(String key, Class<T> clazz);
+
+    List<ComConfig> selectAllComConfig();
+
+    /**
+     * 更新一个redis缓存list
+     * @return
+     */
+    List<ComConfig> updateList();
 }

+ 12 - 0
src/main/java/com/td/boss/common/service/ComConfigServiceImpl.java

@@ -35,6 +35,18 @@ public class ComConfigServiceImpl implements ComConfigService {
         return list;
     }
 
+    @Override
+    public List<ComConfig> updateList() {
+        List<ComConfig> list = repository.list();
+        redisTemplate.opsForValue().set(redisKey, JSONUtil.toJsonStr(list));
+        return list;
+    }
+
+    @Override
+    public List<ComConfig> selectAllComConfig() {
+        return list();
+    }
+
     @Override
     public String selectByKey(String key) {
         List<ComConfig> list = list();

+ 39 - 23
src/main/java/com/td/boss/filter/gameFilter.java

@@ -1,6 +1,7 @@
 package com.td.boss.filter;
 
 
+import cn.hutool.core.convert.Convert;
 import com.td.boss.common.pojo.IpVo;
 import com.td.boss.common.pojo.Result;
 import com.td.boss.config.enums.ResultEnum;
@@ -10,6 +11,7 @@ import io.jsonwebtoken.SignatureException;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.util.StringUtils;
 
 import javax.servlet.*;
@@ -17,6 +19,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @author:slambb
@@ -30,6 +33,10 @@ public class gameFilter implements Filter {
     @Autowired
     private JwtTokenUtil jwtTokenUtil;
 
+    //添加redis 防止恶意请求
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
     @Override
     public void init(FilterConfig filterConfig) throws ServletException {
     }
@@ -48,7 +55,7 @@ public class gameFilter implements Filter {
         response.setHeader("Access-Control-Max-Age", "3600");
         response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept , Authorization");
 
-        log.info("********进入GameFilter过滤器********");
+        //log.info("********进入GameFilter过滤器********");
         HttpServletRequest req = (HttpServletRequest) servletRequest;
         //String method = req.getMethod();
         //if (method.equals("OPTIONS")) {
@@ -56,31 +63,16 @@ public class gameFilter implements Filter {
         //    response.flushBuffer();
         //    return;
         //}
+        //登陆IP不在白名单
+        String ipAddr = IpUtil.getIpAddr(req);
+
         String token = req.getHeader(tokenHeader);
         String path = req.getServletPath();
-        //登录,获取验证码,不用登录的接口
-        if (!(path.indexOf("game") > -1) // 存在game字段,需要检验token
-                || path.indexOf("loginToken") > -1
-            // || path.indexOf("publicKeyAndSys") > -1
-            // || path.indexOf("playback")>-1
-            // || path.indexOf("game_websocket") > -1 // todo 暂时放行
-            //这里三个接口给DApp后台调用
-            //|| path.indexOf("getSNBAndFreeze") >-1
-            //|| path.indexOf("setSNBAndUnfreeze") >-1
-            //|| path.indexOf("cntPlayback") >-1
-        ) {
-            //登录情况直接放行
-            filterChain.doFilter(servletRequest, response);
-            return;
-        }
 
         //这里三个接口给DApp后台调用,需要指定ip访问
-        if (
-                path.indexOf("getSNBAndFreeze") > -1
+        if (path.indexOf("getSNBAndFreeze") > -1
                         || path.indexOf("setSNBAndUnfreeze") > -1
                         || path.indexOf("cntPlayback") > -1) {
-            //登陆IP不在白名单
-            String ipAddr = IpUtil.getIpAddr(req);
             log.info("ipAddr:"+ipAddr);
             //IpVo ipVo = IpUtil.getIpVoByRequest(req);
             //log.info("ip2Addr:"+ ipVo.toString());
@@ -90,7 +82,31 @@ public class gameFilter implements Filter {
                 response.getWriter().print(JsonUtils.toJson(Result.of(null, false, ResultEnum.LOGIN_IP_IS_ERROR.getMessage(), ResultEnum.LOGIN_IP_IS_ERROR.getCode())));
                 return;
             }
+            filterChain.doFilter(servletRequest, response);
+            return;
+        }
+
+        /**
+         * 除了上面三个提供给DApp的接口,剩下的game接口都需要限制访问
+         */
+        //设置20秒内可以访问10次,同一个接口
+        String redisKey = "limit-req:".concat(req.getRequestURL().toString()).concat(":").concat(ipAddr);
+        if(! redisTemplate.hasKey(redisKey)){
+            redisTemplate.opsForValue().set(redisKey, String.valueOf(1),20, TimeUnit.SECONDS);
+        }else{
+            int increment =  Convert.toInt(redisTemplate.opsForValue().get(redisKey));
+            if(increment > 10){
+                response.setCharacterEncoding("utf-8");
+                response.getWriter().print(JsonUtils.toJson(Result.of(null, false, ResultEnum.REDIS_IS_LOCK.getMessage(), ResultEnum.REDIS_IS_LOCK.getCode())));
+            } else {
+                redisTemplate.opsForValue().set(redisKey, String.valueOf(++increment),20,TimeUnit.SECONDS);
+            }
+        }
 
+        //登录,获取验证码,不用登录的接口
+        // 存在game字段,需要检验token
+        if (!(path.indexOf("game") > -1)  || path.indexOf("loginToken") > -1) {
+            //登录情况直接放行
             filterChain.doFilter(servletRequest, response);
             return;
         }
@@ -105,14 +121,14 @@ public class gameFilter implements Filter {
             String authToken = token.substring(7);
             try {
                 String userId = jwtTokenUtil.getUserIdFromToken(authToken);
-                log.info("userId:{}", userId);
+                //log.info("userId:{}", userId);
                 //todo 后面需要校验时间,加入可切换 secret 校验
-                log.info("validateToken:{}", jwtTokenUtil.validateToken(authToken, userId));
+                //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)) {
+                if (StringUtils.hasText(userId)) {
                     filterChain.doFilter(new TokenRequestWrapper((HttpServletRequest) servletRequest, userId), response);
                 } else {
                     //不存在用户信息

+ 2 - 12
src/main/java/com/td/boss/game/commallseed/controller/ComMallSeedController.java

@@ -182,12 +182,7 @@ public class ComMallSeedController extends CommonController<ComMallSeedVo, ComMa
             comSnbTranService.save(_snbTran);
 
             redisLock.unlock(_redisKey, String.valueOf(time));
-            try {
-                // 计算断电损耗
-                comPlayerLogService.powerLoss(userId);
-            } catch (Exception e) {
-                System.err.println("断电损耗异常:" + e.getMessage());
-            }
+
             map.put("seed", entityVo.getGoodsIndex());
             map.put("snb", comUsersVo.getSnb());
             return Result.of(map);
@@ -281,12 +276,7 @@ public class ComMallSeedController extends CommonController<ComMallSeedVo, ComMa
         _selfPlayerLog.setWithered(0); //枯萎就设置 1
         ComPlayerLogVo _selfPlayerLogVo = CopyUtil.copy(_selfPlayerLog, ComPlayerLogVo.class);
         comPlayerLogService.save(_selfPlayerLogVo);
-        try {
-            // 计算断电损耗
-            comPlayerLogService.powerLoss(userId);
-        } catch (Exception e) {
-            System.err.println("断电损耗异常:" + e.getMessage());
-        }
+
         map.put("seed", entityVo.getGoodsIndex());
         map.put("playerData",player.getData());
         map.put("isExchange",player.getIsExchange());

+ 9 - 7
src/main/java/com/td/boss/game/complayercultivate/serivce/ComPlayerCultivateSerivce.java

@@ -1,6 +1,7 @@
 package com.td.boss.game.complayercultivate.serivce;
 
 import com.td.boss.common.pojo.Result;
+import com.td.boss.game.commallseed.vo.ComMallSeedVo;
 
 import java.util.Date;
 
@@ -43,17 +44,18 @@ public interface ComPlayerCultivateSerivce {
      */
     Result<?> buyFood(String userId, Integer configLandId);
 
-    Integer getHarvestDays(String userId, Integer configLandId,String plantFlag);
+    Integer getHarvestDays(String userId, Date plantStart, Integer mallType, Integer configLandId, String plantFlag, ComMallSeedVo comMallSeedVo);
 
     /**
      * 是否已经喂养
-     * @param userId 用户编号
-     * @param landType 土地类型 具体是养殖、渔场、放养
+     *
+     * @param userId       用户编号
+     * @param landType     土地类型 具体是养殖、渔场、放养
      * @param configLandId 土地配置表id
-     * @param plantFlag 种植唯一标识
-     * @param begin 查询开始时间
-     * @param end 查询截止时间
+     * @param plantFlag    种植唯一标识
+     * @param begin        查询开始时间
+     * @param end          查询截止时间
      * @return
      */
-    boolean isAnimalEat(String userId, Integer landType, Integer configLandId,String plantFlag, Date begin, Date end) ;
+    boolean isAnimalEat(String userId, Integer landType, Integer configLandId, String plantFlag, Date begin, Date end);
 }

+ 33 - 21
src/main/java/com/td/boss/game/complayercultivate/serivce/ComPlayerCultivateSerivceImpl.java

@@ -117,7 +117,7 @@ public class ComPlayerCultivateSerivceImpl implements ComPlayerCultivateSerivce
             comPlayerLand.setLeaseMultiple(getMaxAmount(comConfigLand.getMallType())); // 养殖场倍数,暂时设置最大值
             comPlayerLand.setLeaseDate(4); // 租赁类型改成 4
             //设置租赁日期,定义一个30天日期
-            comPlayerLand.setLeaseTime(com.td.boss.util.DateUtil.getOldDateAddDay(nowDate,30));
+            comPlayerLand.setLeaseTime(com.td.boss.util.DateUtil.getOldDateAddDay(nowDate, 30));
             //租赁土地
             comPlayerLand.setIsLease(1);
             comPlayerLand.setUpdateTime(nowDate);
@@ -236,7 +236,7 @@ public class ComPlayerCultivateSerivceImpl implements ComPlayerCultivateSerivce
         //判断今天是否已经喂过
         Date begin = DateUtil.beginOfDay(new Date());
         Date end = DateUtil.endOfDay(new Date());
-        if (isAnimalEat(userId, comPlayerLand.getMallType(), configLandId,comPlayerLand.getPlantFlag(), begin, end)) {
+        if (isAnimalEat(userId, comPlayerLand.getMallType(), configLandId, comPlayerLand.getPlantFlag(), begin, end)) {
             return Result.of(null, false, ResultEnum.FOOD_REPEAT_ERROR.getMessage(), ResultEnum.FOOD_REPEAT_ERROR.getCode());
         }
         long time = System.currentTimeMillis() + RedisData.getPlayerCultivateBuyFoodTimeout();
@@ -314,32 +314,43 @@ public class ComPlayerCultivateSerivceImpl implements ComPlayerCultivateSerivce
         return ErrorResult("喂养失败!");
     }
 
+    /**
+     * 获取成熟时间(计算延期天数),2022年4月7日15:55:11-2022年4月8日15:55:11为一天
+     *
+     * @param userId
+     * @param mallType
+     * @param configLandId
+     * @param plantFlag
+     * @param comMallSeedVo
+     * @return
+     */
     @Override
-    public Integer getHarvestDays(String userId, Integer configLandId,String plantFlag) {
-        ComPlayerLand comPlayerLand = comPlayerLandService.findByUserIdAndLandId(userId, configLandId);
+    public Integer getHarvestDays(String userId, Date plantStart, Integer mallType, Integer configLandId, String plantFlag, ComMallSeedVo comMallSeedVo) {
+        //ComPlayerLand comPlayerLand = comPlayerLandService.findByUserIdAndLandId(userId, configLandId);
         //实际上一共喂几次
-        long times = cultivateRepository.countComPlayerCultivateByUserIdAndLandTypeAndConfigLandIdAndPlantFlag(userId, comPlayerLand.getMallType(), configLandId,plantFlag);
+        long times = cultivateRepository.countComPlayerCultivateByUserIdAndLandTypeAndConfigLandIdAndPlantFlag(userId, mallType, configLandId, plantFlag);
         //从当天到现在。一共过了几天
-        long days = DateUtil.betweenDay(new Date(), comPlayerLand.getPlantStart(), true) + 1;
-        //延期追加天数
-        long l = (days - times) * 2;
-        //延期后的日期=成熟期+追加天数
-        //当天也算一天。过了0点就是新的一天
-        return  Convert.toInt(l, 0) + comPlayerLand.getPlantMature() - 1;
+        long days = DateUtil.betweenDay(plantStart, new Date(), false);
+        long l = 0;
+        if (times < days) {
+            l = (days - times) * 2;
+        }
+        return Convert.toInt(l, 0) + comMallSeedVo.getMaturity();
     }
 
     /**
      * 是否已经喂养
-     * @param userId 用户编号
-     * @param landType 土地类型 具体是养殖、渔场、放养
+     *
+     * @param userId       用户编号
+     * @param landType     土地类型 具体是养殖、渔场、放养
      * @param configLandId 土地配置表id
-     * @param plantFlag 种植唯一标识
-     * @param begin 查询开始时间
-     * @param end 查询截止时间
+     * @param plantFlag    种植唯一标识
+     * @param begin        查询开始时间
+     * @param end          查询截止时间
      * @return
      */
     @Override
-    public boolean isAnimalEat(String userId, Integer landType, Integer configLandId,String plantFlag, Date begin, Date end) {
+    public boolean isAnimalEat(String userId, Integer landType, Integer configLandId, String plantFlag, Date begin, Date end) {
         Specification specification = new Specification<ComPlayerDisaster>() {
             @Override
             public Predicate toPredicate(Root<ComPlayerDisaster> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
@@ -379,13 +390,13 @@ public class ComPlayerCultivateSerivceImpl implements ComPlayerCultivateSerivce
             ComMallSeedVo comMallSeedVo = comMallSeedService.findById(comPlayerLandAndPlantVo.getPlantId());
             //todo [牧场养殖渔场需求] 如果是养殖类的,计算延期后的成熟期
             if (ArrayUtil.contains(CultivateKeys.mallType, comPlayerLandAndPlantVo.getMallType())) {
-                Integer days = getHarvestDays(comPlayerLandAndPlantVo.getUserId(), comPlayerLandAndPlantVo.getConfigLandId(),comPlayerLandAndPlantVo.getPlantFlag());
+                Integer days = getHarvestDays(comPlayerLandAndPlantVo.getUserId(), comPlayerLandAndPlantVo.getPlantStart(),comPlayerLandAndPlantVo.getMallType(),comPlayerLandAndPlantVo.getConfigLandId(),comPlayerLandAndPlantVo.getPlantFlag(),comMallSeedVo);
                 comMallSeedVo.setMaturity(days);
 
                 //获取并设置今日喂养状态
                 Date begin = cn.hutool.core.date.DateUtil.beginOfDay(new Date());
                 Date end = cn.hutool.core.date.DateUtil.endOfDay(new Date());
-                boolean animalEat = isAnimalEat(comPlayerLandAndPlantVo.getUserId(), comPlayerLandAndPlantVo.getMallType(), comPlayerLandAndPlantVo.getConfigLandId(),comPlayerLandAndPlantVo.getPlantFlag(), begin, end);
+                boolean animalEat = isAnimalEat(comPlayerLandAndPlantVo.getUserId(), comPlayerLandAndPlantVo.getMallType(), comPlayerLandAndPlantVo.getConfigLandId(), comPlayerLandAndPlantVo.getPlantFlag(), begin, end);
                 comPlayerLandAndPlantVo.setAnimalEat(animalEat);
 
                 //新加一个养殖的信息
@@ -423,12 +434,13 @@ public class ComPlayerCultivateSerivceImpl implements ComPlayerCultivateSerivce
 
     /**
      * 获取最大种植数量
+     *
      * @param mallType
      * @return
      */
-    private Integer getMaxAmount(Integer mallType){
+    private Integer getMaxAmount(Integer mallType) {
         //获取配置 土堆分别最大种植数量,对应类型mallType:1、2、3、4的值
         List<Map> maps = comConfigService.selectListByKey(CultivateKeys.maxAmount, Map.class);
-        return maps.stream().filter(a->a.get("key").equals(mallType)).map(a-> Convert.toInt(a.get("value"),0)).findFirst().orElse(10000);
+        return maps.stream().filter(a -> a.get("key").equals(mallType)).map(a -> Convert.toInt(a.get("value"), 0)).findFirst().orElse(10000);
     }
 }

+ 5 - 20
src/main/java/com/td/boss/game/complayergoods/controller/ComPlayerGoodsController.java

@@ -240,7 +240,7 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
 
         //todo [牧场养殖渔场需求] 如果是养殖类的,计算延期后的成熟期
         if (ArrayUtil.contains(CultivateKeys.mallType, comPlayerLand.getMallType())) {
-            Integer days = comPlayerCultivateSerivce.getHarvestDays(userId, comPlayerLand.getConfigLandId(),comPlayerLand.getPlantFlag());
+            Integer days = comPlayerCultivateSerivce.getHarvestDays(userId, comPlayerLand.getPlantStart(),comPlayerLand.getMallType(),comPlayerLand.getConfigLandId(),comPlayerLand.getPlantFlag(),comMallSeedVo);
             comMallSeedVo.setMaturity(days);
         }
         // 收获,同时重置土地状态,先判断是否成熟
@@ -419,12 +419,7 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
 
             //对应的,存在plantFlag则解锁
             redisLock.unlock(_redisKey, String.valueOf(landTime));
-            try {
-                // 计算断电损耗
-                comPlayerLogService.powerLoss(userId);
-            } catch (Exception e) {
-                System.err.println("断电损耗异常:" + e.getMessage());
-            }
+
             if (ArrayUtil.contains(CultivateKeys.mallType, comPlayerLand.getMallType())) {
                 map.put("msg", isWithered ? "养殖动物已死亡!" : "成功收获动物!");
             } else {
@@ -573,7 +568,7 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
         }
         //todo [牧场养殖渔场需求] 如果是养殖类的,计算延期后的成熟期
         if (ArrayUtil.contains(CultivateKeys.mallType, otherPlayerLand.getMallType())) {
-            Integer days = comPlayerCultivateSerivce.getHarvestDays(otherUserId, otherPlayerLand.getConfigLandId(),otherPlayerLand.getPlantFlag());
+            Integer days = comPlayerCultivateSerivce.getHarvestDays(otherUserId,otherPlayerLand.getPlantStart(),otherPlayerLand.getMallType(),otherPlayerLand.getConfigLandId(),otherPlayerLand.getPlantFlag(),comMallSeedVo);
             comMallSeedVo.setMaturity(days);
         }
         Integer witheredDay = comConfigService.selectByKey( CultivateKeys.witheredDay, Integer.class);
@@ -767,12 +762,7 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
             }
             ComPlayerGoodsVo comPlayerGoodsVo = CopyUtil.copy(comPlayerGoods, ComPlayerGoodsVo.class);
             comPlayerGoodsService.save(comPlayerGoodsVo);
-            try {
-                // 计算断电损耗
-                comPlayerLogService.powerLoss(userId);
-            } catch (Exception e) {
-                System.err.println("断电损耗异常:" + e.getMessage());
-            }
+
             //todo 偷窃损失,处理目标用户收取果实时候,减扣一部分被偷取的数量
             ComPlayerProfit comPlayerProfit = new ComPlayerProfit();
             comPlayerProfit.setUserId(userId);
@@ -1213,12 +1203,7 @@ public class ComPlayerGoodsController extends CommonController<ComPlayerGoodsVo,
         if (amount <= 0) {
             return Result.of(null, false, ResultEnum.FRUIT_AMOUNT_ERROR.getMessage(), ResultEnum.FRUIT_AMOUNT_ERROR.getCode());
         }
-        try {
-            // 计算断电损耗
-            comPlayerLogService.powerLoss(userId);
-        } catch (Exception e) {
-            System.err.println("断电损耗异常:" + e.getMessage());
-        }
+
         //
         ComFruitVo comFruitVo = comFruitService.findById(fruitId);
 

+ 3 - 9
src/main/java/com/td/boss/game/complayerland/controller/ComPlayerLandController.java

@@ -142,7 +142,7 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                     ComMallSeedVo comMallSeedVo = comMallSeedService.findById(comPlayerLandAndPlantVo.getPlantId());
                     //todo [牧场养殖渔场需求] 如果是养殖类的,计算延期后的成熟期
                     if (ArrayUtil.contains(CultivateKeys.mallType,e.getMallType())) {
-                        Integer days = comPlayerCultivateSerivce.getHarvestDays(userId, e.getConfigLandId(),e.getPlantFlag());
+                        Integer days = comPlayerCultivateSerivce.getHarvestDays(userId, e.getPlantStart(),e.getMallType(),e.getConfigLandId(),e.getPlantFlag(),comMallSeedVo);
                         comMallSeedVo.setMaturity(days);
 
                         //获取并设置今日喂养状态
@@ -240,7 +240,7 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
                     ComMallSeedVo comMallSeedVo = comMallSeedService.findById(comPlayerLandAndPlantVo.getPlantId());
                     //todo [牧场养殖渔场需求] 如果是养殖类的,计算延期后的成熟期
                     if (ArrayUtil.contains(CultivateKeys.mallType,e.getMallType())) {
-                        Integer days = comPlayerCultivateSerivce.getHarvestDays(userId, e.getConfigLandId(),e.getPlantFlag());
+                        Integer days = comPlayerCultivateSerivce.getHarvestDays(userId, e.getPlantStart(),e.getMallType(),e.getConfigLandId(),e.getPlantFlag(),comMallSeedVo);
                         comMallSeedVo.setMaturity(days);
                     }
                     comPlayerLandAndPlantVo.setSeedInfo(comMallSeedVo);
@@ -474,12 +474,6 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
             _playerLogVo.setAfterPart(0d);
             comPlayerLogService.save(_playerLogVo);
 
-            try {
-                // 计算断电损耗
-                comPlayerLogService.powerLoss(userId);
-            } catch (Exception e) {
-                System.err.println("断电损耗异常:" + e.getMessage());
-            }
 
             ComPlayerLandAndPlantVo comPlayerLandAndPlantVo = CopyUtil.copy(comPlayerLand, ComPlayerLandAndPlantVo.class);
             comPlayerLandAndPlantVo.setSeedInfo(comMallSeedVo);
@@ -499,7 +493,7 @@ public class ComPlayerLandController extends CommonController<ComPlayerLandVo, C
 
             //todo [牧场养殖渔场需求] 如果是养殖类的,计算延期后的成熟期
             if (ArrayUtil.contains(CultivateKeys.mallType,comPlayerLand.getMallType())) {
-                Integer days = comPlayerCultivateSerivce.getHarvestDays(userId, comPlayerLand.getConfigLandId(),comPlayerLand.getPlantFlag());
+                Integer days = comPlayerCultivateSerivce.getHarvestDays(userId,comPlayerLand.getPlantStart(),comPlayerLand.getMallType(),comPlayerLand.getConfigLandId(),comPlayerLand.getPlantFlag(),comMallSeedVo);
                 comMallSeedVo.setMaturity(days);
 
                 //新加一个养殖的信息

+ 8 - 8
src/main/java/com/td/boss/game/complayerlog/service/ComPlayerLogServiceImpl.java

@@ -56,23 +56,23 @@ public class ComPlayerLogServiceImpl extends CommonServiceImpl<ComPlayerLogVo, C
         }
         // 计算最后操作时间
         Date lastOperationTime = lastOperationTime(comPlayerLog, comPlayerGoods);
-        System.out.println("最后操作时间:" + dateFormat(lastOperationTime));
+        //System.out.println("最后操作时间:" + dateFormat(lastOperationTime));
         // 计算服务器时间与最后操作时间差
         Date serverDate = new Date();
         long dayDiff = DateUtil.betweenDay(serverDate, lastOperationTime, false);
-        System.out.println("与服务器时间相差:" + dayDiff + "天");
+        //System.out.println("与服务器时间相差:" + dayDiff + "天");
         // 7天未操作 并且 最多持续8天.
         if (dayDiff < 7) {
-            System.out.println("未到7天不损耗");
+            //System.out.println("未到7天不损耗");
             return;
         }
         dayDiff = dayDiff > 14 ? 14 : dayDiff;
         dayDiff = Math.abs(14 - 8 - dayDiff);
-        System.out.println("实际断电损耗:" + dayDiff + "天");
+        //System.out.println("实际断电损耗:" + dayDiff + "天");
 
         List<ComPlayerGoods> fruitList = comPlayerGoodsRepository.findAllByUserId(userId).stream().filter(a -> a.getGoodsType().equals(1)).collect(Collectors.toList());
         if (fruitList.size() == 0) {
-            System.out.println("仓库无果实不损耗");
+            //System.out.println("仓库无果实不损耗");
             return;
         }
         // 批量更新仓库果实量
@@ -100,8 +100,7 @@ public class ComPlayerLogServiceImpl extends CommonServiceImpl<ComPlayerLogVo, C
             playerLog.setTName(goods.getName());
             playerLog.setTPart(0d);
             playerLog.setTAmount(0);
-            // 1=果实
-            playerLog.setTType(0);
+            playerLog.setTType(7);//断电消耗
             playerLog.setBeforeAmount(goodsBeforeAmount);
             playerLog.setBeforePart(goodsBeforePart);
             // 交易后的数据
@@ -113,12 +112,13 @@ public class ComPlayerLogServiceImpl extends CommonServiceImpl<ComPlayerLogVo, C
             // 损失
             playerLog.setTLoss((goodsBeforeAmount + goodsBeforePart) * NumberUtil.div(dayDiff, 100));
             playerLog.setCreateTime(serverDate);
+            playerLog.setUpdateTime(serverDate);
             playerLogList.add(playerLog);
         }
         comPlayerGoodsRepository.saveAll(playerGoodsList);
         comPlayerLogRepository.saveAll(playerLogList);
 
-        System.out.println("损耗完成");
+        //System.out.println("损耗完成");
     }
 
     /**

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

@@ -3,6 +3,7 @@ package com.td.boss.game.comusers.controller;
 import com.alibaba.fastjson.JSON;
 import com.td.boss.common.controller.*;
 import com.td.boss.common.pojo.Result;
+import com.td.boss.game.complayerlog.service.ComPlayerLogService;
 import com.td.boss.game.complayersattri.pojo.ComPlayersAttri;
 import com.td.boss.game.complayersattri.service.ComPlayersAttriService;
 import com.td.boss.game.complayersattri.vo.ComPlayersAttriSimpleVo;
@@ -66,6 +67,9 @@ public class ComUsersController extends CommonController<ComUsersVo, ComUsers, S
     @Autowired
     private RedisLock redisLock;
 
+    @Autowired
+    private ComPlayerLogService comPlayerLogService;
+
     /**
      * 接口需要token放行
      *
@@ -281,6 +285,8 @@ public class ComUsersController extends CommonController<ComUsersVo, ComUsers, S
                 }
 
             }
+
+
             //获取一个配置
             ComSettingVo comSettingVo = comSettingService.get("1").getData();
             if (comSettingVo.equals(null)) {
@@ -300,10 +306,13 @@ public class ComUsersController extends CommonController<ComUsersVo, ComUsers, S
 
             //返回前端的体力值是读取一个配置的体力值,
             map.put("playerAttribute", comPlayersAttriSimpleVo);
-
             //返回一个游戏配置
             map.put("gameSetting", CopyUtil.copy(comSettingVo, ComSettingSimpleVo.class));
             map.put("response", JSON.parse(response));
+
+            // 计算断电损耗
+            comPlayerLogService.powerLoss(id);
+
             return Result.of(map);
         } catch (HttpClientErrorException e) {
             redisLock.unlock(_redisKey, String.valueOf(time));

+ 66 - 6
src/main/java/com/td/boss/sys/sysGame/controller/sysGamePropertyController.java

@@ -1,11 +1,12 @@
 package com.td.boss.sys.sysGame.controller;
 
+import cn.hutool.core.convert.Convert;
+import cn.hutool.json.JSONUtil;
 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.PageCondition;
-import com.td.boss.common.pojo.PageInfo;
-import com.td.boss.common.pojo.Result;
+import com.td.boss.common.pojo.*;
+import com.td.boss.common.service.ComConfigService;
 import com.td.boss.game.comcntorder.service.ComCntOrderService;
 import com.td.boss.game.comcntorder.vo.ComCntOrderDateVo;
 import com.td.boss.game.comcntorder.vo.ComCntOrderPayTypeSumVo;
@@ -22,8 +23,13 @@ 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.complayercultivate.vo.ComPlayerCultivateSeedVo;
 import com.td.boss.game.complayergoods.service.ComPlayerGoodsService;
 import com.td.boss.game.complayergoods.vo.ComPlayerGoodsTypeSumVo;
+import com.td.boss.game.complayersattri.vo.ComPlayersLuckyLandLevelUpVo;
+import com.td.boss.game.complayersattri.vo.ComPlayersLuckyToolsVo;
+import com.td.boss.game.comsetting.service.ComSettingService;
+import com.td.boss.game.comsetting.vo.ComSettingVo;
 import com.td.boss.game.comsnbapply.pojo.ComSnbApply;
 import com.td.boss.game.comsnbapply.service.ComSnbApplyService;
 import com.td.boss.game.comsnbapply.vo.ComSnbApplyBetweenVo;
@@ -44,9 +50,8 @@ import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.ModelAndView;
 
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Slf4j
 @RestController
@@ -80,6 +85,12 @@ public class sysGamePropertyController extends CommonController<ComUsersVo, ComU
     @Autowired
     private ComCntToSnbService comCntToSnbService;
 
+    @Autowired
+    private ComSettingService comSettingService;
+
+    @Autowired
+    private ComConfigService comConfigService;
+
 
     @GetMapping("CNTAndSNB")
     public ModelAndView CNTAndSNB() {
@@ -340,4 +351,53 @@ public class sysGamePropertyController extends CommonController<ComUsersVo, ComU
             @RequestParam(value = "endTime") Date endTime) {
         return Result.of(comCntToSnbService.getBetweenTimeList(beginTime, endTime));
     }
+
+    /**
+     * 返回一个应用设置
+     *
+     * @return
+     */
+    @GetMapping("gameConfig")
+    public ModelAndView gameConfig() {
+        ComSettingVo comSettingVo = comSettingService.get("1").getData();
+        return new ModelAndView("sys/aComConfig/gameConfig", "gameConfig", comSettingVo);
+    }
+
+
+    /**
+     * 获取全部配置
+     */
+    @GetMapping("comConfig")
+    public ModelAndView ComConfig() {
+        List<ComConfig> comConfigs = comConfigService.selectAllComConfig();
+
+        Map map = new HashMap();
+        for (ComConfig c : comConfigs) {
+            if (c.getConfigKey().equals("cultivate_food")) {
+                List<ComPlayerCultivateSeedVo> cultivateFoodList = JSONUtil.toList(c.getConfigValue(), ComPlayerCultivateSeedVo.class);
+                map.put("CultivateFoodList", cultivateFoodList);
+            }else if (c.getConfigKey().equals("land_level")) {
+                List<ComPlayersLuckyLandLevelUpVo> LandLevelList = JSONUtil.toList(c.getConfigValue(), ComPlayersLuckyLandLevelUpVo.class);
+                map.put("LandLevelList", LandLevelList);
+            }else if (c.getConfigKey().equals("land_luck_tosnb")) {
+                //兑换snb倍数
+                int snb = Convert.toInt(c.getConfigValue(), 0);
+                map.put("snbMultiple", snb);
+            }else if (c.getConfigKey().equals("land_tools")) {
+                List<ComPlayersLuckyToolsVo> comPlayersLuckyToolsVos = JSONUtil.toList(c.getConfigValue(), ComPlayersLuckyToolsVo.class);
+                map.put("LuckyTools", comPlayersLuckyToolsVos);
+            } else if (c.getConfigKey().equals("max_amount")) {
+                //获取配置 土堆分别最大种植数量,对应类型mallType:1、2、3、4的值
+                // 1、牧场 2、养殖 3、渔场淡水区 4、渔场海水区
+                List<Map> mapList = JSONUtil.toList(c.getConfigValue(), Map.class);
+                map.put("MaxAmountList", mapList);
+            } else if (c.getConfigKey().equals(CultivateKeys.witheredDay)) {
+                //todo [枯萎]
+                Integer witheredDay = comConfigService.selectByKey(CultivateKeys.witheredDay, Integer.class);
+                map.put("witheredDay", witheredDay);
+            }
+        }
+
+        return new ModelAndView("sys/aComConfig/comConfig", "comConfig", map);
+    }
 }

+ 7 - 7
src/main/java/com/td/boss/util/DappUtil.java

@@ -63,7 +63,7 @@ public class DappUtil {
         String DAppChildrenCountOnlineUrl = "http://192.168.20.251/api/game/childrenCount";
         String DAppChildrenCountTestUrl = "https://wp.landownership.live/api/game/childrenCount";
         String DAppUrl = DappUtil.getEnv().equals("prod") ? DAppChildrenCountOnlineUrl : DAppChildrenCountTestUrl;
-        log.info("用户直推数量地址:" + DAppUrl);
+        //log.info("用户直推数量地址:" + DAppUrl);
         try {
             RestTemplate restTemplate = new RestTemplate();
             HttpHeaders headers = new HttpHeaders();
@@ -76,7 +76,7 @@ public class DappUtil {
 
             HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, headers);
             Map response = restTemplate.postForObject(DAppUrl, files, Map.class);
-            log.info("response={}", response);
+            //log.info("response={}", response);
             return (Integer) response.get("data");
         } catch (Exception e) {
             log.error(e.getMessage());
@@ -102,7 +102,7 @@ public class DappUtil {
         String onlineUrl = "http://192.168.20.251/api/game/cntPayAndSwapAmount";
         String testUrl = "https://wp.landownership.live/api/game/cntPayAndSwapAmount";
         String DAppUrl = DappUtil.getEnv().equals("prod") ? onlineUrl : testUrl;
-        log.info("根据村民ID找到所属村的cnt总支付和总兑换数量:" + DAppUrl);
+        //log.info("根据村民ID找到所属村的cnt总支付和总兑换数量:" + DAppUrl);
         try {
             RestTemplate restTemplate = new RestTemplate();
             HttpHeaders headers = new HttpHeaders();
@@ -141,7 +141,7 @@ public class DappUtil {
         String DAppChildrenCountOnlineUrl = "http://192.168.20.251/api/game/getChildrenBuyLandCount";
         String DAppChildrenCountTestUrl = "https://wp.landownership.live/api/game/getChildrenBuyLandCount";
         String DAppUrl = DappUtil.getEnv().equals("prod") ? DAppChildrenCountOnlineUrl : DAppChildrenCountTestUrl;
-        log.info("获取用户直推且有消费土地的人数量:" + DAppUrl);
+        //log.info("获取用户直推且有消费土地的人数量:" + DAppUrl);
         try {
             RestTemplate restTemplate = new RestTemplate();
             HttpHeaders headers = new HttpHeaders();
@@ -154,7 +154,7 @@ public class DappUtil {
 
             HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, headers);
             Map response = restTemplate.postForObject(DAppUrl, files, Map.class);
-            log.info("response={}", response);
+            //log.info("response={}", response);
             return (Integer) response.get("data");
         } catch (Exception e) {
             log.error(e.getMessage());
@@ -180,7 +180,7 @@ public class DappUtil {
         String DAppChildrenCountOnlineUrl = "http://192.168.20.251/api/game/getChildrenBuyLandAmount";
         String DAppChildrenCountTestUrl = "https://wp.landownership.live/api/game/getChildrenBuyLandAmount";
         String DAppUrl = DappUtil.getEnv().equals("prod") ? DAppChildrenCountOnlineUrl : DAppChildrenCountTestUrl;
-        log.info("获取用户直推下级的消费土地的总cnt数额:" + DAppUrl);
+        //log.info("获取用户直推下级的消费土地的总cnt数额:" + DAppUrl);
         try {
             RestTemplate restTemplate = new RestTemplate();
             HttpHeaders headers = new HttpHeaders();
@@ -193,7 +193,7 @@ public class DappUtil {
 
             HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, headers);
             Map response = restTemplate.postForObject(DAppUrl, files, Map.class);
-            log.info("response={}", response);
+            //log.info("response={}", response);
             return (Integer) response.get("data");
         } catch (Exception e) {
             log.error(e.getMessage());

+ 5 - 1
src/main/resources/static/sys/aComCNTAndSNB/js/CNTAndSNB.js

@@ -182,6 +182,8 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], func
                         return '<span style="color: red">释放SNB</span>';
                     } else if (d.tranType == 9) {
                         return '<span style="color: red">幸运值</span>';
+                    } else if (d.tranType == 10) {
+                        return '<span style="color: red">喂养动物</span>';
                     } else {
                         return '<span style="color: red">待添加:</span>' + d.tranType;
                     }
@@ -252,6 +254,8 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], func
                         return '<span style="color: red">释放SNB</span>';
                     } else if (d.tranType == 9) {
                         return '<span style="color: red">幸运值</span>';
+                    } else if (d.tranType == 10) {
+                        return '<span style="color: red">喂养动物</span>';
                     } else {
                         return '<span style="color: red">待添加:</span>' + d.tranType;
                     }
@@ -386,7 +390,7 @@ function sumSnbReload() {
     });
 }
 
-function  sumErrorSnbReload() {
+function sumErrorSnbReload() {
     tableErrorSNB.reload({
         page: false
         , method: 'POST'

+ 33 - 0
src/main/resources/static/sys/aComConfig/js/comConfig.js

@@ -0,0 +1,33 @@
+let list = [[${comConfig.CultivateFoodList}]];
+console.log(list);
+
+layui.use(['colorpicker', 'form'], function () {
+    let form = layui.form;//select、单选、复选等依赖form
+    let colorpicker = layui.colorpicker;
+    let list = [[${comConfig.CultivateFoodList}]];
+    console.log(list);
+    // layui.use('table', function () {
+    //     var table = layui.table;
+    //     //方法级渲染
+    //     table.render({
+    //         elem: '#SeedList'
+    //         , data: [[${comConfig.CultivateFoodList}]]
+    //         , cols: [[
+    //             {field: 'seedId', title: 'ID', width: 80, sort: true, fixed: true}
+    //             , {field: 'seedName', title: '商户', width: 80, sort: true}
+    //             , {field: 'seedSNB', title: '访问量', width: 80, sort: true, edit: true}
+    //         ]]
+    //         , id: 'testReload'
+    //         , page: true
+    //         , height: 600
+    //     });
+    // });
+
+});
+
+/**
+ * 提交保存
+ */
+function sysFormSave() {
+
+}

+ 46 - 0
src/main/resources/static/sys/aComConfig/js/gameConfig.js

@@ -0,0 +1,46 @@
+let sysNoticeTextEdit;
+layui.use(['colorpicker','form'], function () {
+    let form = layui.form;//select、单选、复选等依赖form
+    let colorpicker = layui.colorpicker;
+
+    //开启全功能
+    colorpicker.render({
+        elem: '#test-form-sysColor'
+        ,color: $('#sysColor').val()
+        ,format: 'rgb'
+        ,predefine: true
+        ,alpha: true
+        ,done: function(color){
+            $('#sysColor').val(color);
+        }
+        ,change: function(color){
+            //给当前页面头部和左侧设置主题色
+            $('.header-demo,.layui-side .layui-nav').css('background-color', color);
+        }
+    });
+
+    //建立编辑器
+    sysNoticeTextEdit = UE.getEditor('sysNoticeTextEdit');
+    //回显
+    sysNoticeTextEdit.ready(function() {
+        sysNoticeTextEdit.setContent($("#sysNoticeText").val());
+    });
+
+    //radio checkbox
+    $("#sysForm").find("[name='sysApiEncrypt'][value='" + $("#sysApiEncrypt").val() + "']").attr("checked", true);
+    form.render();
+});
+
+/**
+ * 提交保存
+ */
+function sysFormSave() {
+    let serializeObject = $("#sysForm").serializeObject();
+    //获取编辑器内容
+    serializeObject.sysNoticeText = sysNoticeTextEdit.getContent();
+    // $.post(ctx + "/sys/sysSetting/save", serializeObject, function (data) {
+    //     layer.msg("修改成功!", {icon: 1, time: 2000}, function () {});
+    //     $("#sysForm").form(data.data);
+    //     $("#sysApiEncrypt").val(data.data.sysApiEncrypt)
+    // });
+}

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

@@ -272,6 +272,8 @@ function initSNBTable(table, data) {
                         return '<span style="color: red">释放SNB</span>';
                     } else if (d.tranType == 9) {
                         return '<span style="color: red">幸运值</span>';
+                    } else if (d.tranType == 10) {
+                        return '<span style="color: red">喂养动物</span>';
                     } else {
                         return '<span style="color: red">待添加:</span>' + d.tranType;
                     }
@@ -509,6 +511,8 @@ function initPlayerLog(table, data) {
                         return '<span style="color: red">出售果实</span>';
                     } else if (d.tType == 6) {
                         return '<span style="color: green">偷取果实</span>';
+                    } else if(d.tType == 7){
+                        return '<span style="color: red">断电扣除果实</span>';
                     } else {
                         return '<span style="color: green">待添加:</span>' + d.tType;
                     }

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

@@ -234,6 +234,8 @@ function initPlayerLog(table, data) {
                         return '<span style="color: red">出售果实</span>';
                     } else if (d.tType == 6) {
                         return '<span style="color: green">偷取果实</span>';
+                    } else if(d.tType == 7){
+                        return '<span style="color: red">断电扣除果实</span>';
                     } else {
                         return '<span style="color: green">待添加:</span>' + d.tType;
                     }
@@ -256,6 +258,19 @@ function initPlayerLog(table, data) {
                 }}
             , {field: 'tLoss', title: '系统扣除部分'}
             , {field: 'lMultiple', title: 'land倍数', width: 80}
+            , {
+                field: 'withered', title: '损耗类型', width: 100, templet: function (d) {
+                    if (d.withered == 0) {  // 自定义内容
+                        return '<span style="color: green">---</span>';
+                    } else if (d.withered == 1) {
+                        return '<span style="color: red">枯萎(死亡)</span>';
+                    } else if (d.withered == 2) {
+                        return '<span style="color: red">断电损耗</span>';
+                    }  else {
+                        return '<span style="color: green">待添加:</span>' + d.withered;
+                    }
+                }
+            }
             , {field: 'createTime', title: '创建时间'}
             , {field: 'updateTime', title: '更新时间', hide: true}
         ]]

+ 147 - 0
src/main/resources/view/sys/aComConfig/comConfig.html

@@ -0,0 +1,147 @@
+<!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/setting/css/setting.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">饲养动物相关设置,只展示当前数据。(注:如需修改数据 com_config,修改数据库后重启后台服务器)</div>
+            <fieldset class="layui-elem-field layui-field-title" style="margin-top: 5px;">
+                <legend>饲料配置(对应key cultivate_food)</legend>
+            </fieldset>
+            <div class="layui-card-body">
+                <table class="layui-hide" id="CultivateFoodList" lay-filter="useruv"></table>
+            </div>
+            <fieldset class="layui-elem-field layui-field-title" style="margin-top: 5px;">
+                <legend>土地等级配置(对应key land_level)</legend>
+            </fieldset>
+            <div class="layui-card-body">
+                <table class="layui-hide" id="LandLevelList" lay-filter="useruv"></table>
+            </div>
+            <fieldset class="layui-elem-field layui-field-title" style="margin-top: 5px;">
+                <legend>工具配置(对应key land_tools)</legend>
+            </fieldset>
+            <div class="layui-card-body">
+                <table class="layui-hide" id="LuckyTools" lay-filter="useruv"></table>
+            </div>
+            <fieldset class="layui-elem-field layui-field-title" style="margin-top: 5px;">
+                <legend>养殖上限配置-1、牧场 2、养殖 3、渔场淡水区 4、渔场海水区(对应key max_amount)</legend>
+            </fieldset>
+            <div class="layui-card-body">
+                <table class="layui-hide" id="MaxAmountList" lay-filter="useruv"></table>
+            </div>
+            <div class="layui-card-body">
+                <form class="layui-form layui-form-pane">
+                    <div class="layui-form-item layui-form-text">
+                        <label class="layui-form-label">兑换snb倍数(对应key land_luck_tosnb)</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="snbMultiple" th:value="${comConfig.snbMultiple}" autocomplete="off"
+                                   placeholder="比例" readonly="readonly"
+                                   class="layui-input">
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item layui-form-text" style="margin-top: 2px;">
+                        <label class="layui-form-label">枯萎天数(对应key witheredDay)</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="witheredDay" th:value="${comConfig.witheredDay}" autocomplete="off"
+                                   placeholder="比例" readonly="readonly"
+                                   class="layui-input">
+                        </div>
+                    </div>
+                </form>
+            </div>
+
+        </div>
+    </div>
+</div>
+</body>
+<!-- js -->
+<script th:inline="javascript">
+
+    layui.use(['colorpicker', 'form', 'table'], function () {
+        let form = layui.form;//select、单选、复选等依赖form
+        let colorpicker = layui.colorpicker;
+        let comConfig = [[${comConfig}]];
+        console.log(comConfig);
+        var table = layui.table;
+
+        //方法级渲染
+        //饲料列表
+        table.render({
+            elem: '#CultivateFoodList'
+            , data: comConfig.CultivateFoodList
+            , cols: [[ //标题栏
+                {field: 'seedId', title: '饲料ID'}
+                , {field: 'seedName', title: '饲料名字'}
+                , {field: 'seedSNB', title: '饲料消耗的SNB/只', sort: true}
+            ]]
+            , skin: 'row' //表格风格
+            , even: true
+        });
+        //土地等级列表
+        table.render({
+            elem: '#LandLevelList'
+            , data: comConfig.LandLevelList
+            , cols: [[ //标题栏
+                {field: 'id', title: '土地类型ID'}
+                , {field: 'name', title: '土地类型名字'}
+                , {field: 'product', title: '收益产出百分比', sort: true}
+                , {field: 'costLucky', title: '消耗的幸运值'}
+            ]]
+            , skin: 'row' //表格风格
+            , even: true
+        });
+        //工具列表
+        table.render({
+            elem: '#LuckyTools'
+            , data: comConfig.LuckyTools
+            , cols: [[ //标题栏
+                {field: 'id', title: '工具ID'}
+                , {field: 'toolName', title: '工具名字'}
+                , {field: 'useHour', title: '工具冷却时间', sort: true}
+                , {field: 'toolLucky', title: '工具增加的幸运值'}
+                , {field: 'enable', title: '是有开启'}
+                , {field: 'createTime', title: '生成时间', sort: true}
+            ]]
+            , skin: 'row' //表格风格
+            , even: true
+        });
+        //养殖场租赁时候设置的最大值消耗饲料
+        table.render({
+            elem: '#MaxAmountList'
+            , data: comConfig.MaxAmountList
+            , cols: [[ //标题栏
+                {
+                    field: 'key', title: '类型', templet: function (d) {
+                        //1、牧场 2、养殖 3、渔场淡水区 4、渔场海水区
+                        if (d.key == 1) {
+                            return "牧场"
+                        } else if (d.key == 2) {
+                            return "养殖场"
+                        } else if (d.key == 3) {
+                            return "淡水区"
+                        } else if (d.key == 4) {
+                            return "海水区"
+                        }
+                    }
+                }
+                , {field: 'value', title: '养殖最大数量'}
+            ]]
+            , skin: 'row' //表格风格
+            , even: true
+        });
+    });
+
+</script>
+<!--<script  th:src="@{/sys/aComConfig/js/comConfig.js}" th:inline="javascript"></script>-->
+</html>

+ 139 - 0
src/main/resources/view/sys/aComConfig/gameConfig.html

@@ -0,0 +1,139 @@
+<!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/setting/css/setting.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">偷菜部分相关设置,只展示当前数据。(注:如需修改,修改数据库 com_setting)</div>
+            <div class="layui-card-body">
+                <form id="gameConfigForm" class="layui-form layui-form-pane">
+                    <div class="layui-form-item  layui-form-text">
+                        <label class="layui-form-label">多倍土地租赁时候最大限制输入的租赁倍数(maxLeaseMulti)</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="maxLeaseMulti" th:value="${gameConfig.maxLeaseMulti}" autocomplete="off"
+                                   placeholder="租赁倍数" readonly="readonly"
+                                   class="layui-input">
+                        </div>
+                    </div>
+                    <div class="layui-form-item  layui-form-text">
+                        <label class="layui-form-label">用户目前的最大体力(maxStrength)</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="maxStrength" th:value="${gameConfig.maxStrength}" autocomplete="off"
+                                   placeholder="最大体力" readonly="readonly"
+                                   class="layui-input">
+                        </div>
+                    </div>
+                    <div class="layui-form-item  layui-form-text">
+                        <label class="layui-form-label">偷取果实时候,扣除体力值变化的单位(unitStrength)</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="unitStrength" th:value="${gameConfig.unitStrength}" autocomplete="off"
+                                   placeholder="体力值变化的单位" readonly="readonly"
+                                   class="layui-input">
+                        </div>
+                    </div>
+                    <div class="layui-form-item  layui-form-text">
+                        <label class="layui-form-label">偷取果实时候,snb不足时候,扣除体力值变化的单位用这个单位(snbUnitStrength)</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="snbUnitStrength" th:value="${gameConfig.snbUnitStrength}" autocomplete="off"
+                                   placeholder="体力值变化的单位" readonly="readonly"
+                                   class="layui-input">
+                        </div>
+                    </div>
+                    <div class="layui-form-item  layui-form-text">
+                        <label class="layui-form-label">偷取时候触发的扣除的snb(deductSnb)</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="deductSnb" th:value="${gameConfig.deductSnb}" autocomplete="off"
+                                   placeholder="snb" readonly="readonly"
+                                   class="layui-input">
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item  layui-form-text">
+                        <label class="layui-form-label">玩家的种植可以被偷的利润比例(profit)</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="profit" th:value="${gameConfig.profit}" autocomplete="off"
+                                   placeholder="比例" readonly="readonly"
+                                   class="layui-input">
+                        </div>
+                    </div>
+                    <div class="layui-form-item  layui-form-text">
+                        <label class="layui-form-label">存在狗时候可以偷取的数量利润比例(profitDog)</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="profitDog" th:value="${gameConfig.profitDog}" autocomplete="off"
+                                   placeholder="比例" readonly="readonly"
+                                   class="layui-input">
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item  layui-form-text">
+                        <label class="layui-form-label">偷取的一个随机范围最大值 比如0.03 这样(stealMaxRatio)</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="stealMaxRatio" th:value="${gameConfig.stealMaxRatio}" autocomplete="off"
+                                   placeholder="比例" readonly="readonly"
+                                   class="layui-input">
+                        </div>
+                    </div>
+                    <div class="layui-form-item  layui-form-text">
+                        <label class="layui-form-label">偷取的一个随机范围最小 比如0.01 这样(stealMinRatio)</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="stealMinRatio" th:value="${gameConfig.stealMinRatio}" autocomplete="off"
+                                   placeholder="比例" readonly="readonly"
+                                   class="layui-input">
+                        </div>
+                    </div>
+                    <div class="layui-form-item  layui-form-text">
+                        <label class="layui-form-label">如果有装备棒子偷的利润比例(stealRatioHasStick)</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="stealRatioHasStick" th:value="${gameConfig.stealRatioHasStick}" autocomplete="off"
+                                   placeholder="比例" readonly="readonly"
+                                   class="layui-input">
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item  layui-form-text">
+                        <label class="layui-form-label">没有装备打狗棒时候利润比例(stealRatioNoStick)</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="stealRatioNoStick" th:value="${gameConfig.stealRatioNoStick}" autocomplete="off"
+                                   placeholder="比例" readonly="readonly"
+                                   class="layui-input">
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item  layui-form-text">
+                        <label class="layui-form-label">最后被偷取的比例,比如被偷取用户损失了10个,最后偷取的用户获得这10个乘这个比例(finalRatio)</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="finalRatio" th:value="${gameConfig.finalRatio}" autocomplete="off"
+                                   placeholder="比例" readonly="readonly"
+                                   class="layui-input">
+                        </div>
+                    </div>
+
+
+                    <!--<div class="layui-form-item">-->
+                    <!--    <div class="layui-input-block">-->
+                    <!--        <a class="layui-btn" onclick="sysFormSave()">修改</a>-->
+                    <!--    </div>-->
+                    <!--</div>-->
+                    <!-- 隐藏域 -->
+                    <input type="text" name="id"  th:value="${gameConfig.id}" hidden="hidden"/>
+                    <!--<input type="text" name="createTime"  th:value="${#dates.format(gameConfig.createTime, 'yyyy-MM-dd HH:mm:ss')}" hidden="hidden"/>-->
+                    <!--<input type="text" name="updateTime"  th:value="${#dates.format(gameConfig.updateTime, 'yyyy-MM-dd HH:mm:ss')}" hidden="hidden"/>-->
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+</body>
+<!-- js -->
+<!--<script th:src="@{/sys/aComConfig/js/gameConfig.js}"></script>-->
+</html>