浏览代码

1.修改后台,和对应功能bug

slambb 3 年之前
父节点
当前提交
d0b2ce55bb
共有 21 个文件被更改,包括 1443 次插入115 次删除
  1. 18 0
      pom.xml
  2. 2 2
      src/main/java/com/td/Dawa/BossApplication.java
  3. 13 2
      src/main/java/com/td/Dawa/common/service/CommonServiceImpl.java
  4. 3 1
      src/main/java/com/td/Dawa/config/enums/ResultEnum.java
  5. 19 12
      src/main/java/com/td/Dawa/game/comcharacters/service/ComCharactersServiceImpl.java
  6. 16 0
      src/main/java/com/td/Dawa/game/comcharactersdiscovery/controller/ComCharactersDiscoveryController.java
  7. 4 0
      src/main/java/com/td/Dawa/game/complayerbackpack/repository/ComPlayerBackpackRepository.java
  8. 4 0
      src/main/java/com/td/Dawa/game/complayerbackpack/service/ComPlayerBackpackService.java
  9. 36 0
      src/main/java/com/td/Dawa/game/complayerbackpack/service/ComPlayerBackpackServiceImpl.java
  10. 2 0
      src/main/java/com/td/Dawa/game/excelcharactercolor/pojo/ExcelCharacterColor.java
  11. 3 0
      src/main/java/com/td/Dawa/game/excelcharactercolor/vo/ExcelCharacterColorClientVo.java
  12. 2 0
      src/main/java/com/td/Dawa/game/excelcharactercolor/vo/ExcelCharacterColorSimpleVo.java
  13. 2 0
      src/main/java/com/td/Dawa/game/excelcharactercolor/vo/ExcelCharacterColorVo.java
  14. 245 32
      src/main/java/com/td/Dawa/sys/sysGame/controller/sysGameUsersController.java
  15. 2 1
      src/main/java/com/td/Dawa/util/ExcelDataUtil.java
  16. 36 8
      src/main/java/com/td/Dawa/util/RedisData.java
  17. 37 1
      src/main/java/com/td/Dawa/util/WaDaNetUtil.java
  18. 509 0
      src/main/resources/static/sys/aComUser/js/userCharacters.js
  19. 133 31
      src/main/resources/static/sys/aComUser/js/userPlayerBackpack.js
  20. 276 0
      src/main/resources/view/sys/aComUser/userCharacters.html
  21. 81 25
      src/main/resources/view/sys/aComUser/userPlayerBackpack.html

+ 18 - 0
pom.xml

@@ -161,6 +161,24 @@
             <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
 
+
+        <!--定制请求跳过ssl证书验证-->
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpmime</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpcore</artifactId>
+        </dependency>
+        <!--定制请求跳过ssl证书验证-->
+
     </dependencies>
 
     <build>

+ 2 - 2
src/main/java/com/td/Dawa/BossApplication.java

