Ver código fonte

客服后台

dos 1 mês atrás
pai
commit
b4ae5f72f7
24 arquivos alterados com 2840 adições e 986 exclusões
  1. 15 0
      game-business/src/main/java/com/game/business/controller/AppGameClassifyController.java
  2. 16 0
      game-business/src/main/java/com/game/business/controller/AppGameController.java
  3. 12 0
      game-business/src/main/java/com/game/business/controller/AppGameItemController.java
  4. 83 1
      game-business/src/main/java/com/game/business/controller/AppGameLotteryController.java
  5. 116 0
      game-business/src/main/java/com/game/business/controller/AppUserController.java
  6. 19 0
      game-business/src/main/java/com/game/business/dto/RestPwdDto.java
  7. 22 0
      game-business/src/main/java/com/game/business/dto/UserChargeDto.java
  8. 51 0
      game-business/src/main/java/com/game/business/mapper/AppGameLotteryMapper.java
  9. 7 0
      game-business/src/main/java/com/game/business/mapper/AppUsersChargeMapper.java
  10. 50 0
      game-business/src/main/java/com/game/business/service/IAppGameLotteryService.java
  11. 68 0
      game-business/src/main/java/com/game/business/service/impl/AppGameLotteryServiceImpl.java
  12. 4 1
      game-business/src/main/java/com/game/business/service/impl/AppUsersChargeServiceImpl.java
  13. 82 0
      game-business/src/main/resources/mapper/business/AppGameLotteryMapper.xml
  14. 9 2
      game-business/src/main/resources/mapper/business/AppUsersChargeMapper.xml
  15. 51 0
      game-ui/src/api/business/game.js
  16. 51 0
      game-ui/src/api/business/game_item.js
  17. 62 0
      game-ui/src/api/business/lottery.js
  18. 62 0
      game-ui/src/api/business/user.js
  19. 377 0
      game-ui/src/views/business/game/index.vue
  20. 296 0
      game-ui/src/views/business/game_item/index.vue
  21. 558 0
      game-ui/src/views/business/lottery/index.vue
  22. 827 0
      game-ui/src/views/business/user/index.vue
  23. 0 980
      game-ui/src/views/index.vue
  24. 2 2
      game-ui/src/views/login.vue

+ 15 - 0
game-business/src/main/java/com/game/business/controller/AppGameClassifyController.java

@@ -2,6 +2,8 @@ package com.game.business.controller;
 
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
+
+import com.game.common.core.domain.R;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -52,6 +54,19 @@ public class AppGameClassifyController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 查询游戏分类列表
+     */
+    @GetMapping("/allList")
+    @ApiOperation(value = "查询游戏分类列表", notes = "获取游戏分类列表")
+    public R<List<AppGameClassify>> allList()
+    {
+        AppGameClassify appGameClassify1 = new AppGameClassify();
+        appGameClassify1.setStatus(1L);
+        List<AppGameClassify> list = appGameClassifyService.selectAppGameClassifyList(appGameClassify1);
+        return R.ok(list);
+    }
+
     /**
      * 导出游戏分类列表
      */

+ 16 - 0
game-business/src/main/java/com/game/business/controller/AppGameController.java

@@ -2,6 +2,8 @@ package com.game.business.controller;
 
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
+
+import com.game.common.core.domain.R;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -52,6 +54,20 @@ public class AppGameController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 查询游戏配置列表
+     */
+//    @PreAuthorize("@ss.hasPermi('business:game:list')")
+    @GetMapping("/allList")
+    @ApiOperation(value = "查询游戏配置列表", notes = "获取游戏配置列表")
+    public R<List<AppGame>> allList(AppGame appGame)
+    {
+//        startPage();
+        appGame.setStatus(1L);
+        List<AppGame> list = appGameService.selectAppGameList(appGame);
+        return R.ok(list);
+    }
+
     /**
      * 导出游戏配置列表
      */

+ 12 - 0
game-business/src/main/java/com/game/business/controller/AppGameItemController.java

@@ -60,6 +60,18 @@ public class AppGameItemController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 查询游戏选项列表
+     */
+//    @PreAuthorize("@ss.hasPermi('business:game_item:list')")
+    @GetMapping("/allList")
+    @ApiOperation(value = "查询游戏选项列表", notes = "获取游戏选项列表")
+    public R<List<AppGameItem>> allList(AppGameItem appGameItem)
+    {
+        List<AppGameItem> list = appGameItemService.selectAppGameItemList(appGameItem);
+        return R.ok(list);
+    }
+
     /**
      * 查询游戏选项列表
      */

+ 83 - 1
game-business/src/main/java/com/game/business/controller/AppGameLotteryController.java

@@ -12,17 +12,24 @@ import com.game.business.task.AppGameLotteryTask;
 import com.game.business.vo.AppGameLotteryVO;
 import com.game.business.vo.AppUserAgentVO;
 import com.game.common.annotation.Anonymous;
+import com.game.common.annotation.Log;
 import com.game.common.core.controller.BaseController;
 import com.game.common.core.domain.HttpRet;
 import com.game.common.core.domain.HttpRetPageArr;
+import com.game.common.core.domain.R;
+import com.game.common.core.page.TableDataInfo;
+import com.game.common.enums.BusinessType;
 import com.game.common.utils.SecurityUtils;