@@ -177,14 +177,14 @@ class IndexController {
                 excelCharacterColorService.updateListToCache(GameEnum.REDIS_KEY_EXCEL_CHARACTER_COLOR.getMessage());
                 excelWorkProService.updateListToCache(GameEnum.REDIS_KEY_EXCEL_WORK_PRO.getMessage());
                 excelPropService.updateListToCache(GameEnum.REDIS_KEY_EXCEL_PROP.getMessage());
-                excelWorkProService.updateListToCache(GameEnum.REDIS_KEY_EXCEL_SCENE.getMessage());
+                excelSceneService.updateListToCache(GameEnum.REDIS_KEY_EXCEL_SCENE.getMessage());
                 //生产和资源
                 excelCharacterCreateService.updateListToCache(GameEnum.REDIS_KEY_EXCEL_CHARACTER_CREATE.getMessage());
                 excelResourcesService.updateListToCache(GameEnum.REDIS_KEY_EXCEL_RESOURCES.getMessage());
                 //等级
                 excelCharacterLevelService.updateListToCache(GameEnum.REDIS_KEY_EXCEL_CHARACTER_LEVEL.getMessage());
 
-                excelCharacterLevelService.updateListToCache(GameEnum.REDIS_KEY_EXCEL_CHARACTER_ATTRI.getMessage());
+                excelCharacterAttriService.updateListToCache(GameEnum.REDIS_KEY_EXCEL_CHARACTER_ATTRI.getMessage());
                 //参数
                 excelParameterService.updateListToCache(GameEnum.REDIS_KEY_EXCEL_PARAMETER.getMessage());
 

+ 13 - 2
src/main/java/com/td/Dawa/common/service/CommonServiceImpl.java

@@ -130,6 +130,7 @@ public class CommonServiceImpl<V, E, T> implements CommonService<V, E, T> {
                 //找出Id主键,自增的不设置
                 if (field.isAnnotationPresent(Id.class)) {
                     if(!field.isAnnotationPresent(GeneratedValue.class)){
+                        //UUID 部分
                         if(!StringUtils.isEmpty(fieldValue)){
                             //如果Id主键不为空,则为更新
                             Optional<E> one = commonRepository.findById((T) fieldValue);
@@ -144,8 +145,18 @@ public class CommonServiceImpl<V, E, T> implements CommonService<V, E, T> {
                             isInsert = true;
                         }
                     }else{
-                        //单纯插入数据,id自增
-                        isInsert = true;
+                        //自增id处理数据
+                        if(!StringUtils.isEmpty(fieldValue)){
+                            //如果Id主键不为空,则为更新
+                            Optional<E> one = commonRepository.findById((T) fieldValue);
+                            if (one.isPresent()) {
+                                entityFull = one.get();
+                            }
+                        }else{
+                            //如果Id主键为空,则为新增
+                            //单纯插入数据,id自增
+                            isInsert = true;
+                        }
                     }
 
                 }

+ 3 - 1
src/main/java/com/td/Dawa/config/enums/ResultEnum.java

@@ -57,8 +57,10 @@ public enum ResultEnum {
 
     ROLE_DOES_NOT_EXIST(521,"不存在角色信息!"),
     ROLE_PRO_DOES_NOT_EXIST(521,"不存在角色职业信息!"),
-    ROLE_WORK_NOT_NORMAL(521,"添加的角色已有工作!"),
+    ROLE_WORK_NOT_NORMAL(521,"角色已有工作!"),
+    ROLE_WORK_ING(521,"角色在工作,不可删除!"),
     ROLE_ADD_ERROR(522,"添加角色信息异常!"),
+    ROLE_DELETE_ERROR(522,"删除角色信息异常!"),
     ROLE_NAME_TOO_LONG(522,"角色名字不能大于12个字!"),
     ROLE_ALREADY_ADD(522,"角色已经添加!"),
     GOLD_NOT_GET_ROLE(522,"金币不足,无法召唤!"),

+ 19 - 12
src/main/java/com/td/Dawa/game/comcharacters/service/ComCharactersServiceImpl.java

@@ -234,9 +234,11 @@ public class ComCharactersServiceImpl extends CommonServiceImpl<ComCharactersVo,
     private List<ComCharactersResourcesVo> generateCharacterModels() {
         //全部颜色,并计算两个主副颜色
         List<ExcelCharacterColor> _allColors = excelCharacterColorService.getListFromCache(GameEnum.REDIS_KEY_EXCEL_CHARACTER_COLOR.getMessage());
-        ExcelCharacterColor _AColor = _allColors.get((int) (Math.random() * _allColors.size())); //耳朵,花纹A主色,B副色
-        List<ExcelCharacterColor> _bColorList = _allColors.stream().filter(e -> !e.getId().equals(_AColor.getId())).collect(Collectors.toList());
-        ExcelCharacterColor _BColor = _bColorList.get((int) (Math.random() * _bColorList.size()));//不与A重复的花纹花色B
+        //颜色类型(0,旧颜色,1花纹、耳朵、尾巴、嘴巴、轮廓主色颜色预设,2内耳预制色,3眉毛预制色,4眼睛颜色预制色)
+        List<ExcelCharacterColor> _mainColors = _allColors.stream().filter(e->e.getType().equals(1)).collect(Collectors.toList());//取颜色1 为主颜色
+        ExcelCharacterColor _AColor = _mainColors.get((int) (Math.random() * _mainColors.size())); //A主色
+        List<ExcelCharacterColor> _bColorList = _mainColors.stream().filter(e -> !e.getId().equals(_AColor.getId())).collect(Collectors.toList());
+        ExcelCharacterColor _BColor = _bColorList.get((int) (Math.random() * _bColorList.size()));//不与A重复的花色B副色
         //生产和资源
         List<ExcelCharacterCreate> _allCreates = excelCharacterCreateService.getListFromCache(GameEnum.REDIS_KEY_EXCEL_CHARACTER_CREATE.getMessage());
         List<ExcelResources> _allResources = excelResourcesService.getListFromCache(GameEnum.REDIS_KEY_EXCEL_RESOURCES.getMessage());
@@ -255,7 +257,8 @@ public class ComCharactersServiceImpl extends CommonServiceImpl<ComCharactersVo,
         //_currentCharacters.add(pupil);
         //_currentCharacters.add(pupil);
         //瞳孔 独立色
-        ExcelCharacterColor _pupilColor = _allColors.get((int) (Math.random() * _allColors.size()));
+        List<ExcelCharacterColor> _pupilColors = _allColors.stream().filter(e->e.getType().equals(4)).collect(Collectors.toList());//取颜色4 为眼睛颜色
+        ExcelCharacterColor _pupilColor = _pupilColors.get((int) (Math.random() * _pupilColors.size()));
         infoList.add(new ComCharactersInfoVo(pupil, _pupilColor, false));
         infoList.add(new ComCharactersInfoVo(pupil, _pupilColor, true));
 
@@ -264,23 +267,27 @@ public class ComCharactersServiceImpl extends CommonServiceImpl<ComCharactersVo,
         ExcelCharacterCreate ears = ProbabilityIntervalUtil.getRolePos(earsAll);// earsAll.get((int) (Math.random() * earsAll.size()));
         //_currentCharacters.add(ears);
         //_currentCharacters.add(ears);
+        //内耳颜色,设置为副色
+        List<ExcelCharacterColor> _earsColors = _allColors.stream().filter(e->e.getType().equals(2)).collect(Collectors.toList());//取颜色2 为内耳颜色
+        ExcelCharacterColor _earsColor = _earsColors.get((int) (Math.random() * _earsColors.size()));
         //A色一致
-        infoList.add(new ComCharactersInfoVo(ears, _AColor, false));
-        infoList.add(new ComCharactersInfoVo(ears, _AColor, true));
+        infoList.add(new ComCharactersInfoVo(ears, _AColor,_earsColor,false));
+        infoList.add(new ComCharactersInfoVo(ears, _AColor,_earsColor, true));
         //3.生成眉毛
         List<ExcelCharacterCreate> eyebrowAll = _allCreates.stream().filter(e -> e.getPosition().equals(3)).collect(Collectors.toList());
         ExcelCharacterCreate eyebrow = ProbabilityIntervalUtil.getRolePos(eyebrowAll);// eyebrowAll.get((int) (Math.random() * eyebrowAll.size()));
         //_currentCharacters.add(eyebrow);
         //_currentCharacters.add(eyebrow);
-        ExcelCharacterColor _black = _allColors.get(75);//todo 后面改个固定值地方
-        infoList.add(new ComCharactersInfoVo(eyebrow, _black, false));
-        infoList.add(new ComCharactersInfoVo(eyebrow, _black, true));
+        List<ExcelCharacterColor> _eyeColors = _allColors.stream().filter(e->e.getType().equals(3)).collect(Collectors.toList());//取颜色3 为眉毛颜色
+        ExcelCharacterColor _eyeColor = _eyeColors.get((int) (Math.random() * _eyeColors.size()));
+        infoList.add(new ComCharactersInfoVo(eyebrow, _eyeColor, false));
+        infoList.add(new ComCharactersInfoVo(eyebrow, _eyeColor, true));
         //4.生成吻部
         List<ExcelCharacterCreate> snoutAll = _allCreates.stream().filter(e -> e.getPosition().equals(4)).collect(Collectors.toList());
         ExcelCharacterCreate snout = ProbabilityIntervalUtil.getRolePos(snoutAll);//snoutAll.get((int) (Math.random() * snoutAll.size()));
         //_currentCharacters.add(snout);
         //独立色
-        ExcelCharacterColor _snoutColor = _allColors.get((int) (Math.random() * _allColors.size()));
+        ExcelCharacterColor _snoutColor = _mainColors.get((int) (Math.random() * _mainColors.size()));
         infoList.add(new ComCharactersInfoVo(snout, _snoutColor));
         //5.生成花纹
         List<ExcelCharacterCreate> decorativePatternAll = _allCreates.stream().filter(e -> e.getPosition().equals(5)).collect(Collectors.toList());
@@ -293,14 +300,14 @@ public class ComCharactersServiceImpl extends CommonServiceImpl<ComCharactersVo,
         ExcelCharacterCreate outLine = ProbabilityIntervalUtil.getRolePos(outLineAll);//outLineAll.get((int) (Math.random() * outLineAll.size()));
         //_currentCharacters.add(outLine);
         //独立色
-        ExcelCharacterColor _outLineColor = _allColors.get((int) (Math.random() * _allColors.size()));
+        ExcelCharacterColor _outLineColor = _mainColors.get((int) (Math.random() * _mainColors.size()));
         infoList.add(new ComCharactersInfoVo(outLine, _outLineColor));
         //7.生成尾巴
         List<ExcelCharacterCreate> tailAll = _allCreates.stream().filter(e -> e.getPosition().equals(7)).collect(Collectors.toList());
         ExcelCharacterCreate tail = ProbabilityIntervalUtil.getRolePos(tailAll);//tailAll.get((int) (Math.random() * tailAll.size()));
         //_currentCharacters.add(tail);
         //独立色
-        ExcelCharacterColor _tailColor = _allColors.get((int) (Math.random() * _allColors.size()));
+        ExcelCharacterColor _tailColor = _mainColors.get((int) (Math.random() * _mainColors.size()));
         //主副色。主色与A色一致,副色为独立色
         infoList.add(new ComCharactersInfoVo(tail, _AColor, _tailColor));
 

+ 16 - 0
src/main/java/com/td/Dawa/game/comcharactersdiscovery/controller/ComCharactersDiscoveryController.java

@@ -17,6 +17,8 @@ import com.td.Dawa.game.comcharactersdiscovery.vo.ComCharactersDiscoveryClientVo
 import com.td.Dawa.game.comcharactersdiscovery.vo.ComCharactersDiscoveryVo;
 import com.td.Dawa.game.comcharactersdiscovery.service.ComCharactersDiscoveryService;
 import com.td.Dawa.util.CopyUtil;
+import com.td.Dawa.util.RedisData;
+import com.td.Dawa.util.RedisLock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -30,6 +32,9 @@ public class ComCharactersDiscoveryController extends CommonController<ComCharac
     @Autowired
     private ComCharactersService comCharactersService;
 
+    @Autowired
+    private RedisLock redisLock;
+
     /**
      * 开始工作
      *
@@ -68,7 +73,15 @@ public class ComCharactersDiscoveryController extends CommonController<ComCharac
                                         @RequestParam(value = "roleId") Integer roleId,
                                         @RequestParam(value = "workPos") Integer workPos,
                                         @RequestParam(value = "sceneId") Integer sceneId) {
+
+        long time = System.currentTimeMillis() + RedisData.getCharactersTimeout();
+        String _redisKey = RedisData.getCharactersKey(userId,roleId);
+
         try {
+            // 防止重复操作
+            if (!redisLock.lock(_redisKey, String.valueOf(time))) {
+                return Result.of(null, false, ResultEnum.REDIS_IS_LOCK);
+            }
             //拿出一个角色对应的配置数据来生成角色
             ComCharactersVo comCharactersVo = comCharactersService.getVo(roleId);
             if (comCharactersVo == null || !comCharactersVo.getUserId().equals(userId)) {
@@ -101,11 +114,14 @@ public class ComCharactersDiscoveryController extends CommonController<ComCharac
 
             //根据roleId 对应的数据,生成玩家数据,属性
             ComCharactersDiscoveryClientVo clientVo = comCharactersDiscoveryService.addDiscoverRole(comCharactersVo, sceneId);
+
             return Result.of(clientVo);
         } catch (AuthorizeException e) {
             return Result.of(null, false, e.getMessage(), e.getCode());
         } catch (Exception e) {
             return Result.of(e.getMessage(), false, ResultEnum.ROLE_ADD_ERROR);
+        } finally {
+            redisLock.unlock(_redisKey, String.valueOf(time));
         }
 
     }

+ 4 - 0
src/main/java/com/td/Dawa/game/complayerbackpack/repository/ComPlayerBackpackRepository.java

@@ -6,10 +6,14 @@ import com.td.Dawa.game.complayerbackpack.vo.ComPlayerBackpackVo;
 import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Repository;
 
+import javax.swing.text.html.Option;
 import java.util.List;
+import java.util.Optional;
 
 @Repository
 public interface ComPlayerBackpackRepository extends CommonRepository<ComPlayerBackpack, String> {
 
+    Optional<ComPlayerBackpack> findByUserIdAndItemId(String userId, Integer itemId);
+
     List<ComPlayerBackpack> findAllByItemIdInAndUserId(List<Integer> itemId,String userId);
 }

+ 4 - 0
src/main/java/com/td/Dawa/game/complayerbackpack/service/ComPlayerBackpackService.java

@@ -12,7 +12,11 @@ import java.util.List;
 
 public interface ComPlayerBackpackService extends CommonService<ComPlayerBackpackVo, ComPlayerBackpack, String> {
 
+    ComPlayerBackpack  findByUserIdAndItemId(String userId,Integer itemId);
+
     List<ComPlayerBackpack> saveAllByUserIdAndProps(String userId, List<ExcelPropClientVo> propClientVoList);
 
+    ComPlayerBackpack saveByUserIdAndProp(String userId, ExcelPropClientVo vo);
+
     PageInfo getPageAndProp(ComPlayerBackpackVo comPlayerBackpackVo);
 }

+ 36 - 0
src/main/java/com/td/Dawa/game/complayerbackpack/service/ComPlayerBackpackServiceImpl.java

@@ -42,6 +42,12 @@ public class ComPlayerBackpackServiceImpl extends CommonServiceImpl<ComPlayerBac
     @Autowired
     private ExcelPropService excelPropService;
 
+    @Override
+    public ComPlayerBackpack findByUserIdAndItemId(String userId, Integer itemId) {
+        ComPlayerBackpack comPlayerBackpack = comPlayerBackpackRepository.findByUserIdAndItemId(userId,itemId).orElse(null);
+        return comPlayerBackpack;
+    }
+
     /**
      * 根据userId对应的propIds保存全部物品
      *
@@ -100,6 +106,36 @@ public class ComPlayerBackpackServiceImpl extends CommonServiceImpl<ComPlayerBac
     }
 
 
+    @Override
+    public ComPlayerBackpack saveByUserIdAndProp(String userId, ExcelPropClientVo vo) {
+
+        //todo 如果传入的数据背包有一部分没有,则新增
+        ComPlayerBackpack comPlayerBackpack = comPlayerBackpackRepository.findByUserIdAndItemId(userId, vo.getPropId()).orElse(null);
+         //propIds 为原始prop id
+        if (comPlayerBackpack != null) {
+            //如果存在,则为旧数据,+ itemNum
+            comPlayerBackpack.setAmount(comPlayerBackpack.getAmount() + 1d);
+            log.info("1==>id:"+vo.getPropId());
+            log.info(comPlayerBackpack.toString());
+            super.save(CopyUtil.copy(comPlayerBackpack, ComPlayerBackpackVo.class));
+        } else {
+            //如果不存在,新增
+            comPlayerBackpack = new ComPlayerBackpack();
+            comPlayerBackpack.setAmount(1d);
+            comPlayerBackpack.setItemId(vo.getPropId());
+            comPlayerBackpack.setUserId(userId);
+            comPlayerBackpack.setItemName(vo.getName());
+            comPlayerBackpack.setItemTag(vo.getItemType());
+            comPlayerBackpack.setItemType(vo.getItemType());//分类和标识暂时设置一样
+            comPlayerBackpack.setCreateTime(vo.getCreateTime());
+            log.info("2==>id:"+vo.getPropId());
+            log.info(comPlayerBackpack.toString());
+            super.save(CopyUtil.copy(comPlayerBackpack, ComPlayerBackpackVo.class));
+        }
+        return comPlayerBackpack;
+    }
+
+
     @Override
     public PageInfo getPageAndProp(ComPlayerBackpackVo comPlayerBackpackVo) {
 

+ 2 - 0
src/main/java/com/td/Dawa/game/excelcharactercolor/pojo/ExcelCharacterColor.java

@@ -21,6 +21,8 @@ public class ExcelCharacterColor implements Serializable {
 
     private Integer a;//alpha
 
+    private Integer type;//颜色类型(0,旧颜色,1花纹、耳朵、尾巴、嘴巴、轮廓主色颜色预设,2内耳预制色,3眉毛预制色,4眼睛颜色预制色)
+
     private String note;//备注
 
     private Date createTime;//

+ 3 - 0
src/main/java/com/td/Dawa/game/excelcharactercolor/vo/ExcelCharacterColorClientVo.java

@@ -17,6 +17,9 @@ public class ExcelCharacterColorClientVo implements Serializable {
 
     private Integer a;//alpha
 
+    private Integer type;//颜色类型(0,旧颜色,1花纹、耳朵、尾巴、嘴巴、轮廓主色颜色预设,2内耳预制色,3眉毛预制色,4眼睛颜色预制色)
+
+
     //private String note;//备注
     //
     //private Date createTime;//

+ 2 - 0
src/main/java/com/td/Dawa/game/excelcharactercolor/vo/ExcelCharacterColorSimpleVo.java

@@ -16,6 +16,8 @@ public class ExcelCharacterColorSimpleVo implements Serializable {
 
     private Integer a;//alpha
 
+    private Integer type;//颜色类型(0,旧颜色,1花纹、耳朵、尾巴、嘴巴、轮廓主色颜色预设,2内耳预制色,3眉毛预制色,4眼睛颜色预制色)
+
     private String note;//备注
 
     private Date createTime;//

+ 2 - 0
src/main/java/com/td/Dawa/game/excelcharactercolor/vo/ExcelCharacterColorVo.java

@@ -16,6 +16,8 @@ public class ExcelCharacterColorVo extends PageCondition implements Serializable
 
     private Integer a;//alpha
 
+    private Integer type;//颜色类型(0,旧颜色,1花纹、耳朵、尾巴、嘴巴、轮廓主色颜色预设,2内耳预制色,3眉毛预制色,4眼睛颜色预制色)
+
     private String note;//备注
 
     private Date createTime;//

+ 245 - 32
src/main/java/com/td/Dawa/sys/sysGame/controller/sysGameUsersController.java

@@ -6,8 +6,14 @@ import com.td.Dawa.common.controller.CommonController;
 import com.td.Dawa.common.pojo.PageInfo;
 import com.td.Dawa.common.pojo.Result;
 import com.td.Dawa.config.enums.GameEnum;
+import com.td.Dawa.config.enums.ResultEnum;
+import com.td.Dawa.game.comcharacters.pojo.ComCharacters;
+import com.td.Dawa.game.comcharacters.service.ComCharactersService;
+import com.td.Dawa.game.comcharacters.vo.ComCharactersClientVo;
+import com.td.Dawa.game.comcharacters.vo.ComCharactersVo;
 import com.td.Dawa.game.comcntorder.service.ComCntOrderService;
 import com.td.Dawa.game.comcntorder.vo.ComCntOrderVo;
+import com.td.Dawa.game.complayerbackpack.pojo.ComPlayerBackpack;
 import com.td.Dawa.game.complayerbackpack.service.ComPlayerBackpackService;
 import com.td.Dawa.game.complayerbackpack.vo.ComPlayerBackpackVo;
 import com.td.Dawa.game.complayergoods.service.ComPlayerGoodsService;
@@ -25,15 +31,30 @@ import com.td.Dawa.game.comsnbtran.vo.ComSnbTranVo;
 import com.td.Dawa.game.comusers.pojo.ComUsers;
 import com.td.Dawa.game.comusers.service.ComUsersService;
 import com.td.Dawa.game.comusers.vo.ComUsersVo;
+import com.td.Dawa.game.excelcharacterattri.pojo.ExcelCharacterAttri;
+import com.td.Dawa.game.excelcharacterattri.service.ExcelCharacterAttriService;
+import com.td.Dawa.game.excelcharacterattri.vo.ExcelCharacterAttriVo;
+import com.td.Dawa.game.excelcharactercreate.service.ExcelCharacterCreateService;
+import com.td.Dawa.game.excelprop.pojo.ExcelProp;
+import com.td.Dawa.game.excelprop.service.ExcelPropService;
+import com.td.Dawa.game.excelprop.vo.ExcelPropClientVo;
+import com.td.Dawa.game.excelprop.vo.ExcelPropVo;
 import com.td.Dawa.game.excelworkpro.vo.ExcelWorkProVo;
+import com.td.Dawa.util.CopyUtil;
 import com.td.Dawa.util.JwtTokenUtil;
+import com.td.Dawa.util.RedisData;
+import com.td.Dawa.util.RedisLock;
 import lombok.extern.slf4j.Slf4j;
+import net.bytebuddy.asm.Advice;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.ModelAndView;
 
 import java.util.ArrayList;
+import java.util.List;
 
 @Slf4j
 @RestController
@@ -66,6 +87,18 @@ public class sysGameUsersController extends CommonController<ComUsersVo, ComUser
     @Autowired
     private ComPlayerBackpackService comPlayerBackpackService;
 
+    @Autowired
+    private ComCharactersService comCharactersService;
+
+    @Autowired
+    private ExcelCharacterAttriService excelCharacterAttriService;
+
+    @Autowired
+    private ExcelPropService excelPropService;
+
+    @Autowired
+    private RedisLock redisLock;
+
     @Autowired
     private JwtTokenUtil jwtTokenUtil;
 
@@ -73,17 +106,17 @@ public class sysGameUsersController extends CommonController<ComUsersVo, ComUser
     private String active;
 
     @GetMapping("user")
-    public ModelAndView user(){
+    public ModelAndView user() {
         return new ModelAndView("sys/aComUser/user");
     }
 
     @PostMapping("findGameUserByAddress")
     @Decrypt
     @Encrypt
-    public Result<PageInfo<ComUsersVo>> findGameUserByAddress(ComUsersVo comUsersVo){
+    public Result<PageInfo<ComUsersVo>> findGameUserByAddress(ComUsersVo comUsersVo) {
         ComUsersVo comUsersVo1 = new ComUsersVo();
         ArrayList<ComUsersVo> comUsersVoList = new ArrayList<>();
-        if(comUsersVo.getAddress() != null){
+        if (comUsersVo.getAddress() != null) {
             comUsersVo1 = comUsersService.findByAddress(comUsersVo.getAddress());
             comUsersVoList.add(comUsersVo1);
         }
@@ -106,12 +139,12 @@ public class sysGameUsersController extends CommonController<ComUsersVo, ComUser
     @PostMapping("findAllUserAttribute")
     @Decrypt
     @Encrypt
-    public Result<PageInfo<ComPlayersAttriVo>> findAllUserAttribute(ComUsersVo comUsersVo){
+    public Result<PageInfo<ComPlayersAttriVo>> findAllUserAttribute(ComUsersVo comUsersVo) {
 
-        if(comUsersVo.getAddress() != null){
+        if (comUsersVo.getAddress() != null) {
             //查询用户id
             ComUsersVo _comUsersVo = comUsersService.findByAddress(comUsersVo.getAddress());
-            if(!_comUsersVo.equals(null)){
+            if (!_comUsersVo.equals(null)) {
                 //如果存在用户数据,继续查询背包
                 ComPlayersAttriVo vo = new ComPlayersAttriVo();
                 vo.setUserId(_comUsersVo.getUserId());
@@ -144,7 +177,7 @@ public class sysGameUsersController extends CommonController<ComUsersVo, ComUser
     @PostMapping("findSNBTranByUserId")
     @Decrypt
     @Encrypt
-    public Result<PageInfo<ComSnbTranVo>> findSNBTranByUserId(ComSnbTranVo comSnbTranVo){
+    public Result<PageInfo<ComSnbTranVo>> findSNBTranByUserId(ComSnbTranVo comSnbTranVo) {
         return comSnbTranService.page(comSnbTranVo);
     }
 
@@ -152,29 +185,27 @@ public class sysGameUsersController extends CommonController<ComUsersVo, ComUser
     @PostMapping("findCNTTranByUserId")
     @Decrypt
     @Encrypt
-    public Result<PageInfo<ComCntOrderVo>> findCNTTranByUserId(ComCntOrderVo comCntOrderVo){
+    public Result<PageInfo<ComCntOrderVo>> findCNTTranByUserId(ComCntOrderVo comCntOrderVo) {
         return comCntOrderService.page(comCntOrderVo);
     }
 
     @PostMapping("findPlayerLogPage")
     @Decrypt
     @Encrypt
-    public Result<PageInfo<ComPlayerLogVo>> findCNTTranByUserId(ComPlayerLogVo comPlayerLogVo){
+    public Result<PageInfo<ComPlayerLogVo>> findCNTTranByUserId(ComPlayerLogVo comPlayerLogVo) {
         return comPlayerLogService.page(comPlayerLogVo);
     }
 
     @PostMapping("findPlayerProfitPage")
     @Decrypt
     @Encrypt
-    public Result<PageInfo<ComPlayerProfitVo>> findPlayerProfitByUserId(ComPlayerProfitVo comPlayerProfitVo){
+    public Result<PageInfo<ComPlayerProfitVo>> findPlayerProfitByUserId(ComPlayerProfitVo comPlayerProfitVo) {
         return comPlayerProfitService.page(comPlayerProfitVo);
     }
 
 
-
-
     @GetMapping("userPlayerGoods")
-    public ModelAndView userPlayerGoods(){
+    public ModelAndView userPlayerGoods() {
         return new ModelAndView("sys/aComUser/userPlayerGoods");
     }
 
@@ -182,12 +213,12 @@ public class sysGameUsersController extends CommonController<ComUsersVo, ComUser
     @PostMapping("findPlayerGoodsByAddress")
     @Decrypt
     @Encrypt
-    public Result<PageInfo<ComPlayerGoodsVo>> findPlayerGoodsByAddress(ComUsersVo comUsersVo){
+    public Result<PageInfo<ComPlayerGoodsVo>> findPlayerGoodsByAddress(ComUsersVo comUsersVo) {
 
-        if(comUsersVo.getAddress() != null){
+        if (comUsersVo.getAddress() != null) {
             //查询用户id
             ComUsersVo _comUsersVo = comUsersService.findByAddress(comUsersVo.getAddress());
-            if(!_comUsersVo.equals(null)){
+            if (!_comUsersVo.equals(null)) {
                 //如果存在用户数据,继续查询背包
                 ComPlayerGoodsVo comPlayerGoodsVo = new ComPlayerGoodsVo();
                 comPlayerGoodsVo.setUserId(_comUsersVo.getUserId());
@@ -208,26 +239,27 @@ public class sysGameUsersController extends CommonController<ComUsersVo, ComUser
         pageInfo.setTotal(1);//总页数
         return Result.of(pageInfo);
     }
+
     @PostMapping("playerGoodsSave")
     @Decrypt
     @Encrypt
-    public Result<ComPlayerGoodsVo> playerGoodsSave(ComPlayerGoodsVo comPlayerGoodsVo){
+    public Result<ComPlayerGoodsVo> playerGoodsSave(ComPlayerGoodsVo comPlayerGoodsVo) {
         return comPlayerGoodsService.save(comPlayerGoodsVo);
     }
 
     @GetMapping("userPlayerLands")
-    public ModelAndView 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){
+    public Result<PageInfo<ComPlayerLandVo>> findPlayerLandByAddress(ComUsersVo comUsersVo) {
+        if (comUsersVo.getAddress() != null) {
             //查询用户id
             ComUsersVo _comUsersVo = comUsersService.findByAddress(comUsersVo.getAddress());
-            if(!_comUsersVo.equals(null)){
+            if (!_comUsersVo.equals(null)) {
                 //如果存在用户数据,继续查询背包
                 ComPlayerLandVo comPlayerLandVo = new ComPlayerLandVo();
                 comPlayerLandVo.setUserId(_comUsersVo.getUserId());
@@ -249,44 +281,66 @@ public class sysGameUsersController extends CommonController<ComUsersVo, ComUser
         pageInfo.setTotal(1);//总页数
         return Result.of(pageInfo);
     }
+
     @PostMapping("playerLandSave")
     @Decrypt
     @Encrypt
-    public Result<ComPlayerLandVo> playerLandSave(ComPlayerLandVo comPlayerLandVo){
+    public Result<ComPlayerLandVo> playerLandSave(ComPlayerLandVo comPlayerLandVo) {
         return comPlayerLandService.save(comPlayerLandVo);
     }
 
     @PostMapping("findPlayerLandByUserId")
     @Decrypt
     @Encrypt
-    public Result<PageInfo<ComPlayerLandVo>> findPlayerLandByUserId(ComPlayerLandVo comPlayerLandVo){
+    public Result<PageInfo<ComPlayerLandVo>> findPlayerLandByUserId(ComPlayerLandVo comPlayerLandVo) {
         return comPlayerLandService.page(comPlayerLandVo);
     }
 
     @PostMapping("findPlayerGoodsByUserId")
     @Decrypt
     @Encrypt
-    public Result<PageInfo<ComPlayerGoodsVo>> findPlayerGoodsByUserId(ComPlayerGoodsVo comPlayerGoodsVo){
+    public Result<PageInfo<ComPlayerGoodsVo>> findPlayerGoodsByUserId(ComPlayerGoodsVo comPlayerGoodsVo) {
         return comPlayerGoodsService.page(comPlayerGoodsVo);
     }
 
+    //瓦达接口相关
 
+    /**
+     * 根据地址获取用户信息
+     *
+     * @param address
+     * @return
+     */
+    @PostMapping("findUserIdByAddress")
+    @Decrypt
+    @Encrypt
+    public Result<?> findUserIdByAddress(@RequestParam("address") String address) {
+        //查询用户id
+        ComUsersVo _comUsersVo = comUsersService.findByAddress(address);
+        if (_comUsersVo == null) {
+            return Result.of(null, false, ResultEnum.USER_NOT_ADDRESS);
+        }
+        return Result.of(_comUsersVo);
+    }
 
-
+    //用户背包
     @GetMapping("userPlayerBackpack")
-    public ModelAndView userPlayerBackpack(){
-        return new ModelAndView("sys/aComUser/userPlayerBackpack");
+    public ModelAndView userPlayerBackpack() {
+        //初始化背包页面时候,加载物品配置,以便添加信息
+        List<ExcelProp> excelPropList = excelPropService.getListFromCache(GameEnum.REDIS_KEY_EXCEL_PROP.getMessage());
+
+        return new ModelAndView("sys/aComUser/userPlayerBackpack","propList",CopyUtil.copyList(excelPropList,ExcelPropVo.class));
     }
 
 
     @PostMapping("findPlayerBackpack")
     @Decrypt
     @Encrypt
-    public Result<?> findPlayerBackpack(ComUsersVo comUsersVo){
-        if(comUsersVo.getAddress() != null){
+    public Result<?> findPlayerBackpack(ComUsersVo comUsersVo) {
+        if (comUsersVo.getAddress() != null) {
             //查询用户id
             ComUsersVo _comUsersVo = comUsersService.findByAddress(comUsersVo.getAddress());
-            if(!_comUsersVo.equals(null)){
+            if (!_comUsersVo.equals(null)) {
                 //如果存在用户数据,继续查询背包
                 ComPlayerBackpackVo vo = new ComPlayerBackpackVo();
                 vo.setUserId(_comUsersVo.getUserId());
@@ -299,11 +353,65 @@ public class sysGameUsersController extends CommonController<ComUsersVo, ComUser
         }
         return Result.of(new PageInfo<>());
     }
+
+    /**
+     * 新增背包数据
+     *
+     * @param vo
+     * @return
+     */
     @PostMapping("savePlayerBackpack")
     @Decrypt
     @Encrypt
-    public Result<?> savePlayerBackpack(ComPlayerBackpackVo vo){
-        return comPlayerBackpackService.save(vo);
+    public Result<?> savePlayerBackpack(ComPlayerBackpackVo vo) {
+        long time = System.currentTimeMillis() + RedisData.getBackpackTimeout();
+        String _redisKey = "SYS_BACKPACK_SAVE_" + vo.getUserId();
+        try {
+            // 防止重复操作
+            if (!redisLock.lock(_redisKey, String.valueOf(time))) {
+                return Result.of(null, false, "保存繁忙,稍后再试!");
+            }
+            //新增情况查询是否存在物品
+            if (!StringUtils.hasText(vo.getId()) && comPlayerBackpackService.findByUserIdAndItemId(vo.getUserId(), vo.getItemId()) != null) {
+                return Result.of(null, false, "已存在物品");
+            }
+            Result result = comPlayerBackpackService.save(vo);
+            redisLock.unlock(_redisKey, String.valueOf(time));
+            return result;
+        } catch (Exception e) {
+            return Result.of(null, false, "保存异常,稍后再试!");
+        }
+    }
+
+    /**
+     * 直接根据id添加物品
+     *
+     * @param userId
+     * @param id
+     * @return
+     */
+    @PostMapping("addProp")
+    @Encrypt
+    public Result<?> addProp(@RequestParam(value = "userId") String userId,
+                                                       @RequestParam(value = "id") Integer id) {
+        long time = System.currentTimeMillis() + RedisData.getCharacterTimeout();
+        String _redisKey = "SYS_PROP_ADD_" + userId;
+        try {
+            // 防止重复操作
+            if (!redisLock.lock(_redisKey, String.valueOf(time))) {
+                return Result.of(null, false, "保存繁忙,稍后再试!");
+            }
+            //拿出一个角色对应的配置数据来生成角色
+            ExcelPropVo excelPropVo = excelPropService.getVo(id);
+            if (excelPropVo == null) {
+                return Result.of(null, false, "没有对应物品!");
+            }
+            //根据roleId 对应的数据,生成玩家数据,属性
+            ComPlayerBackpack comPlayerBackpack = comPlayerBackpackService.saveByUserIdAndProp(userId, CopyUtil.copy(excelPropVo,ExcelPropClientVo.class));
+            return Result.of(comPlayerBackpack);
+        } catch (Exception e) {
+            return Result.of(null, false, "操作物品异常!");
+        }
     }
 
 
@@ -314,4 +422,109 @@ public class sysGameUsersController extends CommonController<ComUsersVo, ComUser
         Result result = comPlayerBackpackService.delete(id);
         return result;
     }
+
+
+    //用户管理
+    @GetMapping("userCharacters")
+    public ModelAndView userCharacters() {
+        List<ExcelCharacterAttri> excelCharacterAttris = excelCharacterAttriService.getListFromCache(GameEnum.REDIS_KEY_EXCEL_CHARACTER_ATTRI.getMessage());
+
+        return new ModelAndView("sys/aComUser/userCharacters" ,"characterAttris",CopyUtil.copyList(excelCharacterAttris,ExcelCharacterAttriVo.class));
+    }
+
+
+    @PostMapping("findCharacters")
+    @Decrypt
+    @Encrypt
+    public Result<?> findCharacters(ComUsersVo comUsersVo) {
+        if (comUsersVo.getAddress() != null) {
+            //查询用户id
+            ComUsersVo _comUsersVo = comUsersService.findByAddress(comUsersVo.getAddress());
+            if (!_comUsersVo.equals(null)) {
+                //如果存在用户数据,继续查询背包
+                ComCharactersVo vo = new ComCharactersVo();
+                vo.setUserId(_comUsersVo.getUserId());
+                vo.setPage(comUsersVo.getPage());
+                vo.setRows(comUsersVo.getRows());
+                vo.setSidx(comUsersVo.getSidx());
+                vo.setSord(comUsersVo.getSord());
+                return comCharactersService.page(vo);
+            }
+        }
+        return Result.of(new PageInfo<>());
+    }
+
+    @PostMapping("saveCharacters")
+    @Decrypt
+    @Encrypt
+    public Result<?> saveCharacters(ComCharactersVo vo) {
+        Result result = comCharactersService.save(vo);
+        return result;
+    }
+
+    /**
+     * 直接根据roleId添加角色
+     *
+     * @param userId
+     * @param roleId
+     * @return
+     */
+    @PostMapping("addCharacters")
+    @Encrypt
+    public Result<ComCharactersClientVo> addCharacters(@RequestParam(value = "userId") String userId,
+                                                       @RequestParam(value = "roleId") Integer roleId) {
+        long time = System.currentTimeMillis() + RedisData.getCharacterTimeout();
+        String _redisKey = "SYS_CHARACTERS_ADD_" + userId;
+        try {
+            // 防止重复操作
+            if (!redisLock.lock(_redisKey, String.valueOf(time))) {
+                return Result.of(null, false, "保存繁忙,稍后再试!");
+            }
+            //拿出一个角色对应的配置数据来生成角色
+            ExcelCharacterAttriVo excelCharacterAttriVo = excelCharacterAttriService.getVo(roleId);
+            if (excelCharacterAttriVo == null) {
+                return Result.of(null, false, ResultEnum.ROLE_DOES_NOT_EXIST);
+            }
+            //根据roleId 对应的数据,生成玩家数据,属性
+            ComCharactersClientVo comCharacters = comCharactersService.addRole(excelCharacterAttriVo, userId);
+            return Result.of(comCharacters);
+        } catch (Exception e) {
+            return Result.of(null, false, ResultEnum.ROLE_ADD_ERROR);
+        }
+    }
+
+    /**
+     * 删除角色时候,如果正在工作,则不能删除
+     *
+     * @param id
+     * @return
+     */
+    @PostMapping("deleteCharacters")
+    @Decrypt
+    @Encrypt
+    public Result deletePlayerBackpack(@RequestParam("id") Integer id) {
+        ComCharactersVo comCharactersVo = comCharactersService.getVo(id);
+        if (comCharactersVo == null) {
+            return Result.of(null, false, ResultEnum.ROLE_DOES_NOT_EXIST);
+        }
+        long time = System.currentTimeMillis() + RedisData.getCharactersTimeout();
+        String _redisKey = RedisData.getCharactersKey(comCharactersVo.getUserId(), comCharactersVo.getRoleId());
+        try {
+            // 防止重复操作
+            if (!redisLock.lock(_redisKey, String.valueOf(time))) {
+                return Result.of(null, false, ResultEnum.REDIS_IS_LOCK);
+            }
+            if (comCharactersVo.getProfessional().equals(GameEnum.PRO_WORK_NORMAL.getValue())) {
+                //如果没指派工作,可以删除 ,加操作锁
+                Result result = comCharactersService.delete(id);
+                return result;
+            } else {
+                return Result.of(null, false, ResultEnum.ROLE_WORK_ING);
+            }
+        } catch (Exception e) {
+            return Result.of(e.getMessage(), false, ResultEnum.ROLE_DELETE_ERROR);
+        } finally {
+            redisLock.unlock(_redisKey, String.valueOf(time));
+        }
+    }
 }

+ 2 - 1
src/main/java/com/td/Dawa/util/ExcelDataUtil.java

@@ -81,7 +81,8 @@ public class ExcelDataUtil {
         excelReader.addHeaderAlias("ID","id")
                 .addHeaderAlias("R","r")
                 .addHeaderAlias("G","g")
-                .addHeaderAlias("B","b");
+                .addHeaderAlias("B","b")
+                .addHeaderAlias("Type","type");
         return excelReader.read(0,1,ExcelCharacterColorVo.class);
     }
 

+ 36 - 8
src/main/java/com/td/Dawa/util/RedisData.java

@@ -4,14 +4,6 @@ package com.td.Dawa.util;
  * redis 参数
  */
 public class RedisData {
-    /**
-     * ss player 相关
-     */
-    private static final int PLAYER_TIMEOUT = 5 * 1000; //5s锁
-
-    public static int getPlayerTimeout() {
-        return PLAYER_TIMEOUT;
-    }
 
     /**
      * 1s SNB锁
@@ -115,4 +107,40 @@ public class RedisData {
     public static int getPlayerScoreTimeout() {
         return PLAYER_SCORE_TIMEOUT;
     }
+
+
+    /**
+     * player 相关
+     */
+    private static final int PLAYER_TIMEOUT = 5 * 1000; //5s锁
+
+    public static int getPlayerTimeout() {
+        return PLAYER_TIMEOUT;
+    }
+    /**
+     *  characters 相关
+     */
+    private static final int CHARACTERS_TIMEOUT = 5 * 1000; //5s锁
+
+    public static int getCharactersTimeout() {
+        return CHARACTERS_TIMEOUT;
+    }
+
+    public static String getCharactersKey(String userId,Integer roleId) {
+        return "CHARACTERS_".concat(userId).concat("_").concat(roleId.toString());
+    }
+    /**
+     * sys 相关
+     */
+    private static final int BACKPACK_TIMEOUT = 5 * 1000; //5s锁
+
+    public static int getBackpackTimeout() {
+        return BACKPACK_TIMEOUT;
+    }
+
+    private static final int CHARACTER_TIMEOUT = 5 * 1000; //5s锁
+
+    public static int getCharacterTimeout() {
+        return CHARACTER_TIMEOUT;
+    }
 }

+ 37 - 1
src/main/java/com/td/Dawa/util/WaDaNetUtil.java

@@ -3,16 +3,25 @@ package com.td.Dawa.util;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.http.conn.ssl.NoopHostnameVerifier;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.TrustStrategy;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.ssl.SSLContexts;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
 import org.springframework.stereotype.Component;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
 
+import javax.net.ssl.SSLContext;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -45,6 +54,24 @@ public class WaDaNetUtil {
         WaDaNetUtil.waDaUrl = waDaUrl;
     }
 
+    /**
+     * 通过该工厂类创建的RestTemplate发送请求时,可忽略https证书认证
+     *
+     * @return 工厂
+     */
+    private static HttpComponentsClientHttpRequestFactory generateHttpRequestFactory() throws Exception {
+        TrustStrategy acceptingTrustStrategy = ((x509Certificates, authType) -> true);
+        SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();
+        SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier());
+
+        HttpClientBuilder httpClientBuilder = HttpClients.custom();
+        httpClientBuilder.setSSLSocketFactory(connectionSocketFactory);
+        CloseableHttpClient httpClient = httpClientBuilder.build();
+        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
+        factory.setHttpClient(httpClient);
+        return factory;
+    }
+
     /**
      * 登录验证
      * {
@@ -62,13 +89,20 @@ public class WaDaNetUtil {
      * }
      */
     public static Map MetaPalLogin(String userName, String password) {
+
         // 以 body json体传入
         ObjectMapper objectMapper = new ObjectMapper();
         ObjectNode params = objectMapper.createObjectNode();
         params.put("username", userName);
         params.put("password", password);
         String DAppUrl = WaDaNetUtil.getWaDaUrl() + "/user/login";
-        RestTemplate restTemplate = new RestTemplate();
+        RestTemplate restTemplate = null;
+        try {
+            restTemplate = new RestTemplate(WaDaNetUtil.generateHttpRequestFactory());
+        } catch (Exception e) {
+            log.error(e.getMessage());
+            throw new RuntimeException("unSSLRestTemplate bean创建失败,原因为:" + e.getMessage());
+        }
         HttpHeaders headers = new HttpHeaders();
         MediaType type = MediaType.parseMediaType(MediaType.APPLICATION_JSON_VALUE);
         headers.setContentType(type);
@@ -81,6 +115,8 @@ public class WaDaNetUtil {
         } else {
             throw new RuntimeException("请求失败!状态:" + response.getStatusCodeValue() + ";信息:系统繁忙!请稍后重试!");
         }
+
+
     }
 
     /**

+ 509 - 0
src/main/resources/static/sys/aComUser/js/userCharacters.js

@@ -0,0 +1,509 @@
+let tableIns;
+let tablePlayerLog;
+let tablePlayerProfit;
+let tree;
+let userId;
+let openIndex;
+
+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: '#mainTable'
+        , url: ctx + "/sys/sysComUsers/findCharacters"
+        , 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 即为原始返回的数据
+            $("#addForm")[0].reset();
+            userId = null;
+            form.render();
+            var data = res.data;
+            console.log("返回的地址数据:", data);
+            if (data.rows && data.rows.length > 0) {
+                // userId = data.rows[0].userId;//记录当前访问的userId
+                // let _findData = {userId: data.rows[0].userId, sidx: "desc", sord: "createTime"};
+                // if (!tablePlayerLog) {
+                //     initPlayerLog(table, _findData);
+                // } else {
+                //     playerLogReload(_findData);
+                // }
+                //
+                // if(!tablePlayerProfit){
+                //     initPlayerProfit(table, _findData);
+                // }else{
+                //     playerProfitReload(_findData);
+                // }
+            }
+
+            return {
+                "flag": res.flag, //解析接口状态
+                "msg": res.msg, //解析提示文本
+                "records": data.records, //解析数据长度
+                "rows": data.rows //解析数据列表
+            };
+        }
+        , toolbar: '#mainTableToolbarDemo'
+        , title: '角色列表'
+        , cols: [[
+            {field: 'id', title: '背包ID', hide: true}
+            , {field: 'userId', title: '用户ID'}
+            , {field: 'roleId', title: '属性表ID'}
+            , {field: 'roleType', title: '种类', hide: true}
+            , {field: 'name', title: '名字'}
+            , {field: 'exp', title: '经验'}
+            , {field: 'level', title: '等级'}
+            , {field: 'power', title: '力量'}
+            , {field: 'intelligence', title: '智力值'}
+            , {field: 'skills', title: '技巧值'}
+            , {field: 'random', title: '随机属性值', hide: true}
+            , {
+                field: 'professional', title: '当前工作', templet: function (d) {
+                    //挖矿,勘探,运输,伐木
+                    if (d.professional == 0) {
+                        return '<span style="color: red">无工作</span>';
+                    } else if (d.professional == 1) {
+                        return '<span style="color: green">挖矿</span>';
+                    } else if (d.professional == 2) {
+                        return '<span style="color: green">勘探</span>';
+                    } else if (d.professional == 3) {
+                        return '<span style="color: green">运输</span>';
+                    } else if (d.professional == 4) {
+                        return '<span style="color: green">伐木</span>';
+                    } else {
+                        return '未添加:' + d.professional;
+                    }
+                }
+            }
+            , {field: 'workPos', title: '工作位置'}
+            , {field: 'action', title: '携带动作'}
+            , {field: 'interactive', title: '互动事件'}
+            , {field: 'state', title: '状态', hide: true}
+            , {field: 'modelId', title: '模型ID'}
+            , {field: 'modelColor', title: '颜色ID'}
+            , {field: 'createTime', title: '创建时间', hide: true}
+            , {field: 'updateTime', title: '更新时间', hide: true}
+            , {fixed: 'right', title: '操作', width: 140, toolbar: '#mainTableBarDemo'}
+        ]]
+        , defaultToolbar: ['', 'exports', 'print']
+        , page: true
+        , height: height
+        , cellMinWidth: 80
+    });
+
+    //头工具栏事件
+    table.on('toolbar(test)', function (obj) {
+        switch (obj.event) {
+            case 'query':
+                //根据用户地址查询
+                findByUserAddress(form);
+                break;
+            case 'playerLogReload':
+                playerLogReload();
+                break;
+
+            case 'addNewRow':
+                let queryByAddress = $("#queryByAddress").val();
+                //获取菜单数据
+                if (queryByAddress.length <= 0) {
+                    layer.msg("输入用户钱包地址新增", {icon: 2, time: 1000}, function () {
+                    });
+                    return;
+                }
+                $.post(ctx + "/sys/sysComUsers/findUserIdByAddress", {address: queryByAddress}, function (res) {
+                    if (!res.flag) {
+                        layer.msg(res.msg, {icon: 2, time: 2000}, function () {
+                        });
+                        return;
+                    }
+
+                    //类型,后面进入页面时候获取一次配置
+                    // $('#roleId').find("option").remove();
+                    // $('#roleId').append(new Option("角色1", "1"));
+                    // $('#roleId').append(new Option("角色2", "2"));
+                    // $('#roleId').append(new Option("角色3", "3"));
+                    // $('#roleId').append(new Option("角色4", "4"));
+                    // form.render("select");
+
+                    //按地址查询返回userId后,添加用户信息
+                    $("#tableId").css("display", "none");
+                    $("#tableTime").css("display", "none");
+                    $("#saveBtn").css("display", "none");
+                    $("#addBtn").css("display", "block");
+                    $("#addForm")[0].reset();
+                    // console.log(res);
+                    userId = res.data.userId;//记录当前访问的userId
+                    form.val("addForm",{"userId":userId});
+                    form.render();
+                    openIndex = layer.open({
+                        type: 1,  //可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
+                        title: ['新增数据', 'font-size:18px;'],//数组第二项可以写任意css样式;如果你不想显示标题栏,你可以title: false
+                        area: ['50%', '80%'],
+                        content: $('#show_add_div')
+                    });
+                });
+
+                break;
+        }
+    });
+
+    //监听行工具事件
+    table.on('tool(test)', function (obj) {
+        let data = obj.data;
+        //编辑
+        if (obj.event === 'edit') {
+            $("#tableId").css("display", "block");
+            $("#tableTime").css("display", "block");
+            $("#saveBtn").css("display", "block");
+            $("#addBtn").css("display", "none");
+            //回显操作表单
+            $("#comForm")[0].reset();
+            $("#comForm").form(data);
+            form.render();
+
+            openIndex = layer.open({
+                type: 1,  //可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
+                title: ['修改数据', 'font-size:18px;'],//数组第二项可以写任意css样式;如果你不想显示标题栏,你可以title: false
+                area: ['80%', '80%'],
+                content: $('#show_div')
+            });
+        } else if (obj.event === 'del') {
+            layer.confirm('真的删除行么?', function (index) {
+                $.post(ctx + "/sys/sysComUsers/deleteCharacters", {id: data.id}, function (data) {
+                    if (!data.flag) {
+                        layer.msg(data.msg, {icon: 2, time: 2000}, function () {
+                        });
+                        return;
+                    }
+                    obj.del();
+                    tableIns.reload();
+                });
+                layer.close(index);
+            });
+        }
+    });
+
+
+    //日期选择器
+    laydate.render({
+        elem: '#expiredTimeDate',
+        format: "yyyy-MM-dd HH:mm:ss"
+    });
+
+    //监听提交
+    form.on('submit(comFilter)', function (data) {
+        comFormSave(false);
+    });
+    form.on('submit(comAddFilter)', function (data) {
+        comFormAdd();
+    });
+
+    $("#saveBtn").css("display", "none");
+    $("#addBtn").css("display", "none");
+});
+
+
+function findByUserAddress(form) {
+    if(form){
+        //重置数据
+        $("#comForm")[0].reset();
+        form.render();
+    }
+    let queryByAddress = $("#queryByAddress").val();
+    //获取菜单数据
+    if (queryByAddress.length <= 0) {
+        layer.msg("输入用户钱包地址查询", {icon: 2, time: 1000}, function () {
+        });
+        return;
+    }
+    tableIns.reload({
+        page: {
+            curr: 1 //重新从第 1 页开始
+            , limit: 10
+        },
+        method: 'POST'
+        , url: ctx + "/sys/sysComUsers/findCharacters"
+        , where: {address: queryByAddress, sidx: "desc", sord: "createTime"}
+        , done: function (res, curr, count) {
+            // console.log(res, curr, count);
+            $("input[name='queryByAddress']").val(queryByAddress);
+            //this.where={};
+            //不清空,有问题:搜索条件会保留
+            //清空,  有问题:分页的时候没有搜索条件了,分页会受到影响
+        }
+    });
+}
+
+/**
+ * 提交保存
+ */
+function comFormSave(isAddNew) {
+    let comForm = $("#comForm").serializeObject();
+    if (!comForm.id && !isAddNew) {
+        layer.msg("选择编辑的对象", {icon: 2, time: 1000}, function () {
+        });
+        return;
+    }
+    $.post(ctx + "/sys/sysComUsers/saveCharacters", comForm, function (data) {
+        if (!data.flag) {
+            layer.msg(data.msg, {icon: 2, time: 2000}, function () {
+            });
+            return;
+        }
+        layer.close(openIndex);
+        tableIns.reload();
+    });
+}
+
+function comFormAdd() {
+    let addForm = $("#addForm").serializeObject();
+    console.log(addForm);
+    $.post(ctx + "/sys/sysComUsers/addCharacters", {userId: addForm.userId, roleId: addForm.roleId}, function (data) {
+        if (!data.flag) {
+            layer.msg(data.msg, {icon: 2, time: 2000}, function () {
+            });
+            return;
+        }
+        layer.close(openIndex);
+        findByUserAddress();
+    });
+}
+
+/**
+ * 用户操作日志
+ * @param table
+ * @param data
+ */
+function initPlayerLog(table, data) {
+    //用户操作playerLog
+    // console.log("playerLog");
+    tablePlayerLog = table.render({
+        elem: '#comPlayerLogTable'
+        , url: ctx + "/sys/sysComUsers/findPlayerLogPage"
+        , method: 'POST'
+        //请求前参数处理
+        , request: {
+            pageName: 'page' //页码的参数名称,默认:page
+            , limitName: 'rows' //每页数据量的参数名,默认:limit
+        }
+        , where: data
+        , response: {
+            statusName: 'flag' //规定数据状态的字段名称,默认:code
+            , statusCode: true //规定成功的状态码,默认:0
+            , msgName: 'msg' //规定状态信息的字段名称,默认:msg
+            , countName: 'records' //规定数据总数的字段名称,默认:count
+            , dataName: 'rows' //规定数据列表的字段名称,默认:data
+        }
+        //响应后数据处理
+        , parseData: function (res) { //res 即为原始返回的数据
+            let data = res.data;
+            // console.log("playerLog",res);
+            return {
+                "flag": res.flag, //解析接口状态
+                "msg": res.msg, //解析提示文本
+                "records": data.records, //解析数据长度
+                "rows": data.rows //解析数据列表
+            };
+        }
+        , toolbar: '#comPlayerLogTableToolbarDemo'
+        , title: '用户仓库操作列表'
+        , cols: [[
+            {field: 'id', title: 'ID', hide: true}
+            , {field: 'userId', title: 'userId', width: 260}
+            , {field: 'tId', title: '目标id', width: 100}
+            , {
+                field: 'tType', title: '交易的类型', width: 100, templet: function (d) {
+                    if (d.tType == 0) {  // 自定义内容
+                        return '<span style="color: green">收获果实</span>';
+                    } else if (d.tType == 1) {
+                        return '<span style="color: red">种植种子</span>';
+                    } else if (d.tType == 2) {
+                        return '<span style="color: red">赠送</span>';
+                    } else if (d.tType == 3) {
+                        return '<span style="color: green">被赠送</span>';
+                    } else if (d.tType == 4) {
+                        return '<span style="color: green">钻石兑换种子</span>';
+                    } else if (d.tType == 5) {
+                        return '<span style="color: red">出售果实</span>';
+                    } else if (d.tType == 6) {
+                        return '<span style="color: green">偷取果实</span>';
+                    } else if (d.tType == 7) {
+                        return '<span style="color: red">断电扣除果实</span>';
+                    } else {
+                        return '<span style="color: green">待添加:</span>' + d.tType;
+                    }
+                }
+            }
+            , {field: 'tName', title: '物品名字', width: 120}
+            // , {field: 'tAmount', title: '交易数量', width: 150}
+            // , {field: 'beforeAmount', title: '交易前数量'}
+            // , {field: 'afterAmount', title: '交易后数量'}
+            , {
+                field: 'tAmount', title: '交易数量', width: 150, templet: function (d) {
+                    return (d.tAmount + d.tPart).toFixed(5);
+                }
+            }
+            , {
+                field: 'beforeAmount', title: '交易前数量', templet: function (d) {
+                    return (d.beforeAmount + d.beforePart).toFixed(5);
+                }
+            }
+            , {
+                field: 'afterAmount', title: '交易后数量', templet: function (d) {
+                    return (d.afterAmount + d.afterPart).toFixed(5);
+                }
+            }
+            , {field: 'tLoss', title: '系统扣除部分'}
+            , {field: 'lMultiple', title: 'land倍数', width: 80}
+            , {
+                field: 'withered', title: '损耗类型', width: 100, templet: function (d) {
+                    if (d.withered == 0) {  // 自定义内容
+                        return '<span style="color: green">---</span>';
+                    } else if (d.withered == 1) {
+                        return '<span style="color: red">枯萎(死亡)</span>';
+                    } else if (d.withered == 2) {
+                        return '<span style="color: red">断电损耗</span>';
+                    } else {
+                        return '<span style="color: green">待添加:</span>' + d.withered;
+                    }
+                }
+            }
+            , {field: 'createTime', title: '创建时间'}
+            , {field: 'updateTime', title: '更新时间', hide: true}
+        ]]
+        , defaultToolbar: ['', 'exports', 'print']
+        , page: true
+        , height: 500
+        , cellMinWidth: 80
+    });
+}
+
+
+function playerLogReload(data) {
+    tablePlayerLog.reload({
+        page: {
+            curr: 1 //重新从第 1 页开始
+            , limit: 10
+        }
+        , method: 'POST'
+        , url: ctx + "/sys/sysComUsers/findPlayerLogPage"
+        , where: data
+        , done: function (res, curr, count) {
+        }
+    });
+}
+
+
+/**
+ * 用户偷取的操作
+ * @param table
+ * @param data
+ */
+function initPlayerProfit(table, data) {
+    //用户操作PlayerProfit
+    tablePlayerProfit = table.render({
+        elem: '#comPlayerProfitTable'
+        , url: ctx + "/sys/sysComUsers/findPlayerProfitPage"
+        , method: 'POST'
+        //请求前参数处理
+        , request: {
+            pageName: 'page' //页码的参数名称,默认:page
+            , limitName: 'rows' //每页数据量的参数名,默认:limit
+        }
+        , where: data
+        , response: {
+            statusName: 'flag' //规定数据状态的字段名称,默认:code
+            , statusCode: true //规定成功的状态码,默认:0
+            , msgName: 'msg' //规定状态信息的字段名称,默认:msg
+            , countName: 'records' //规定数据总数的字段名称,默认:count
+            , dataName: 'rows' //规定数据列表的字段名称,默认:data
+        }
+        //响应后数据处理
+        , parseData: function (res) { //res 即为原始返回的数据
+            let data = res.data;
+            // console.log("playerLog",res);
+            return {
+                "flag": res.flag, //解析接口状态
+                "msg": res.msg, //解析提示文本
+                "records": data.records, //解析数据长度
+                "rows": data.rows //解析数据列表
+            };
+        }
+        , toolbar: '#comPlayerProfitTableToolbarDemo'
+        , title: '用户仓库操作列表'
+        , cols: [[
+            {field: 'id', title: 'ID', hide: true}
+            , {field: 'userId', title: 'userId', width: 260}
+            , {field: 'targetId', title: '目标id', width: 100}
+            , {field: 'plantFlag', title: '种植标识', width: 120}
+            , {field: 'landId', title: '土地号数', width: 120}
+            , {
+                field: 'leaseDate', title: '租赁类型', width: 100, templet: function (d) {
+                    if (d.leaseDate == 1) {  // 自定义内容
+                        return '<span style="color: green">3个月</span>';
+                    } else if (d.leaseDate == 2) {
+                        return '<span style="color: red">1年</span>';
+                    } else if (d.leaseDate == 3) {
+                        return '<span style="color: red">5年</span>';
+                    } else if (d.leaseDate == 4) {
+                        return '<span style="color: red">养殖场</span>';
+                    } else {
+                        return '<span style="color: green">待添加:</span>' + d.leaseDate;
+                    }
+                }
+            }
+            , {field: 'leaseMultiple', title: '租赁倍数', width: 120}
+            , {field: 'harvest', title: '土地产出量', width: 150}
+            , {field: 'profit', title: '利润总值'}
+            , {field: 'profitAfter', title: '交易后利润'}
+            , {field: 'stolen', title: '目标损失量', width: 150}
+            , {field: 'finalSteal', title: '玩家偷取得到的数量'}
+            , {field: 'profitRatio', title: '收成的比例值'}
+            , {field: 'stealRatio', title: '比例区间1%~3%'}
+            , {field: 'finalRatio', title: '损失比例', width: 80}
+            , {field: 'createTime', title: '创建时间'}
+            , {field: 'updateTime', title: '更新时间', hide: true}
+        ]]
+        , defaultToolbar: ['', 'exports', 'print']
+        , page: true
+        , height: 500
+        , cellMinWidth: 80
+    });
+}
+
+
+function playerProfitReload(data) {
+    tablePlayerProfit.reload({
+        page: {
+            curr: 1 //重新从第 1 页开始
+            , limit: 10
+        }
+        , method: 'POST'
+        , url: ctx + "/sys/sysComUsers/findPlayerProfitPage"
+        , where: data
+        , done: function (res, curr, count) {
+        }
+    });
+}

+ 133 - 31
src/main/resources/static/sys/aComUser/js/userPlayerBackpack.js

@@ -1,21 +1,24 @@
 let tableIns;
-let tableCNT;
-let tableSNB;
 let tablePlayerLog;
 let tablePlayerProfit;
 let tree;
+let userId;
+let bHasData = false;
+let openIndex;
+// let propList = [[${propList}]];
+// console.log("propList:",propList);
 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+)$/, '只能填写正整数'],//必填,且只能输入正整数
+        // positiveInteger: [/^(([0-9]+[\.]?[0-9]+)|[1-9])$/, '只能填写正数'],//必填,且只能输入正
+        positiveInteger: [/^[1-9]\d*$/, '只能填写正整数'],//必填,且只能输入正整数
     });
 
     let element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
     let laydate = layui.laydate;
     tree = layui.tree;
-    let height = document.documentElement.clientHeight * 0.5; //随便设置下,和操作表单大概一样
+    let height = document.documentElement.clientHeight * 0.8;
     //用户列表
     tableIns = table.render({
         elem: '#mainTable'
@@ -36,22 +39,27 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], func
         }
         //响应后数据处理
         , parseData: function (res) { //res 即为原始返回的数据
+            $("#addForm")[0].reset();
+            userId = null;
+            form.render();
             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);
-            //     }
-            //
-            //     if(!tablePlayerProfit){
-            //         initPlayerProfit(table, _findData);
-            //     }else{
-            //         playerProfitReload(_findData);
-            //     }
-            // }
+            console.log("返回的地址数据:", data);
+            if (data.rows && data.rows.length > 0) {
+                bHasData = true;
+                // userId = data.rows[0].userId;//记录当前访问的userId
+                // let _findData = {userId: data.rows[0].userId, sidx: "desc", sord: "createTime"};
+                // if (!tablePlayerLog) {
+                //     initPlayerLog(table, _findData);
+                // } else {
+                //     playerLogReload(_findData);
+                // }
+                //
+                // if(!tablePlayerProfit){
+                //     initPlayerProfit(table, _findData);
+                // }else{
+                //     playerProfitReload(_findData);
+                // }
+            }
 
             return {
                 "flag": res.flag, //解析接口状态
@@ -105,12 +113,50 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], func
                 break;
 
             case 'addNewRow':
-                $("#tableId").css("display", "none");
-                $("#tableTime").css("display", "none");
-                $("#saveBtn").css("display", "none");
-                $("#addBtn").css("display", "block");
-                $("#comForm")[0].reset();
-                form.render();
+                let queryByAddress = $("#queryByAddress").val();
+                //获取菜单数据
+                if (queryByAddress.length <= 0) {
+                    layer.msg("输入用户钱包地址新增", {icon: 2, time: 1000}, function () {
+                    });
+                    return;
+                }
+                $.post(ctx + "/sys/sysComUsers/findUserIdByAddress", {address: queryByAddress}, function (res) {
+                    if (!res.flag) {
+                        layer.msg(res.msg, {icon: 2, time: 2000}, function () {
+                        });
+                        return;
+                    }
+                    //类型(1:货币,2:矿石,3:材料)
+                    // $('#itemType').find("option").remove();
+                    // $('#itemType').append(new Option("货币", "1"));// 下拉菜单里添加元素
+                    // $('#itemType').append(new Option("矿石", "2"));// 下拉菜单里添加元素
+                    // $('#itemType').append(new Option("材料", "3"));// 下拉菜单里添加元素
+                    // form.render("select");
+
+                    $("#tableId").css("display", "none");
+                    $("input[name='itemId']").removeAttr("readonly");
+
+                    $("#tableTime").css("display", "none");
+                    $("#saveBtn").css("display", "none");
+                    $("#addBtn").css("display", "block");
+                    // $("#comForm")[0].reset();
+                    // userId = res.data.userId;//记录当前访问的userId
+                    // //设置一个数据
+                    // form.val("comForm", {"userId": userId});
+                    // form.render();
+                    $("#addForm")[0].reset();
+                    userId = res.data.userId;//记录当前访问的userId
+                    form.val("addForm", {"userId": userId});
+                    form.render();
+
+                    openIndex = layer.open({
+                        type: 1,  //可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
+                        title: ['新增数据', 'font-size:18px;'],//数组第二项可以写任意css样式;如果你不想显示标题栏,你可以title: false
+                        area: ['50%', '80%'],
+                        content: $('#show_add_div')
+                    });
+
+                });
                 break;
         }
     });
@@ -120,13 +166,28 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], func
         let data = obj.data;
         //编辑
         if (obj.event === 'edit') {
+            $('#itemType').find("option").remove();
+            $('#itemType').append(new Option("货币", "1", data.itemType === 1));// 下拉菜单里添加元素
+            $('#itemType').append(new Option("矿石", "2", data.itemType === 2));// 下拉菜单里添加元素
+            $('#itemType').append(new Option("材料", "3", data.itemType === 3));// 下拉菜单里添加元素
+            form.render("select");
+
             $("#tableId").css("display", "block");
+            $("input[name='itemId']").attr("readonly", "readonly");
+
             $("#tableTime").css("display", "block");
             $("#saveBtn").css("display", "block");
             $("#addBtn").css("display", "none");
             //回显操作表单
             $("#comForm").form(data);
             form.render();
+
+            openIndex = layer.open({
+                type: 1,  //可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
+                title: ['修改数据', 'font-size:18px;'],//数组第二项可以写任意css样式;如果你不想显示标题栏,你可以title: false
+                area: ['80%', '80%'],
+                content: $('#show_div')
+            });
         } else if (obj.event === 'del') {
             layer.confirm('真的删除行么?', function (index) {
                 $.post(ctx + "/sys/sysComUsers/deletePlayerBackpack", {id: data.id}, function (data) {
@@ -155,16 +216,21 @@ layui.use(['element', 'form', 'table', 'layer', 'laydate', 'tree', 'util'], func
         comFormSave(false);
     });
     form.on('submit(comAddFilter)', function (data) {
-        comFormSave(true);
+        // comFormSave(true);
+        comFormAdd();
     });
 
+    $("#saveBtn").css("display", "none");
+    $("#addBtn").css("display", "none");
 });
 
 
 function findByUserAddress(form) {
-    //重置数据
-    $("#comForm")[0].reset();
-    form.render();
+    if (form) {
+        //重置数据
+        $("#comForm")[0].reset();
+        form.render();
+    }
     let queryByAddress = $("#queryByAddress").val();
     //获取菜单数据
     if (queryByAddress.length <= 0) {
@@ -200,13 +266,49 @@ function comFormSave(isAddNew) {
         });
         return;
     }
+    //新增的需要处理id
+    console.log("userId:" + userId);
+    if (isAddNew) {
+        if (!userId) {
+            layer.msg("没有用户信息!", {icon: 2, time: 1000}, function () {
+            });
+            return;
+        } else {
+            comForm["userId"] = userId;
+        }
+    }
     $.post(ctx + "/sys/sysComUsers/savePlayerBackpack", comForm, function (data) {
         if (!data.flag) {
             layer.msg(data.msg, {icon: 2, time: 2000}, function () {
             });
             return;
         }
-        tableIns.reload();
+        layer.close(openIndex);
+        if (isAddNew) {
+            if (!bHasData) {
+                findByUserAddress();
+            } else {
+                tableIns.reload();
+            }
+        } else {
+            tableIns.reload();
+        }
+
+    });
+}
+
+
+function comFormAdd() {
+    let addForm = $("#addForm").serializeObject();
+    console.log(addForm);
+    $.post(ctx + "/sys/sysComUsers/addProp", {userId: addForm.userId, id: addForm.id}, function (data) {
+        if (!data.flag) {
+            layer.msg(data.msg, {icon: 2, time: 2000}, function () {
+            });
+            return;
+        }
+        layer.close(openIndex);
+        findByUserAddress();
     });
 }
 

+ 276 - 0
src/main/resources/view/sys/aComUser/userCharacters.html

@@ -0,0 +1,276 @@
+<!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="mainTable" lay-filter="test"></table>
+                <!-- 模板 -->
+                <script type="text/html" id="mainTableToolbarDemo">
+                    <div class="layui-form" action="">
+                        <div class="layui-form-item">
+                            <div class="layui-inline tool-btn">
+                                <button class="layui-btn layui-btn-sm" lay-event="addNewRow">新增</button>
+                            </div>
+                            <div class="layui-inline" style="width: 500px;">
+                                <input type="text" id="queryByAddress" name="queryByAddress" placeholder="输入钱包地址"
+                                       autocomplete="off" class="layui-input">
+                            </div>
+                            <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="mainTableBarDemo">
+                    <a class="layui-btn layui-btn-xs" lay-event="edit">编辑<i class="layui-icon layui-icon-edit"></i></a>
+                    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
+                </script>
+            </div>
+        </div>
+
+    </div>
+    <!-- 操作表单 -->
+    <div class="layui-col-md12" style="display:none;" id="show_div">
+        <div class="layui-card">
+            <!--<div class="layui-card-header">操作表单</div>-->
+            <div class="layui-card-body">
+                <form id="comForm" class="layui-form layui-form-pane" lay-filter="comForm">
+                    <div class="layui-form-item" id="tableId">
+                        <label class="layui-form-label">ID</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="id" autocomplete="off" placeholder="id"
+                                   class="layui-input" readonly="readonly">
+                        </div>
+                    </div>
+                    <input type="text" name="userId" hidden="hidden"/>
+                    <input type="text" name="roleId" hidden="hidden"/>
+                    <input type="text" name="roleType" hidden="hidden"/>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">角色名字</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="name" autocomplete="off" placeholder="name"
+                                   class="layui-input">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">角色经验</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="exp" autocomplete="off" placeholder="exp"
+                                   class="layui-input">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">角色等级</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="level" autocomplete="off" placeholder="level"
+                                   class="layui-input">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">力量</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="power" autocomplete="off" placeholder="power"
+                                   class="layui-input">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">智力值</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="intelligence" autocomplete="off" placeholder="intelligence"
+                                   class="layui-input">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">技巧值</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="skills" autocomplete="off" placeholder="skills"
+                                   class="layui-input">
+                        </div>
+                    </div>
+                    <!--<input type="text" name="random" hidden="hidden"/>-->
+                    <!--<div class="layui-form-item">-->
+                    <!--    <label class="layui-form-label">随机属性值</label>-->
+                    <!--    <div class="layui-input-block">-->
+                    <!--        <input type="text" name="random" autocomplete="off" placeholder="random"-->
+                    <!--               class="layui-input" >-->
+                    <!--    </div>-->
+                    <!--</div>-->
+                    <!--<input type="text" name="professional" hidden="hidden"/>-->
+                    <!--(0无,1挖矿,2勘探,3运输,4伐木) -->
+                    <!--<div class="layui-form-item">-->
+                    <!--    <label class="layui-form-label">工作</label>-->
+                    <!--    <div class="layui-input-block">-->
+                    <!--        <input type="text" name="professional" autocomplete="off" placeholder="professional"-->
+                    <!--               class="layui-input" readonly="readonly">-->
+                    <!--    </div>-->
+                    <!--</div>-->
+                    <!--<input type="text" name="workPos" hidden="hidden"/>-->
+                    <!--<div class="layui-form-item">-->
+                    <!--    <label class="layui-form-label">配置位置</label>-->
+                    <!--    <div class="layui-input-block">-->
+                    <!--        <input type="text" name="workPos" autocomplete="off" placeholder="workPos"-->
+                    <!--               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="action" autocomplete="off" placeholder="action"
+                                   class="layui-input">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">互动事件</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="interactive" autocomplete="off" placeholder="interactive"
+                                   class="layui-input">
+                        </div>
+                    </div>
+                    <input type="text" name="state" hidden="hidden"/>
+                    <!--<div class="layui-form-item">-->
+                    <!--    <label class="layui-form-label">状态</label>-->
+                    <!--    <div class="layui-input-block">-->
+                    <!--        <input type="text" name="state" autocomplete="off" placeholder="state"-->
+                    <!--               class="layui-input">-->
+                    <!--    </div>-->
+                    <!--</div>-->
+                    <!--<input type="text" name="modelId" hidden="hidden"/>-->
+                    <!--<div class="layui-form-item">-->
+                    <!--    <label class="layui-form-label">模型ID</label>-->
+                    <!--    <div class="layui-input-block">-->
+                    <!--        <input type="text" name="modelId" autocomplete="off" placeholder="modelId"-->
+                    <!--               class="layui-input">-->
+                    <!--    </div>-->
+                    <!--</div>-->
+                    <!--<input type="text" name="modelColor" hidden="hidden"/>-->
+                    <!--<div class="layui-form-item">-->
+                    <!--    <label class="layui-form-label">颜色ID</label>-->
+                    <!--    <div class="layui-input-block">-->
+                    <!--        <input type="text" name="modelColor" autocomplete="off" placeholder="modelColor"-->
+                    <!--               class="layui-input">-->
+                    <!--    </div>-->
+                    <!--</div>-->
+
+                    <div class="layui-form-item" id="tableTime">
+                        <div class="layui-inline">
+                            <label class="layui-form-label">创建时间</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="createTime" autocomplete="off" class="layui-input"
+                                       readonly="readonly">
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item" id="tableTime">
+                        <div class="layui-inline">
+                            <label class="layui-form-label">更新时间</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="updateTime" autocomplete="off" class="layui-input"
+                                       readonly="readonly">
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <div class="layui-input-block">
+                            <a id="saveBtn" class="layui-btn" type="submit" lay-submit lay-filter="comFilter">保存</a>
+                            <!--<a id="addBtn" class="layui-btn" type="submit" lay-submit lay-filter="comAddFilter">新增</a>-->
+                        </div>
+                    </div>
+                </form>
+
+            </div>
+        </div>
+
+    </div>
+    <div class="layui-col-md12" style="display:none;" id="show_add_div">
+        <div class="layui-card">
+            <div class="layui-card-body">
+                <form id="addForm" class="layui-form layui-form-pane" lay-filter="addForm">
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">当前用户ID</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="userId" autocomplete="off" placeholder="userId"
+                                   class="layui-input" readonly="readonly">
+                        </div>
+                    </div>
+                    <!--<input type="text" name="userId" hidden="hidden"/>-->
+
+                    <!--<div class="layui-form-item">-->
+                    <!--    <label class="layui-form-label">角色ID</label>-->
+                    <!--    <div class="layui-input-block">-->
+                    <!--        <input type="text" name="roleId" autocomplete="off" placeholder="roleId"-->
+                    <!--               class="layui-input">-->
+                    <!--    </div>-->
+                    <!--</div>-->
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">角色ID</label>
+                        <div class="layui-input-block">
+                            <select name="roleId" id="roleId" lay-verify="required" lay-filter="roleIdFilter">
+                                <option th:each="attri : ${characterAttris}"  th:value="${attri.id}" th:text="${attri.note}">
+                                </option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <div class="layui-input-block">
+                            <a id="addBtn" class="layui-btn" type="submit" lay-submit lay-filter="comAddFilter">新增</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">-->
+    <!--            &lt;!&ndash; 表格主体 &ndash;&gt;-->
+    <!--            <table class="layui-hide" id="comPlayerLogTable" lay-filter="test"></table>-->
+    <!--            &lt;!&ndash; 模板 &ndash;&gt;-->
+    <!--            <script type="text/html" id="comPlayerLogTableToolbarDemo">-->
+    <!--                <div class="layui-btn-container">-->
+    <!--                    <button class="layui-btn layui-btn-sm" lay-event="playerLogReload">刷新</button>-->
+    <!--                </div>-->
+    <!--            </script>-->
+    <!--        </div>-->
+    <!--    </div>-->
+    <!--</div>-->
+
+    <!--<div class="layui-col-md12">-->
+    <!--    <div class="layui-card">-->
+    <!--        <div class="layui-card-header">用户偷取操作列表</div>-->
+    <!--        <div class="layui-card-body">-->
+    <!--            &lt;!&ndash; 表格主体 &ndash;&gt;-->
+    <!--            <table class="layui-hide" id="comPlayerProfitTable" lay-filter="test"></table>-->
+    <!--            &lt;!&ndash; 模板 &ndash;&gt;-->
+    <!--            <script type="text/html" id="comPlayerProfitTableToolbarDemo">-->
+    <!--                <div class="layui-btn-container">-->
+    <!--                    <button class="layui-btn layui-btn-sm" lay-event="playerProfitReload">刷新</button>-->
+    <!--                </div>-->
+    <!--            </script>-->
+    <!--        </div>-->
+    <!--    </div>-->
+    <!--</div>-->
+
+</div>
+</body>
+<script type="text/javascript" th:inline="javascript">
+    console.log("characterAttris:",[[${characterAttris}]]);
+</script>
+<!-- js -->
+<script th:src="@{/sys/aComUser/js/userCharacters.js}"></script>
+</html>

+ 81 - 25
src/main/resources/view/sys/aComUser/userPlayerBackpack.html

@@ -11,47 +11,59 @@
 <body>
 <div class="layui-row layui-col-space15">
     <!-- 树 -->
-    <div class="layui-col-md6">
+    <div class="layui-col-md12">
         <div class="layui-card">
-            <div class="layui-card-header">用户仓库列表</div>
+            <div class="layui-card-header">背包列表</div>
             <div class="layui-card-body">
                 <!-- 表格主体 -->
                 <table class="layui-hide" id="mainTable" lay-filter="test"></table>
                 <!-- 模板 -->
                 <script type="text/html" id="mainTableToolbarDemo">
-                    <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 class="layui-form" action="">
+                        <div class="layui-form-item">
+                            <div class="layui-inline tool-btn">
+                                <button class="layui-btn layui-btn-sm" lay-event="addNewRow">新增</button>
+                            </div>
+                            <div class="layui-inline" style="width: 500px;">
+                                <input type="text" id="queryByAddress" name="queryByAddress" placeholder="输入钱包地址"
+                                       autocomplete="off" class="layui-input">
                             </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>
-                    <div class="layui-btn-container">
-                        <button class="layui-btn layui-btn-sm" lay-event="addNewRow">新增</button>
-                    </div>
                 </script>
 
                 <script type="text/html" id="mainTableBarDemo">
                     <a class="layui-btn layui-btn-xs" lay-event="edit">编辑<i class="layui-icon layui-icon-edit"></i></a>
                     <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
                 </script>
+
+
+                <!--<script type="text/html" id="itemTypeTpl">-->
+                <!--    <select id="demoCity1" class="layui-border" lay-ignore>-->
+                <!--        <option th:each="prop,iterStat : ${propList}"  th:value="${prop.id}" th:text="${prop.itemName }">-->
+                <!--        </option>-->
+                <!--    </select>-->
+                <!--</script>-->
             </div>
         </div>
 
     </div>
     <!-- 操作表单 -->
-    <div class="layui-col-md6">
+    <div class="layui-col-md12" style="display:none;" id="show_div">
         <div class="layui-card">
-            <div class="layui-card-header">操作表单</div>
+            <!--<div class="layui-card-header">操作表单</div>-->
             <div class="layui-card-body">
-                <form id="comForm" class="layui-form layui-form-pane">
-                    <div  class="layui-form-item" id="tableId">
+                <form id="comForm" class="layui-form layui-form-pane" lay-filter="comForm">
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">用户ID</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="userId" autocomplete="off" placeholder="userId"
+                                   class="layui-input" readonly="readonly">
+                        </div>
+                    </div>
+                    <div class="layui-form-item" id="tableId">
                         <label class="layui-form-label">背包ID</label>
                         <div class="layui-input-block">
                             <input type="text" name="id" autocomplete="off" placeholder="id"
@@ -62,21 +74,30 @@
                         <label class="layui-form-label">物品ID</label>
                         <div class="layui-input-block">
                             <input type="text" name="itemId" autocomplete="off" placeholder="itemId"
-                                   class="layui-input" readonly="readonly">
+                                   class="layui-input" readonly="readonly" lay-verify="required|positiveInteger">
                         </div>
                     </div>
+                    <!--<div class="layui-form-item">-->
+                    <!--    <label class="layui-form-label">类型(1:货币,2:矿石,3:材料)</label>-->
+                    <!--    <div class="layui-input-block">-->
+                    <!--        <input type="text" name="itemType" autocomplete="off" placeholder="itemType"-->
+                    <!--               class="layui-input" >-->
+                    <!--    </div>-->
+                    <!--</div>-->
                     <div class="layui-form-item">
-                        <label class="layui-form-label">类型(1:货币,2:矿石,3:材料)</label>
+                        <label class="layui-form-label">类型</label>
                         <div class="layui-input-block">
-                            <input type="text" name="itemType" autocomplete="off" placeholder="itemType"
-                                   class="layui-input" >
+                            <select name="itemType" id="itemType" lay-verify="required" lay-filter="xmFilter">
+                                <option value="">请选择</option>
+                            </select>
                         </div>
                     </div>
+
                     <div class="layui-form-item">
                         <label class="layui-form-label">标记分类</label>
                         <div class="layui-input-block">
                             <input type="text" name="itemTag" autocomplete="off" placeholder="itemTag"
-                                   class="layui-input">
+                                   class="layui-input" lay-verify="required|positiveInteger">
                         </div>
                     </div>
                     <div class="layui-form-item">
@@ -90,7 +111,7 @@
                         <label class="layui-form-label">图片</label>
                         <div class="layui-input-block">
                             <input type="text" name="pictureName" autocomplete="off" placeholder="pictureName"
-                                   class="layui-input" >
+                                   class="layui-input">
                         </div>
                     </div>
 
@@ -98,7 +119,7 @@
                         <label class="layui-form-label">物品数量</label>
                         <div class="layui-input-block">
                             <input type="text" name="amount" autocomplete="off" placeholder="amount"
-                                   class="layui-input">
+                                   class="layui-input" lay-verify="required|positiveInteger">
                         </div>
                     </div>
                     <div class="layui-form-item" id="tableTime">
@@ -120,11 +141,42 @@
                         </div>
                     </div>
                     <!-- 隐藏域 -->
-                    <input type="text" name="userId" hidden="hidden"/>
+                    <!--<input type="text" name="userId" hidden="hidden"/>-->
 
                     <div class="layui-form-item">
                         <div class="layui-input-block">
                             <a id="saveBtn" class="layui-btn" type="submit" lay-submit lay-filter="comFilter">保存</a>
+                            <!--<a id="addBtn" class="layui-btn" type="submit" lay-submit lay-filter="comAddFilter">新增</a>-->
+                        </div>
+                    </div>
+                </form>
+
+            </div>
+        </div>
+    </div>
+
+    <div class="layui-col-md12" style="display:none;" id="show_add_div">
+        <div class="layui-card">
+            <div class="layui-card-body">
+                <form id="addForm" class="layui-form layui-form-pane" lay-filter="addForm">
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">当前用户ID</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="userId" autocomplete="off" placeholder="userId"
+                                   class="layui-input" readonly="readonly">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">物品</label>
+                        <div class="layui-input-block">
+                            <select name="id" id="id" lay-verify="required" lay-filter="idFilter">
+                                <option th:each="prop : ${propList}"  th:value="${prop.id}" th:text="${prop.name}">
+                                </option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <div class="layui-input-block">
                             <a id="addBtn" class="layui-btn" type="submit" lay-submit lay-filter="comAddFilter">新增</a>
                         </div>
                     </div>
@@ -133,6 +185,7 @@
             </div>
         </div>
     </div>
+
     <!--<div class="layui-col-md12">-->
     <!--    <div class="layui-card">-->
     <!--        <div class="layui-card-header">用户仓库操作列表</div>-->
@@ -167,6 +220,9 @@
 
 </div>
 </body>
+<script type="text/javascript" th:inline="javascript">
+    console.log("propList:",[[${propList}]]);
+</script>
 <!-- js -->
 <script th:src="@{/sys/aComUser/js/userPlayerBackpack.js}"></script>
 </html>