+import com.game.common.utils.poi.ExcelUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -128,6 +135,7 @@ public class AppGameLotteryController extends BaseController{
 
     @PostMapping("/addLottery")
     @ApiOperation(value = "手动开奖", notes = "手动开奖")
+    @Log(title = "手动开奖", businessType = BusinessType.UPDATE)
     public HttpRet<Boolean> addLottery(@RequestBody AppGameLottery appGameLottery) throws Exception {
 
         Long userId = SecurityUtils.getUserId();
@@ -136,7 +144,7 @@ public class AppGameLotteryController extends BaseController{
             return HttpRet.fail("权限不足,请联系管理员");
         }
 
-        if(userId != 10013){
+        if(userId != 10013 && SecurityUtils.getLoginUser().isBusUser()){ //app用户只有10013能发
             return HttpRet.fail("权限不足,请联系管理员");
         }
 
@@ -153,4 +161,78 @@ public class AppGameLotteryController extends BaseController{
 
         return HttpRet.success("手动开奖成功",true);
     }
+
+    /**
+     * 查询游戏开奖记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('business:lottery:list')")
+    @GetMapping("/list")
+    @ApiOperation(value = "查询游戏开奖记录列表", notes = "获取游戏开奖记录列表")
+    public TableDataInfo<AppGameLottery> list(AppGameLottery appGameLottery)
+    {
+        startPage();
+        List<AppGameLottery> list = appGameLotteryService.selectAppGameLotteryList(appGameLottery);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出游戏开奖记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('business:lottery:export')")
+    @Log(title = "游戏开奖记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ApiOperation(value = "导出游戏开奖记录列表", notes = "导出游戏开奖记录列表")
+    public void export(HttpServletResponse response, AppGameLottery appGameLottery)
+    {
+        List<AppGameLottery> list = appGameLotteryService.selectAppGameLotteryList(appGameLottery);
+        ExcelUtil<AppGameLottery> util = new ExcelUtil<AppGameLottery>(AppGameLottery.class);
+        util.exportExcel(response, list, "游戏开奖记录数据");
+    }
+
+    /**
+     * 获取游戏开奖记录详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('business:lottery:query')")
+    @GetMapping(value = "/{id}")
+    @ApiOperation(value = "获取游戏开奖记录详细信息", notes = "获取游戏开奖记录详细信息")
+    public R<AppGameLottery> getInfo(@PathVariable("id") Long id)
+    {
+        return R.ok(appGameLotteryService.selectAppGameLotteryById(id));
+    }
+
+    /**
+     * 新增游戏开奖记录
+     */
+    @PreAuthorize("@ss.hasPermi('business:lottery:add')")
+    @Log(title = "游戏开奖记录", businessType = BusinessType.INSERT)
+    @ApiOperation(value = "新增游戏开奖记录", notes = "新增游戏开奖记录")
+    @PostMapping
+    public R add(@RequestBody AppGameLottery appGameLottery)
+    {
+        return R.ok(appGameLotteryService.insertAppGameLottery(appGameLottery));
+    }
+
+    /**
+     * 修改游戏开奖记录
+     */
+    @PreAuthorize("@ss.hasPermi('business:lottery:edit')")
+    @Log(title = "游戏开奖记录", businessType = BusinessType.UPDATE)
+    @ApiOperation(value = "修改游戏开奖记录", notes = "修改游戏开奖记录")
+    @PutMapping
+    public R edit(@RequestBody AppGameLottery appGameLottery)
+    {
+        return R.ok(appGameLotteryService.updateAppGameLottery(appGameLottery));
+    }
+
+    /**
+     * 删除游戏开奖记录
+     */
+    @PreAuthorize("@ss.hasPermi('business:lottery:remove')")
+    @Log(title = "游戏开奖记录", businessType = BusinessType.DELETE)
+    @ApiOperation(value = "删除游戏开奖记录", notes = "删除游戏开奖记录")
+    @DeleteMapping("/{ids}")
+    public R remove(@PathVariable Long[] ids)
+    {
+        return R.ok(appGameLotteryService.deleteAppGameLotteryByIds(ids));
+    }
 }

+ 116 - 0
game-business/src/main/java/com/game/business/controller/AppUserController.java

@@ -1,9 +1,32 @@
 package com.game.business.controller;
 
+import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
+
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.RandomUtil;
+import com.game.business.domain.AppUsersCharge;
+import com.game.business.domain.FinTranRecord;
+import com.game.business.dto.RestPwdDto;
+import com.game.business.dto.UserChargeDto;
+import com.game.business.service.IAppUsersChargeService;
+import com.game.business.util.Md5Utils;
+import com.game.common.constant.AppSceneType;
+import com.game.common.constant.finance.FinTranAddedInfo;
+import com.game.common.constant.finance.FinTranType1;
+import com.game.common.constant.finance.FinTranType3;
+import com.game.common.constant.finance.TranCurrencyType;
+import com.game.common.core.domain.HttpRet;
+import com.game.common.core.domain.R;
+import com.game.common.core.redis.RedisCache;
+import com.game.common.utils.SecurityUtils;
+import lombok.extern.log4j.Log4j2;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PutMapping;
@@ -34,11 +57,18 @@ import com.game.common.core.page.TableDataInfo;
 @RestController
 @RequestMapping("/business/user")
 @Api(value = "AppUserController", description = "app用户接口", tags = {"app用户"})
+@Log4j2
 public class AppUserController extends BaseController
 {
     @Autowired
     private IAppUserService appUserService;
 
+    @Autowired
+    private IAppUsersChargeService appUsersChargeService;
+
+    @Autowired
+    private RedisCache redisCache;
+
     /**
      * 查询app用户列表
      */
@@ -52,6 +82,92 @@ public class AppUserController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 重置密码
+     */
+    @PreAuthorize("@ss.hasPermi('business:user:restPwd')")
+    @Log(title = "app用户", businessType = BusinessType.UPDATE)
+    @PostMapping("/restPwd")
+    @ApiOperation(value = "重置密码", notes = "重置密码")
+    public R<String> restPwd(HttpServletResponse response,@RequestBody @Validated RestPwdDto restPwdDto)
+    {
+        AppUser appUser = appUserService.selectAppUserByUserid(restPwdDto.getUserId());
+        if(null == appUser){
+            return R.fail("重置失败,用户不存在");
+        }
+        AppUser updateUser = new AppUser();
+        updateUser.setUserid(appUser.getUserid());
+        updateUser.setSalt(appUser.getSalt());
+        if(StringUtils.isBlank(updateUser.getSalt())){
+            updateUser.setSalt(RandomUtil.randomString(6));
+        }
+        updateUser.setPassword(Md5Utils.md5(Md5Utils.md5(restPwdDto.getPassword()) + updateUser.getSalt()));
+        appUserService.updateAppUser(updateUser);
+        //清除用户缓存
+        redisCache.deleteObject("U:UserInfo:".concat(String.valueOf(appUser.getUserid())));
+        return R.ok("重置成功");
+    }
+
+    /**
+     * 充值
+     */
+    @PreAuthorize("@ss.hasPermi('business:user:charge')")
+    @Log(title = "app用户", businessType = BusinessType.UPDATE)
+    @PostMapping("/charge")
+    @ApiOperation(value = "充值", notes = "充值")
+    public R<String> charge(HttpServletResponse response,@RequestBody @Validated UserChargeDto userChargeDto)
+    {
+        AppUser appUser = appUserService.selectAppUserByUserid(userChargeDto.getUserId());
+        if(null == appUser){
+            return R.fail("充值失败,用户不存在");
+        }
+        //流水 余额
+        FinTranAddedInfo addedInfo = FinTranAddedInfo.createTranInfo(appUser.getUserid(), 0, 0, AppSceneType.Scene_None, "");
+        FinTranRecord tran = null;
+        if(userChargeDto.getType() == 0){
+            tran = FinTranRecord.initFinTranRecordSomeParams(addedInfo, FinTranType3.CHARGE_IN_Back, userChargeDto.getAmount()<0?FinTranType1.U_Outcome_Coin:FinTranType1.U_Income_Coin, appUser);
+            tran.setCoinChange(userChargeDto.getAmount());
+            tran.setCurrencyType(TranCurrencyType.Coin.getType());
+        }else{
+            tran = FinTranRecord.initFinTranRecordSomeParams(addedInfo, FinTranType3.CHARGE_IN_Back, userChargeDto.getAmount()<0?FinTranType1.U_Outcome_Balance:FinTranType1.U_Income_Coin_Balance, appUser);
+            tran.setDiamondCoinChange(userChargeDto.getAmount());
+            tran.setCurrencyType(TranCurrencyType.Balance.getType());
+        }
+        tran.setRemarks("后台充值");
+        try {
+            appUserService.updateUserAmount(tran);
+            AppUser afterUser = appUserService.selectAppUserByUserid(userChargeDto.getUserId());
+            //充值记录
+            AppUsersCharge appUsersCharge = new AppUsersCharge();
+//            appUsersCharge.id = charge.id;
+            appUsersCharge.setTouid(appUser.getUserid());
+
+            appUsersCharge.setCoin(BigDecimal.valueOf(userChargeDto.getAmount()));
+            appUsersCharge.setCoinType(Long.parseLong(String.valueOf(userChargeDto.getType())));
+            appUsersCharge.setOrderno(IdUtil.fastUUID());
+            // 充值成功
+            appUsersCharge.setStatus(1L);
+            // 人工充值
+            appUsersCharge.setType(4L);
+            // 人工
+            appUsersCharge.setAmbient(1L);
+            // 操作人
+            appUsersCharge.setOptUser(String.valueOf(SecurityUtils.getUserId()));
+            // 操作类型 1:充值金币 2:扣减金币
+            appUsersCharge.setOptType(userChargeDto.getAmount()<0?2L:1L);
+            appUsersCharge.setAddtime(new Date());
+            appUsersCharge.setPlatformService(0.00);
+            appUsersCharge.setPlatformServiceRate(0.00);
+            appUsersCharge.setCoinGive(BigDecimal.valueOf(0));
+            appUsersCharge.setAfterCoin(userChargeDto.getType()==0?BigDecimal.valueOf(afterUser.getCoin()):BigDecimal.valueOf(afterUser.getDiamondCoin()));
+            appUsersChargeService.insertAppUsersCharge(appUsersCharge);
+        } catch (Exception e) {
+            log.info("{}充值失败:{}",userChargeDto.getUserId(),e.getMessage());
+            return  R.fail("充值失败");
+        }
+        return R.ok("充值成功");
+    }
+
     /**
      * 导出app用户列表
      */

+ 19 - 0
game-business/src/main/java/com/game/business/dto/RestPwdDto.java

@@ -0,0 +1,19 @@
+package com.game.business.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+@ApiModel("修改密码")
+@Data
+public class RestPwdDto implements Serializable {
+
+    @NotNull(message = "密码不能为空")
+    private String password;
+
+    @NotNull(message = "UID不能为空")
+    private Long userId;
+
+}

+ 22 - 0
game-business/src/main/java/com/game/business/dto/UserChargeDto.java

@@ -0,0 +1,22 @@
+package com.game.business.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+@ApiModel("修改密码")
+@Data
+public class UserChargeDto implements Serializable {
+
+    @NotNull(message = "充值金额")
+    private Double amount;
+
+    @NotNull(message = "充值类型 0:金币  1:余额")
+    private int type = 0;
+
+    @NotNull(message = "UID不能为空")
+    private Long userId;
+
+}

+ 51 - 0
game-business/src/main/java/com/game/business/mapper/AppGameLotteryMapper.java

@@ -3,5 +3,56 @@ package com.game.business.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.game.business.domain.AppGameLottery;
 
+import java.util.List;
+
 public interface AppGameLotteryMapper extends BaseMapper<AppGameLottery> {
+
+    /**
+     * 查询游戏开奖记录
+     *
+     * @param id 游戏开奖记录主键
+     * @return 游戏开奖记录
+     */
+    public AppGameLottery selectAppGameLotteryById(Long id);
+
+    /**
+     * 查询游戏开奖记录列表
+     *
+     * @param appGameLottery 游戏开奖记录
+     * @return 游戏开奖记录集合
+     */
+    public List<AppGameLottery> selectAppGameLotteryList(AppGameLottery appGameLottery);
+
+    /**
+     * 新增游戏开奖记录
+     *
+     * @param appGameLottery 游戏开奖记录
+     * @return 结果
+     */
+    public int insertAppGameLottery(AppGameLottery appGameLottery);
+
+    /**
+     * 修改游戏开奖记录
+     *
+     * @param appGameLottery 游戏开奖记录
+     * @return 结果
+     */
+    public int updateAppGameLottery(AppGameLottery appGameLottery);
+
+    /**
+     * 删除游戏开奖记录
+     *
+     * @param id 游戏开奖记录主键
+     * @return 结果
+     */
+    public int deleteAppGameLotteryById(Long id);
+
+    /**
+     * 批量删除游戏开奖记录
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteAppGameLotteryByIds(Long[] ids);
+
 }

+ 7 - 0
game-business/src/main/java/com/game/business/mapper/AppUsersChargeMapper.java

@@ -3,6 +3,8 @@ package com.game.business.mapper;
 import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.game.business.domain.AppUsersCharge;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Service;
 
 /**
  * 充值记录Mapper接口
@@ -58,4 +60,9 @@ public interface AppUsersChargeMapper extends BaseMapper<AppUsersCharge> {
      * @return 结果
      */
     public int deleteAppUsersChargeByIds(Long[] ids);
+
+    public Long getNewId();
+
+    @Select("select next_val from sys_sequence where sequence_name = 'app_users_charge'")
+    public Long getMaxId();
 }

+ 50 - 0
game-business/src/main/java/com/game/business/service/IAppGameLotteryService.java

@@ -3,6 +3,8 @@ package com.game.business.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.game.business.domain.AppGameLottery;
 
+import java.util.List;
+
 /**
  * 游戏开奖记录业务接口
  */
@@ -13,4 +15,52 @@ public interface IAppGameLotteryService extends IService<AppGameLottery> {
     AppGameLottery selectLottery(Long classId, Long gameId, String gameDate);
 
     boolean save(AppGameLottery appGameLottery);
+
+    /**
+     * 查询游戏开奖记录
+     *
+     * @param id 游戏开奖记录主键
+     * @return 游戏开奖记录
+     */
+    public AppGameLottery selectAppGameLotteryById(Long id);
+
+    /**
+     * 查询游戏开奖记录列表
+     *
+     * @param appGameLottery 游戏开奖记录
+     * @return 游戏开奖记录集合
+     */
+    public List<AppGameLottery> selectAppGameLotteryList(AppGameLottery appGameLottery);
+
+    /**
+     * 新增游戏开奖记录
+     *
+     * @param appGameLottery 游戏开奖记录
+     * @return 结果
+     */
+    public int insertAppGameLottery(AppGameLottery appGameLottery);
+
+    /**
+     * 修改游戏开奖记录
+     *
+     * @param appGameLottery 游戏开奖记录
+     * @return 结果
+     */
+    public int updateAppGameLottery(AppGameLottery appGameLottery);
+
+    /**
+     * 批量删除游戏开奖记录
+     *
+     * @param ids 需要删除的游戏开奖记录主键集合
+     * @return 结果
+     */
+    public int deleteAppGameLotteryByIds(Long[] ids);
+
+    /**
+     * 删除游戏开奖记录信息
+     *
+     * @param id 游戏开奖记录主键
+     * @return 结果
+     */
+    public int deleteAppGameLotteryById(Long id);
 }

+ 68 - 0
game-business/src/main/java/com/game/business/service/impl/AppGameLotteryServiceImpl.java

@@ -9,6 +9,8 @@ import com.game.business.service.IAppGameLotteryService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 @Service
 public class AppGameLotteryServiceImpl extends ServiceImpl<AppGameLotteryMapper, AppGameLottery> implements IAppGameLotteryService {
 
@@ -37,4 +39,70 @@ public class AppGameLotteryServiceImpl extends ServiceImpl<AppGameLotteryMapper,
     public boolean save(AppGameLottery appGameLottery) {
         return appGameLotteryMapper.insert(appGameLottery) > 0;
     }
+
+    /**
+     * 查询游戏开奖记录
+     *
+     * @param id 游戏开奖记录主键
+     * @return 游戏开奖记录
+     */
+    @Override
+    public AppGameLottery selectAppGameLotteryById(Long id) {
+        return appGameLotteryMapper.selectAppGameLotteryById(id);
+    }
+
+    /**
+     * 查询游戏开奖记录列表
+     *
+     * @param appGameLottery 游戏开奖记录
+     * @return 游戏开奖记录
+     */
+    @Override
+    public List<AppGameLottery> selectAppGameLotteryList(AppGameLottery appGameLottery) {
+        return appGameLotteryMapper.selectAppGameLotteryList(appGameLottery);
+    }
+
+    /**
+     * 新增游戏开奖记录
+     *
+     * @param appGameLottery 游戏开奖记录
+     * @return 结果
+     */
+    @Override
+    public int insertAppGameLottery(AppGameLottery appGameLottery) {
+        return appGameLotteryMapper.insertAppGameLottery(appGameLottery);
+    }
+
+    /**
+     * 修改游戏开奖记录
+     *
+     * @param appGameLottery 游戏开奖记录
+     * @return 结果
+     */
+    @Override
+    public int updateAppGameLottery(AppGameLottery appGameLottery) {
+        return appGameLotteryMapper.updateAppGameLottery(appGameLottery);
+    }
+
+    /**
+     * 批量删除游戏开奖记录
+     *
+     * @param ids 需要删除的游戏开奖记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteAppGameLotteryByIds(Long[] ids) {
+        return appGameLotteryMapper.deleteAppGameLotteryByIds(ids);
+    }
+
+    /**
+     * 删除游戏开奖记录信息
+     *
+     * @param id 游戏开奖记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteAppGameLotteryById(Long id) {
+        return appGameLotteryMapper.deleteAppGameLotteryById(id);
+    }
 }

+ 4 - 1
game-business/src/main/java/com/game/business/service/impl/AppUsersChargeServiceImpl.java

@@ -60,7 +60,10 @@ public class AppUsersChargeServiceImpl extends ServiceImpl<AppUsersChargeMapper,
     @Override
     @DataSource(DataSourceType.SLAVE)
     public int insertAppUsersCharge(AppUsersCharge appUsersCharge) {
-            return appUsersChargeMapper.insertAppUsersCharge(appUsersCharge);
+       appUsersChargeMapper.getNewId();
+       appUsersCharge.setId(appUsersChargeMapper.getMaxId());
+
+       return appUsersChargeMapper.insertAppUsersCharge(appUsersCharge);
     }
 
     /**

+ 82 - 0
game-business/src/main/resources/mapper/business/AppGameLotteryMapper.xml

@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.game.business.mapper.AppGameLotteryMapper">
+    
+    <resultMap type="com.game.business.domain.AppGameLottery" id="AppGameLotteryResult">
+        <result property="id"    column="id"    />
+        <result property="classId"    column="class_id"    />
+        <result property="gameId"    column="game_id"    />
+        <result property="gameDate"    column="game_date"    />
+        <result property="isLottery"    column="is_lottery"    />
+        <result property="gameLotterySucc"    column="game_lottery_succ"    />
+        <result property="gameRecordDate"    column="game_record_date"    />
+    </resultMap>
+
+    <sql id="selectAppGameLotteryVo">
+        select id, class_id, game_id, game_date, is_lottery, game_lottery_succ, game_record_date from app_game_lottery
+    </sql>
+
+    <select id="selectAppGameLotteryList" parameterType="com.game.business.domain.AppGameLottery" resultMap="AppGameLotteryResult">
+        <include refid="selectAppGameLotteryVo"/>
+        <where>  
+            <if test="classId != null "> and class_id = #{classId}</if>
+            <if test="gameId != null "> and game_id = #{gameId}</if>
+            <if test="gameDate != null  and gameDate != ''"> and game_date = #{gameDate}</if>
+            <if test="isLottery != null  and isLottery != ''"> and is_lottery = #{isLottery}</if>
+            <if test="gameLotterySucc != null  and gameLotterySucc != ''"> and game_lottery_succ = #{gameLotterySucc}</if>
+            <if test="gameRecordDate != null "> and game_record_date = #{gameRecordDate}</if>
+        </where>
+        order by game_record_date desc
+    </select>
+    
+    <select id="selectAppGameLotteryById" parameterType="Long" resultMap="AppGameLotteryResult">
+        <include refid="selectAppGameLotteryVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertAppGameLottery" parameterType="com.game.business.domain.AppGameLottery" useGeneratedKeys="true" keyProperty="id">
+        insert into app_game_lottery
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="classId != null">class_id,</if>
+            <if test="gameId != null">game_id,</if>
+            <if test="gameDate != null">game_date,</if>
+            <if test="isLottery != null">is_lottery,</if>
+            <if test="gameLotterySucc != null">game_lottery_succ,</if>
+            <if test="gameRecordDate != null">game_record_date,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="classId != null">#{classId},</if>
+            <if test="gameId != null">#{gameId},</if>
+            <if test="gameDate != null">#{gameDate},</if>
+            <if test="isLottery != null">#{isLottery},</if>
+            <if test="gameLotterySucc != null">#{gameLotterySucc},</if>
+            <if test="gameRecordDate != null">#{gameRecordDate},</if>
+         </trim>
+    </insert>
+
+    <update id="updateAppGameLottery" parameterType="com.game.business.domain.AppGameLottery">
+        update app_game_lottery
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="classId != null">class_id = #{classId},</if>
+            <if test="gameId != null">game_id = #{gameId},</if>
+            <if test="gameDate != null">game_date = #{gameDate},</if>
+            <if test="isLottery != null">is_lottery = #{isLottery},</if>
+            <if test="gameLotterySucc != null">game_lottery_succ = #{gameLotterySucc},</if>
+            <if test="gameRecordDate != null">game_record_date = #{gameRecordDate},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteAppGameLotteryById" parameterType="Long">
+        delete from app_game_lottery where id = #{id}
+    </delete>
+
+    <delete id="deleteAppGameLotteryByIds" parameterType="String">
+        delete from app_game_lottery where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 9 - 2
game-business/src/main/resources/mapper/business/AppUsersChargeMapper.xml

@@ -90,8 +90,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="coin != null">coin,</if>
             <if test="coinType != null">coin_type,</if>
             <if test="coinGive != null">coin_give,</if>
-            <if test="platformService != null">platform_ervice,</if>
-            <if test="platformServiceRate != null">platform_ervice_rate,</if>
+            <if test="platformService != null">platform_service,</if>
+            <if test="platformServiceRate != null">platform_service_rate,</if>
             <if test="isAgent != null">is_agent,</if>
             <if test="isDelete != null">is_delete,</if>
             <if test="isWater != null">is_water,</if>
@@ -190,4 +190,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{id}
         </foreach>
     </delete>
+    <update id="getNewId">
+        update sys_sequence set next_val = next_val + 1 where sequence_name = 'app_users_charge'
+        <!-- 返回更新后的数量 -->
+        <selectKey keyProperty="next_val" resultType="int" order="AFTER">
+            SELECT next_val FROM sys_sequence WHERE sequence_name = 'app_users_charge'
+        </selectKey>
+    </update>
 </mapper>

+ 51 - 0
game-ui/src/api/business/game.js

@@ -0,0 +1,51 @@
+import request from '@/utils/request'
+
+// 查询游戏配置列表
+export function listGame(query) {
+  return request({
+    url: '/business/game/list',
+    method: 'get',
+    params: query
+  })
+}
+// 查询游戏分类列表
+export function listClassifyGame() {
+  return request({
+    url: '/business/classify/allList',
+    method: 'get',
+  })
+}
+
+// 查询游戏配置详细
+export function getGame(id) {
+  return request({
+    url: '/business/game/' + id,
+    method: 'get'
+  })
+}
+
+// 新增游戏配置
+export function addGame(data) {
+  return request({
+    url: '/business/game',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改游戏配置
+export function updateGame(data) {
+  return request({
+    url: '/business/game',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除游戏配置
+export function delGame(id) {
+  return request({
+    url: '/business/game/' + id,
+    method: 'delete'
+  })
+}

+ 51 - 0
game-ui/src/api/business/game_item.js

@@ -0,0 +1,51 @@
+import request from '@/utils/request'
+
+// 查询游戏选项列表
+export function listGame_item(query) {
+  return request({
+    url: '/business/game_item/list',
+    method: 'get',
+    params: query
+  })
+}
+// 查询游戏列表
+export function allGameList() {
+  return request({
+    url: '/business/game/allList',
+    method: 'get'
+  })
+}
+
+// 查询游戏选项详细
+export function getGame_item(id) {
+  return request({
+    url: '/business/game_item/' + id,
+    method: 'get'
+  })
+}
+
+// 新增游戏选项
+export function addGame_item(data) {
+  return request({
+    url: '/business/game_item',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改游戏选项
+export function updateGame_item(data) {
+  return request({
+    url: '/business/game_item',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除游戏选项
+export function delGame_item(id) {
+  return request({
+    url: '/business/game_item/' + id,
+    method: 'delete'
+  })
+}

+ 62 - 0
game-ui/src/api/business/lottery.js

@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 查询游戏开奖记录列表
+export function listLottery(query) {
+  return request({
+    url: '/business/lottery/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询所有开奖选项
+export function allList(query) {
+  return request({
+    url: '/business/game_item/allList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询游戏开奖记录详细
+export function getLottery(id) {
+  return request({
+    url: '/business/lottery/' + id,
+    method: 'get'
+  })
+}
+
+// 新增游戏开奖记录
+export function addLottery(data) {
+  return request({
+    url: '/business/lottery',
+    method: 'post',
+    data: data
+  })
+}
+
+// 手动开奖记录
+export function kjLottery(data) {
+  return request({
+    url: '/business/lottery/addLottery',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改游戏开奖记录
+export function updateLottery(data) {
+  return request({
+    url: '/business/lottery',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除游戏开奖记录
+export function delLottery(id) {
+  return request({
+    url: '/business/lottery/' + id,
+    method: 'delete'
+  })
+}

+ 62 - 0
game-ui/src/api/business/user.js

@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 查询app用户列表
+export function listUser(query) {
+  return request({
+    url: '/business/user/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询app用户详细
+export function getUser(userid) {
+  return request({
+    url: '/business/user/' + userid,
+    method: 'get'
+  })
+}
+
+// 新增app用户
+export function addUser(data) {
+  return request({
+    url: '/business/user',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改app用户
+export function updateUser(data) {
+  return request({
+    url: '/business/user',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除app用户
+export function delUser(userid) {
+  return request({
+    url: '/business/user/' + userid,
+    method: 'delete'
+  })
+}
+
+// 重置密码
+export function resetUser(data) {
+  return request({
+    url: '/business/user/restPwd',
+    method: 'post',
+    data: data
+  })
+}
+
+// 充值
+export function userCharge(data) {
+  return request({
+    url: '/business/user/charge',
+    method: 'post',
+    data: data
+  })
+}

+ 377 - 0
game-ui/src/views/business/game/index.vue

@@ -0,0 +1,377 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="名称" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="请输入名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="所属分类" prop="classifyId">
+        <el-select v-model="queryParams.classifyId" placeholder="请选择分类">
+          <el-option
+            v-for="item in typeList"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
+          <el-option
+            v-for="dict in dict.type.app_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['business:game:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['business:game:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['business:game:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['business:game:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="gameList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="" align="center" prop="id" />
+      <el-table-column label="名称" align="center" prop="name" />
+      <el-table-column label="所属分类" align="center" prop="classifyId" >
+        <template slot-scope="scope">
+          <span>{{ getTypeName(scope.row.classifyId) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="游戏当前期号" align="center" prop="gameDate" />
+      <el-table-column label="游戏当前倒计时" align="center" prop="gameTime" />
+      <el-table-column label="上次中奖选项" align="center" prop="upItem" />
+      <el-table-column label="logo" align="center" prop="logoUrl">
+        <template slot-scope="scope">
+          <image-preview :src="scope.row.logoUrl" :width="50" :height="50"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="直播间图片" align="center" prop="liveImgUrl">
+        <template slot-scope="scope">
+          <image-preview :src="scope.row.liveImgUrl" :width="50" :height="50"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="我的页面图片" align="center" prop="myImgUrl" >
+        <template slot-scope="scope">
+          <image-preview :src="scope.row.myImgUrl" :width="50" :height="50"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="游戏路径" align="center" prop="gamePath" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.app_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="排序" align="center" prop="orderno" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['business:game:edit']"
+          >查看开奖记录</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['business:game:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['business:game:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改游戏配置对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="80%" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+        <el-form-item label="所属分类id" prop="classifyId">
+          <el-input v-model="form.classifyId" placeholder="请输入所属分类id" />
+        </el-form-item>
+        <el-form-item label="logo" prop="logoUrl">
+          <el-input v-model="form.logoUrl" placeholder="请输入logo" />
+        </el-form-item>
+        <el-form-item label="直播间图片" prop="liveImgUrl">
+          <el-input v-model="form.liveImgUrl" placeholder="请输入直播间图片" />
+        </el-form-item>
+        <el-form-item label="我的页面图片" prop="myImgUrl">
+          <el-input v-model="form.myImgUrl" placeholder="请输入我的页面图片" />
+        </el-form-item>
+        <el-form-item label="游戏路径" prop="gamePath">
+          <el-input v-model="form.gamePath" placeholder="请输入游戏路径" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-select v-model="form.status" placeholder="请选择状态">
+            <el-option
+              v-for="dict in dict.type.app_status"
+              :key="dict.value"
+              :label="dict.label"
+              :value="parseInt(dict.value)"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="排序" prop="orderno">
+          <el-input v-model="form.orderno" placeholder="请输入排序" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listGame, getGame, delGame, addGame, updateGame,listClassifyGame } from "@/api/business/game";
+
+export default {
+  name: "Game",
+  dicts: ['app_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 游戏配置表格数据
+      gameList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      typeList:[],
+      typeMap:{},
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: null,
+        classifyId: null,
+        gameDate: null,
+        gameTime: null,
+        upItem: null,
+        logoUrl: null,
+        liveImgUrl: null,
+        myImgUrl: null,
+        gamePath: null,
+        status: null,
+        orderno: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    var that = this;
+    listClassifyGame().then(response => {
+      if(response.data){
+        for(var i in response.data){
+          var item = response.data[i];
+          that.typeMap[item.id.toString()] = item.name;
+          that.typeList.push({
+            value:item.id,
+            label:item.name
+          })
+        }
+      }
+      this.getList();
+
+    })
+  },
+  methods: {
+    getTypeName(id) {
+      return this.typeMap[id.toString()];
+    },
+    /** 查询游戏配置列表 */
+    getList() {
+      this.loading = true;
+      listGame(this.queryParams).then(response => {
+        this.gameList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        name: null,
+        code: null,
+        classifyId: null,
+        gameDate: null,
+        gameTime: null,
+        upItem: null,
+        logoUrl: null,
+        liveImgUrl: null,
+        myImgUrl: null,
+        gamePath: null,
+        status: null,
+        createTime: null,
+        orderno: null,
+        gameExpand1: null,
+        gameExpand2: null,
+        gameExpand3: null,
+        gameExpand4: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加游戏配置";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getGame(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改游戏配置";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateGame(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addGame(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除游戏配置编号为"' + ids + '"的数据项?').then(function() {
+        return delGame(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {
+      });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('business/game/export', {
+        ...this.queryParams
+      }, `game_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 296 - 0
game-ui/src/views/business/game_item/index.vue

@@ -0,0 +1,296 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="游戏" prop="gameId">
+        <el-select v-model="queryParams.gameId" placeholder="请选择">
+          <el-option
+            v-for="item in typeList"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="选项名称" prop="itemName">
+        <el-input
+          v-model="queryParams.itemName"
+          placeholder="请输入选项名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['business:game_item:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['business:game_item:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['business:game_item:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['business:game_item:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="game_itemList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="主键ID" align="center" prop="id" />
+      <el-table-column label="游戏" align="center" prop="gameId">
+        <template slot-scope="scope">
+          <span>{{ getTypeName(scope.row.gameId) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="选项名称" align="center" prop="itemName" />
+      <el-table-column label="选项倍数" align="center" prop="itemMultiple" />
+      <el-table-column label="选项值" align="center" prop="itemLocation" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['business:game_item:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['business:game_item:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改游戏选项对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="游戏ID" prop="gameId">
+          <el-input v-model="form.gameId" placeholder="请输入游戏ID" />
+        </el-form-item>
+        <el-form-item label="选项名称" prop="itemName">
+          <el-input v-model="form.itemName" placeholder="请输入选项名称" />
+        </el-form-item>
+        <el-form-item label="选项倍数" prop="itemMultiple">
+          <el-input v-model="form.itemMultiple" placeholder="请输入选项倍数" />
+        </el-form-item>
+        <el-form-item label="选项值" prop="itemLocation">
+          <el-input v-model="form.itemLocation" placeholder="请输入选项值" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listGame_item, getGame_item, delGame_item, addGame_item, updateGame_item,allGameList } from "@/api/business/game_item";
+
+export default {
+  name: "Game_item",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 游戏选项表格数据
+      game_itemList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      typeMap:{},
+      typeList:[],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        gameId: null,
+        itemName: null,
+        itemMultiple: null,
+        itemLocation: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    var that = this;
+    allGameList().then(response => {
+      if(response.data){
+        for(var i in response.data){
+          var item = response.data[i];
+          that.typeMap[item.id.toString()] = item.name;
+          that.typeList.push({
+            value:item.id,
+            label:item.name
+          })
+        }
+      }
+      this.getList();
+
+    })
+  },
+  methods: {
+    getTypeName(id) {
+      return this.typeMap[id.toString()];
+    },
+    /** 查询游戏选项列表 */
+    getList() {
+      this.loading = true;
+      listGame_item(this.queryParams).then(response => {
+        this.game_itemList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        gameId: null,
+        itemName: null,
+        itemMultiple: null,
+        itemLocation: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加游戏选项";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getGame_item(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改游戏选项";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateGame_item(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addGame_item(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除游戏选项编号为"' + ids + '"的数据项?').then(function() {
+        return delGame_item(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('business/game_item/export', {
+        ...this.queryParams
+      }, `game_item_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 558 - 0
game-ui/src/views/business/lottery/index.vue

@@ -0,0 +1,558 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="游戏ID" prop="gameId">
+        <el-select v-model="queryParams.gameId" placeholder="请选择">
+          <el-option
+            v-for="item in typeList"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="游戏期号" prop="gameDate">
+        <el-input
+          v-model="queryParams.gameDate"
+          placeholder="请输入游戏期号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="是否开奖" prop="isLottery">
+        <el-select v-model="queryParams.isLottery" placeholder="请选择是否开奖" clearable>
+          <el-option
+            v-for="dict in dict.type.app_game_is_open"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="开奖选项" prop="gameLotterySucc">
+        <el-select v-model="queryParams.gameLotterySucc" placeholder="请选择是否开奖" clearable>
+          <el-option
+            v-for="dict in gameItemList"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+<!--      <el-form-item label="记录时间" prop="gameRecordDate">
+        <el-date-picker clearable
+                        v-model="queryParams.gameRecordDate"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="请选择记录时间">
+        </el-date-picker>
+      </el-form-item>-->
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleKj"
+        >手动开奖</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['business:lottery:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['business:lottery:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['business:lottery:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['business:lottery:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="lotteryList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="主键ID" align="center" prop="id" />
+      <el-table-column label="游戏" align="center" prop="gameId">
+        <template slot-scope="scope">
+          <span>{{ getTypeName(scope.row.gameId) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="游戏期号" align="center" prop="gameDate" />
+      <el-table-column label="是否开奖" align="center" prop="isLottery">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.app_game_is_open" :value="scope.row.isLottery"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="开奖选项" align="center" prop="gameLotterySucc">
+        <template slot-scope="scope">
+          <span>{{ getItemName(scope.row.gameLotterySucc) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="记录时间" align="center" prop="gameRecordDate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.gameRecordDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['business:lottery:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['business:lottery:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改游戏开奖记录对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="游戏类型" prop="classId">
+          <el-select v-model="form.classId" placeholder="请选择">
+            <el-option
+              v-for="item in gameClassifyList"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="游戏ID" prop="gameId">
+          <el-select v-model="form.gameId" placeholder="请选择">
+            <el-option
+              v-for="item in typeList"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="游戏期号" prop="gameDate">
+          <el-input v-model="form.gameDate" placeholder="请输入游戏期号" />
+        </el-form-item>
+        <el-form-item label="是否开奖 0 否 1 是" prop="isLottery">
+          <el-select v-model="form.isLottery" placeholder="请选择是否开奖 0 否 1 是">
+            <el-option
+              v-for="dict in dict.type.app_game_is_open"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="开奖选项" prop="gameLotterySucc">
+          <el-input v-model="form.gameLotterySucc" placeholder="请输入开奖选项" />
+        </el-form-item>
+        <el-form-item label="记录时间" prop="gameRecordDate">
+          <el-date-picker clearable
+                          v-model="form.gameRecordDate"
+                          type="date"
+                          value-format="yyyy-MM-dd"
+                          placeholder="请选择记录时间">
+          </el-date-picker>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+
+    <!-- 手动开奖 -->
+    <el-dialog :title="title" :visible.sync="kjOpen" width="500px" append-to-body>
+      <el-form ref="kjForm" :model="kjForm" :rules="kjRules" label-width="80px">
+        <el-form-item label="游戏类型" prop="classId">
+          <el-select v-model="kjForm.classId" placeholder="请选择" @change="changeClass">
+            <el-option
+              v-for="item in gameClassifyList"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="游戏" prop="gameId" >
+          <el-select v-model="kjForm.gameId" placeholder="请选择" @change="changeGame">
+            <el-option
+              v-for="item in kjGamelist"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="开奖选项" prop="gameLotterySucc">
+          <el-select v-model="kjForm.gameLotterySucc" placeholder="请选择">
+            <el-option
+              v-for="dict in kjGameItemList"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="游戏期号" prop="gameDate">
+          <el-input v-model="kjForm.gameDate" placeholder="请输入游戏期号" />
+        </el-form-item>
+        <el-form-item label="是否开奖" prop="isLottery">
+          <el-select v-model="kjForm.isLottery" placeholder="请选择">
+            <el-option
+              v-for="dict in dict.type.app_game_is_open"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitKjForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listLottery, getLottery, delLottery, addLottery, updateLottery,allList,kjLottery } from "@/api/business/lottery";
+
+import {allGameList } from "@/api/business/game_item";
+
+import {listClassifyGame } from "@/api/business/game";
+
+export default {
+  name: "Lottery",
+  dicts: ['app_game_is_open'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 游戏开奖记录表格数据
+      lotteryList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      kjOpen:false,
+      typeMap:{},
+      typeList:[],
+      gameItemMap:{},
+      gameItemList:[],
+      gameClassifyList:[],
+      kjGamelist:[],
+      kjGameItemList:[],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        classId: null,
+        gameId: null,
+        gameDate: null,
+        isLottery: null,
+        gameLotterySucc: null,
+        gameRecordDate: null
+      },
+      // 表单参数
+      form: {},
+      kjForm:{},
+      // 表单校验
+      rules: {
+        classId: [
+          { required: true, message: "游戏类型ID不能为空", trigger: "blur" }
+        ],
+        gameId: [
+          { required: true, message: "游戏ID不能为空", trigger: "blur" }
+        ],
+      },
+      // 表单校验
+      kjRules: {
+        classId: [
+          { required: true, message: "游戏类型不能为空", trigger: "blur" }
+        ],
+        gameId: [
+          { required: true, message: "游戏不能为空", trigger: "blur" }
+        ],
+        gameLotterySucc: [
+          { required: true, message: "游戏选项不能为空", trigger: "blur" }
+        ],
+        gameDate: [
+          { required: true, message: "游戏期号不能为空", trigger: "blur" }
+        ],
+        isLottery: [
+          { required: true, message: "是否开奖不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    var that = this;
+    allList().then(response => {
+        if(response.data){
+          for(var i in response.data){
+            var item = response.data[i];
+            that.gameItemMap[item.id.toString()] = item.itemName;
+            that.gameItemList.push({
+              value:item.id,
+              label:item.itemName,
+              gameId:item.gameId
+            })
+          }
+        }
+    });
+    listClassifyGame().then(response => {
+        if(response.data){
+          for(var i in response.data){
+            var item = response.data[i];
+            that.gameClassifyList.push({
+              value:item.id,
+              label:item.name
+            })
+          }
+        }
+    });
+    allGameList().then(response => {
+      if(response.data){
+        for(var i in response.data){
+          var item = response.data[i];
+          that.typeMap[item.id.toString()] = item.name;
+          that.typeList.push({
+            value:item.id,
+            label:item.name,
+            classId:item.classifyId
+          })
+        }
+      }
+      this.getList();
+    })
+  },
+  methods: {
+    changeClass(val){
+
+      var that = this;
+      that.kjGamelist = [];
+      that.kjForm.gameId = null;
+      that.kjForm.gameLotterySucc = null;
+      for(var i in that.typeList){
+        var item = that.typeList[i];
+        if(item["classId"] == val){
+          that.kjGamelist.push(item);
+        }
+      }
+    },
+    changeGame(val){
+      var that = this;
+      that.kjGameItemList = [];
+      that.kjForm.gameLotterySucc = null;
+      for(var i in that.gameItemList){
+        var item = that.gameItemList[i];
+        console.log(item["gameId"],val)
+        if(item["gameId"] == val){
+          that.kjGameItemList.push(item);
+        }
+      }
+    },
+    getTypeName(id) {
+      return this.typeMap[id.toString()];
+    },
+    getItemName(id) {
+      return this.gameItemMap[id.toString()];
+    },
+    /** 查询游戏开奖记录列表 */
+    getList() {
+      this.loading = true;
+      listLottery(this.queryParams).then(response => {
+        this.lotteryList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.kjOpen = false;
+      this.reset();
+      this.resetKj();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        classId: null,
+        gameId: null,
+        gameDate: null,
+        isLottery: null,
+        gameLotterySucc: null,
+        gameRecordDate: null
+      };
+      this.resetForm("form");
+    },
+    resetKj() {
+      this.kjForm = {
+        id: null,
+        classId: null,
+        gameId: null,
+        gameDate: null,
+        isLottery: null,
+        gameLotterySucc: null,
+        gameRecordDate: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加游戏开奖记录";
+    },
+    /** 新增按钮操作 */
+    handleKj() {
+      this.resetKj();
+      this.kjOpen = true;
+      this.title = "手动开奖";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getLottery(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改游戏开奖记录";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateLottery(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addLottery(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 提交按钮 */
+    submitKjForm() {
+      this.$refs["kjForm"].validate(valid => {
+        if (valid) {
+          kjLottery(this.kjForm).then(response => {
+                this.$modal.msgSuccess(response.msg);
+                this.open = false;
+                this.getList();
+
+            });
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除游戏开奖记录编号为"' + ids + '"的数据项?').then(function() {
+        return delLottery(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('business/lottery/export', {
+        ...this.queryParams
+      }, `lottery_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 827 - 0
game-ui/src/views/business/user/index.vue

@@ -0,0 +1,827 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="UID" prop="userid">
+        <el-input
+          v-model="queryParams.userid"
+          placeholder="请输入UID"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="昵称 " prop="nickname">
+        <el-input
+          v-model="queryParams.nickname"
+          placeholder="请输入昵称 "
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="手机号" prop="mobile">
+        <el-input
+          v-model="queryParams.mobile"
+          placeholder="请输入手机号 "
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="在线状态" prop="onlineStatus">
+        <el-select v-model="queryParams.onlineStatus" placeholder="请选择" clearable>
+          <el-option
+            v-for="dict in dict.type.app_user_online_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <br>
+      <el-form-item label="直属上级" prop="pid">
+        <el-input
+          v-model="queryParams.pid"
+          placeholder="请输入直属上级"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="用户身份" prop="role">
+        <el-select v-model="queryParams.role" placeholder="请选择用户身份" clearable>
+          <el-option
+            v-for="dict in dict.type.app_user_role"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['business:user:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['business:user:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['business:user:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['business:user:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="userList" style="width: 100%" @scroll="handleScroll" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column fixed label="UID" align="center" prop="userid" />
+      <el-table-column fixed label="昵称 " align="center" prop="username" />
+      <el-table-column label="头像" align="center" prop="avatar" width="100">
+        <template slot-scope="scope">
+          <image-preview :src="scope.row.avatar" :width="50" :height="50"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="金币" align="center" prop="coin" />
+      <el-table-column label="余额" align="center" prop="diamondCoin" />
+      <el-table-column label=" 手机号" align="center" prop="mobile" />
+      <el-table-column label="最大连续签到天数" align="center" prop="maxSignCount" />
+      <el-table-column label="主播等级" align="center" prop="anchorGrade" />
+      <el-table-column label="主播积分" align="center" prop="anchorPoint" />
+      <el-table-column label="连续登录天数" align="center" prop="awardLoginDay" />
+      <el-table-column label="魅力等级" align="center" prop="charmGrade" />
+      <el-table-column label="魅力积分" align="center" prop="charmPoint" />
+      <el-table-column label="可兑换" align="center" prop="coinCash" />
+      <el-table-column label="消费总额(财富积分)" align="center" prop="consumption" />
+      <el-table-column label="注册时间" align="center" prop="createTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="邀请码" align="center" prop="inviteCode" />
+      <el-table-column label="用户当前的位置" align="center" prop="ipaddr" />
+      <el-table-column label="主播是否认证" align="center" prop="isAnchorAuth">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.is_anchor_auth" :value="scope.row.isAnchorAuth"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="最后登录ip" align="center" prop="lastLoginIp" />
+      <el-table-column label=" 上次登录时间" align="center" prop="lastLoginTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.lastLoginTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label=" 离线时间" align="center" prop="lastOffLineTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.lastOffLineTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="用户在线状态" align="center" prop="onlineStatus">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.app_user_online_status" :value="scope.row.onlineStatus"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="手机厂商" align="center" prop="phoneFirm" />
+      <el-table-column label="手机型号" align="center" prop="phoneModel" />
+      <el-table-column label="直属上级" align="center" prop="pid" />
+      <el-table-column label="用户身份" align="center" prop="role">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.app_user_role" :value="scope.row.role"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="连续签到次数" align="center" prop="signCount" />
+      <el-table-column label="上次签到时间" align="center" prop="signTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.signTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="手机号区域" align="center" prop="smsRegion" />
+      <el-table-column label="用户状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.app_user_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column fixed="right" label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleRestPwd(scope.row)"
+          >重置密码</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-bank-card"
+            @click="handleCharge(scope.row)"
+          >充值</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['business:user:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['business:user:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改app用户对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="当前版本号" prop="appVersion">
+          <el-input v-model="form.appVersion" placeholder="请输入当前版本号" />
+        </el-form-item>
+        <el-form-item label="当前版本code" prop="appVersionCode">
+          <el-input v-model="form.appVersionCode" placeholder="请输入当前版本code" />
+        </el-form-item>
+        <el-form-item label="用户头像" prop="avatar">
+          <image-upload v-model="form.avatar"/>
+        </el-form-item>
+        <el-form-item label="连续登录天数" prop="awardLoginDay">
+          <el-input v-model="form.awardLoginDay" placeholder="请输入连续登录天数" />
+        </el-form-item>
+        <el-form-item label="生日" prop="birthday">
+          <el-input v-model="form.birthday" placeholder="请输入生日" />
+        </el-form-item>
+        <el-form-item label="魅力等级" prop="charmGrade">
+          <el-input v-model="form.charmGrade" placeholder="请输入魅力等级" />
+        </el-form-item>
+        <el-form-item label="魅力积分" prop="charmPoint">
+          <el-input v-model="form.charmPoint" placeholder="请输入魅力积分" />
+        </el-form-item>
+        <el-form-item label="金币 /充值金额" prop="coin">
+          <el-input v-model="form.coin" placeholder="请输入金币 /充值金额" />
+        </el-form-item>
+        <el-form-item label="可兑换" prop="coinCash">
+          <el-input v-model="form.coinCash" placeholder="请输入可兑换" />
+        </el-form-item>
+        <el-form-item label="消费总额(财富积分)" prop="consumption">
+          <el-input v-model="form.consumption" placeholder="请输入消费总额(财富积分)" />
+        </el-form-item>
+        <el-form-item label="邀请码" prop="inviteCode">
+          <el-input v-model="form.inviteCode" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label=" 用户当前的位置信息ID" prop="ipaddr">
+          <el-input v-model="form.ipaddr" placeholder="请输入 用户当前的位置信息ID" />
+        </el-form-item>
+        <el-form-item label="主播是否认证 0:未认证 1:已认证  后台添加主播时,如果是认证状态, 需要添加认证记录" prop="isAnchorAuth">
+          <el-select v-model="form.isAnchorAuth" placeholder="请选择主播是否认证 0:未认证 1:已认证  后台添加主播时,如果是认证状态, 需要添加认证记录">
+            <el-option
+              v-for="dict in dict.type.is_anchor_auth"
+              :key="dict.value"
+              :label="dict.label"
+              :value="parseInt(dict.value)"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="上次登录时间(连续登录用)" prop="lastLoginDay">
+          <el-date-picker clearable
+            v-model="form.lastLoginDay"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择上次登录时间(连续登录用)">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="最后登录ip" prop="lastLoginIp">
+          <el-input v-model="form.lastLoginIp" placeholder="请输入最后登录ip" />
+        </el-form-item>
+        <el-form-item label=" 上次登录时间" prop="lastLoginTime">
+          <el-date-picker clearable
+            v-model="form.lastLoginTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择 上次登录时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label=" 离线时间" prop="lastOffLineTime">
+          <el-date-picker clearable
+            v-model="form.lastOffLineTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择 离线时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="最大连续签到天数" prop="maxSignCount">
+          <el-input v-model="form.maxSignCount" placeholder="请输入最大连续签到天数" />
+        </el-form-item>
+        <el-form-item label=" 手机号" prop="mobile">
+          <el-input v-model="form.mobile" placeholder="请输入 手机号" />
+        </el-form-item>
+        <el-form-item label="昵称 " prop="nickname">
+          <el-input v-model="form.nickname" placeholder="请输入昵称 " />
+        </el-form-item>
+        <el-form-item label="用户在线状态 0:离线 1:在线" prop="onlineStatus">
+          <el-select v-model="form.onlineStatus" placeholder="请选择用户在线状态 0:离线 1:在线">
+            <el-option
+              v-for="dict in dict.type.app_user_online_status"
+              :key="dict.value"
+              :label="dict.label"
+              :value="parseInt(dict.value)"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="手机厂商" prop="phoneFirm">
+          <el-input v-model="form.phoneFirm" placeholder="请输入手机厂商" />
+        </el-form-item>
+        <el-form-item label="手机型号" prop="phoneModel">
+          <el-input v-model="form.phoneModel" placeholder="请输入手机型号" />
+        </el-form-item>
+        <el-form-item label="手机系统" prop="phoneSystem">
+          <el-input v-model="form.phoneSystem" placeholder="请输入手机系统" />
+        </el-form-item>
+        <el-form-item label="手机唯一标识" prop="phoneUuid">
+          <el-input v-model="form.phoneUuid" placeholder="请输入手机唯一标识" />
+        </el-form-item>
+        <el-form-item label="直属上级" prop="pid">
+          <el-input v-model="form.pid" placeholder="请输入直属上级" />
+        </el-form-item>
+        <el-form-item label="用户身份" prop="role">
+          <el-select v-model="form.role" placeholder="请选择用户身份">
+            <el-option
+              v-for="dict in dict.type.app_user_role"
+              :key="dict.value"
+              :label="dict.label"
+              :value="parseInt(dict.value)"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="连续签到次数" prop="signCount">
+          <el-input v-model="form.signCount" placeholder="请输入连续签到次数" />
+        </el-form-item>
+        <el-form-item label="上次签到时间" prop="signTime">
+          <el-date-picker clearable
+            v-model="form.signTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择上次签到时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="手机号区域 例如:86" prop="smsRegion">
+          <el-input v-model="form.smsRegion" placeholder="请输入手机号区域 例如:86" />
+        </el-form-item>
+        <el-form-item label=" 用户状态 1:禁用 0:正常" prop="status">
+          <el-select v-model="form.status" placeholder="请选择 用户状态 1:禁用 0:正常">
+            <el-option
+              v-for="dict in dict.type.app_user_status"
+              :key="dict.value"
+              :label="dict.label"
+              :value="parseInt(dict.value)"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="余额/可提现余额" prop="diamondCoin">
+          <el-input v-model="form.diamondCoin" placeholder="请输入余额/可提现余额" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+
+    <!-- 重置密码对话框 -->
+    <el-dialog :title="title" :visible.sync="resetPwdopen" width="500px" append-to-body>
+      <el-form ref="restPwdForm" :model="restPwdForm" :rules="resetPwdRules" label-width="80px">
+        <el-form-item label="用户id" prop="userId">
+          <el-input v-model="resetPwdForm.userId" disabled />
+        </el-form-item>
+        <el-form-item label="密码" prop="password">
+          <el-input v-model="resetPwdForm.password" placeholder="请输入密码" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitResetPwdForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 充值对话框 -->
+    <el-dialog :title="title" :visible.sync="chargeopen" width="500px" append-to-body>
+      <el-form ref="chargeForm" :model="chargeForm" :rules="chargeRules" label-width="80px">
+        <el-form-item label="用户id" prop="userId">
+          <el-input v-model="chargeForm.userId" disabled />
+        </el-form-item>
+        <el-form-item label="货币类型" prop="type">
+          <el-select v-model="chargeForm.type" placeholder="请选择" clearable>
+            <el-option
+              v-for="dict in dict.type.app_user_coin_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="金额" prop="amount">
+          <el-input v-model="chargeForm.amount" placeholder="请输入密码" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitChargeForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listUser, getUser, delUser, addUser, updateUser,resetUser,userCharge } from "@/api/business/user";
+
+export default {
+  name: "User",
+  dicts: ['is_anchor_auth', 'app_user_role', 'app_user_status', 'app_user_online_status','app_user_coin_type'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // app用户表格数据
+      userList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 是否显示弹出层
+      resetPwdopen: false,
+      // 是否显示弹出层
+      chargeopen: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userid: null,
+        anchorGrade: null,
+        anchorPoint: null,
+        appVersion: null,
+        appVersionCode: null,
+        avatar: null,
+        awardLoginDay: null,
+        birthday: null,
+        charmGrade: null,
+        charmPoint: null,
+        coin: null,
+        coinCash: null,
+        consumption: null,
+        createTime: null,
+        ipaddr: null,
+        isAnchorAuth: null,
+        nickname: null,
+        onlineStatus: null,
+        phoneFirm: null,
+        phoneModel: null,
+        phoneSystem: null,
+        phoneUuid: null,
+        pid: null,
+        role: null,
+        diamondCoin: null,
+        mobile:null
+      },
+      // 表单参数
+      form: {},
+      //重置密码
+      resetPwdForm:{},
+      //重置密码
+      chargeForm:{},
+      // 表单校验
+      rules: {
+        level: [
+          { required: true, message: "不能为空", trigger: "blur" }
+        ],
+      },
+      resetPwdRules: {
+        password: [
+          { required: true, message: "密码不能为空", trigger: "blur" }
+        ],
+      },
+      chargeRules: {
+        amount: [
+          { required: true, message: "金额不能为空", trigger: "blur" }
+        ],
+        type: [
+          { required: true, message: "类型不能为空", trigger: "blur" }
+        ],
+      },
+      scrollLeft: 0
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询app用户列表 */
+    getList() {
+      this.loading = true;
+      listUser(this.queryParams).then(response => {
+        this.userList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.resetPwdopen = false;
+      this.chargeopen = false;
+      this.reset();
+      this.resetPwd();
+      this.resetCharge();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        userid: null,
+        address: null,
+        agentId: null,
+        amount: null,
+        anchorGrade: null,
+        anchorPoint: null,
+        appVersion: null,
+        appVersionCode: null,
+        avatar: null,
+        awardLoginDay: null,
+        birthday: null,
+        broadCast: null,
+        channelId: null,
+        chargeShow: null,
+        charmGrade: null,
+        charmPoint: null,
+        city: null,
+        cityEdit: null,
+        coin: null,
+        coinCash: null,
+        constellation: null,
+        consumption: null,
+        createTime: null,
+        dealScalePlan: null,
+        delFlag: null,
+        deviceId: null,
+        devoteShow: null,
+        giftGlobalBroadcast: null,
+        goodnum: null,
+        groupId: null,
+        gsRoomId: null,
+        gsRoomType: null,
+        guildId: null,
+        headNo: null,
+        height: null,
+        hideDistance: null,
+        inviteCode: null,
+        bindCode: null,
+        ipaddr: null,
+        isAnchorAuth: null,
+        isAutomatic: null,
+        isJoinJg: null,
+        isLiveAccount: null,
+        isNotDisturb: null,
+        isOooAccount: null,
+        isPush: null,
+        isRecommend: null,
+        isShowHomePage: null,
+        isSvip: null,
+        isTone: null,
+        isYouthModel: null,
+        ishot: null,
+        isrecord: null,
+        issuper: null,
+        iszombie: null,
+        iszombiep: null,
+        joinRoomShow: null,
+        kickTime: null,
+        lastGameNum: null,
+        lastLoginDay: null,
+        lastLoginIp: null,
+        lastLoginTime: null,
+        lastOffLineTime: null,
+        lat: null,
+        level: null,
+        liveFunction: null,
+        liveStatus: null,
+        liveThumb: null,
+        liveThumbs: null,
+        lng: null,
+        lockReason: null,
+        lockTime: null,
+        loginType: null,
+        managerCoId: null,
+        managerId: null,
+        maxSignCount: null,
+        mobile: null,
+        nickname: null,
+        nobleGrade: null,
+        onlineStatus: null,
+        oooHomePageSortNo: null,
+        oooLiveStatus: null,
+        oooTwoClassifyId: null,
+        openLiveZombieNum: null,
+        openid: null,
+        optUserName: null,
+        password: null,
+        phoneFirm: null,
+        phoneModel: null,
+        phoneSystem: null,
+        phoneUuid: null,
+        pid: null,
+        portrait: null,
+        poster: null,
+        province: null,
+        pushPlatform: null,
+        pushRegisterId: null,
+        readShortVideoNumber: null,
+        regType: null,
+        registerIp: null,
+        role: null,
+        roomId: null,
+        roomTitle: null,
+        roomType: null,
+        roomTypeVal: null,
+        salt: null,
+        sanwei: null,
+        score: null,
+        sex: null,
+        signCount: null,
+        signTime: null,
+        signature: null,
+        smsRegion: null,
+        source: null,
+        starId: null,
+        status: null,
+        totalAmount: null,
+        totalAmountCash: null,
+        totalCash: null,
+        totalCharge: null,
+        unionid: null,
+        updatePwdTime: null,
+        userActivationKey: null,
+        userEmail: null,
+        userGrade: null,
+        userPoint: null,
+        userSetOnlineStatus: null,
+        userType: null,
+        userUrl: null,
+        username: null,
+        video: null,
+        videoCoin: null,
+        videoImg: null,
+        vocation: null,
+        voice: null,
+        voiceCoin: null,
+        voiceStatus: null,
+        voipToken: null,
+        votes: null,
+        votestotal: null,
+        wealthGrade: null,
+        wechat: null,
+        weight: null,
+        whetherEnablePositioningShow: null,
+        youthPassword: null,
+        zombieMaxNum: null,
+        zombieRatio: null,
+        agentGrade: null,
+        liveDividedInto: null,
+        gameDividedInto: null,
+        inviteBindTime: null,
+        fundPassword: null,
+        diamondCoin: null,
+        diamondCoinTotal: null,
+        diamondCoinCashTotal: null,
+        agentFlag: null,
+        diamondCoinCash: null,
+        otherPid: null
+      };
+      this.resetForm("form");
+    },// 表单重置
+    resetPwd() {
+      this.resetPwdForm = {
+        userId: null,
+        password: null
+      };
+      this.resetForm("restPwdForm");
+    },// 表单重置
+    resetCharge() {
+      this.chargeForm = {
+        userId: null,
+        amount: null,
+        type:null
+      };
+      this.resetForm("restPwdForm");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.userid)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加app用户";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const userid = row.userid || this.ids
+      getUser(userid).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改app用户";
+      });
+    },
+    /** 重置密码按钮操作 */
+    handleRestPwd(row) {
+      this.resetPwd();
+      const userid = row.userid;
+      this.resetPwdForm = {
+        userId:userid,
+        password:""
+      };
+      this.resetPwdopen = true;
+      this.title = "重置密码";
+    },
+    /** 重置密码按钮操作 */
+    handleCharge(row) {
+      this.resetCharge();
+      const userid = row.userid;
+      this.chargeForm = {
+        userId:userid,
+        type: null,
+        amount:null
+      };
+      this.chargeopen = true;
+      this.title = "充值";
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.userid != null) {
+            updateUser(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUser(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 重置密码提交按钮 */
+    submitResetPwdForm() {
+      this.$refs["restPwdForm"].validate(valid => {
+        if (valid) {
+          resetUser(this.resetPwdForm).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.resetPwdopen = false;
+            this.getList();
+          });
+        }
+      });
+    },
+    /** 充值提交按钮 */
+    submitChargeForm() {
+      this.$refs["chargeForm"].validate(valid => {
+        if (valid) {
+          userCharge(this.chargeForm).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.chargeopen = false;
+            this.getList();
+          });
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const userids = row.userid || this.ids;
+      this.$modal.confirm('是否确认删除app用户编号为"' + userids + '"的数据项?').then(function() {
+        return delUser(userids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('business/user/export', {
+        ...this.queryParams
+      }, `user_${new Date().getTime()}.xlsx`)
+    },
+    handleScroll(event) {
+      // 当滚动时同步左右滚动
+      this.scrollLeft = event.target.scrollLeft;
+    }
+  }
+};
+</script>

+ 0 - 980
game-ui/src/views/index.vue

@@ -1,986 +1,6 @@
 <template>
   <div class="app-container home">
-    <el-row :gutter="20">
-      <el-col :sm="24" :lg="24">
-        <blockquote class="text-warning" style="font-size: 14px">
-          领取阿里云通用云产品1888优惠券
-          <br />
-          <el-link
-            href="https://www.aliyun.com/minisite/goods?userCode=brki8iof"
-            type="primary"
-            target="_blank"
-            >https://www.aliyun.com/minisite/goods?userCode=brki8iof</el-link
-          >
-          <br />
-          领取腾讯云通用云产品2860优惠券
-          <br />
-          <el-link
-            href="https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console"
-            type="primary"
-            target="_blank"
-            >https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console</el-link
-          >
-          <br />
-          阿里云服务器折扣区
-          <el-link href="http://aly.ruoyi.vip" type="primary" target="_blank"
-            >>☛☛点我进入☚☚</el-link
-          >
-          &nbsp;&nbsp;&nbsp; 腾讯云服务器秒杀区
-          <el-link href="http://txy.ruoyi.vip" type="primary" target="_blank"
-            >>☛☛点我进入☚☚</el-link
-          ><br />
-          <h4 class="text-danger">
-            云产品通用红包,可叠加官网常规优惠使用。(仅限新用户)
-          </h4>
-        </blockquote>
 
-        <hr />
-      </el-col>
-    </el-row>
-    <el-row :gutter="20">
-      <el-col :sm="24" :lg="12" style="padding-left: 20px">
-        <h2>若依后台管理框架</h2>
-        <p>
-          一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了若依管理系统,她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA等等,当然,您也可以对她进行深度定制,以做出更强系统。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。
-        </p>
-        <p>
-          <b>当前版本:</b> <span>v{{ version }}</span>
-        </p>
-        <p>
-          <el-tag type="danger">&yen;免费开源</el-tag>
-        </p>
-        <p>
-          <el-button
-            type="primary"
-            size="mini"
-            icon="el-icon-cloudy"
-            plain
-            @click="goTarget('https://gitee.com/y_project/RuoYi-Vue')"
-            >访问码云</el-button
-          >
-          <el-button
-            size="mini"
-            icon="el-icon-s-home"
-            plain
-            @click="goTarget('http://ruoyi.vip')"
-            >访问主页</el-button
-          >
-        </p>
-      </el-col>
-
-      <el-col :sm="24" :lg="12" style="padding-left: 50px">
-        <el-row>
-          <el-col :span="12">
-            <h2>技术选型</h2>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="6">
-            <h4>后端技术</h4>
-            <ul>
-              <li>SpringBoot</li>
-              <li>Spring Security</li>
-              <li>JWT</li>
-              <li>MyBatis</li>
-              <li>Druid</li>
-              <li>Fastjson</li>
-              <li>...</li>
-            </ul>
-          </el-col>
-          <el-col :span="6">
-            <h4>前端技术</h4>
-            <ul>
-              <li>Vue</li>
-              <li>Vuex</li>
-              <li>Element-ui</li>
-              <li>Axios</li>
-              <li>Sass</li>
-              <li>Quill</li>
-              <li>...</li>
-            </ul>
-          </el-col>
-        </el-row>
-      </el-col>
-    </el-row>
-    <el-divider />
-    <el-row :gutter="20">
-      <el-col :xs="24" :sm="24" :md="12" :lg="8">
-        <el-card class="update-log">
-          <div slot="header" class="clearfix">
-            <span>联系信息</span>
-          </div>
-          <div class="body">
-            <p>
-              <i class="el-icon-s-promotion"></i> 官网:<el-link
-                href="http://www.ruoyi.vip"
-                target="_blank"
-                >http://www.ruoyi.vip</el-link
-              >
-            </p>
-            <p>
-              <i class="el-icon-user-solid"></i> QQ群:<s> 满937441 </s> <s> 满887144332 </s>
-              <s> 满180251782 </s> <s> 满104180207 </s> <s> 满186866453 </s> <s> 满201396349 </s>
-              <s> 满101456076 </s> <s> 满101539465 </s> <s> 满264312783 </s> <s> 满167385320 </s> 
-              <s> 满104748341 </s> <s> 满160110482 </s> <s> 满170801498 </s> <s> 满108482800 </s> 
-              <s> 满101046199 </s> <s> 满136919097 </s> <s> 满143961921 </s> <s> 满174951577 </s> 
-              <s> 满161281055 </s> <a href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=XIzkm_mV2xTsUtFxo63bmicYoDBA6Ifm&authKey=dDW%2F4qsmw3x9govoZY9w%2FoWAoC4wbHqGal%2BbqLzoS6VBarU8EBptIgPKN%2FviyC8j&noverify=0&group_code=138988063" target="_blank">138988063</a>
-            </p>
-            <p>
-              <i class="el-icon-chat-dot-round"></i> 微信:<a
-                href="javascript:;"
-                >/ *若依</a
-              >
-            </p>
-            <p>
-              <i class="el-icon-money"></i> 支付宝:<a
-                href="javascript:;"
-                class="支付宝信息"
-                >/ *若依</a
-              >
-            </p>
-          </div>
-        </el-card>
-      </el-col>
-      <el-col :xs="24" :sm="24" :md="12" :lg="8">
-        <el-card class="update-log">
-          <div slot="header" class="clearfix">
-            <span>更新日志</span>
-          </div>
-          <el-collapse accordion>
-            <el-collapse-item title="v3.8.7 - 2023-12-08">
-              <ol>
-                <li>操作日志记录部门名称</li>
-                <li>全局数据存储用户编号</li>
-                <li>新增编程式判断资源访问权限</li>
-                <li>操作日志列表新增IP地址查询</li>
-                <li>定时任务新增页去除状态选项</li>
-                <li>代码生成支持选择前端模板类型</li>
-                <li>显隐列组件支持复选框弹出类型</li>
-                <li>通用排序属性orderBy参数限制长度</li>
-                <li>Excel自定义数据处理器增加单元格/工作簿对象</li>
-                <li>升级oshi到最新版本6.4.8</li>
-                <li>升级druid到最新版本1.2.20</li>
-                <li>升级fastjson到最新版2.0.43</li>
-                <li>升级pagehelper到最新版1.4.7</li>
-                <li>升级commons.io到最新版本2.13.0</li>
-                <li>升级element-ui到最新版本2.15.14</li>
-                <li>修复五级路由缓存无效问题</li>
-                <li>修复外链带端口出现的异常</li>
-                <li>修复树模板父级编码变量错误</li>
-                <li>修复字典表详情页面搜索问题</li>
-                <li>修复内链iframe没有传递参数问题</li>
-                <li>修复自定义字典样式不生效的问题</li>
-                <li>修复字典缓存删除方法参数错误问题</li>
-                <li>修复Excel导入数据临时文件无法删除问题</li>
-                <li>修复未登录带参数访问成功后参数丢失问题</li>
-                <li>修复HeaderSearch组件跳转query参数丢失问题</li>
-                <li>修复代码生成导入后必填项与数据库不匹配问题</li>
-                <li>修复Excels导入时无法获取到dictType字典值问题</li>
-                <li>优化下载zip方法新增遮罩层</li>
-                <li>优化头像上传参数新增文件名称</li>
-                <li>优化字典标签支持自定义分隔符</li>
-                <li>优化菜单管理类型为按钮状态可选</li>
-                <li>优化前端防重复提交数据大小限制</li>
-                <li>优化TopNav菜单没有图标svg不显示</li>
-                <li>优化数字金额大写转换精度丢失问题</li>
-                <li>优化富文本Editor组件检验图片格式</li>
-                <li>优化页签在Firefox浏览器被遮挡的问题</li>
-                <li>优化个人中心/基本资料修改时数据显示问题</li>
-                <li>优化缓存监控图表支持跟随屏幕大小自适应调整</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.6 - 2023-06-30">
-              <ol>
-                <li>支持登录IP黑名单限制</li>
-                <li>新增监控页面图标显示</li>
-                <li>操作日志新增消耗时间属性</li>
-                <li>屏蔽定时任务bean违规的字符</li>
-                <li>日志管理使用索引提升查询性能</li>
-                <li>日志注解支持排除指定的请求参数</li>
-                <li>支持自定义隐藏属性列过滤子对象</li>
-                <li>升级oshi到最新版本6.4.3</li>
-                <li>升级druid到最新版本1.2.16</li>
-                <li>升级fastjson到最新版2.0.34</li>
-                <li>升级spring-boot到最新版本2.5.15</li>
-                <li>升级element-ui到最新版本2.15.13</li>
-                <li>移除apache/commons-fileupload依赖</li>
-                <li>修复页面切换时布局错乱的问题</li>
-                <li>修复匿名注解Anonymous空指针问题</li>
-                <li>修复路由跳转被阻止时内部产生报错信息问题</li>
-                <li>修复isMatchedIp的参数判断产生空指针的问题</li>
-                <li>修复用户多角色数据权限可能出现权限抬升的情况</li>
-                <li>修复开启TopNav后一级菜单路由参数设置无效问题</li>
-                <li>修复DictTag组件value没有匹配的值时则展示value</li>
-                <li>优化文件下载出现的异常</li>
-                <li>优化选择图标组件高亮回显</li>
-                <li>优化弹窗后导航栏偏移的问题</li>
-                <li>优化修改密码日志存储明文问题</li>
-                <li>优化页签栏关闭其他出现的异常问题</li>
-                <li>优化页签关闭左侧选项排除首页选项</li>
-                <li>优化关闭当前tab页跳转最右侧tab页</li>
-                <li>优化缓存列表清除操作提示不变的问题</li>
-                <li>优化字符未使用下划线不进行驼峰式处理</li>
-                <li>优化用户导入更新时需获取用户编号问题</li>
-                <li>优化侧边栏的平台标题与VUE_APP_TITLE保持同步</li>
-                <li>优化导出Excel时设置dictType属性重复查缓存问题</li>
-                <li>连接池Druid支持新的配置connectTimeout和socketTimeout</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.5 - 2023-01-01">
-              <ol>
-                <li>定时任务违规的字符</li>
-                <li>重置时取消部门选中</li>
-                <li>新增返回警告消息提示</li>
-                <li>忽略不必要的属性数据返回</li>
-                <li>修改参数键名时移除前缓存配置</li>
-                <li>导入更新用户数据前校验数据权限</li>
-                <li>兼容Excel下拉框内容过多无法显示的问题</li>
-                <li>升级echarts到最新版本5.4.0</li>
-                <li>升级core-js到最新版本3.25.3</li>
-                <li>升级oshi到最新版本6.4.0</li>
-                <li>升级kaptcha到最新版2.3.3</li>
-                <li>升级druid到最新版本1.2.15</li>
-                <li>升级fastjson到最新版2.0.20</li>
-                <li>升级pagehelper到最新版1.4.6</li>
-                <li>优化弹窗内容过多展示不全问题</li>
-                <li>优化swagger-ui静态资源使用缓存</li>
-                <li>开启TopNav没有子菜单隐藏侧边栏</li>
-                <li>删除fuse无效选项maxPatternLength</li>
-                <li>优化导出对象的子列表为空会出现[]问题</li>
-                <li>优化编辑头像时透明部分会变成黑色问题</li>
-                <li>优化小屏幕上修改头像界面布局错位的问题</li>
-                <li>修复代码生成勾选属性无效问题</li>
-                <li>修复文件上传组件格式验证问题</li>
-                <li>修复回显数据字典数组异常问题</li>
-                <li>修复sheet超出最大行数异常问题</li>
-                <li>修复Log注解GET请求记录不到参数问题</li>
-                <li>修复调度日志点击多次数据不变化的问题</li>
-                <li>修复主题颜色在Drawer组件不会加载问题</li>
-                <li>修复文件名包含特殊字符的文件无法下载问题</li>
-                <li>修复table中更多按钮切换主题色未生效修复问题</li>
-                <li>修复某些特性的环境生成代码变乱码TXT文件问题</li>
-                <li>修复代码生成图片/文件/单选时选择必填无法校验问题</li>
-                <li>修复某些特性的情况用户编辑对话框中角色和部门无法修改问题</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.4 - 2022-09-26">
-              <ol>
-                <li>数据逻辑删除不进行唯一验证</li>
-                <li>Excel注解支持导出对象的子列表方法</li>
-                <li>Excel注解支持自定义隐藏属性列</li>
-                <li>Excel注解支持backgroundColor属性设置背景色</li>
-                <li>支持配置密码最大错误次数/锁定时间</li>
-                <li>登录日志新增解锁账户功能</li>
-                <li>通用下载方法新增config配置选项</li>
-                <li>支持多权限字符匹配角色数据权限</li>
-                <li>页面内嵌iframe切换tab不刷新数据</li>
-                <li>操作日志记录支持排除敏感属性字段</li>
-                <li>修复多文件上传报错出现的异常问题</li>
-                <li>修复图片预览组件src属性为null值控制台报错问题</li>
-                <li>升级oshi到最新版本6.2.2</li>
-                <li>升级fastjson到最新版2.0.14</li>
-                <li>升级pagehelper到最新版1.4.3</li>
-                <li>升级core-js到最新版本3.25.2</li>
-                <li>升级element-ui到最新版本2.15.10</li>
-                <li>优化任务过期不执行调度</li>
-                <li>优化字典数据使用store存取</li>
-                <li>优化修改资料头像被覆盖的问题</li>
-                <li>优化修改用户登录账号重复验证</li>
-                <li>优化代码生成同步后值NULL问题</li>
-                <li>优化定时任务支持执行父类方法</li>
-                <li>优化用户个人信息接口防止修改部门</li>
-                <li>优化布局设置使用el-drawer抽屉显示</li>
-                <li>优化没有权限的用户编辑部门缺少数据</li>
-                <li>优化日志注解记录限制请求地址的长度</li>
-                <li>优化excel/scale属性导出单元格数值类型</li>
-                <li>优化日志操作中重置按钮时重复查询的问题</li>
-                <li>优化多个相同角色数据导致权限SQL重复问题</li>
-                <li>优化表格上右侧工具条(搜索按钮显隐&右侧样式凸出)</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.3 - 2022-06-27">
-              <ol>
-                <li>新增缓存列表菜单功能</li>
-                <li>代码生成树表新增(展开/折叠)</li>
-                <li>Excel注解支持color字体颜色</li>
-                <li>新增Anonymous匿名访问不鉴权注解</li>
-                <li>用户头像上传限制只能为图片格式</li>
-                <li>接口使用泛型使其看到响应属性字段</li>
-                <li>检查定时任务bean所在包名是否为白名单配置</li>
-                <li>添加页签openPage支持传递参数</li>
-                <li>用户缓存信息添加部门ancestors祖级列表</li>
-                <li>升级element-ui到最新版本2.15.8</li>
-                <li>升级oshi到最新版本6.1.6</li>
-                <li>升级druid到最新版本1.2.11</li>
-                <li>升级fastjson到最新版2.0.8</li>
-                <li>升级spring-boot到最新版本2.5.14</li>
-                <li>降级jsencrypt版本兼容IE浏览器</li>
-                <li>删除多余的salt字段</li>
-                <li>新增获取不带后缀文件名称方法</li>
-                <li>新增获取配置文件中的属性值方法</li>
-                <li>新增内容编码/解码方便插件集成使用</li>
-                <li>字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)</li>
-                <li>优化设置分页参数默认值</li>
-                <li>优化对空字符串参数处理的过滤</li>
-                <li>优化显示顺序orderNum类型为整型</li>
-                <li>优化表单构建按钮不显示正则校验</li>
-                <li>优化字典数据回显样式下拉框显示值</li>
-                <li>优化R响应成功状态码与全局保持一致</li>
-                <li>优化druid开启wall过滤器出现的异常问题</li>
-                <li>优化用户管理左侧树型组件增加选中高亮保持</li>
-                <li>优化新增用户与角色信息&用户与岗位信息逻辑</li>
-                <li>优化默认不启用压缩文件缓存防止node_modules过大</li>
-                <li>修复字典数据显示不全问题</li>
-                <li>修复操作日志查询类型条件为0时会查到所有数据</li>
-                <li>修复Excel注解prompt/combo同时使用不生效问题</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.2 - 2022-04-01">
-              <ol>
-                <li>前端支持设置是否需要防止数据重复提交</li>
-                <li>开启TopNav没有子菜单情况隐藏侧边栏</li>
-                <li>侧边栏菜单名称过长悬停显示标题</li>
-                <li>用户访问控制时校验数据权限,防止越权</li>
-                <li>导出Excel时屏蔽公式,防止CSV注入风险</li>
-                <li>组件ImagePreview支持多图预览显示</li>
-                <li>组件ImageUpload支持多图同时选择上传</li>
-                <li>组件FileUpload支持多文件同时选择上传</li>
-                <li>服务监控新增运行参数信息显示</li>
-                <li>定时任务目标字符串过滤特殊字符</li>
-                <li>定时任务目标字符串验证包名白名单</li>
-                <li>代码生成列表图片支持预览</li>
-                <li>代码生成编辑修改打开新页签</li>
-                <li>代码生成新增Java类型Boolean</li>
-                <li>代码生成子表支持日期/字典配置</li>
-                <li>代码生成同步保留必填/类型选项</li>
-                <li>升级oshi到最新版本6.1.2</li>
-                <li>升级fastjson到最新版1.2.80</li>
-                <li>升级pagehelper到最新版1.4.1</li>
-                <li>升级spring-boot到最新版本2.5.11</li>
-                <li>升级spring-boot-mybatis到最新版2.2.2</li>
-                <li>添加遗漏的分页参数合理化属性</li>
-                <li>修改npm即将过期的注册源地址</li>
-                <li>修复分页组件请求两次问题</li>
-                <li>修复通用文件下载接口跨域问题</li>
-                <li>修复Xss注解字段值为空时的异常问题</li>
-                <li>修复选项卡点击右键刷新丢失参数问题</li>
-                <li>修复表单清除元素位置未垂直居中问题</li>
-                <li>修复服务监控中运行参数显示条件错误</li>
-                <li>修复导入Excel时字典字段类型为Long转义为空问题</li>
-                <li>修复登录超时刷新页面跳转登录页面还提示重新登录问题</li>
-                <li>优化加载字典缓存数据</li>
-                <li>优化IP地址获取到多个的问题</li>
-                <li>优化任务队列满时任务拒绝策略</li>
-                <li>优化文件上传兼容Weblogic环境</li>
-                <li>优化定时任务默认保存到内存中执行</li>
-                <li>优化部门修改缩放后出现的错位问题</li>
-                <li>优化Excel格式化不同类型的日期对象</li>
-                <li>优化菜单表关键字导致的插件报错问题</li>
-                <li>优化Oracle用户头像列为空时不显示问题</li>
-                <li>优化页面若未匹配到字典标签则返回原字典值</li>
-                <li>优化修复登录失效后多次请求提示多次弹窗问题</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.1 - 2022-01-01">
-              <ol>
-                <li>新增Vue3前端代码生成模板</li>
-                <li>新增图片预览组件</li>
-                <li>新增压缩插件实现打包Gzip</li>
-                <li>自定义xss校验注解实现</li>
-                <li>自定义文字复制剪贴指令</li>
-                <li>代码生成预览支持复制内容</li>
-                <li>路由支持单独配置菜单或角色权限</li>
-                <li>用户管理部门查询选择节点后分页参数初始</li>
-                <li>修复用户分配角色属性错误</li>
-                <li>修复打包后字体图标偶现的乱码问题</li>
-                <li>修复菜单管理重置表单出现的错误</li>
-                <li>修复版本差异导致的懒加载报错问题</li>
-                <li>修复Cron组件中周回显问题</li>
-                <li>修复定时任务多参数逗号分隔的问题</li>
-                <li>修复根据ID查询列表可能出现的主键溢出问题</li>
-                <li>修复tomcat配置参数已过期问题</li>
-                <li>升级clipboard到最新版本2.0.8</li>
-                <li>升级oshi到最新版本v5.8.6</li>
-                <li>升级fastjson到最新版1.2.79</li>
-                <li>升级spring-boot到最新版本2.5.8</li>
-                <li>升级log4j2到2.17.1,防止漏洞风险</li>
-                <li>优化下载解析blob异常提示</li>
-                <li>优化代码生成字典组重复问题</li>
-                <li>优化查询用户的角色组&岗位组代码</li>
-                <li>优化定时任务cron表达式小时设置24</li>
-                <li>优化用户导入提示溢出则显示滚动条</li>
-                <li>优化防重复提交标识组合为(key+url+header)</li>
-                <li>优化分页方法设置成通用方便灵活调用</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.0 - 2021-12-01">
-              <ol>
-                <li>新增配套并同步的Vue3前端版本</li>
-                <li>新增通用方法简化模态/缓存/下载/权限/页签使用</li>
-                <li>优化导出数据/使用通用下载方法</li>
-                <li>Excel注解支持自定义数据处理器</li>
-                <li>Excel注解支持导入导出标题信息</li>
-                <li>Excel导入支持@Excels注解</li>
-                <li>新增组件data-dict,简化数据字典使用</li>
-                <li>新增Jaxb依赖,防止jdk8以上出现的兼容错误</li>
-                <li>生产环境使用路由懒加载提升页面响应速度</li>
-                <li>修复五级以上菜单出现的404问题</li>
-                <li>防重提交注解支持配置间隔时间/提示消息</li>
-                <li>日志注解新增是否保存响应参数</li>
-                <li>任务屏蔽违规字符&参数忽略双引号中的逗号</li>
-                <li>升级SpringBoot到最新版本2.5.6</li>
-                <li>升级pagehelper到最新版1.4.0</li>
-                <li>升级spring-boot-mybatis到最新版2.2.0</li>
-                <li>升级oshi到最新版本v5.8.2</li>
-                <li>升级druid到最新版1.2.8</li>
-                <li>升级velocity到最新版本2.3</li>
-                <li>升级fastjson到最新版1.2.78</li>
-                <li>升级axios到最新版本0.24.0</li>
-                <li>升级dart-sass到版本1.32.13</li>
-                <li>升级core-js到最新版本3.19.1</li>
-                <li>升级jsencrypt到最新版本3.2.1</li>
-                <li>升级js-cookie到最新版本3.0.1</li>
-                <li>升级file-saver到最新版本2.0.5</li>
-                <li>升级sass-loader到最新版本10.1.1</li>
-                <li>升级element-ui到最新版本2.15.6</li>
-                <li>新增sendGet无参请求方法</li>
-                <li>禁用el-tag组件的渐变动画</li>
-                <li>代码生成点击预览重置激活tab</li>
-                <li>AjaxResult重写put方法,以方便链式调用</li>
-                <li>优化登录/验证码请求headers不设置token</li>
-                <li>优化用户个人信息接口防止修改用户名</li>
-                <li>优化Cron表达式生成器关闭时销毁避免缓存</li>
-                <li>优化注册成功提示消息类型success</li>
-                <li>优化aop语法,使用spring自动注入注解</li>
-                <li>优化记录登录信息,移除不必要的修改</li>
-                <li>优化mybatis全局默认的执行器</li>
-                <li>优化Excel导入图片可能出现的异常</li>
-                <li>修复代码生成模板主子表删除缺少事务</li>
-                <li>修复日志记录可能出现的转换异常</li>
-                <li>修复代码生成复选框字典遗漏问题</li>
-                <li>修复关闭xss功能导致可重复读RepeatableFilter失效</li>
-                <li>修复字符串无法被反转义问题</li>
-                <li>修复后端主子表代码模板方法名生成错误问题</li>
-                <li>修复xss过滤后格式出现的异常</li>
-                <li>修复swagger没有指定dataTypeClass导致启动出现warn日志</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.7.0 - 2021-09-13">
-              <ol>
-                <li>参数管理支持配置验证码开关</li>
-                <li>新增是否开启用户注册功能</li>
-                <li>定时任务支持在线生成cron表达式</li>
-                <li>菜单管理支持配置路由参数</li>
-                <li>支持自定义注解实现接口限流</li>
-                <li>Excel注解支持Image图片导入</li>
-                <li>自定义弹层溢出滚动样式</li>
-                <li>自定义可拖动弹窗宽度指令</li>
-                <li>自定义可拖动弹窗高度指令</li>
-                <li>修复任意账户越权问题</li>
-                <li>修改时检查用户数据权限范围</li>
-                <li>修复保存配置主题颜色失效问题</li>
-                <li>新增暗色菜单风格主题</li>
-                <li>菜单&部门新增展开/折叠功能</li>
-                <li>页签新增关闭左侧&添加图标</li>
-                <li>顶部菜单排除隐藏的默认路由</li>
-                <li>顶部菜单同步系统主题样式</li>
-                <li>跳转路由高亮相对应的菜单栏</li>
-                <li>代码生成主子表多选行数据</li>
-                <li>日期范围支持添加多组</li>
-                <li>升级element-ui到最新版本2.15.5</li>
-                <li>升级oshi到最新版本v5.8.0</li>
-                <li>升级commons.io到最新版本v2.11.0</li>
-                <li>定时任务屏蔽ldap远程调用</li>
-                <li>定时任务屏蔽http(s)远程调用</li>
-                <li>补充定时任务表字段注释</li>
-                <li>定时任务对检查异常进行事务回滚</li>
-                <li>启用父部门状态排除顶级节点</li>
-                <li>富文本新增上传文件大小限制</li>
-                <li>默认首页使用keep-alive缓存</li>
-                <li>修改代码生成字典回显样式</li>
-                <li>自定义分页合理化传入参数</li>
-                <li>修复字典组件值为整形不显示问题</li>
-                <li>修复定时任务日志执行状态显示</li>
-                <li>角色&菜单新增字段属性提示信息</li>
-                <li>修复角色分配用户页面参数类型错误提醒</li>
-                <li>优化布局设置动画特效</li>
-                <li>优化异常处理信息</li>
-                <li>优化错误token导致的解析异常</li>
-                <li>密码框新增显示切换密码图标</li>
-                <li>定时任务新增更多操作</li>
-                <li>更多操作按钮添加权限控制</li>
-                <li>导入用户样式优化</li>
-                <li>提取通用方法到基类控制器</li>
-                <li>优化使用权限工具获取用户信息</li>
-                <li>优化用户不能删除自己</li>
-                <li>优化XSS跨站脚本过滤</li>
-                <li>优化代码生成模板</li>
-                <li>验证码默认20s超时</li>
-                <li>BLOB下载时清除URL对象引用</li>
-                <li>代码生成导入表按创建时间排序</li>
-                <li>修复代码生成页面数据编辑保存之后总是跳转第一页的问题</li>
-                <li>修复带safari浏览器无法格式化utc日期格式yyyy-MM-dd'T'HH:mm:ss.SSS问题</li>
-                <li>多图上传组件移除多余的api地址&验证失败导致图片删除问题&无法删除相应图片修复</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.6.0 - 2021-07-12">
-              <ol>
-                <li>角色管理新增分配用户功能</li>
-                <li>用户管理新增分配角色功能</li>
-                <li>日志列表支持排序操作</li>
-                <li>优化参数&字典缓存操作</li>
-                <li>系统布局配置支持动态标题开关</li>
-                <li>菜单路由配置支持内链访问</li>
-                <li>默认访问后端首页新增提示语</li>
-                <li>富文本默认上传返回url类型</li>
-                <li>新增自定义弹窗拖拽指令</li>
-                <li>全局注册常用通用组件</li>
-                <li>全局挂载字典标签组件</li>
-                <li>ImageUpload组件支持多图片上传</li>
-                <li>FileUpload组件支持多文件上传</li>
-                <li>文件上传组件添加数量限制属性</li>
-                <li>富文本编辑组件添加类型属性</li>
-                <li>富文本组件工具栏配置视频</li>
-                <li>封装通用iframe组件</li>
-                <li>限制超级管理员不允许操作</li>
-                <li>用户信息长度校验限制</li>
-                <li>分页组件新增pagerCount属性</li>
-                <li>添加bat脚本执行应用</li>
-                <li>升级oshi到最新版本v5.7.4</li>
-                <li>升级element-ui到最新版本2.15.2</li>
-                <li>升级pagehelper到最新版1.3.1</li>
-                <li>升级commons.io到最新版本v2.10.0</li>
-                <li>升级commons.fileupload到最新版本v1.4</li>
-                <li>升级swagger到最新版本v3.0.0</li>
-                <li>修复关闭confirm提示框控制台报错问题</li>
-                <li>修复存在的SQL注入漏洞问题</li>
-                <li>定时任务屏蔽rmi远程调用</li>
-                <li>修复用户搜索分页变量错误</li>
-                <li>修复导出角色数据范围翻译缺少仅本人</li>
-                <li>修复表单构建选择下拉选择控制台报错问题</li>
-                <li>优化图片工具类读取文件</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.5.0 - 2021-05-25">
-              <ol>
-                <li>新增菜单导航显示风格TopNav(false为左侧导航菜单,true为顶部导航菜单)</li>
-                <li>布局设置支持保存&重置配置</li>
-                <li>修复树表数据显示不全&加载慢问题</li>
-                <li>新增IE浏览器版本过低提示页面</li>
-                <li>用户登录后记录最后登录IP&时间</li>
-                <li>页面导出按钮点击之后添加遮罩</li>
-                <li>富文本编辑器支持自定义上传地址</li>
-                <li>富文本编辑组件新增readOnly属性</li>
-                <li>页签TagsView新增关闭右侧功能</li>
-                <li>显隐列组件加载初始默认隐藏列</li>
-                <li>关闭头像上传窗口还原默认图片</li>
-                <li>个人信息添加手机&邮箱重复验证</li>
-                <li>代码生成模板导出按钮点击后添加遮罩</li>
-                <li>代码生成模板树表操作列添加新增按钮</li>
-                <li>代码生成模板修复主子表字段重名问题</li>
-                <li>升级fastjson到最新版1.2.76</li>
-                <li>升级druid到最新版本v1.2.6</li>
-                <li>升级mybatis到最新版3.5.6 阻止远程代码执行漏洞</li>
-                <li>升级oshi到最新版本v5.6.0</li>
-                <li>velocity剔除commons-collections版本,防止3.2.1版本的反序列化漏洞</li>
-                <li>数据监控页默认账户密码防止越权访问</li>
-                <li>修复firefox下表单构建拖拽会新打卡一个选项卡</li>
-                <li>修正后端导入表权限标识</li>
-                <li>修正前端操作日志&登录日志权限标识</li>
-                <li>设置Redis配置HashKey序列化</li>
-                <li>删除操作日志记录信息</li>
-                <li>上传媒体类型添加视频格式</li>
-                <li>修复请求形参未传值记录日志异常问题</li>
-                <li>优化xss校验json请求条件</li>
-                <li>树级结构更新子节点使用replaceFirst</li>
-                <li>优化ExcelUtil空值处理</li>
-                <li>日志记录过滤BindingResult对象,防止异常</li>
-                <li>修改主题后mini类型按钮无效问题</li>
-                <li>优化通用下载完成后删除节点</li>
-                <li>通用Controller添加响应返回消息</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.4.0 - 2021-02-22">
-              <ol>
-                <li>代码生成模板支持主子表</li>
-                <li>表格右侧工具栏组件支持显隐列</li>
-                <li>图片组件添加预览&移除功能</li>
-                <li>Excel注解支持Image图片导出</li>
-                <li>操作按钮组调整为朴素按钮样式</li>
-                <li>代码生成支持文件上传组件</li>
-                <li>代码生成日期控件区分范围</li>
-                <li>代码生成数据库文本类型生成表单文本域</li>
-                <li>用户手机邮箱&菜单组件修改允许空字符串</li>
-                <li>升级SpringBoot到最新版本2.2.13 提升启动速度</li>
-                <li>升级druid到最新版本v1.2.4</li>
-                <li>升级fastjson到最新版1.2.75</li>
-                <li>升级element-ui到最新版本2.15.0</li>
-                <li>修复IE11浏览器报错问题</li>
-                <li>优化多级菜单之间切换无法缓存的问题</li>
-                <li>修复四级菜单无法显示问题</li>
-                <li>修正侧边栏静态路由丢失问题</li>
-                <li>修复角色管理-编辑角色-功能权限显示异常</li>
-                <li>配置文件新增redis数据库索引属性</li>
-                <li>权限工具类增加admin判断</li>
-                <li>角色非自定义权限范围清空选择值</li>
-                <li>修复导入数据为负浮点数时丢失精度问题</li>
-                <li>移除path-to-regexp正则匹配插件</li>
-                <li>修复生成树表代码异常</li>
-                <li>修改ip字段长度防止ipv6地址长度不够</li>
-                <li>防止get请求参数值为false或0等特殊值会导致无法正确的传参</li>
-                <li>登录后push添加catch防止出现检查错误</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.3.0 - 2020-12-14">
-              <ol>
-                <li>新增缓存监控功能</li>
-                <li>支持主题风格配置</li>
-                <li>修复多级菜单之间切换无法缓存的问题</li>
-                <li>多级菜单自动配置组件</li>
-                <li>代码生成预览支持高亮显示</li>
-                <li>支持Get请求映射Params参数</li>
-                <li>删除用户和角色解绑关联</li>
-                <li>去除用户手机邮箱部门必填验证</li>
-                <li>Excel支持注解align对齐方式</li>
-                <li>Excel支持导入Boolean型数据</li>
-                <li>优化头像样式,鼠标移入悬停遮罩</li>
-                <li>代码生成预览提供滚动机制</li>
-                <li>代码生成删除多余的数字float类型</li>
-                <li>修正转换字符串的目标字符集属性</li>
-                <li>回显数据字典防止空值报错</li>
-                <li>日志记录增加过滤多文件场景</li>
-                <li>修改缓存Set方法可能导致嵌套的问题</li>
-                <li>移除前端一些多余的依赖</li>
-                <li>防止安全扫描YUI出现的风险提示</li>
-                <li>修改node-sass为dart-sass</li>
-                <li>升级SpringBoot到最新版本2.1.18</li>
-                <li>升级poi到最新版本4.1.2</li>
-                <li>升级oshi到最新版本v5.3.6</li>
-                <li>升级bitwalker到最新版本1.21</li>
-                <li>升级axios到最新版本0.21.0</li>
-                <li>升级element-ui到最新版本2.14.1</li>
-                <li>升级vue到最新版本2.6.12</li>
-                <li>升级vuex到最新版本3.6.0</li>
-                <li>升级vue-cli到版本4.5.9</li>
-                <li>升级vue-router到最新版本3.4.9</li>
-                <li>升级vue-cli到最新版本4.4.6</li>
-                <li>升级vue-cropper到最新版本0.5.5</li>
-                <li>升级clipboard到最新版本2.0.6</li>
-                <li>升级core-js到最新版本3.8.1</li>
-                <li>升级echarts到最新版本4.9.0</li>
-                <li>升级file-saver到最新版本2.0.4</li>
-                <li>升级fuse.js到最新版本6.4.3</li>
-                <li>升级js-beautify到最新版本1.13.0</li>
-                <li>升级js-cookie到最新版本2.2.1</li>
-                <li>升级path-to-regexp到最新版本6.2.0</li>
-                <li>升级quill到最新版本1.3.7</li>
-                <li>升级screenfull到最新版本5.0.2</li>
-                <li>升级sortablejs到最新版本1.10.2</li>
-                <li>升级vuedraggable到最新版本2.24.3</li>
-                <li>升级chalk到最新版本4.1.0</li>
-                <li>升级eslint到最新版本7.15.0</li>
-                <li>升级eslint-plugin-vue到最新版本7.2.0</li>
-                <li>升级lint-staged到最新版本10.5.3</li>
-                <li>升级runjs到最新版本4.4.2</li>
-                <li>升级sass-loader到最新版本10.1.0</li>
-                <li>升级script-ext-html-webpack-plugin到最新版本2.1.5</li>
-                <li>升级svg-sprite-loader到最新版本5.1.1</li>
-                <li>升级vue-template-compiler到最新版本2.6.12</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.2.1 - 2020-11-18">
-              <ol>
-                <li>阻止任意文件下载漏洞</li>
-                <li>代码生成支持上传控件</li>
-                <li>新增图片上传组件</li>
-                <li>调整默认首页</li>
-                <li>升级druid到最新版本v1.2.2</li>
-                <li>mapperLocations配置支持分隔符</li>
-                <li>权限信息调整</li>
-                <li>调整sql默认时间</li>
-                <li>解决代码生成没有bit类型的问题</li>
-                <li>升级pagehelper到最新版1.3.0</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.2.0 - 2020-10-10">
-              <ol>
-                <li>升级springboot版本到2.1.17 提升安全性</li>
-                <li>升级oshi到最新版本v5.2.5</li>
-                <li>升级druid到最新版本v1.2.1</li>
-                <li>升级jjwt到版本0.9.1</li>
-                <li>升级fastjson到最新版1.2.74</li>
-                <li>修改sass为node-sass,避免el-icon图标乱码</li>
-                <li>代码生成支持同步数据库</li>
-                <li>代码生成支持富文本控件</li>
-                <li>代码生成页面时不忽略remark属性</li>
-                <li>代码生成添加select必填选项</li>
-                <li>Excel导出类型NUMERIC支持精度浮点类型</li>
-                <li>Excel导出targetAttr优化获取值,防止get方法不规范</li>
-                <li>Excel注解支持自动统计数据总和</li>
-                <li>Excel注解支持设置BigDecimal精度&舍入规则</li>
-                <li>菜单&数据权限新增(展开/折叠 全选/全不选 父子联动)</li>
-                <li>允许用户分配到部门父节点</li>
-                <li>菜单新增是否缓存keep-alive</li>
-                <li>表格操作列间距调整</li>
-                <li>限制系统内置参数不允许删除</li>
-                <li>富文本组件优化,支持自定义高度&图片冲突问题</li>
-                <li>富文本工具栏样式对齐</li>
-                <li>导入excel整形值校验优化</li>
-                <li>修复页签关闭所有时固定标签路由不刷新问题</li>
-                <li>表单构建布局型组件新增按钮</li>
-                <li>左侧菜单文字过长显示省略号</li>
-                <li>修正根节点为子部门时,树状结构显示问题</li>
-                <li>修正调用目标字符串最大长度</li>
-                <li>修正菜单提示信息错误</li>
-                <li>修正定时任务执行一次权限标识</li>
-                <li>修正数据库字符串类型nvarchar</li>
-                <li>优化递归子节点</li>
-                <li>优化数据权限判断</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v3.1.0 - 2020-08-13">
-              <ol>
-                <li>表格工具栏右侧添加刷新&显隐查询组件</li>
-                <li>后端支持CORS跨域请求</li>
-                <li>代码生成支持选择上级菜单</li>
-                <li>代码生成支持自定义路径</li>
-                <li>代码生成支持复选框</li>
-                <li>Excel导出导入支持dictType字典类型</li>
-                <li>Excel支持分割字符串组内容</li>
-                <li>验证码类型支持(数组计算、字符验证)</li>
-                <li>升级vue-cli版本到4.4.4</li>
-                <li>修改 node-sass 为 dart-sass</li>
-                <li>表单类型为Integer/Long设置整形默认值</li>
-                <li>代码生成器默认mapper路径与默认mapperScan路径不一致</li>
-                <li>优化防重复提交拦截器</li>
-                <li>优化上级菜单不能选择自己</li>
-                <li>修复角色的权限分配后,未实时生效问题</li>
-                <li>修复在线用户日志记录类型</li>
-                <li>修复富文本空格和缩进保存后不生效问题</li>
-                <li>修复在线用户判断逻辑</li>
-                <li>唯一限制条件只返回单条数据</li>
-                <li>添加获取当前的环境配置方法</li>
-                <li>超时登录后页面跳转到首页</li>
-                <li>全局异常状态汉化拦截处理</li>
-                <li>HTML过滤器改为将html转义</li>
-                <li>检查字符支持小数点&降级改成异常提醒</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v3.0.0 - 2020-07-20">
-              <ol>
-                <li>单应用调整为多模块项目</li>
-                <li>升级element-ui版本到2.13.2</li>
-                <li>删除babel,提高编译速度。</li>
-                <li>新增菜单默认主类目</li>
-                <li>编码文件名修改为uuid方式</li>
-                <li>定时任务cron表达式验证</li>
-                <li>角色权限修改时已有权限未自动勾选异常修复</li>
-                <li>防止切换权限用户后登录出现404</li>
-                <li>Excel支持sort导出排序</li>
-                <li>创建用户不允许选择超级管理员角色</li>
-                <li>修复代码生成导入表结构出现异常页面不提醒问题</li>
-                <li>修复代码生成点击多次表修改数据不变化的问题</li>
-                <li>修复头像上传成功二次打开无法改变裁剪框大小和位置问题</li>
-                <li>修复布局为small者mini用户表单显示错位问题</li>
-                <li>修复热部署导致的强换异常问题</li>
-                <li>修改用户管理复选框宽度,防止部分浏览器出现省略号</li>
-                <li>IpUtils工具,清除Xss特殊字符,防止Xff注入攻击</li>
-                <li>生成domain 如果是浮点型 统一用BigDecimal</li>
-                <li>定时任务调整label-width,防止部署出现错位</li>
-                <li>调整表头固定列默认样式</li>
-                <li>代码生成模板调整,字段为String并且必填则加空串条件</li>
-                <li>代码生成字典Integer/Long使用parseInt</li>
-                <li>
-                  修复dict_sort不可update为0的问题&查询返回增加dict_sort升序排序
-                </li>
-                <li>修正岗位导出权限注解</li>
-                <li>禁止加密密文返回前端</li>
-                <li>修复代码生成页面中的查询条件创建时间未生效的问题</li>
-                <li>修复首页搜索菜单外链无法点击跳转问题</li>
-                <li>修复菜单管理选择图标,backspace删除时不过滤数据</li>
-                <li>用户管理部门分支节点不可检查&显示计数</li>
-                <li>数据范围过滤属性调整</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v2.3.0 - 2020-06-01">
-              <ol>
-                <li>升级fastjson到最新版1.2.70 修复高危安全漏洞</li>
-                <li>dev启动默认打开浏览器</li>
-                <li>vue-cli使用默认source-map</li>
-                <li>slidebar eslint报错优化</li>
-                <li>当tags-view滚动关闭右键菜单</li>
-                <li>字典管理添加缓存读取</li>
-                <li>参数管理支持缓存操作</li>
-                <li>支持一级菜单(和主页同级)在main区域显示</li>
-                <li>限制外链地址必须以http(s)开头</li>
-                <li>tagview & sidebar 主题颜色与element ui(全局)同步</li>
-                <li>修改数据源类型优先级,先根据方法,再根据类</li>
-                <li>支持是否需要设置token属性,自定义返回码消息。</li>
-                <li>swagger请求前缀加入配置。</li>
-                <li>登录地点设置内容过长则隐藏显示</li>
-                <li>修复定时任务执行一次按钮后不提示消息问题</li>
-                <li>修改上级部门(选择项排除本身和下级)</li>
-                <li>通用http发送方法增加参数 contentType 编码类型</li>
-                <li>更换IP地址查询接口</li>
-                <li>修复页签变量undefined</li>
-                <li>添加校验部门包含未停用的子部门</li>
-                <li>修改定时任务详情下次执行时间日期显示错误</li>
-                <li>角色管理查询设置默认排序字段</li>
-                <li>swagger添加enable参数控制是否启用</li>
-                <li>只对json类型请求构建可重复读取inputStream的request</li>
-                <li>修改代码生成字典字段int类型没有自动选中问题</li>
-                <li>vuex用户名取值修正</li>
-                <li>表格树模板去掉多余的)</li>
-                <li>代码生成序号修正</li>
-                <li>全屏情况下不调整上外边距</li>
-                <li>代码生成Date字段添加默认格式</li>
-                <li>用户管理角色选择权限控制</li>
-                <li>修复路由懒加载报错问题</li>
-                <li>模板sql.vm添加菜单状态</li>
-                <li>设置用户名称不能修改</li>
-                <li>dialog添加append-to-body属性,防止ie遮罩</li>
-                <li>菜单区分状态和显示隐藏功能</li>
-                <li>升级fastjson到最新版1.2.68 修复安全加固</li>
-                <li>修复代码生成如果选择字典类型缺失逗号问题</li>
-                <li>登录请求params更换为data,防止暴露url</li>
-                <li>日志返回时间格式处理</li>
-                <li>添加handle控制允许拖动的元素</li>
-                <li>布局设置点击扩大范围</li>
-                <li>代码生成列属性排序查询</li>
-                <li>代码生成列支持拖动排序</li>
-                <li>修复时间格式不支持ios问题</li>
-                <li>表单构建添加父级class,防止冲突</li>
-                <li>定时任务并发属性修正</li>
-                <li>角色禁用&菜单隐藏不查询权限</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v2.2.0 - 2020-03-18">
-              <ol>
-                <li>系统监控新增定时任务功能</li>
-                <li>添加一个打包Web工程bat</li>
-                <li>修复页签鼠标滚轮按下的时候,可以关闭不可关闭的tag</li>
-                <li>修复点击退出登录有时会无提示问题</li>
-                <li>修复防重复提交注解无效问题</li>
-                <li>修复通知公告批量删除异常问题</li>
-                <li>添加菜单时路由地址必填限制</li>
-                <li>代码生成字段描述可编辑</li>
-                <li>修复用户修改个人信息导致缓存不过期问题</li>
-                <li>个人信息创建时间获取正确属性值</li>
-                <li>操作日志详细显示正确类型</li>
-                <li>导入表单击行数据时选中对应的复选框</li>
-                <li>批量替换表前缀逻辑调整</li>
-                <li>固定重定向路径表达式</li>
-                <li>升级element-ui版本到2.13.0</li>
-                <li>操作日志排序调整</li>
-                <li>修复charts切换侧边栏或者缩放窗口显示bug</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v2.1.0 - 2020-02-24">
-              <ol>
-                <li>新增表单构建</li>
-                <li>代码生成支持树表结构</li>
-                <li>新增用户导入</li>
-                <li>修复动态加载路由页面刷新问题</li>
-                <li>修复地址开关无效问题</li>
-                <li>汉化错误提示页面</li>
-                <li>代码生成已知问题修改</li>
-                <li>修复多数据源下配置关闭出现异常处理</li>
-                <li>添加HTML过滤器,用于去除XSS漏洞隐患</li>
-                <li>修复上传头像控制台出现异常</li>
-                <li>修改用户管理分页不正确的问题</li>
-                <li>修复验证码记录提示错误</li>
-                <li>修复request.js缺少Message引用</li>
-                <li>修复表格时间为空出现的异常</li>
-                <li>添加Jackson日期反序列化时区配置</li>
-                <li>调整根据用户权限加载菜单数据树形结构</li>
-                <li>调整成功登录不恢复按钮,防止多次点击</li>
-                <li>修改用户个人资料同步缓存信息</li>
-                <li>修复页面同时出现el-upload和Editor不显示处理</li>
-                <li>修复在角色管理页修改菜单权限偶尔未选中问题</li>
-                <li>配置文件新增redis密码属性</li>
-                <li>设置mybatis全局的配置文件</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v2.0.0 - 2019-12-02">
-              <ol>
-                <li>新增代码生成</li>
-                <li>新增@RepeatSubmit注解,防止重复提交</li>
-                <li>新增菜单主目录添加/删除操作</li>
-                <li>日志记录过滤特殊对象,防止转换异常</li>
-                <li>修改代码生成路由脚本错误</li>
-                <li>用户上传头像实时同步缓存,无需重新登录</li>
-                <li>调整切换页签后不重新加载数据</li>
-                <li>添加jsencrypt实现参数的前端加密</li>
-                <li>系统退出删除用户缓存记录</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v1.1.0 - 2019-11-11">
-              <ol>
-                <li>新增在线用户管理</li>
-                <li>新增按钮组功能实现(批量删除、导出、清空)</li>
-                <li>新增查询条件重置按钮</li>
-                <li>新增Swagger全局Token配置</li>
-                <li>新增后端参数校验</li>
-                <li>修复字典管理页面的日期查询异常</li>
-                <li>修改时间函数命名防止冲突</li>
-                <li>去除菜单上级校验,默认为顶级</li>
-                <li>修复用户密码无法修改问题</li>
-                <li>修复菜单类型为按钮时不显示权限标识</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v1.0.0 - 2019-10-08">
-              <ol>
-                <li>若依前后端分离系统正式发布</li>
-              </ol>
-            </el-collapse-item>
-          </el-collapse>
-        </el-card>
-      </el-col>
-      <el-col :xs="24" :sm="24" :md="12" :lg="8">
-        <el-card class="update-log">
-          <div slot="header" class="clearfix">
-            <span>捐赠支持</span>
-          </div>
-          <div class="body">
-            <img
-              src="@/assets/images/pay.png"
-              alt="donate"
-              width="100%"
-            />
-            <span style="display: inline-block; height: 30px; line-height: 30px"
-              >你可以请作者喝杯咖啡表示鼓励</span
-            >
-          </div>
-        </el-card>
-      </el-col>
-    </el-row>
   </div>
 </template>
 

+ 2 - 2
game-ui/src/views/login.vue

@@ -72,8 +72,8 @@ export default {
     return {
       codeUrl: "",
       loginForm: {
-        username: "admin",
-        password: "admin123",
+        username: "",//admin
+        password: "",//admin123
         rememberMe: false,
         code: "",
         uuid: ""