“LosinoLoveJava 4 hafta önce
ebeveyn
işleme
6580886b00
65 değiştirilmiş dosya ile 7899 ekleme ve 2032 silme
  1. 0 1
      .github/FUNDING.yml
  2. BIN
      doc/若依环境使用手册.docx
  3. 98 0
      ruoyi-admin/src/main/java/com/ruoyi/system/controller/DbUsersController.java
  4. 245 0
      ruoyi-admin/src/main/java/com/ruoyi/system/controller/MHDController.java
  5. 98 0
      ruoyi-admin/src/main/java/com/ruoyi/system/controller/SysXPoolController.java
  6. 99 0
      ruoyi-admin/src/main/java/com/ruoyi/system/controller/SysXPoolCountController.java
  7. 98 0
      ruoyi-admin/src/main/java/com/ruoyi/system/controller/SysXPrizesController.java
  8. 98 0
      ruoyi-admin/src/main/java/com/ruoyi/system/controller/SysXPrizesPackageController.java
  9. 98 0
      ruoyi-admin/src/main/java/com/ruoyi/system/controller/SysXProbabilitiesController.java
  10. 172 0
      ruoyi-admin/src/main/java/com/ruoyi/system/controller/WechatController.java
  11. 319 0
      ruoyi-admin/src/main/java/com/ruoyi/system/domain/DbUsers.java
  12. 142 0
      ruoyi-admin/src/main/java/com/ruoyi/system/domain/MHDPool.java
  13. 156 0
      ruoyi-admin/src/main/java/com/ruoyi/system/domain/SysXPool.java
  14. 121 0
      ruoyi-admin/src/main/java/com/ruoyi/system/domain/SysXPoolCount.java
  15. 121 0
      ruoyi-admin/src/main/java/com/ruoyi/system/domain/SysXPrizes.java
  16. 168 0
      ruoyi-admin/src/main/java/com/ruoyi/system/domain/SysXPrizesPackage.java
  17. 104 0
      ruoyi-admin/src/main/java/com/ruoyi/system/domain/SysXProbabilities.java
  18. 61 0
      ruoyi-admin/src/main/java/com/ruoyi/system/mapper/DbUsersMapper.java
  19. 61 0
      ruoyi-admin/src/main/java/com/ruoyi/system/mapper/SysXPoolCountMapper.java
  20. 61 0
      ruoyi-admin/src/main/java/com/ruoyi/system/mapper/SysXPoolMapper.java
  21. 61 0
      ruoyi-admin/src/main/java/com/ruoyi/system/mapper/SysXPrizesMapper.java
  22. 61 0
      ruoyi-admin/src/main/java/com/ruoyi/system/mapper/SysXPrizesPackageMapper.java
  23. 61 0
      ruoyi-admin/src/main/java/com/ruoyi/system/mapper/SysXProbabilitiesMapper.java
  24. 61 0
      ruoyi-admin/src/main/java/com/ruoyi/system/service/IDbUsersService.java
  25. 61 0
      ruoyi-admin/src/main/java/com/ruoyi/system/service/ISysXPoolCountService.java
  26. 61 0
      ruoyi-admin/src/main/java/com/ruoyi/system/service/ISysXPoolService.java
  27. 61 0
      ruoyi-admin/src/main/java/com/ruoyi/system/service/ISysXPrizesPackageService.java
  28. 61 0
      ruoyi-admin/src/main/java/com/ruoyi/system/service/ISysXPrizesService.java
  29. 61 0
      ruoyi-admin/src/main/java/com/ruoyi/system/service/ISysXProbabilitiesService.java
  30. 93 0
      ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/DbUsersServiceImpl.java
  31. 93 0
      ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/SysXPoolCountServiceImpl.java
  32. 108 0
      ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/SysXPoolServiceImpl.java
  33. 95 0
      ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/SysXPrizesPackageServiceImpl.java
  34. 93 0
      ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/SysXPrizesServiceImpl.java
  35. 93 0
      ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/SysXProbabilitiesServiceImpl.java
  36. 10 10
      ruoyi-admin/src/main/resources/application-druid.yml
  37. 11 0
      ruoyi-admin/src/main/resources/application.yml
  38. 153 0
      ruoyi-admin/src/main/resources/mapper/system/DbUsersMapper.xml
  39. 81 0
      ruoyi-admin/src/main/resources/mapper/system/SysXPoolCountMapper.xml
  40. 91 0
      ruoyi-admin/src/main/resources/mapper/system/SysXPoolMapper.xml
  41. 81 0
      ruoyi-admin/src/main/resources/mapper/system/SysXPrizesMapper.xml
  42. 105 0
      ruoyi-admin/src/main/resources/mapper/system/SysXPrizesPackageMapper.xml
  43. 71 0
      ruoyi-admin/src/main/resources/mapper/system/SysXProbabilitiesMapper.xml
  44. 4 3
      ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
  45. 11 11
      ruoyi-ui/.env.development
  46. 8 8
      ruoyi-ui/.env.production
  47. 12 12
      ruoyi-ui/.env.staging
  48. 93 91
      ruoyi-ui/package.json
  49. 44 0
      ruoyi-ui/src/api/system/count.js
  50. 44 0
      ruoyi-ui/src/api/system/package.js
  51. 44 0
      ruoyi-ui/src/api/system/pool.js
  52. 44 0
      ruoyi-ui/src/api/system/prizes.js
  53. 44 0
      ruoyi-ui/src/api/system/probabilities.js
  54. 44 0
      ruoyi-ui/src/api/system/users.js
  55. 193 200
      ruoyi-ui/src/layout/components/Navbar.vue
  56. 23 1136
      ruoyi-ui/src/views/index.vue
  57. 219 219
      ruoyi-ui/src/views/login.vue
  58. 210 210
      ruoyi-ui/src/views/register.vue
  59. 316 0
      ruoyi-ui/src/views/system/count/index.vue
  60. 537 0
      ruoyi-ui/src/views/system/package/index.vue
  61. 497 0
      ruoyi-ui/src/views/system/pool/index.vue
  62. 438 0
      ruoyi-ui/src/views/system/prizes/index.vue
  63. 434 0
      ruoyi-ui/src/views/system/probabilities/index.vue
  64. 462 0
      ruoyi-ui/src/views/system/users/index.vue
  65. 131 131
      ruoyi-ui/vue.config.js

+ 0 - 1
.github/FUNDING.yml

@@ -1 +0,0 @@
-custom: http://doc.ruoyi.vip/ruoyi-vue/other/donate.html

BIN
doc/若依环境使用手册.docx


+ 98 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/controller/DbUsersController.java

@@ -0,0 +1,98 @@
+package com.ruoyi.system.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.DbUsers;
+import com.ruoyi.system.service.IDbUsersService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 【请填写功能名称】Controller
+ *
+ * @author ruoyi
+ * @date 2025-07-19
+ */
+@RestController
+@RequestMapping("/system/users")
+public class DbUsersController extends BaseController
+{
+    @Autowired
+    private IDbUsersService dbUsersService;
+
+    /**
+     * 查询【请填写功能名称】列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(DbUsers dbUsers)
+    {
+        startPage();
+        List<DbUsers> list = dbUsersService.selectDbUsersList(dbUsers);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出【请填写功能名称】列表
+     */
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, DbUsers dbUsers)
+    {
+        List<DbUsers> list = dbUsersService.selectDbUsersList(dbUsers);
+        ExcelUtil<DbUsers> util = new ExcelUtil<DbUsers>(DbUsers.class);
+        util.exportExcel(response, list, "【请填写功能名称】数据");
+    }
+
+    /**
+     * 获取【请填写功能名称】详细信息
+     */
+    @GetMapping(value = "/{SteamID}")
+    public AjaxResult getInfo(@PathVariable("SteamID") String steamId)
+    {
+        return success(dbUsersService.selectDbUsersBySteamID(steamId));
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     */
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody DbUsers dbUsers)
+    {
+        return toAjax(dbUsersService.insertDbUsers(dbUsers));
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     */
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody DbUsers dbUsers)
+    {
+        return toAjax(dbUsersService.updateDbUsers(dbUsers));
+    }
+
+    /**
+     * 删除【请填写功能名称】
+     */
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{SteamIDs}")
+    public AjaxResult remove(@PathVariable Long[] SteamIDs)
+    {
+        return toAjax(dbUsersService.deleteDbUsersBySteamIDs(SteamIDs));
+    }
+}

+ 245 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/controller/MHDController.java

@@ -0,0 +1,245 @@
+package com.ruoyi.system.controller;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.domain.*;
+import com.ruoyi.system.service.*;
+import io.swagger.models.auth.In;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.beans.Transient;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * @author Losino
+ * @version 1.0
+ */
+@RestController
+@RequestMapping("/MHD")
+public class MHDController {
+
+    @Resource
+    private ISysXPoolService poolService;
+
+    @Resource
+    private ISysXPrizesService prizesService;
+
+    @Resource
+    private ISysXProbabilitiesService probabilitiesService;
+
+    @Resource
+    private IDbUsersService usersService;
+
+    @Resource
+    private ISysXPoolCountService countService;
+
+    @Resource
+    private ISysXPrizesPackageService packageService;
+
+    /**
+     * 返回用户中奖背包
+     * @param steamId
+     * @return
+     */
+    @RequestMapping("/getPackage")
+    public R getPackage(@RequestParam(name = "steamId", required = false) String steamId) {
+        List<SysXPrizesPackage> packages = packageService.selectSysXPrizesPackageList(new SysXPrizesPackage()).stream().filter(res -> res.getSteamId().equals(steamId)).collect(Collectors.toList());
+
+        return R.ok(packages);
+    }
+
+    /**
+     * 抽奖
+     *
+     * @param steamId
+     * @param poolId
+     * @return
+     */
+    @RequestMapping("/startPrize")
+    @Transient
+    public R startPrize(@RequestParam(name = "steamId", required = false) String steamId,
+                        @RequestParam(name = "id", required = false) Long poolId) {
+        // 获取抽奖次数
+        List<SysXPoolCount> poolCountList = countService.selectSysXPoolCountList(new SysXPoolCount()).stream().filter(res -> res.getSteamId().equals(steamId)).filter(res -> res.getPoolId().equals(poolId)).collect(Collectors.toList());
+        SysXPoolCount poolCount = null;
+        if (poolCountList.size() > 0) {
+            poolCount = poolCountList.get(0);
+        }
+
+        if (poolCount == null || !(poolCount.getCount() > 0)) {
+            return R.fail("后端校验抽奖次数不足,请重试");
+        }
+
+        // 获取卡池id对应概率
+        List<SysXProbabilities> filterProbabilitiesList = probabilitiesService
+                .selectSysXProbabilitiesList(new SysXProbabilities()).stream()
+                .filter(res -> res.getPoolId().equals(poolId)).collect(Collectors.toList());
+
+        // 获取获取卡池id对应奖池
+        List<SysXPrizes> prizeList = prizesService.selectSysXPrizesList(new SysXPrizes()).stream()
+                .filter(res -> res.getPoolId().equals(poolId)).collect(Collectors.toList());
+
+        // 计算每个级别的概率和奖品数量
+        Map<String, Integer> levelPrizeCountMap = prizeList.stream()
+                .collect(Collectors.toMap(SysXPrizes::getQuality, prize -> 1, Integer::sum, LinkedHashMap::new));
+
+        // 过滤掉无奖品的级别,并计算每个级别的概率
+        Map<String, Long> levelProbabilityMap = new LinkedHashMap<>();
+        for (SysXProbabilities probabilities : filterProbabilitiesList) {
+            if (levelPrizeCountMap.containsKey(probabilities.getName())) {
+                levelProbabilityMap.put(probabilities.getName(),
+                        levelProbabilityMap.getOrDefault(probabilities.getName(), 0L) + probabilities.getValue());
+            }
+        }
+
+        // 根据级别概率和奖品数量进行抽奖
+        SysXPrizes drawnPrize = null;
+        Random rand = new Random();
+        List<String> levelList = new ArrayList<>();
+        for (Map.Entry<String, Long> entry : levelProbabilityMap.entrySet()) {
+            for (int i = 0; i < entry.getValue(); i++) {
+                levelList.add(entry.getKey());
+            }
+        }
+        Collections.shuffle(levelList);
+        String selectedLevel = levelList.get(rand.nextInt(levelList.size()));
+        // 根据级别随机选择一个奖品
+        List<SysXPrizes> levelPrizes = prizeList.stream()
+                .filter(prize -> prize.getQuality().equals(selectedLevel))
+                .collect(Collectors.toList());
+        if (!levelPrizes.isEmpty()) {
+            drawnPrize = levelPrizes.get(rand.nextInt(levelPrizes.size()));
+        }
+
+        if (drawnPrize != null) {
+            // 存入背包
+            SysXPrizesPackage prizesPackage = new SysXPrizesPackage();
+
+            // 获取用户信息
+            DbUsers user = usersService.selectDbUsersBySteamID(steamId);
+            // 获取卡池信息
+            SysXPool pool = poolService.selectSysXPoolById(poolId);
+
+            prizesPackage.setSteamId(steamId);
+            prizesPackage.setZhanghao(user.getZhanghao());
+            prizesPackage.setSteamName(user.getSteamName());
+            prizesPackage.setPoolId(poolId);
+            prizesPackage.setPoolName(pool.getTitle());
+            prizesPackage.setPrizeId(drawnPrize.getId() + "");
+            prizesPackage.setPrizeName(drawnPrize.getName());
+            prizesPackage.setQuality(drawnPrize.getQuality());
+            prizesPackage.setCreateTime(new Date());
+            prizesPackage.setIsCheck(0L);
+
+            int pageRow = packageService.insertSysXPrizesPackage(prizesPackage);
+
+            // 抽中奖品后,减少一次该用户对应卡池的抽奖次数
+            if (pageRow > 0) {
+                poolCount.setCount(poolCount.getCount() - 1);
+                countService.updateSysXPoolCount(poolCount);
+            }
+
+
+            return R.ok(drawnPrize);
+        }
+        else {
+            return R.fail("未抽中任何奖品");
+        }
+    }
+
+    @RequestMapping("/login")
+    public R login(@RequestParam String username,
+                   @RequestParam String password) {
+        List<DbUsers> users = usersService.selectDbUsersList(new DbUsers());
+
+        for (DbUsers user : users) {
+            String zhanghao = user.getZhanghao();
+            String mima = user.getMima();
+
+            if (zhanghao == null || mima == null) {
+                continue;
+            }
+
+            if (zhanghao.equals(username)) {
+                if (mima.equals(password)) {
+                    return R.ok(user);
+                }
+                else {
+                    return R.fail("密码错误");
+                }
+            }
+        }
+
+        return R.fail("账号不存在");
+    }
+
+    /**
+     * 返回整理好卡池的结构
+     */
+    @RequestMapping("/list")
+    public R<List<MHDPool>> list(@RequestParam(value = "steamId", required = false) String steamId) {
+        List<SysXPool> sysXPools = poolService.selectSysXPoolList(new SysXPool());
+
+        List<SysXPrizes> sysXPrizes = prizesService.selectSysXPrizesList(new SysXPrizes());
+
+        List<SysXProbabilities> sysXProbabilities = probabilitiesService
+                .selectSysXProbabilitiesList(new SysXProbabilities());
+
+        List<MHDPool> mhdPools = new ArrayList<>();
+
+        // 将sysXPool的属性直接覆盖到mhdPool
+        for (SysXPool sysXPool : sysXPools) {
+            Long poolId = sysXPool.getId();
+
+            // 筛选奖池
+            List<SysXPrizes> filterSysXPrizes = sysXPrizes.stream().filter(res -> res.getPoolId().equals(poolId))
+                    .sorted((a, b) -> {
+                        String[] order = {"史诗", "稀有", "精良", "普通"};
+                        return order.length - 1 - order.length + Arrays.asList(order).indexOf(a.getQuality())
+                                - Arrays.asList(order).indexOf(b.getQuality());
+                    }).collect(Collectors.toList());
+
+            // 筛选概率
+            List<SysXProbabilities> filterSysXProbabilities = sysXProbabilities.stream()
+                    .filter(res -> res.getPoolId().equals(poolId)).collect(Collectors.toList());
+
+            MHDPool mhdPool = new MHDPool();
+            mhdPool.setId(poolId);
+            mhdPool.setTitle(sysXPool.getTitle());
+            mhdPool.setPrice(sysXPool.getPrice());
+            mhdPool.setDescription(sysXPool.getDescription());
+            mhdPool.setBorderColor(sysXPool.getBorderColor());
+            mhdPool.setBgColor(sysXPool.getBgColor());
+            mhdPool.setTextColor(sysXPool.getTextColor());
+            mhdPool.setFullDescription(sysXPool.getFullDescription());
+            mhdPool.setPrizes(filterSysXPrizes);
+            mhdPool.setProbabilities(filterSysXProbabilities);
+            mhdPool.setPoolCount(sysXPool.getCount());
+            mhdPool.setCount(0L);
+
+            // 加入用户剩余抽奖次数
+            if (steamId != null) {
+                List<SysXPoolCount> countList = countService.selectSysXPoolCountList(new SysXPoolCount())
+                        .stream()
+                        .filter(res -> res.getSteamId().equals(steamId))
+                        .filter(res -> res.getPoolId().equals(poolId))
+                        .collect(Collectors.toList());
+                if (countList.size() > 0) {
+                    mhdPool.setCount(countList.get(0).getCount());
+                }
+
+            }
+
+            mhdPools.add(mhdPool);
+        }
+
+        return R.ok(mhdPools);
+    }
+
+}

+ 98 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/controller/SysXPoolController.java

@@ -0,0 +1,98 @@
+package com.ruoyi.system.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.SysXPool;
+import com.ruoyi.system.service.ISysXPoolService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 卡池Controller
+ *
+ * @author ruoyi
+ * @date 2025-07-19
+ */
+@RestController
+@RequestMapping("/system/pool")
+public class SysXPoolController extends BaseController
+{
+    @Autowired
+    private ISysXPoolService sysXPoolService;
+
+    /**
+     * 查询卡池列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(SysXPool sysXPool)
+    {
+        startPage();
+        List<SysXPool> list = sysXPoolService.selectSysXPoolList(sysXPool);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出卡池列表
+     */
+    @Log(title = "卡池", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysXPool sysXPool)
+    {
+        List<SysXPool> list = sysXPoolService.selectSysXPoolList(sysXPool);
+        ExcelUtil<SysXPool> util = new ExcelUtil<SysXPool>(SysXPool.class);
+        util.exportExcel(response, list, "卡池数据");
+    }
+
+    /**
+     * 获取卡池详细信息
+     */
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(sysXPoolService.selectSysXPoolById(id));
+    }
+
+    /**
+     * 新增卡池
+     */
+    @Log(title = "卡池", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysXPool sysXPool)
+    {
+        return toAjax(sysXPoolService.insertSysXPool(sysXPool));
+    }
+
+    /**
+     * 修改卡池
+     */
+    @Log(title = "卡池", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysXPool sysXPool)
+    {
+        return toAjax(sysXPoolService.updateSysXPool(sysXPool));
+    }
+
+    /**
+     * 删除卡池
+     */
+    @Log(title = "卡池", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(sysXPoolService.deleteSysXPoolByIds(ids));
+    }
+}

+ 99 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/controller/SysXPoolCountController.java

@@ -0,0 +1,99 @@
+package com.ruoyi.system.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.SysXPoolCount;
+import com.ruoyi.system.service.ISysXPoolCountService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 抽奖次数Controller
+ *
+ * @author ruoyi
+ * @date 2025-07-22
+ */
+@RestController
+@RequestMapping("/system/count")
+public class SysXPoolCountController extends BaseController
+{
+    @Autowired
+    private ISysXPoolCountService sysXPoolCountService;
+
+
+    /**
+     * 查询抽奖次数列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(SysXPoolCount sysXPoolCount)
+    {
+        startPage();
+        List<SysXPoolCount> list = sysXPoolCountService.selectSysXPoolCountList(sysXPoolCount);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出抽奖次数列表
+     */
+    @Log(title = "抽奖次数", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysXPoolCount sysXPoolCount)
+    {
+        List<SysXPoolCount> list = sysXPoolCountService.selectSysXPoolCountList(sysXPoolCount);
+        ExcelUtil<SysXPoolCount> util = new ExcelUtil<SysXPoolCount>(SysXPoolCount.class);
+        util.exportExcel(response, list, "抽奖次数数据");
+    }
+
+    /**
+     * 获取抽奖次数详细信息
+     */
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(sysXPoolCountService.selectSysXPoolCountById(id));
+    }
+
+    /**
+     * 新增抽奖次数
+     */
+    @Log(title = "抽奖次数", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysXPoolCount sysXPoolCount)
+    {
+        return toAjax(sysXPoolCountService.insertSysXPoolCount(sysXPoolCount));
+    }
+
+    /**
+     * 修改抽奖次数
+     */
+    @Log(title = "抽奖次数", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysXPoolCount sysXPoolCount)
+    {
+        return toAjax(sysXPoolCountService.updateSysXPoolCount(sysXPoolCount));
+    }
+
+    /**
+     * 删除抽奖次数
+     */
+    @Log(title = "抽奖次数", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(sysXPoolCountService.deleteSysXPoolCountByIds(ids));
+    }
+}

+ 98 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/controller/SysXPrizesController.java

@@ -0,0 +1,98 @@
+package com.ruoyi.system.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.SysXPrizes;
+import com.ruoyi.system.service.ISysXPrizesService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 奖品池Controller
+ *
+ * @author ruoyi
+ * @date 2025-07-19
+ */
+@RestController
+@RequestMapping("/system/prizes")
+public class SysXPrizesController extends BaseController
+{
+    @Autowired
+    private ISysXPrizesService sysXPrizesService;
+
+    /**
+     * 查询奖品池列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(SysXPrizes sysXPrizes)
+    {
+        startPage();
+        List<SysXPrizes> list = sysXPrizesService.selectSysXPrizesList(sysXPrizes);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出奖品池列表
+     */
+    @Log(title = "奖品池", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysXPrizes sysXPrizes)
+    {
+        List<SysXPrizes> list = sysXPrizesService.selectSysXPrizesList(sysXPrizes);
+        ExcelUtil<SysXPrizes> util = new ExcelUtil<SysXPrizes>(SysXPrizes.class);
+        util.exportExcel(response, list, "奖品池数据");
+    }
+
+    /**
+     * 获取奖品池详细信息
+     */
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(sysXPrizesService.selectSysXPrizesById(id));
+    }
+
+    /**
+     * 新增奖品池
+     */
+    @Log(title = "奖品池", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysXPrizes sysXPrizes)
+    {
+        return toAjax(sysXPrizesService.insertSysXPrizes(sysXPrizes));
+    }
+
+    /**
+     * 修改奖品池
+     */
+    @Log(title = "奖品池", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysXPrizes sysXPrizes)
+    {
+        return toAjax(sysXPrizesService.updateSysXPrizes(sysXPrizes));
+    }
+
+    /**
+     * 删除奖品池
+     */
+    @Log(title = "奖品池", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(sysXPrizesService.deleteSysXPrizesByIds(ids));
+    }
+}

+ 98 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/controller/SysXPrizesPackageController.java

@@ -0,0 +1,98 @@
+package com.ruoyi.system.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.SysXPrizesPackage;
+import com.ruoyi.system.service.ISysXPrizesPackageService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 奖品背包Controller
+ *
+ * @author ruoyi
+ * @date 2025-07-22
+ */
+@RestController
+@RequestMapping("/system/package")
+public class SysXPrizesPackageController extends BaseController
+{
+    @Autowired
+    private ISysXPrizesPackageService sysXPrizesPackageService;
+
+    /**
+     * 查询奖品背包列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(SysXPrizesPackage sysXPrizesPackage)
+    {
+        startPage();
+        List<SysXPrizesPackage> list = sysXPrizesPackageService.selectSysXPrizesPackageList(sysXPrizesPackage);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出奖品背包列表
+     */
+    @Log(title = "奖品背包", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysXPrizesPackage sysXPrizesPackage)
+    {
+        List<SysXPrizesPackage> list = sysXPrizesPackageService.selectSysXPrizesPackageList(sysXPrizesPackage);
+        ExcelUtil<SysXPrizesPackage> util = new ExcelUtil<SysXPrizesPackage>(SysXPrizesPackage.class);
+        util.exportExcel(response, list, "奖品背包数据");
+    }
+
+    /**
+     * 获取奖品背包详细信息
+     */
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(sysXPrizesPackageService.selectSysXPrizesPackageById(id));
+    }
+
+    /**
+     * 新增奖品背包
+     */
+    @Log(title = "奖品背包", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysXPrizesPackage sysXPrizesPackage)
+    {
+        return toAjax(sysXPrizesPackageService.insertSysXPrizesPackage(sysXPrizesPackage));
+    }
+
+    /**
+     * 修改奖品背包
+     */
+    @Log(title = "奖品背包", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysXPrizesPackage sysXPrizesPackage)
+    {
+        return toAjax(sysXPrizesPackageService.updateSysXPrizesPackage(sysXPrizesPackage));
+    }
+
+    /**
+     * 删除奖品背包
+     */
+    @Log(title = "奖品背包", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(sysXPrizesPackageService.deleteSysXPrizesPackageByIds(ids));
+    }
+}

+ 98 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/controller/SysXProbabilitiesController.java

@@ -0,0 +1,98 @@
+package com.ruoyi.system.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.SysXProbabilities;
+import com.ruoyi.system.service.ISysXProbabilitiesService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 概率设置Controller
+ *
+ * @author ruoyi
+ * @date 2025-07-19
+ */
+@RestController
+@RequestMapping("/system/probabilities")
+public class SysXProbabilitiesController extends BaseController
+{
+    @Autowired
+    private ISysXProbabilitiesService sysXProbabilitiesService;
+
+    /**
+     * 查询概率设置列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(SysXProbabilities sysXProbabilities)
+    {
+        startPage();
+        List<SysXProbabilities> list = sysXProbabilitiesService.selectSysXProbabilitiesList(sysXProbabilities);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出概率设置列表
+     */
+    @Log(title = "概率设置", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysXProbabilities sysXProbabilities)
+    {
+        List<SysXProbabilities> list = sysXProbabilitiesService.selectSysXProbabilitiesList(sysXProbabilities);
+        ExcelUtil<SysXProbabilities> util = new ExcelUtil<SysXProbabilities>(SysXProbabilities.class);
+        util.exportExcel(response, list, "概率设置数据");
+    }
+
+    /**
+     * 获取概率设置详细信息
+     */
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(sysXProbabilitiesService.selectSysXProbabilitiesById(id));
+    }
+
+    /**
+     * 新增概率设置
+     */
+    @Log(title = "概率设置", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysXProbabilities sysXProbabilities)
+    {
+        return toAjax(sysXProbabilitiesService.insertSysXProbabilities(sysXProbabilities));
+    }
+
+    /**
+     * 修改概率设置
+     */
+    @Log(title = "概率设置", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysXProbabilities sysXProbabilities)
+    {
+        return toAjax(sysXProbabilitiesService.updateSysXProbabilities(sysXProbabilities));
+    }
+
+    /**
+     * 删除概率设置
+     */
+    @Log(title = "概率设置", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(sysXProbabilitiesService.deleteSysXProbabilitiesByIds(ids));
+    }
+}

+ 172 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/controller/WechatController.java

@@ -0,0 +1,172 @@
+package com.ruoyi.system.controller;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletRequest;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.security.MessageDigest;
+import java.util.*;
+
+@RestController
+@RequestMapping("/wechat")
+public class WechatController {
+
+    @Value("${wechat.appid}")
+    private String appId;
+    @Value("${wechat.mch_id}")
+    private String mchId;
+    @Value("${wechat.api_key}")
+    private String apiKey;
+    @Value("${wechat.notify_url}")
+    private String notifyUrl;
+
+    // 统一下单接口,生成二维码链接
+    @PostMapping("/nativePay")
+    public Map<String, Object> nativePay(@RequestBody Map<String, Object> params) {
+        Map<String, String> data = new HashMap<>();
+        data.put("appid", appId);
+        data.put("mch_id", mchId);
+        data.put("nonce_str", UUID.randomUUID().toString().replace("-", ""));
+        data.put("body", (String) params.getOrDefault("body", "商品描述"));
+        data.put("out_trade_no", System.currentTimeMillis() + "");
+        data.put("total_fee", String.valueOf(params.getOrDefault("total_fee", "1"))); // 单位:分
+        data.put("spbill_create_ip", "127.0.0.1");
+        data.put("notify_url", notifyUrl);
+        data.put("trade_type", "NATIVE");
+        String sign = createSign(data, apiKey);
+        data.put("sign", sign);
+        String xml = mapToXml(data);
+        String responseXml = postXml("https://api.mch.weixin.qq.com/pay/unifiedorder", xml);
+        Map<String, String> respMap = xmlToMap(responseXml);
+        Map<String, Object> result = new HashMap<>();
+        if ("SUCCESS".equals(respMap.get("return_code")) && "SUCCESS".equals(respMap.get("result_code"))) {
+            result.put("code_url", respMap.get("code_url"));
+            result.put("msg", "请用微信扫码支付");
+        } else {
+            result.put("msg", respMap.getOrDefault("return_msg", "下单失败"));
+        }
+        return result;
+    }
+
+    // 支付回调接口
+    @PostMapping("/notify")
+    public String payNotify(HttpServletRequest request) {
+        try {
+            BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
+            StringBuilder sb = new StringBuilder();
+            String line;
+            while ((line = reader.readLine()) != null) {
+                sb.append(line);
+            }
+            Map<String, String> notifyMap = xmlToMap(sb.toString());
+            String sign = notifyMap.remove("sign");
+            String mySign = createSign(notifyMap, apiKey);
+            if (!mySign.equals(sign)) {
+                return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>";
+            }
+            return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
+        } catch (Exception e) {
+            return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[异常]]></return_msg></xml>";
+        }
+    }
+
+    @GetMapping("/orderQuery")
+    public Map<String, Object> orderQuery(@RequestParam String outTradeNo) {
+        Map<String, String> data = new HashMap<>();
+        data.put("appid", appId);
+        data.put("mch_id", mchId);
+        data.put("out_trade_no", outTradeNo);
+        data.put("nonce_str", UUID.randomUUID().toString().replace("-", ""));
+        String sign = createSign(data, apiKey);
+        data.put("sign", sign);
+        String xml = mapToXml(data);
+        String responseXml = postXml("https://api.mch.weixin.qq.com/pay/orderquery", xml);
+        Map<String, String> respMap = xmlToMap(responseXml);
+        Map<String, Object> result = new HashMap<>();
+        result.putAll(respMap);
+        return result;
+    }
+
+    private String createSign(Map<String, String> data, String key) {
+        List<String> keys = new ArrayList<>(data.keySet());
+        Collections.sort(keys);
+        StringBuilder sb = new StringBuilder();
+        for (String k : keys) {
+            if (data.get(k) != null && !data.get(k).isEmpty()) {
+                sb.append(k).append("=").append(data.get(k)).append("&");
+            }
+        }
+        sb.append("key=").append(key);
+        return md5(sb.toString()).toUpperCase();
+    }
+
+    private String md5(String str) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            byte[] array = md.digest(str.getBytes("UTF-8"));
+            StringBuilder sb = new StringBuilder();
+            for (byte b : array) {
+                sb.append(String.format("%02x", b & 0xff));
+            }
+            return sb.toString();
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    private String mapToXml(Map<String, String> data) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("<xml>");
+        for (Map.Entry<String, String> entry : data.entrySet()) {
+            sb.append("<").append(entry.getKey()).append(">")
+                    .append("<![CDATA[").append(entry.getValue()).append("]]>")
+                    .append("</").append(entry.getKey()).append(">");
+        }
+        sb.append("</xml>");
+        return sb.toString();
+    }
+
+    private Map<String, String> xmlToMap(String xml) {
+        Map<String, String> map = new HashMap<>();
+        try {
+            String[] arr = xml.replace("<xml>", "").replace("</xml>", "").split("<");
+            for (String s : arr) {
+                if (s.contains(">")) {
+                    String key = s.substring(0, s.indexOf(">"));
+                    String value = s.substring(s.indexOf(">") + 1, s.lastIndexOf("<"));
+                    value = value.replace("<![CDATA[", "").replace("]]>", "");
+                    map.put(key, value);
+                }
+            }
+        } catch (Exception e) {
+        }
+        return map;
+    }
+
+    private String postXml(String urlStr, String xml) {
+        try {
+            URL url = new URL(urlStr);
+            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+            conn.setRequestMethod("POST");
+            conn.setDoOutput(true);
+            conn.setRequestProperty("Content-Type", "application/xml");
+            OutputStream os = conn.getOutputStream();
+            os.write(xml.getBytes("UTF-8"));
+            os.close();
+            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
+            String inputLine;
+            StringBuilder response = new StringBuilder();
+            while ((inputLine = in.readLine()) != null) {
+                response.append(inputLine);
+            }
+            in.close();
+            return response.toString();
+        } catch (Exception e) {
+            return "";
+        }
+    }
+}

+ 319 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/domain/DbUsers.java

@@ -0,0 +1,319 @@
+package com.ruoyi.system.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 【请填写功能名称】对象 db_users
+ *
+ * @author ruoyi
+ * @date 2025-07-19
+ */
+public class DbUsers extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    private String SteamID;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String zhanghao;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String mima;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long jifen;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long level;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Date regtime;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String qiandaotime;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String SteamName;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String GameStatus;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long killed;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long shadi;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long onlinetime;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String konglong;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long isshouchong;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long clanId;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Date lastConnectTime;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String prefix;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String lastConnectIp;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long X;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long Y;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long Z;
+
+    public void setSteamID(String SteamID)
+    {
+        this.SteamID = SteamID;
+    }
+
+    public String getSteamID()
+    {
+        return SteamID;
+    }
+    public void setZhanghao(String zhanghao)
+    {
+        this.zhanghao = zhanghao;
+    }
+
+    public String getZhanghao()
+    {
+        return zhanghao;
+    }
+    public void setMima(String mima)
+    {
+        this.mima = mima;
+    }
+
+    public String getMima()
+    {
+        return mima;
+    }
+    public void setJifen(Long jifen)
+    {
+        this.jifen = jifen;
+    }
+
+    public Long getJifen()
+    {
+        return jifen;
+    }
+    public void setLevel(Long level)
+    {
+        this.level = level;
+    }
+
+    public Long getLevel()
+    {
+        return level;
+    }
+    public void setRegtime(Date regtime)
+    {
+        this.regtime = regtime;
+    }
+
+    public Date getRegtime()
+    {
+        return regtime;
+    }
+    public void setQiandaotime(String qiandaotime)
+    {
+        this.qiandaotime = qiandaotime;
+    }
+
+    public String getQiandaotime()
+    {
+        return qiandaotime;
+    }
+    public void setSteamName(String SteamName)
+    {
+        this.SteamName = SteamName;
+    }
+
+    public String getSteamName()
+    {
+        return SteamName;
+    }
+    public void setGameStatus(String GameStatus)
+    {
+        this.GameStatus = GameStatus;
+    }
+
+    public String getGameStatus()
+    {
+        return GameStatus;
+    }
+    public void setKilled(Long killed)
+    {
+        this.killed = killed;
+    }
+
+    public Long getKilled()
+    {
+        return killed;
+    }
+    public void setShadi(Long shadi)
+    {
+        this.shadi = shadi;
+    }
+
+    public Long getShadi()
+    {
+        return shadi;
+    }
+    public void setOnlinetime(Long onlinetime)
+    {
+        this.onlinetime = onlinetime;
+    }
+
+    public Long getOnlinetime()
+    {
+        return onlinetime;
+    }
+    public void setKonglong(String konglong)
+    {
+        this.konglong = konglong;
+    }
+
+    public String getKonglong()
+    {
+        return konglong;
+    }
+    public void setIsshouchong(Long isshouchong)
+    {
+        this.isshouchong = isshouchong;
+    }
+
+    public Long getIsshouchong()
+    {
+        return isshouchong;
+    }
+    public void setClanId(Long clanId)
+    {
+        this.clanId = clanId;
+    }
+
+    public Long getClanId()
+    {
+        return clanId;
+    }
+    public void setLastConnectTime(Date lastConnectTime)
+    {
+        this.lastConnectTime = lastConnectTime;
+    }
+
+    public Date getLastConnectTime()
+    {
+        return lastConnectTime;
+    }
+    public void setPrefix(String prefix)
+    {
+        this.prefix = prefix;
+    }
+
+    public String getPrefix()
+    {
+        return prefix;
+    }
+    public void setLastConnectIp(String lastConnectIp)
+    {
+        this.lastConnectIp = lastConnectIp;
+    }
+
+    public String getLastConnectIp()
+    {
+        return lastConnectIp;
+    }
+    public void setX(Long X)
+    {
+        this.X = X;
+    }
+
+    public Long getX()
+    {
+        return X;
+    }
+    public void setY(Long Y)
+    {
+        this.Y = Y;
+    }
+
+    public Long getY()
+    {
+        return Y;
+    }
+    public void setZ(Long Z)
+    {
+        this.Z = Z;
+    }
+
+    public Long getZ()
+    {
+        return Z;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("SteamID", getSteamID())
+            .append("zhanghao", getZhanghao())
+            .append("mima", getMima())
+            .append("jifen", getJifen())
+            .append("level", getLevel())
+            .append("regtime", getRegtime())
+            .append("qiandaotime", getQiandaotime())
+            .append("SteamName", getSteamName())
+            .append("GameStatus", getGameStatus())
+            .append("killed", getKilled())
+            .append("shadi", getShadi())
+            .append("onlinetime", getOnlinetime())
+            .append("konglong", getKonglong())
+            .append("isshouchong", getIsshouchong())
+            .append("clanId", getClanId())
+            .append("lastConnectTime", getLastConnectTime())
+            .append("prefix", getPrefix())
+            .append("lastConnectIp", getLastConnectIp())
+            .append("X", getX())
+            .append("Y", getY())
+            .append("Z", getZ())
+            .toString();
+    }
+}

+ 142 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/domain/MHDPool.java

@@ -0,0 +1,142 @@
+package com.ruoyi.system.domain;
+
+import io.swagger.models.auth.In;
+
+import java.util.List;
+
+/**
+ * @author Losino
+ * @version 1.0
+ */
+public class MHDPool {
+
+    private Long id;
+    private String title;
+    private Double price;
+    private String description;
+    private String borderColor;
+    private String bgColor;
+    private String textColor;
+    private String fullDescription;
+
+    private String poolCount;
+
+    private List<SysXPrizes> prizes;
+
+    private List<SysXProbabilities> probabilities;
+
+    private Long count;
+
+    public MHDPool() {
+    }
+
+    public MHDPool(Long id, String title, Double price, String description, String borderColor, String bgColor, String textColor, String fullDescription, List<SysXPrizes> prizes, List<SysXProbabilities> probabilities, Long count) {
+        this.id = id;
+        this.title = title;
+        this.price = price;
+        this.description = description;
+        this.borderColor = borderColor;
+        this.bgColor = bgColor;
+        this.textColor = textColor;
+        this.fullDescription = fullDescription;
+        this.prizes = prizes;
+        this.probabilities = probabilities;
+        this.count = count;
+    }
+
+    public String getPoolCount() {
+        return poolCount;
+    }
+
+    public void setPoolCount(String poolCount) {
+        this.poolCount = poolCount;
+    }
+
+    public Long getCount() {
+        return count;
+    }
+
+    public void setCount(Long count) {
+        this.count = count;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Double getPrice() {
+        return price;
+    }
+
+    public void setPrice(Double price) {
+        this.price = price;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getBorderColor() {
+        return borderColor;
+    }
+
+    public void setBorderColor(String borderColor) {
+        this.borderColor = borderColor;
+    }
+
+    public String getBgColor() {
+        return bgColor;
+    }
+
+    public void setBgColor(String bgColor) {
+        this.bgColor = bgColor;
+    }
+
+    public String getTextColor() {
+        return textColor;
+    }
+
+    public void setTextColor(String textColor) {
+        this.textColor = textColor;
+    }
+
+    public String getFullDescription() {
+        return fullDescription;
+    }
+
+    public void setFullDescription(String fullDescription) {
+        this.fullDescription = fullDescription;
+    }
+
+    public List<SysXPrizes> getPrizes() {
+        return prizes;
+    }
+
+    public void setPrizes(List<SysXPrizes> prizes) {
+        this.prizes = prizes;
+    }
+
+    public List<SysXProbabilities> getProbabilities() {
+        return probabilities;
+    }
+
+    public void setProbabilities(List<SysXProbabilities> probabilities) {
+        this.probabilities = probabilities;
+    }
+}

+ 156 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/domain/SysXPool.java

@@ -0,0 +1,156 @@
+package com.ruoyi.system.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 卡池对象 sys_x_pool
+ *
+ * @author ruoyi
+ * @date 2025-07-19
+ */
+public class SysXPool extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 卡池名称
+     */
+    @Excel(name = "卡池名称")
+    private String title;
+
+    /**
+     * 价格
+     */
+    @Excel(name = "价格")
+    private Double price;
+
+    /**
+     * 概要
+     */
+    @Excel(name = "概要")
+    private String description;
+
+    /**
+     * 边界颜色
+     */
+    @Excel(name = "边界颜色")
+    private String borderColor;
+
+    /**
+     * 背景颜色
+     */
+    @Excel(name = "背景颜色")
+    private String bgColor;
+
+    /**
+     * 字体颜色
+     */
+    @Excel(name = "字体颜色")
+    private String textColor;
+
+    /**
+     * 描述
+     */
+    @Excel(name = "描述")
+    private String fullDescription;
+
+    /**
+     * 描述
+     */
+    @Excel(name = "抽奖次数")
+    private String count;
+
+    public String getCount() {
+        return count;
+    }
+
+    public void setCount(String count) {
+        this.count = count;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setPrice(Double price) {
+        this.price = price;
+    }
+
+    public Double getPrice() {
+        return price;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setBorderColor(String borderColor) {
+        this.borderColor = borderColor;
+    }
+
+    public String getBorderColor() {
+        return borderColor;
+    }
+
+    public void setBgColor(String bgColor) {
+        this.bgColor = bgColor;
+    }
+
+    public String getBgColor() {
+        return bgColor;
+    }
+
+    public void setTextColor(String textColor) {
+        this.textColor = textColor;
+    }
+
+    public String getTextColor() {
+        return textColor;
+    }
+
+    public void setFullDescription(String fullDescription) {
+        this.fullDescription = fullDescription;
+    }
+
+    public String getFullDescription() {
+        return fullDescription;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+                .append("id", getId())
+                .append("title", getTitle())
+                .append("price", getPrice())
+                .append("description", getDescription())
+                .append("borderColor", getBorderColor())
+                .append("bgColor", getBgColor())
+                .append("textColor", getTextColor())
+                .append("fullDescription", getFullDescription())
+                .append("count", getCount())
+                .toString();
+    }
+}

+ 121 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/domain/SysXPoolCount.java

@@ -0,0 +1,121 @@
+package com.ruoyi.system.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 抽奖次数对象 sys_x_pool_count
+ *
+ * @author ruoyi
+ * @date 2025-07-22
+ */
+public class SysXPoolCount extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** Id */
+    private Long id;
+
+    /** steamId */
+    @Excel(name = "steamId")
+    private String steamId;
+
+    /** 账号 */
+    @Excel(name = "账号")
+    private String zhanghao;
+
+    /** steam名称 */
+    @Excel(name = "steam名称")
+    private String steamName;
+
+    /** 卡池id */
+    @Excel(name = "卡池id")
+    private Long poolId;
+
+    /** 卡池名称 */
+    @Excel(name = "卡池名称")
+    private String poolName;
+
+    /** 剩余抽奖次数 */
+    @Excel(name = "剩余抽奖次数")
+    private Long count;
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId()
+    {
+        return id;
+    }
+    public void setSteamId(String steamId)
+    {
+        this.steamId = steamId;
+    }
+
+    public String getSteamId()
+    {
+        return steamId;
+    }
+    public void setZhanghao(String zhanghao)
+    {
+        this.zhanghao = zhanghao;
+    }
+
+    public String getZhanghao()
+    {
+        return zhanghao;
+    }
+    public void setSteamName(String steamName)
+    {
+        this.steamName = steamName;
+    }
+
+    public String getSteamName()
+    {
+        return steamName;
+    }
+    public void setPoolId(Long poolId)
+    {
+        this.poolId = poolId;
+    }
+
+    public Long getPoolId()
+    {
+        return poolId;
+    }
+    public void setPoolName(String poolName)
+    {
+        this.poolName = poolName;
+    }
+
+    public String getPoolName()
+    {
+        return poolName;
+    }
+    public void setCount(Long count)
+    {
+        this.count = count;
+    }
+
+    public Long getCount()
+    {
+        return count;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("steamId", getSteamId())
+            .append("zhanghao", getZhanghao())
+            .append("steamName", getSteamName())
+            .append("poolId", getPoolId())
+            .append("poolName", getPoolName())
+            .append("count", getCount())
+            .toString();
+    }
+}

+ 121 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/domain/SysXPrizes.java

@@ -0,0 +1,121 @@
+package com.ruoyi.system.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 奖品池对象 sys_x_prizes
+ * 
+ * @author ruoyi
+ * @date 2025-07-19
+ */
+public class SysXPrizes extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    private Long id;
+
+    /** 奖品名称 */
+    @Excel(name = "奖品名称")
+    private String name;
+
+    /** 稀有度 */
+    @Excel(name = "稀有度")
+    private String quality;
+
+    /** 背景颜色 */
+    @Excel(name = "背景颜色")
+    private String bgColor;
+
+    /** 字体颜色 */
+    @Excel(name = "字体颜色")
+    private String textColor;
+
+    /** 描述 */
+    @Excel(name = "描述")
+    private String fullDescription;
+
+    /** 关联卡池id */
+    @Excel(name = "关联卡池id")
+    private Long poolId;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+
+    public String getName() 
+    {
+        return name;
+    }
+    public void setQuality(String quality) 
+    {
+        this.quality = quality;
+    }
+
+    public String getQuality() 
+    {
+        return quality;
+    }
+    public void setBgColor(String bgColor) 
+    {
+        this.bgColor = bgColor;
+    }
+
+    public String getBgColor() 
+    {
+        return bgColor;
+    }
+    public void setTextColor(String textColor) 
+    {
+        this.textColor = textColor;
+    }
+
+    public String getTextColor() 
+    {
+        return textColor;
+    }
+    public void setFullDescription(String fullDescription) 
+    {
+        this.fullDescription = fullDescription;
+    }
+
+    public String getFullDescription() 
+    {
+        return fullDescription;
+    }
+    public void setPoolId(Long poolId) 
+    {
+        this.poolId = poolId;
+    }
+
+    public Long getPoolId() 
+    {
+        return poolId;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("name", getName())
+            .append("quality", getQuality())
+            .append("bgColor", getBgColor())
+            .append("textColor", getTextColor())
+            .append("fullDescription", getFullDescription())
+            .append("poolId", getPoolId())
+            .toString();
+    }
+}

+ 168 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/domain/SysXPrizesPackage.java

@@ -0,0 +1,168 @@
+package com.ruoyi.system.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 奖品背包对象 sys_x_prizes_package
+ *
+ * @author ruoyi
+ * @date 2025-07-22
+ */
+public class SysXPrizesPackage extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /** 自增id */
+    private Long id;
+
+    /** steamId */
+    @Excel(name = "steamId")
+    private String steamId;
+
+    /** 账号 */
+    @Excel(name = "账号")
+    private String zhanghao;
+
+    /** steam名称 */
+    @Excel(name = "steam名称")
+    private String steamName;
+
+    /** 卡池id */
+    @Excel(name = "卡池id")
+    private Long poolId;
+
+    /** 卡池名称 */
+    @Excel(name = "卡池名称")
+    private String poolName;
+
+    /** 奖品id */
+    @Excel(name = "奖品id")
+    private String prizeId;
+
+    /** 奖品名称 */
+    @Excel(name = "奖品名称")
+    private String prizeName;
+
+    /** 稀有度 */
+    @Excel(name = "稀有度")
+    private String quality;
+
+    /** 是否核销 */
+    @Excel(name = "是否核销")
+    private Long isCheck;
+
+    /** 核销时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "核销时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date checkTime;
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setSteamId(String steamId) {
+        this.steamId = steamId;
+    }
+
+    public String getSteamId() {
+        return steamId;
+    }
+
+    public void setZhanghao(String zhanghao) {
+        this.zhanghao = zhanghao;
+    }
+
+    public String getZhanghao() {
+        return zhanghao;
+    }
+
+    public void setSteamName(String steamName) {
+        this.steamName = steamName;
+    }
+
+    public String getSteamName() {
+        return steamName;
+    }
+
+    public void setPoolId(Long poolId) {
+        this.poolId = poolId;
+    }
+
+    public Long getPoolId() {
+        return poolId;
+    }
+
+    public void setPoolName(String poolName) {
+        this.poolName = poolName;
+    }
+
+    public String getPoolName() {
+        return poolName;
+    }
+
+    public void setPrizeId(String prizeId) {
+        this.prizeId = prizeId;
+    }
+
+    public String getPrizeId() {
+        return prizeId;
+    }
+
+    public void setPrizeName(String prizeName) {
+        this.prizeName = prizeName;
+    }
+
+    public String getPrizeName() {
+        return prizeName;
+    }
+
+    public void setQuality(String quality) {
+        this.quality = quality;
+    }
+
+    public String getQuality() {
+        return quality;
+    }
+
+    public void setIsCheck(Long isCheck) {
+        this.isCheck = isCheck;
+    }
+
+    public Long getIsCheck() {
+        return isCheck;
+    }
+
+    public void setCheckTime(Date checkTime) {
+        this.checkTime = checkTime;
+    }
+
+    public Date getCheckTime() {
+        return checkTime;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+                .append("id", getId())
+                .append("steamId", getSteamId())
+                .append("zhanghao", getZhanghao())
+                .append("steamName", getSteamName())
+                .append("poolId", getPoolId())
+                .append("poolName", getPoolName())
+                .append("prizeId", getPrizeId())
+                .append("prizeName", getPrizeName())
+                .append("quality", getQuality())
+                .append("createTime", getCreateTime())
+                .append("isCheck", getIsCheck())
+                .append("checkTime", getCheckTime())
+                .toString();
+    }
+}

+ 104 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/domain/SysXProbabilities.java

@@ -0,0 +1,104 @@
+package com.ruoyi.system.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 概率设置对象 sys_x_probabilities
+ *
+ * @author ruoyi
+ * @date 2025-07-19
+ */
+public class SysXProbabilities extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    private Long id;
+
+    /** 品质 */
+    @Excel(name = "品质")
+    private String name;
+
+    /** 概率值 */
+    @Excel(name = "概率值")
+    private Long value;
+
+    /** 颜色设置 */
+    @Excel(name = "颜色设置")
+    private String colorClass;
+
+    /** 关联卡池id */
+    @Excel(name = "关联卡池id")
+    private Long poolId;
+
+    public SysXProbabilities() {
+    }
+
+    public SysXProbabilities(Long id, String name, Long value, String colorClass, Long poolId) {
+        this.id = id;
+        this.name = name;
+        this.value = value;
+        this.colorClass = colorClass;
+        this.poolId = poolId;
+    }
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId()
+    {
+        return id;
+    }
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+    public void setValue(Long value)
+    {
+        this.value = value;
+    }
+
+    public Long getValue()
+    {
+        return value;
+    }
+    public void setColorClass(String colorClass)
+    {
+        this.colorClass = colorClass;
+    }
+
+    public String getColorClass()
+    {
+        return colorClass;
+    }
+    public void setPoolId(Long poolId)
+    {
+        this.poolId = poolId;
+    }
+
+    public Long getPoolId()
+    {
+        return poolId;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("name", getName())
+            .append("value", getValue())
+            .append("colorClass", getColorClass())
+            .append("poolId", getPoolId())
+            .toString();
+    }
+}

+ 61 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/mapper/DbUsersMapper.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.system.domain.DbUsers;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2025-07-19
+ */
+public interface DbUsersMapper 
+{
+    /**
+     * 查询【请填写功能名称】
+     * 
+     * @param SteamID 【请填写功能名称】主键
+     * @return 【请填写功能名称】
+     */
+    public DbUsers selectDbUsersBySteamID(String steamId);
+
+    /**
+     * 查询【请填写功能名称】列表
+     * 
+     * @param dbUsers 【请填写功能名称】
+     * @return 【请填写功能名称】集合
+     */
+    public List<DbUsers> selectDbUsersList(DbUsers dbUsers);
+
+    /**
+     * 新增【请填写功能名称】
+     * 
+     * @param dbUsers 【请填写功能名称】
+     * @return 结果
+     */
+    public int insertDbUsers(DbUsers dbUsers);
+
+    /**
+     * 修改【请填写功能名称】
+     * 
+     * @param dbUsers 【请填写功能名称】
+     * @return 结果
+     */
+    public int updateDbUsers(DbUsers dbUsers);
+
+    /**
+     * 删除【请填写功能名称】
+     * 
+     * @param SteamID 【请填写功能名称】主键
+     * @return 结果
+     */
+    public int deleteDbUsersBySteamID(String steamId);
+
+    /**
+     * 批量删除【请填写功能名称】
+     * 
+     * @param SteamIDs 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteDbUsersBySteamIDs(Long[] SteamIDs);
+}

+ 61 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/mapper/SysXPoolCountMapper.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.system.domain.SysXPoolCount;
+
+/**
+ * 抽奖次数Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2025-07-22
+ */
+public interface SysXPoolCountMapper 
+{
+    /**
+     * 查询抽奖次数
+     * 
+     * @param id 抽奖次数主键
+     * @return 抽奖次数
+     */
+    public SysXPoolCount selectSysXPoolCountById(Long id);
+
+    /**
+     * 查询抽奖次数列表
+     * 
+     * @param sysXPoolCount 抽奖次数
+     * @return 抽奖次数集合
+     */
+    public List<SysXPoolCount> selectSysXPoolCountList(SysXPoolCount sysXPoolCount);
+
+    /**
+     * 新增抽奖次数
+     * 
+     * @param sysXPoolCount 抽奖次数
+     * @return 结果
+     */
+    public int insertSysXPoolCount(SysXPoolCount sysXPoolCount);
+
+    /**
+     * 修改抽奖次数
+     * 
+     * @param sysXPoolCount 抽奖次数
+     * @return 结果
+     */
+    public int updateSysXPoolCount(SysXPoolCount sysXPoolCount);
+
+    /**
+     * 删除抽奖次数
+     * 
+     * @param id 抽奖次数主键
+     * @return 结果
+     */
+    public int deleteSysXPoolCountById(Long id);
+
+    /**
+     * 批量删除抽奖次数
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteSysXPoolCountByIds(Long[] ids);
+}

+ 61 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/mapper/SysXPoolMapper.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.system.domain.SysXPool;
+
+/**
+ * 卡池Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2025-07-19
+ */
+public interface SysXPoolMapper 
+{
+    /**
+     * 查询卡池
+     * 
+     * @param id 卡池主键
+     * @return 卡池
+     */
+    public SysXPool selectSysXPoolById(Long id);
+
+    /**
+     * 查询卡池列表
+     * 
+     * @param sysXPool 卡池
+     * @return 卡池集合
+     */
+    public List<SysXPool> selectSysXPoolList(SysXPool sysXPool);
+
+    /**
+     * 新增卡池
+     * 
+     * @param sysXPool 卡池
+     * @return 结果
+     */
+    public int insertSysXPool(SysXPool sysXPool);
+
+    /**
+     * 修改卡池
+     * 
+     * @param sysXPool 卡池
+     * @return 结果
+     */
+    public int updateSysXPool(SysXPool sysXPool);
+
+    /**
+     * 删除卡池
+     * 
+     * @param id 卡池主键
+     * @return 结果
+     */
+    public int deleteSysXPoolById(Long id);
+
+    /**
+     * 批量删除卡池
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteSysXPoolByIds(Long[] ids);
+}

+ 61 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/mapper/SysXPrizesMapper.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.system.domain.SysXPrizes;
+
+/**
+ * 奖品池Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2025-07-19
+ */
+public interface SysXPrizesMapper 
+{
+    /**
+     * 查询奖品池
+     * 
+     * @param id 奖品池主键
+     * @return 奖品池
+     */
+    public SysXPrizes selectSysXPrizesById(Long id);
+
+    /**
+     * 查询奖品池列表
+     * 
+     * @param sysXPrizes 奖品池
+     * @return 奖品池集合
+     */
+    public List<SysXPrizes> selectSysXPrizesList(SysXPrizes sysXPrizes);
+
+    /**
+     * 新增奖品池
+     * 
+     * @param sysXPrizes 奖品池
+     * @return 结果
+     */
+    public int insertSysXPrizes(SysXPrizes sysXPrizes);
+
+    /**
+     * 修改奖品池
+     * 
+     * @param sysXPrizes 奖品池
+     * @return 结果
+     */
+    public int updateSysXPrizes(SysXPrizes sysXPrizes);
+
+    /**
+     * 删除奖品池
+     * 
+     * @param id 奖品池主键
+     * @return 结果
+     */
+    public int deleteSysXPrizesById(Long id);
+
+    /**
+     * 批量删除奖品池
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteSysXPrizesByIds(Long[] ids);
+}

+ 61 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/mapper/SysXPrizesPackageMapper.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.system.domain.SysXPrizesPackage;
+
+/**
+ * 奖品背包Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2025-07-22
+ */
+public interface SysXPrizesPackageMapper 
+{
+    /**
+     * 查询奖品背包
+     * 
+     * @param id 奖品背包主键
+     * @return 奖品背包
+     */
+    public SysXPrizesPackage selectSysXPrizesPackageById(Long id);
+
+    /**
+     * 查询奖品背包列表
+     * 
+     * @param sysXPrizesPackage 奖品背包
+     * @return 奖品背包集合
+     */
+    public List<SysXPrizesPackage> selectSysXPrizesPackageList(SysXPrizesPackage sysXPrizesPackage);
+
+    /**
+     * 新增奖品背包
+     * 
+     * @param sysXPrizesPackage 奖品背包
+     * @return 结果
+     */
+    public int insertSysXPrizesPackage(SysXPrizesPackage sysXPrizesPackage);
+
+    /**
+     * 修改奖品背包
+     * 
+     * @param sysXPrizesPackage 奖品背包
+     * @return 结果
+     */
+    public int updateSysXPrizesPackage(SysXPrizesPackage sysXPrizesPackage);
+
+    /**
+     * 删除奖品背包
+     * 
+     * @param id 奖品背包主键
+     * @return 结果
+     */
+    public int deleteSysXPrizesPackageById(Long id);
+
+    /**
+     * 批量删除奖品背包
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteSysXPrizesPackageByIds(Long[] ids);
+}

+ 61 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/mapper/SysXProbabilitiesMapper.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.system.domain.SysXProbabilities;
+
+/**
+ * 概率设置Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2025-07-19
+ */
+public interface SysXProbabilitiesMapper 
+{
+    /**
+     * 查询概率设置
+     * 
+     * @param id 概率设置主键
+     * @return 概率设置
+     */
+    public SysXProbabilities selectSysXProbabilitiesById(Long id);
+
+    /**
+     * 查询概率设置列表
+     * 
+     * @param sysXProbabilities 概率设置
+     * @return 概率设置集合
+     */
+    public List<SysXProbabilities> selectSysXProbabilitiesList(SysXProbabilities sysXProbabilities);
+
+    /**
+     * 新增概率设置
+     * 
+     * @param sysXProbabilities 概率设置
+     * @return 结果
+     */
+    public int insertSysXProbabilities(SysXProbabilities sysXProbabilities);
+
+    /**
+     * 修改概率设置
+     * 
+     * @param sysXProbabilities 概率设置
+     * @return 结果
+     */
+    public int updateSysXProbabilities(SysXProbabilities sysXProbabilities);
+
+    /**
+     * 删除概率设置
+     * 
+     * @param id 概率设置主键
+     * @return 结果
+     */
+    public int deleteSysXProbabilitiesById(Long id);
+
+    /**
+     * 批量删除概率设置
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteSysXProbabilitiesByIds(Long[] ids);
+}

+ 61 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/service/IDbUsersService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+import com.ruoyi.system.domain.DbUsers;
+
+/**
+ * 【请填写功能名称】Service接口
+ *
+ * @author ruoyi
+ * @date 2025-07-19
+ */
+public interface IDbUsersService
+{
+    /**
+     * 查询【请填写功能名称】
+     *
+     * @param steamId 【请填写功能名称】主键
+     * @return 【请填写功能名称】
+     */
+    public DbUsers selectDbUsersBySteamID(String steamId);
+
+    /**
+     * 查询【请填写功能名称】列表
+     *
+     * @param dbUsers 【请填写功能名称】
+     * @return 【请填写功能名称】集合
+     */
+    public List<DbUsers> selectDbUsersList(DbUsers dbUsers);
+
+    /**
+     * 新增【请填写功能名称】
+     *
+     * @param dbUsers 【请填写功能名称】
+     * @return 结果
+     */
+    public int insertDbUsers(DbUsers dbUsers);
+
+    /**
+     * 修改【请填写功能名称】
+     *
+     * @param dbUsers 【请填写功能名称】
+     * @return 结果
+     */
+    public int updateDbUsers(DbUsers dbUsers);
+
+    /**
+     * 批量删除【请填写功能名称】
+     *
+     * @param SteamIDs 需要删除的【请填写功能名称】主键集合
+     * @return 结果
+     */
+    public int deleteDbUsersBySteamIDs(Long[] SteamIDs);
+
+    /**
+     * 删除【请填写功能名称】信息
+     *
+     * @param SteamID 【请填写功能名称】主键
+     * @return 结果
+     */
+    public int deleteDbUsersBySteamID(String steamId);
+}

+ 61 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/service/ISysXPoolCountService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+import com.ruoyi.system.domain.SysXPoolCount;
+
+/**
+ * 抽奖次数Service接口
+ * 
+ * @author ruoyi
+ * @date 2025-07-22
+ */
+public interface ISysXPoolCountService 
+{
+    /**
+     * 查询抽奖次数
+     * 
+     * @param id 抽奖次数主键
+     * @return 抽奖次数
+     */
+    public SysXPoolCount selectSysXPoolCountById(Long id);
+
+    /**
+     * 查询抽奖次数列表
+     * 
+     * @param sysXPoolCount 抽奖次数
+     * @return 抽奖次数集合
+     */
+    public List<SysXPoolCount> selectSysXPoolCountList(SysXPoolCount sysXPoolCount);
+
+    /**
+     * 新增抽奖次数
+     * 
+     * @param sysXPoolCount 抽奖次数
+     * @return 结果
+     */
+    public int insertSysXPoolCount(SysXPoolCount sysXPoolCount);
+
+    /**
+     * 修改抽奖次数
+     * 
+     * @param sysXPoolCount 抽奖次数
+     * @return 结果
+     */
+    public int updateSysXPoolCount(SysXPoolCount sysXPoolCount);
+
+    /**
+     * 批量删除抽奖次数
+     * 
+     * @param ids 需要删除的抽奖次数主键集合
+     * @return 结果
+     */
+    public int deleteSysXPoolCountByIds(Long[] ids);
+
+    /**
+     * 删除抽奖次数信息
+     * 
+     * @param id 抽奖次数主键
+     * @return 结果
+     */
+    public int deleteSysXPoolCountById(Long id);
+}

+ 61 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/service/ISysXPoolService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+import com.ruoyi.system.domain.SysXPool;
+
+/**
+ * 卡池Service接口
+ * 
+ * @author ruoyi
+ * @date 2025-07-19
+ */
+public interface ISysXPoolService 
+{
+    /**
+     * 查询卡池
+     * 
+     * @param id 卡池主键
+     * @return 卡池
+     */
+    public SysXPool selectSysXPoolById(Long id);
+
+    /**
+     * 查询卡池列表
+     * 
+     * @param sysXPool 卡池
+     * @return 卡池集合
+     */
+    public List<SysXPool> selectSysXPoolList(SysXPool sysXPool);
+
+    /**
+     * 新增卡池
+     * 
+     * @param sysXPool 卡池
+     * @return 结果
+     */
+    public int insertSysXPool(SysXPool sysXPool);
+
+    /**
+     * 修改卡池
+     * 
+     * @param sysXPool 卡池
+     * @return 结果
+     */
+    public int updateSysXPool(SysXPool sysXPool);
+
+    /**
+     * 批量删除卡池
+     * 
+     * @param ids 需要删除的卡池主键集合
+     * @return 结果
+     */
+    public int deleteSysXPoolByIds(Long[] ids);
+
+    /**
+     * 删除卡池信息
+     * 
+     * @param id 卡池主键
+     * @return 结果
+     */
+    public int deleteSysXPoolById(Long id);
+}

+ 61 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/service/ISysXPrizesPackageService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+import com.ruoyi.system.domain.SysXPrizesPackage;
+
+/**
+ * 奖品背包Service接口
+ * 
+ * @author ruoyi
+ * @date 2025-07-22
+ */
+public interface ISysXPrizesPackageService 
+{
+    /**
+     * 查询奖品背包
+     * 
+     * @param id 奖品背包主键
+     * @return 奖品背包
+     */
+    public SysXPrizesPackage selectSysXPrizesPackageById(Long id);
+
+    /**
+     * 查询奖品背包列表
+     * 
+     * @param sysXPrizesPackage 奖品背包
+     * @return 奖品背包集合
+     */
+    public List<SysXPrizesPackage> selectSysXPrizesPackageList(SysXPrizesPackage sysXPrizesPackage);
+
+    /**
+     * 新增奖品背包
+     * 
+     * @param sysXPrizesPackage 奖品背包
+     * @return 结果
+     */
+    public int insertSysXPrizesPackage(SysXPrizesPackage sysXPrizesPackage);
+
+    /**
+     * 修改奖品背包
+     * 
+     * @param sysXPrizesPackage 奖品背包
+     * @return 结果
+     */
+    public int updateSysXPrizesPackage(SysXPrizesPackage sysXPrizesPackage);
+
+    /**
+     * 批量删除奖品背包
+     * 
+     * @param ids 需要删除的奖品背包主键集合
+     * @return 结果
+     */
+    public int deleteSysXPrizesPackageByIds(Long[] ids);
+
+    /**
+     * 删除奖品背包信息
+     * 
+     * @param id 奖品背包主键
+     * @return 结果
+     */
+    public int deleteSysXPrizesPackageById(Long id);
+}

+ 61 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/service/ISysXPrizesService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+import com.ruoyi.system.domain.SysXPrizes;
+
+/**
+ * 奖品池Service接口
+ * 
+ * @author ruoyi
+ * @date 2025-07-19
+ */
+public interface ISysXPrizesService 
+{
+    /**
+     * 查询奖品池
+     * 
+     * @param id 奖品池主键
+     * @return 奖品池
+     */
+    public SysXPrizes selectSysXPrizesById(Long id);
+
+    /**
+     * 查询奖品池列表
+     * 
+     * @param sysXPrizes 奖品池
+     * @return 奖品池集合
+     */
+    public List<SysXPrizes> selectSysXPrizesList(SysXPrizes sysXPrizes);
+
+    /**
+     * 新增奖品池
+     * 
+     * @param sysXPrizes 奖品池
+     * @return 结果
+     */
+    public int insertSysXPrizes(SysXPrizes sysXPrizes);
+
+    /**
+     * 修改奖品池
+     * 
+     * @param sysXPrizes 奖品池
+     * @return 结果
+     */
+    public int updateSysXPrizes(SysXPrizes sysXPrizes);
+
+    /**
+     * 批量删除奖品池
+     * 
+     * @param ids 需要删除的奖品池主键集合
+     * @return 结果
+     */
+    public int deleteSysXPrizesByIds(Long[] ids);
+
+    /**
+     * 删除奖品池信息
+     * 
+     * @param id 奖品池主键
+     * @return 结果
+     */
+    public int deleteSysXPrizesById(Long id);
+}

+ 61 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/service/ISysXProbabilitiesService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+import com.ruoyi.system.domain.SysXProbabilities;
+
+/**
+ * 概率设置Service接口
+ * 
+ * @author ruoyi
+ * @date 2025-07-19
+ */
+public interface ISysXProbabilitiesService 
+{
+    /**
+     * 查询概率设置
+     * 
+     * @param id 概率设置主键
+     * @return 概率设置
+     */
+    public SysXProbabilities selectSysXProbabilitiesById(Long id);
+
+    /**
+     * 查询概率设置列表
+     * 
+     * @param sysXProbabilities 概率设置
+     * @return 概率设置集合
+     */
+    public List<SysXProbabilities> selectSysXProbabilitiesList(SysXProbabilities sysXProbabilities);
+
+    /**
+     * 新增概率设置
+     * 
+     * @param sysXProbabilities 概率设置
+     * @return 结果
+     */
+    public int insertSysXProbabilities(SysXProbabilities sysXProbabilities);
+
+    /**
+     * 修改概率设置
+     * 
+     * @param sysXProbabilities 概率设置
+     * @return 结果
+     */
+    public int updateSysXProbabilities(SysXProbabilities sysXProbabilities);
+
+    /**
+     * 批量删除概率设置
+     * 
+     * @param ids 需要删除的概率设置主键集合
+     * @return 结果
+     */
+    public int deleteSysXProbabilitiesByIds(Long[] ids);
+
+    /**
+     * 删除概率设置信息
+     * 
+     * @param id 概率设置主键
+     * @return 结果
+     */
+    public int deleteSysXProbabilitiesById(Long id);
+}

+ 93 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/DbUsersServiceImpl.java

@@ -0,0 +1,93 @@
+package com.ruoyi.system.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.system.mapper.DbUsersMapper;
+import com.ruoyi.system.domain.DbUsers;
+import com.ruoyi.system.service.IDbUsersService;
+
+/**
+ * 【请填写功能名称】Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2025-07-19
+ */
+@Service
+public class DbUsersServiceImpl implements IDbUsersService
+{
+    @Autowired
+    private DbUsersMapper dbUsersMapper;
+
+    /**
+     * 查询【请填写功能名称】
+     *
+     * @param steamId 【请填写功能名称】主键
+     * @return 【请填写功能名称】
+     */
+    @Override
+    public DbUsers selectDbUsersBySteamID(String steamId)
+    {
+        return dbUsersMapper.selectDbUsersBySteamID(steamId);
+    }
+
+    /**
+     * 查询【请填写功能名称】列表
+     *
+     * @param dbUsers 【请填写功能名称】
+     * @return 【请填写功能名称】
+     */
+    @Override
+    public List<DbUsers> selectDbUsersList(DbUsers dbUsers)
+    {
+        return dbUsersMapper.selectDbUsersList(dbUsers);
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     *
+     * @param dbUsers 【请填写功能名称】
+     * @return 结果
+     */
+    @Override
+    public int insertDbUsers(DbUsers dbUsers)
+    {
+        return dbUsersMapper.insertDbUsers(dbUsers);
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     *
+     * @param dbUsers 【请填写功能名称】
+     * @return 结果
+     */
+    @Override
+    public int updateDbUsers(DbUsers dbUsers)
+    {
+        return dbUsersMapper.updateDbUsers(dbUsers);
+    }
+
+    /**
+     * 批量删除【请填写功能名称】
+     *
+     * @param SteamIDs 需要删除的【请填写功能名称】主键
+     * @return 结果
+     */
+    @Override
+    public int deleteDbUsersBySteamIDs(Long[] SteamIDs)
+    {
+        return dbUsersMapper.deleteDbUsersBySteamIDs(SteamIDs);
+    }
+
+    /**
+     * 删除【请填写功能名称】信息
+     *
+     * @param steamId 【请填写功能名称】主键
+     * @return 结果
+     */
+    @Override
+    public int deleteDbUsersBySteamID(String steamId)
+    {
+        return dbUsersMapper.deleteDbUsersBySteamID(steamId);
+    }
+}

+ 93 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/SysXPoolCountServiceImpl.java

@@ -0,0 +1,93 @@
+package com.ruoyi.system.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.system.mapper.SysXPoolCountMapper;
+import com.ruoyi.system.domain.SysXPoolCount;
+import com.ruoyi.system.service.ISysXPoolCountService;
+
+/**
+ * 抽奖次数Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2025-07-22
+ */
+@Service
+public class SysXPoolCountServiceImpl implements ISysXPoolCountService 
+{
+    @Autowired
+    private SysXPoolCountMapper sysXPoolCountMapper;
+
+    /**
+     * 查询抽奖次数
+     * 
+     * @param id 抽奖次数主键
+     * @return 抽奖次数
+     */
+    @Override
+    public SysXPoolCount selectSysXPoolCountById(Long id)
+    {
+        return sysXPoolCountMapper.selectSysXPoolCountById(id);
+    }
+
+    /**
+     * 查询抽奖次数列表
+     * 
+     * @param sysXPoolCount 抽奖次数
+     * @return 抽奖次数
+     */
+    @Override
+    public List<SysXPoolCount> selectSysXPoolCountList(SysXPoolCount sysXPoolCount)
+    {
+        return sysXPoolCountMapper.selectSysXPoolCountList(sysXPoolCount);
+    }
+
+    /**
+     * 新增抽奖次数
+     * 
+     * @param sysXPoolCount 抽奖次数
+     * @return 结果
+     */
+    @Override
+    public int insertSysXPoolCount(SysXPoolCount sysXPoolCount)
+    {
+        return sysXPoolCountMapper.insertSysXPoolCount(sysXPoolCount);
+    }
+
+    /**
+     * 修改抽奖次数
+     * 
+     * @param sysXPoolCount 抽奖次数
+     * @return 结果
+     */
+    @Override
+    public int updateSysXPoolCount(SysXPoolCount sysXPoolCount)
+    {
+        return sysXPoolCountMapper.updateSysXPoolCount(sysXPoolCount);
+    }
+
+    /**
+     * 批量删除抽奖次数
+     * 
+     * @param ids 需要删除的抽奖次数主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysXPoolCountByIds(Long[] ids)
+    {
+        return sysXPoolCountMapper.deleteSysXPoolCountByIds(ids);
+    }
+
+    /**
+     * 删除抽奖次数信息
+     * 
+     * @param id 抽奖次数主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysXPoolCountById(Long id)
+    {
+        return sysXPoolCountMapper.deleteSysXPoolCountById(id);
+    }
+}

+ 108 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/SysXPoolServiceImpl.java

@@ -0,0 +1,108 @@
+package com.ruoyi.system.service.impl;
+
+import java.util.List;
+
+import com.ruoyi.system.domain.SysXProbabilities;
+import com.ruoyi.system.mapper.SysXProbabilitiesMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.system.mapper.SysXPoolMapper;
+import com.ruoyi.system.domain.SysXPool;
+import com.ruoyi.system.service.ISysXPoolService;
+
+import javax.annotation.Resource;
+
+/**
+ * 卡池Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2025-07-19
+ */
+@Service
+public class SysXPoolServiceImpl implements ISysXPoolService {
+    @Autowired
+    private SysXPoolMapper sysXPoolMapper;
+
+    /**
+     * 查询卡池
+     *
+     * @param id 卡池主键
+     * @return 卡池
+     */
+    @Override
+    public SysXPool selectSysXPoolById(Long id) {
+        return sysXPoolMapper.selectSysXPoolById(id);
+    }
+
+    /**
+     * 查询卡池列表
+     *
+     * @param sysXPool 卡池
+     * @return 卡池
+     */
+    @Override
+    public List<SysXPool> selectSysXPoolList(SysXPool sysXPool) {
+        return sysXPoolMapper.selectSysXPoolList(sysXPool);
+    }
+
+
+    @Resource
+    private SysXProbabilitiesMapper probabilitiesMapper;
+
+    /**
+     * 新增卡池
+     *
+     * @param sysXPool 卡池
+     * @return 结果
+     */
+    @Override
+    public int insertSysXPool(SysXPool sysXPool) {
+        int result = sysXPoolMapper.insertSysXPool(sysXPool);
+        if (result != 0) {
+            // 添加概率信息
+            SysXProbabilities epic = new SysXProbabilities(null, "史诗", 25L, "bg-rarity-epic", sysXPool.getId());
+            SysXProbabilities rare = new SysXProbabilities(null, "稀有", 25L, "bg-rarity-rare", sysXPool.getId());
+            SysXProbabilities fine = new SysXProbabilities(null, "精良", 25L, "bg-rarity-fine", sysXPool.getId());
+            SysXProbabilities common = new SysXProbabilities(null, "普通", 25L, "bg-rarity-common", sysXPool.getId());
+
+            probabilitiesMapper.insertSysXProbabilities(epic);
+            probabilitiesMapper.insertSysXProbabilities(rare);
+            probabilitiesMapper.insertSysXProbabilities(fine);
+            probabilitiesMapper.insertSysXProbabilities(common);
+        };
+        return result;
+    }
+
+    /**
+     * 修改卡池
+     *
+     * @param sysXPool 卡池
+     * @return 结果
+     */
+    @Override
+    public int updateSysXPool(SysXPool sysXPool) {
+        return sysXPoolMapper.updateSysXPool(sysXPool);
+    }
+
+    /**
+     * 批量删除卡池
+     *
+     * @param ids 需要删除的卡池主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysXPoolByIds(Long[] ids) {
+        return sysXPoolMapper.deleteSysXPoolByIds(ids);
+    }
+
+    /**
+     * 删除卡池信息
+     *
+     * @param id 卡池主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysXPoolById(Long id) {
+        return sysXPoolMapper.deleteSysXPoolById(id);
+    }
+}

+ 95 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/SysXPrizesPackageServiceImpl.java

@@ -0,0 +1,95 @@
+package com.ruoyi.system.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.system.mapper.SysXPrizesPackageMapper;
+import com.ruoyi.system.domain.SysXPrizesPackage;
+import com.ruoyi.system.service.ISysXPrizesPackageService;
+
+/**
+ * 奖品背包Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2025-07-22
+ */
+@Service
+public class SysXPrizesPackageServiceImpl implements ISysXPrizesPackageService 
+{
+    @Autowired
+    private SysXPrizesPackageMapper sysXPrizesPackageMapper;
+
+    /**
+     * 查询奖品背包
+     * 
+     * @param id 奖品背包主键
+     * @return 奖品背包
+     */
+    @Override
+    public SysXPrizesPackage selectSysXPrizesPackageById(Long id)
+    {
+        return sysXPrizesPackageMapper.selectSysXPrizesPackageById(id);
+    }
+
+    /**
+     * 查询奖品背包列表
+     * 
+     * @param sysXPrizesPackage 奖品背包
+     * @return 奖品背包
+     */
+    @Override
+    public List<SysXPrizesPackage> selectSysXPrizesPackageList(SysXPrizesPackage sysXPrizesPackage)
+    {
+        return sysXPrizesPackageMapper.selectSysXPrizesPackageList(sysXPrizesPackage);
+    }
+
+    /**
+     * 新增奖品背包
+     * 
+     * @param sysXPrizesPackage 奖品背包
+     * @return 结果
+     */
+    @Override
+    public int insertSysXPrizesPackage(SysXPrizesPackage sysXPrizesPackage)
+    {
+        sysXPrizesPackage.setCreateTime(DateUtils.getNowDate());
+        return sysXPrizesPackageMapper.insertSysXPrizesPackage(sysXPrizesPackage);
+    }
+
+    /**
+     * 修改奖品背包
+     * 
+     * @param sysXPrizesPackage 奖品背包
+     * @return 结果
+     */
+    @Override
+    public int updateSysXPrizesPackage(SysXPrizesPackage sysXPrizesPackage)
+    {
+        return sysXPrizesPackageMapper.updateSysXPrizesPackage(sysXPrizesPackage);
+    }
+
+    /**
+     * 批量删除奖品背包
+     * 
+     * @param ids 需要删除的奖品背包主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysXPrizesPackageByIds(Long[] ids)
+    {
+        return sysXPrizesPackageMapper.deleteSysXPrizesPackageByIds(ids);
+    }
+
+    /**
+     * 删除奖品背包信息
+     * 
+     * @param id 奖品背包主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysXPrizesPackageById(Long id)
+    {
+        return sysXPrizesPackageMapper.deleteSysXPrizesPackageById(id);
+    }
+}

+ 93 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/SysXPrizesServiceImpl.java

@@ -0,0 +1,93 @@
+package com.ruoyi.system.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.system.mapper.SysXPrizesMapper;
+import com.ruoyi.system.domain.SysXPrizes;
+import com.ruoyi.system.service.ISysXPrizesService;
+
+/**
+ * 奖品池Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2025-07-19
+ */
+@Service
+public class SysXPrizesServiceImpl implements ISysXPrizesService 
+{
+    @Autowired
+    private SysXPrizesMapper sysXPrizesMapper;
+
+    /**
+     * 查询奖品池
+     * 
+     * @param id 奖品池主键
+     * @return 奖品池
+     */
+    @Override
+    public SysXPrizes selectSysXPrizesById(Long id)
+    {
+        return sysXPrizesMapper.selectSysXPrizesById(id);
+    }
+
+    /**
+     * 查询奖品池列表
+     * 
+     * @param sysXPrizes 奖品池
+     * @return 奖品池
+     */
+    @Override
+    public List<SysXPrizes> selectSysXPrizesList(SysXPrizes sysXPrizes)
+    {
+        return sysXPrizesMapper.selectSysXPrizesList(sysXPrizes);
+    }
+
+    /**
+     * 新增奖品池
+     * 
+     * @param sysXPrizes 奖品池
+     * @return 结果
+     */
+    @Override
+    public int insertSysXPrizes(SysXPrizes sysXPrizes)
+    {
+        return sysXPrizesMapper.insertSysXPrizes(sysXPrizes);
+    }
+
+    /**
+     * 修改奖品池
+     * 
+     * @param sysXPrizes 奖品池
+     * @return 结果
+     */
+    @Override
+    public int updateSysXPrizes(SysXPrizes sysXPrizes)
+    {
+        return sysXPrizesMapper.updateSysXPrizes(sysXPrizes);
+    }
+
+    /**
+     * 批量删除奖品池
+     * 
+     * @param ids 需要删除的奖品池主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysXPrizesByIds(Long[] ids)
+    {
+        return sysXPrizesMapper.deleteSysXPrizesByIds(ids);
+    }
+
+    /**
+     * 删除奖品池信息
+     * 
+     * @param id 奖品池主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysXPrizesById(Long id)
+    {
+        return sysXPrizesMapper.deleteSysXPrizesById(id);
+    }
+}

+ 93 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/SysXProbabilitiesServiceImpl.java

@@ -0,0 +1,93 @@
+package com.ruoyi.system.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.system.mapper.SysXProbabilitiesMapper;
+import com.ruoyi.system.domain.SysXProbabilities;
+import com.ruoyi.system.service.ISysXProbabilitiesService;
+
+/**
+ * 概率设置Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2025-07-19
+ */
+@Service
+public class SysXProbabilitiesServiceImpl implements ISysXProbabilitiesService 
+{
+    @Autowired
+    private SysXProbabilitiesMapper sysXProbabilitiesMapper;
+
+    /**
+     * 查询概率设置
+     * 
+     * @param id 概率设置主键
+     * @return 概率设置
+     */
+    @Override
+    public SysXProbabilities selectSysXProbabilitiesById(Long id)
+    {
+        return sysXProbabilitiesMapper.selectSysXProbabilitiesById(id);
+    }
+
+    /**
+     * 查询概率设置列表
+     * 
+     * @param sysXProbabilities 概率设置
+     * @return 概率设置
+     */
+    @Override
+    public List<SysXProbabilities> selectSysXProbabilitiesList(SysXProbabilities sysXProbabilities)
+    {
+        return sysXProbabilitiesMapper.selectSysXProbabilitiesList(sysXProbabilities);
+    }
+
+    /**
+     * 新增概率设置
+     * 
+     * @param sysXProbabilities 概率设置
+     * @return 结果
+     */
+    @Override
+    public int insertSysXProbabilities(SysXProbabilities sysXProbabilities)
+    {
+        return sysXProbabilitiesMapper.insertSysXProbabilities(sysXProbabilities);
+    }
+
+    /**
+     * 修改概率设置
+     * 
+     * @param sysXProbabilities 概率设置
+     * @return 结果
+     */
+    @Override
+    public int updateSysXProbabilities(SysXProbabilities sysXProbabilities)
+    {
+        return sysXProbabilitiesMapper.updateSysXProbabilities(sysXProbabilities);
+    }
+
+    /**
+     * 批量删除概率设置
+     * 
+     * @param ids 需要删除的概率设置主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysXProbabilitiesByIds(Long[] ids)
+    {
+        return sysXProbabilitiesMapper.deleteSysXProbabilitiesByIds(ids);
+    }
+
+    /**
+     * 删除概率设置信息
+     * 
+     * @param id 概率设置主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysXProbabilitiesById(Long id)
+    {
+        return sysXProbabilitiesMapper.deleteSysXProbabilitiesById(id);
+    }
+}

+ 10 - 10
ruoyi-admin/src/main/resources/application-druid.yml

@@ -4,18 +4,18 @@ spring:
         type: com.alibaba.druid.pool.DruidDataSource
         driverClassName: com.mysql.cj.jdbc.Driver
         druid:
-            # 主库数据源
+            # 系统数据库
             master:
-                url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-                username: root
-                password: password
-            # 从库数据源
+                url: jdbc:mysql://180.188.21.23:3306/longdao_11300?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                username: admin11300/23df3kfa;312'
+                password: admin11300/23df3kfa;312'
+            # 业务数据库
             slave:
                 # 从数据源开关/默认关闭
                 enabled: false
-                url: 
-                username: 
-                password: 
+                url:
+                username:
+                password:
             # 初始连接数
             initialSize: 5
             # 最小连接池数量
@@ -39,7 +39,7 @@ spring:
             testWhileIdle: true
             testOnBorrow: false
             testOnReturn: false
-            webStatFilter: 
+            webStatFilter:
                 enabled: true
             statViewServlet:
                 enabled: true
@@ -58,4 +58,4 @@ spring:
                     merge-sql: true
                 wall:
                     config:
-                        multi-statement-allow: true
+                        multi-statement-allow: true

+ 11 - 0
ruoyi-admin/src/main/resources/application.yml

@@ -127,3 +127,14 @@ xss:
   excludes: /system/notice
   # 匹配链接
   urlPatterns: /system/*,/monitor/*,/tool/*
+
+# 微信支付
+wechat:
+  appid: wx9eba8bb9cb843644
+  # 商户号
+  mch_id: 1722849854
+  # 密钥
+  # B5D4rnsKpcbGBhtzz7ZH4PUuvF8Y3TpD
+  api_key: "B5D4rnsKpcbGBhtzz7ZH4PUuvF8Y3TpD"
+  # 回调地址
+  notify_url: http://kldlongdao.com/LotteryPage/

+ 153 - 0
ruoyi-admin/src/main/resources/mapper/system/DbUsersMapper.xml

@@ -0,0 +1,153 @@
+<?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.ruoyi.system.mapper.DbUsersMapper">
+
+    <resultMap type="DbUsers" id="DbUsersResult">
+        <result property="SteamID"    column="SteamID"    />
+        <result property="zhanghao"    column="zhanghao"    />
+        <result property="mima"    column="mima"    />
+        <result property="jifen"    column="jifen"    />
+        <result property="level"    column="level"    />
+        <result property="regtime"    column="regtime"    />
+        <result property="qiandaotime"    column="qiandaotime"    />
+        <result property="SteamName"    column="SteamName"    />
+        <result property="GameStatus"    column="GameStatus"    />
+        <result property="killed"    column="killed"    />
+        <result property="shadi"    column="shadi"    />
+        <result property="onlinetime"    column="onlinetime"    />
+        <result property="konglong"    column="konglong"    />
+        <result property="isshouchong"    column="isshouchong"    />
+        <result property="clanId"    column="clan_id"    />
+        <result property="lastConnectTime"    column="last_connect_time"    />
+        <result property="prefix"    column="prefix"    />
+        <result property="lastConnectIp"    column="last_connect_ip"    />
+        <result property="X"    column="X"    />
+        <result property="Y"    column="Y"    />
+        <result property="Z"    column="Z"    />
+    </resultMap>
+
+    <sql id="selectDbUsersVo">
+        select SteamID, zhanghao, mima, jifen, level, regtime, qiandaotime, SteamName, GameStatus, killed, shadi, onlinetime, konglong, isshouchong, clan_id, last_connect_time, prefix, last_connect_ip, X, Y, Z from db_users
+    </sql>
+
+    <select id="selectDbUsersList" parameterType="DbUsers" resultMap="DbUsersResult">
+        <include refid="selectDbUsersVo"/>
+        <where>
+            <if test="zhanghao != null  and zhanghao != ''"> and zhanghao = #{zhanghao}</if>
+            <if test="mima != null  and mima != ''"> and mima = #{mima}</if>
+            <if test="jifen != null "> and jifen = #{jifen}</if>
+            <if test="level != null "> and level = #{level}</if>
+            <if test="regtime != null "> and regtime = #{regtime}</if>
+            <if test="qiandaotime != null  and qiandaotime != ''"> and qiandaotime = #{qiandaotime}</if>
+            <if test="SteamName != null  and SteamName != ''"> and SteamName like concat('%', #{SteamName}, '%')</if>
+            <if test="GameStatus != null  and GameStatus != ''"> and GameStatus = #{GameStatus}</if>
+            <if test="killed != null "> and killed = #{killed}</if>
+            <if test="shadi != null "> and shadi = #{shadi}</if>
+            <if test="onlinetime != null "> and onlinetime = #{onlinetime}</if>
+            <if test="konglong != null  and konglong != ''"> and konglong = #{konglong}</if>
+            <if test="isshouchong != null "> and isshouchong = #{isshouchong}</if>
+            <if test="clanId != null "> and clan_id = #{clanId}</if>
+            <if test="lastConnectTime != null "> and last_connect_time = #{lastConnectTime}</if>
+            <if test="prefix != null  and prefix != ''"> and prefix = #{prefix}</if>
+            <if test="lastConnectIp != null  and lastConnectIp != ''"> and last_connect_ip = #{lastConnectIp}</if>
+            <if test="X != null "> and X = #{X}</if>
+            <if test="Y != null "> and Y = #{Y}</if>
+            <if test="Z != null "> and Z = #{Z}</if>
+        </where>
+    </select>
+
+    <select id="selectDbUsersBySteamID" parameterType="String" resultMap="DbUsersResult">
+        <include refid="selectDbUsersVo"/>
+        where SteamID = #{SteamID}
+    </select>
+
+    <insert id="insertDbUsers" parameterType="DbUsers">
+        insert into db_users
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="SteamID != null">SteamID,</if>
+            <if test="zhanghao != null">zhanghao,</if>
+            <if test="mima != null">mima,</if>
+            <if test="jifen != null">jifen,</if>
+            <if test="level != null">level,</if>
+            <if test="regtime != null">regtime,</if>
+            <if test="qiandaotime != null">qiandaotime,</if>
+            <if test="SteamName != null">SteamName,</if>
+            <if test="GameStatus != null">GameStatus,</if>
+            <if test="killed != null">killed,</if>
+            <if test="shadi != null">shadi,</if>
+            <if test="onlinetime != null">onlinetime,</if>
+            <if test="konglong != null">konglong,</if>
+            <if test="isshouchong != null">isshouchong,</if>
+            <if test="clanId != null">clan_id,</if>
+            <if test="lastConnectTime != null">last_connect_time,</if>
+            <if test="prefix != null">prefix,</if>
+            <if test="lastConnectIp != null">last_connect_ip,</if>
+            <if test="X != null">X,</if>
+            <if test="Y != null">Y,</if>
+            <if test="Z != null">Z,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="SteamID != null">#{SteamID},</if>
+            <if test="zhanghao != null">#{zhanghao},</if>
+            <if test="mima != null">#{mima},</if>
+            <if test="jifen != null">#{jifen},</if>
+            <if test="level != null">#{level},</if>
+            <if test="regtime != null">#{regtime},</if>
+            <if test="qiandaotime != null">#{qiandaotime},</if>
+            <if test="SteamName != null">#{SteamName},</if>
+            <if test="GameStatus != null">#{GameStatus},</if>
+            <if test="killed != null">#{killed},</if>
+            <if test="shadi != null">#{shadi},</if>
+            <if test="onlinetime != null">#{onlinetime},</if>
+            <if test="konglong != null">#{konglong},</if>
+            <if test="isshouchong != null">#{isshouchong},</if>
+            <if test="clanId != null">#{clanId},</if>
+            <if test="lastConnectTime != null">#{lastConnectTime},</if>
+            <if test="prefix != null">#{prefix},</if>
+            <if test="lastConnectIp != null">#{lastConnectIp},</if>
+            <if test="X != null">#{X},</if>
+            <if test="Y != null">#{Y},</if>
+            <if test="Z != null">#{Z},</if>
+         </trim>
+    </insert>
+
+    <update id="updateDbUsers" parameterType="DbUsers">
+        update db_users
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="zhanghao != null">zhanghao = #{zhanghao},</if>
+            <if test="mima != null">mima = #{mima},</if>
+            <if test="jifen != null">jifen = #{jifen},</if>
+            <if test="level != null">level = #{level},</if>
+            <if test="regtime != null">regtime = #{regtime},</if>
+            <if test="qiandaotime != null">qiandaotime = #{qiandaotime},</if>
+            <if test="SteamName != null">SteamName = #{SteamName},</if>
+            <if test="GameStatus != null">GameStatus = #{GameStatus},</if>
+            <if test="killed != null">killed = #{killed},</if>
+            <if test="shadi != null">shadi = #{shadi},</if>
+            <if test="onlinetime != null">onlinetime = #{onlinetime},</if>
+            <if test="konglong != null">konglong = #{konglong},</if>
+            <if test="isshouchong != null">isshouchong = #{isshouchong},</if>
+            <if test="clanId != null">clan_id = #{clanId},</if>
+            <if test="lastConnectTime != null">last_connect_time = #{lastConnectTime},</if>
+            <if test="prefix != null">prefix = #{prefix},</if>
+            <if test="lastConnectIp != null">last_connect_ip = #{lastConnectIp},</if>
+            <if test="X != null">X = #{X},</if>
+            <if test="Y != null">Y = #{Y},</if>
+            <if test="Z != null">Z = #{Z},</if>
+        </trim>
+        where SteamID = #{SteamID}
+    </update>
+
+    <delete id="deleteDbUsersBySteamID" parameterType="Long">
+        delete from db_users where SteamID = #{SteamID}
+    </delete>
+
+    <delete id="deleteDbUsersBySteamIDs" parameterType="String">
+        delete from db_users where SteamID in
+        <foreach item="SteamID" collection="array" open="(" separator="," close=")">
+            #{SteamID}
+        </foreach>
+    </delete>
+</mapper>

+ 81 - 0
ruoyi-admin/src/main/resources/mapper/system/SysXPoolCountMapper.xml

@@ -0,0 +1,81 @@
+<?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.ruoyi.system.mapper.SysXPoolCountMapper">
+    
+    <resultMap type="SysXPoolCount" id="SysXPoolCountResult">
+        <result property="id"    column="id"    />
+        <result property="steamId"    column="steam_id"    />
+        <result property="zhanghao"    column="zhanghao"    />
+        <result property="steamName"    column="steam_name"    />
+        <result property="poolId"    column="pool_id"    />
+        <result property="poolName"    column="pool_name"    />
+        <result property="count"    column="count"    />
+    </resultMap>
+
+    <sql id="selectSysXPoolCountVo">
+        select id, steam_id, zhanghao, steam_name, pool_id, pool_name, count from sys_x_pool_count
+    </sql>
+
+    <select id="selectSysXPoolCountList" parameterType="SysXPoolCount" resultMap="SysXPoolCountResult">
+        <include refid="selectSysXPoolCountVo"/>
+        <where>  
+            <if test="steamId != null "> and steam_id = #{steamId}</if>
+            <if test="zhanghao != null  and zhanghao != ''"> and zhanghao = #{zhanghao}</if>
+            <if test="steamName != null  and steamName != ''"> and steam_name like concat('%', #{steamName}, '%')</if>
+            <if test="poolId != null "> and pool_id = #{poolId}</if>
+            <if test="poolName != null  and poolName != ''"> and pool_name like concat('%', #{poolName}, '%')</if>
+            <if test="count != null "> and count = #{count}</if>
+        </where>
+    </select>
+    
+    <select id="selectSysXPoolCountById" parameterType="Long" resultMap="SysXPoolCountResult">
+        <include refid="selectSysXPoolCountVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertSysXPoolCount" parameterType="SysXPoolCount" useGeneratedKeys="true" keyProperty="id">
+        insert into sys_x_pool_count
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="steamId != null">steam_id,</if>
+            <if test="zhanghao != null">zhanghao,</if>
+            <if test="steamName != null">steam_name,</if>
+            <if test="poolId != null">pool_id,</if>
+            <if test="poolName != null">pool_name,</if>
+            <if test="count != null">count,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="steamId != null">#{steamId},</if>
+            <if test="zhanghao != null">#{zhanghao},</if>
+            <if test="steamName != null">#{steamName},</if>
+            <if test="poolId != null">#{poolId},</if>
+            <if test="poolName != null">#{poolName},</if>
+            <if test="count != null">#{count},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSysXPoolCount" parameterType="SysXPoolCount">
+        update sys_x_pool_count
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="steamId != null">steam_id = #{steamId},</if>
+            <if test="zhanghao != null">zhanghao = #{zhanghao},</if>
+            <if test="steamName != null">steam_name = #{steamName},</if>
+            <if test="poolId != null">pool_id = #{poolId},</if>
+            <if test="poolName != null">pool_name = #{poolName},</if>
+            <if test="count != null">count = #{count},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteSysXPoolCountById" parameterType="Long">
+        delete from sys_x_pool_count where id = #{id}
+    </delete>
+
+    <delete id="deleteSysXPoolCountByIds" parameterType="String">
+        delete from sys_x_pool_count where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 91 - 0
ruoyi-admin/src/main/resources/mapper/system/SysXPoolMapper.xml

@@ -0,0 +1,91 @@
+<?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.ruoyi.system.mapper.SysXPoolMapper">
+
+    <resultMap type="SysXPool" id="SysXPoolResult">
+        <result property="id"    column="id"    />
+        <result property="title"    column="title"    />
+        <result property="price"    column="price"    />
+        <result property="description"    column="description"    />
+        <result property="borderColor"    column="borderColor"    />
+        <result property="bgColor"    column="bgColor"    />
+        <result property="textColor"    column="textColor"    />
+        <result property="fullDescription"    column="fullDescription"    />
+        <result property="count"    column="count"    />
+    </resultMap>
+
+    <sql id="selectSysXPoolVo">
+        select id, title, price, description, borderColor, bgColor, textColor, fullDescription, count from sys_x_pool
+    </sql>
+
+    <select id="selectSysXPoolList" parameterType="SysXPool" resultMap="SysXPoolResult">
+        <include refid="selectSysXPoolVo"/>
+        <where>
+            <if test="title != null  and title != ''"> and title = #{title}</if>
+            <if test="price != null  and price != ''"> and price = #{price}</if>
+            <if test="description != null  and description != ''"> and description = #{description}</if>
+            <if test="borderColor != null  and borderColor != ''"> and borderColor = #{borderColor}</if>
+            <if test="bgColor != null  and bgColor != ''"> and bgColor = #{bgColor}</if>
+            <if test="textColor != null  and textColor != ''"> and textColor = #{textColor}</if>
+            <if test="fullDescription != null  and fullDescription != ''"> and fullDescription = #{fullDescription}</if>
+            <if test="count != null  and count != ''"> and `count` = #{count}</if>
+        </where>
+    </select>
+
+    <select id="selectSysXPoolById" parameterType="Long" resultMap="SysXPoolResult">
+        <include refid="selectSysXPoolVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertSysXPool" parameterType="SysXPool" useGeneratedKeys="true" keyProperty="id">
+        insert into sys_x_pool
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="title != null">title,</if>
+            <if test="price != null">price,</if>
+            <if test="description != null">description,</if>
+            <if test="borderColor != null">borderColor,</if>
+            <if test="bgColor != null">bgColor,</if>
+            <if test="textColor != null">textColor,</if>
+            <if test="fullDescription != null">fullDescription,</if>
+            <if test="count != null">`count`,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="title != null">#{title},</if>
+            <if test="price != null">#{price},</if>
+            <if test="description != null">#{description},</if>
+            <if test="borderColor != null">#{borderColor},</if>
+            <if test="bgColor != null">#{bgColor},</if>
+            <if test="textColor != null">#{textColor},</if>
+            <if test="fullDescription != null">#{fullDescription},</if>
+            <if test="count != null">#{count},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSysXPool" parameterType="SysXPool">
+        update sys_x_pool
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="title != null">title = #{title},</if>
+            <if test="price != null">price = #{price},</if>
+            <if test="description != null">description = #{description},</if>
+            <if test="borderColor != null">borderColor = #{borderColor},</if>
+            <if test="bgColor != null">bgColor = #{bgColor},</if>
+            <if test="textColor != null">textColor = #{textColor},</if>
+            <if test="fullDescription != null">fullDescription = #{fullDescription},</if>
+            <if test="count != null">`count` = #{count},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteSysXPoolById" parameterType="Long">
+        delete from sys_x_pool where id = #{id}
+    </delete>
+
+    <delete id="deleteSysXPoolByIds" parameterType="String">
+        delete from sys_x_pool where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 81 - 0
ruoyi-admin/src/main/resources/mapper/system/SysXPrizesMapper.xml

@@ -0,0 +1,81 @@
+<?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.ruoyi.system.mapper.SysXPrizesMapper">
+    
+    <resultMap type="SysXPrizes" id="SysXPrizesResult">
+        <result property="id"    column="id"    />
+        <result property="name"    column="name"    />
+        <result property="quality"    column="quality"    />
+        <result property="bgColor"    column="bgColor"    />
+        <result property="textColor"    column="textColor"    />
+        <result property="fullDescription"    column="fullDescription"    />
+        <result property="poolId"    column="pool_id"    />
+    </resultMap>
+
+    <sql id="selectSysXPrizesVo">
+        select id, name, quality, bgColor, textColor, fullDescription, pool_id from sys_x_prizes
+    </sql>
+
+    <select id="selectSysXPrizesList" parameterType="SysXPrizes" resultMap="SysXPrizesResult">
+        <include refid="selectSysXPrizesVo"/>
+        <where>  
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="quality != null  and quality != ''"> and quality = #{quality}</if>
+            <if test="bgColor != null  and bgColor != ''"> and bgColor = #{bgColor}</if>
+            <if test="textColor != null  and textColor != ''"> and textColor = #{textColor}</if>
+            <if test="fullDescription != null  and fullDescription != ''"> and fullDescription = #{fullDescription}</if>
+            <if test="poolId != null "> and pool_id = #{poolId}</if>
+        </where>
+    </select>
+    
+    <select id="selectSysXPrizesById" parameterType="Long" resultMap="SysXPrizesResult">
+        <include refid="selectSysXPrizesVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertSysXPrizes" parameterType="SysXPrizes" useGeneratedKeys="true" keyProperty="id">
+        insert into sys_x_prizes
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="name != null">name,</if>
+            <if test="quality != null">quality,</if>
+            <if test="bgColor != null">bgColor,</if>
+            <if test="textColor != null">textColor,</if>
+            <if test="fullDescription != null">fullDescription,</if>
+            <if test="poolId != null">pool_id,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="name != null">#{name},</if>
+            <if test="quality != null">#{quality},</if>
+            <if test="bgColor != null">#{bgColor},</if>
+            <if test="textColor != null">#{textColor},</if>
+            <if test="fullDescription != null">#{fullDescription},</if>
+            <if test="poolId != null">#{poolId},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSysXPrizes" parameterType="SysXPrizes">
+        update sys_x_prizes
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="name != null">name = #{name},</if>
+            <if test="quality != null">quality = #{quality},</if>
+            <if test="bgColor != null">bgColor = #{bgColor},</if>
+            <if test="textColor != null">textColor = #{textColor},</if>
+            <if test="fullDescription != null">fullDescription = #{fullDescription},</if>
+            <if test="poolId != null">pool_id = #{poolId},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteSysXPrizesById" parameterType="Long">
+        delete from sys_x_prizes where id = #{id}
+    </delete>
+
+    <delete id="deleteSysXPrizesByIds" parameterType="String">
+        delete from sys_x_prizes where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 105 - 0
ruoyi-admin/src/main/resources/mapper/system/SysXPrizesPackageMapper.xml

@@ -0,0 +1,105 @@
+<?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.ruoyi.system.mapper.SysXPrizesPackageMapper">
+    
+    <resultMap type="SysXPrizesPackage" id="SysXPrizesPackageResult">
+        <result property="id"    column="id"    />
+        <result property="steamId"    column="steam_id"    />
+        <result property="zhanghao"    column="zhanghao"    />
+        <result property="steamName"    column="steam_name"    />
+        <result property="poolId"    column="pool_id"    />
+        <result property="poolName"    column="pool_name"    />
+        <result property="prizeId"    column="prize_id"    />
+        <result property="prizeName"    column="prize_name"    />
+        <result property="quality"    column="quality"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="isCheck"    column="is_check"    />
+        <result property="checkTime"    column="check_time"    />
+    </resultMap>
+
+    <sql id="selectSysXPrizesPackageVo">
+        select id, steam_id, zhanghao, steam_name, pool_id, pool_name, prize_id, prize_name, quality, create_time, is_check, check_time from sys_x_prizes_package
+    </sql>
+
+    <select id="selectSysXPrizesPackageList" parameterType="SysXPrizesPackage" resultMap="SysXPrizesPackageResult">
+        <include refid="selectSysXPrizesPackageVo"/>
+        <where>  
+            <if test="steamId != null "> and steam_id = #{steamId}</if>
+            <if test="zhanghao != null  and zhanghao != ''"> and zhanghao = #{zhanghao}</if>
+            <if test="steamName != null  and steamName != ''"> and steam_name like concat('%', #{steamName}, '%')</if>
+            <if test="poolId != null "> and pool_id = #{poolId}</if>
+            <if test="poolName != null  and poolName != ''"> and pool_name like concat('%', #{poolName}, '%')</if>
+            <if test="prizeId != null  and prizeId != ''"> and prize_id = #{prizeId}</if>
+            <if test="prizeName != null  and prizeName != ''"> and prize_name like concat('%', #{prizeName}, '%')</if>
+            <if test="quality != null  and quality != ''"> and quality = #{quality}</if>
+            <if test="isCheck != null "> and is_check = #{isCheck}</if>
+            <if test="checkTime != null "> and check_time = #{checkTime}</if>
+        </where>
+    </select>
+    
+    <select id="selectSysXPrizesPackageById" parameterType="Long" resultMap="SysXPrizesPackageResult">
+        <include refid="selectSysXPrizesPackageVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertSysXPrizesPackage" parameterType="SysXPrizesPackage" useGeneratedKeys="true" keyProperty="id">
+        insert into sys_x_prizes_package
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="steamId != null">steam_id,</if>
+            <if test="zhanghao != null">zhanghao,</if>
+            <if test="steamName != null">steam_name,</if>
+            <if test="poolId != null">pool_id,</if>
+            <if test="poolName != null">pool_name,</if>
+            <if test="prizeId != null and prizeId != ''">prize_id,</if>
+            <if test="prizeName != null">prize_name,</if>
+            <if test="quality != null">quality,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="isCheck != null">is_check,</if>
+            <if test="checkTime != null">check_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="steamId != null">#{steamId},</if>
+            <if test="zhanghao != null">#{zhanghao},</if>
+            <if test="steamName != null">#{steamName},</if>
+            <if test="poolId != null">#{poolId},</if>
+            <if test="poolName != null">#{poolName},</if>
+            <if test="prizeId != null and prizeId != ''">#{prizeId},</if>
+            <if test="prizeName != null">#{prizeName},</if>
+            <if test="quality != null">#{quality},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="isCheck != null">#{isCheck},</if>
+            <if test="checkTime != null">#{checkTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSysXPrizesPackage" parameterType="SysXPrizesPackage">
+        update sys_x_prizes_package
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="steamId != null">steam_id = #{steamId},</if>
+            <if test="zhanghao != null">zhanghao = #{zhanghao},</if>
+            <if test="steamName != null">steam_name = #{steamName},</if>
+            <if test="poolId != null">pool_id = #{poolId},</if>
+            <if test="poolName != null">pool_name = #{poolName},</if>
+            <if test="prizeId != null and prizeId != ''">prize_id = #{prizeId},</if>
+            <if test="prizeName != null">prize_name = #{prizeName},</if>
+            <if test="quality != null">quality = #{quality},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="isCheck != null">is_check = #{isCheck},</if>
+            <if test="checkTime != null">check_time = #{checkTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteSysXPrizesPackageById" parameterType="Long">
+        delete from sys_x_prizes_package where id = #{id}
+    </delete>
+
+    <delete id="deleteSysXPrizesPackageByIds" parameterType="String">
+        delete from sys_x_prizes_package where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 71 - 0
ruoyi-admin/src/main/resources/mapper/system/SysXProbabilitiesMapper.xml

@@ -0,0 +1,71 @@
+<?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.ruoyi.system.mapper.SysXProbabilitiesMapper">
+    
+    <resultMap type="SysXProbabilities" id="SysXProbabilitiesResult">
+        <result property="id"    column="id"    />
+        <result property="name"    column="name"    />
+        <result property="value"    column="value"    />
+        <result property="colorClass"    column="colorClass"    />
+        <result property="poolId"    column="pool_id"    />
+    </resultMap>
+
+    <sql id="selectSysXProbabilitiesVo">
+        select id, name, value, colorClass, pool_id from sys_x_probabilities
+    </sql>
+
+    <select id="selectSysXProbabilitiesList" parameterType="SysXProbabilities" resultMap="SysXProbabilitiesResult">
+        <include refid="selectSysXProbabilitiesVo"/>
+        <where>  
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="value != null  and value != ''"> and value = #{value}</if>
+            <if test="colorClass != null  and colorClass != ''"> and colorClass = #{colorClass}</if>
+            <if test="poolId != null "> and pool_id = #{poolId}</if>
+        </where>
+    </select>
+    
+    <select id="selectSysXProbabilitiesById" parameterType="Long" resultMap="SysXProbabilitiesResult">
+        <include refid="selectSysXProbabilitiesVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertSysXProbabilities" parameterType="SysXProbabilities" useGeneratedKeys="true" keyProperty="id">
+        insert into sys_x_probabilities
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="name != null">name,</if>
+            <if test="value != null">value,</if>
+            <if test="colorClass != null">colorClass,</if>
+            <if test="poolId != null">pool_id,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="name != null">#{name},</if>
+            <if test="value != null">#{value},</if>
+            <if test="colorClass != null">#{colorClass},</if>
+            <if test="poolId != null">#{poolId},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSysXProbabilities" parameterType="SysXProbabilities">
+        update sys_x_probabilities
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="name != null">name = #{name},</if>
+            <if test="value != null">value = #{value},</if>
+            <if test="colorClass != null">colorClass = #{colorClass},</if>
+            <if test="poolId != null">pool_id = #{poolId},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteSysXProbabilitiesById" parameterType="Long">
+        delete from sys_x_probabilities where id = #{id}
+    </delete>
+
+    <delete id="deleteSysXProbabilitiesByIds" parameterType="String">
+        delete from sys_x_probabilities where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 4 - 3
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java

@@ -23,7 +23,7 @@ import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl;
 
 /**
  * spring security配置
- * 
+ *
  * @author ruoyi
  */
 @EnableMethodSecurity(prePostEnabled = true, securedEnabled = true)
@@ -35,7 +35,7 @@ public class SecurityConfig
      */
     @Autowired
     private UserDetailsService userDetailsService;
-    
+
     /**
      * 认证失败处理类
      */
@@ -53,7 +53,7 @@ public class SecurityConfig
      */
     @Autowired
     private JwtAuthenticationTokenFilter authenticationTokenFilter;
-    
+
     /**
      * 跨域过滤器
      */
@@ -115,6 +115,7 @@ public class SecurityConfig
                     // 静态资源,可匿名访问
                     .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                     .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
+                    .antMatchers("/**").permitAll()
                     // 除上面外的所有请求全部需要鉴权认证
                     .anyRequest().authenticated();
             })

+ 11 - 11
ruoyi-ui/.env.development

@@ -1,11 +1,11 @@
-# 页面标题
-VUE_APP_TITLE = 若依管理系统
-
-# 开发环境配置
-ENV = 'development'
-
-# 若依管理系统/开发环境
-VUE_APP_BASE_API = '/dev-api'
-
-# 路由懒加载
-VUE_CLI_BABEL_TRANSPILE_MODULES = true
+# 页面标题
+VUE_APP_TITLE = MHD龙岛后台
+
+# 开发环境配置
+ENV = 'development'
+
+# MHD龙岛后台/开发环境
+VUE_APP_BASE_API = '/dev-api'
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 8 - 8
ruoyi-ui/.env.production

@@ -1,8 +1,8 @@
-# 页面标题
-VUE_APP_TITLE = 若依管理系统
-
-# 生产环境配置
-ENV = 'production'
-
-# 若依管理系统/生产环境
-VUE_APP_BASE_API = '/prod-api'
+# 页面标题
+VUE_APP_TITLE = MHD龙岛后台
+
+# 生产环境配置
+ENV = 'production'
+
+# MHD龙岛后台/生产环境
+VUE_APP_BASE_API = '/prod-api'

+ 12 - 12
ruoyi-ui/.env.staging

@@ -1,12 +1,12 @@
-# 页面标题
-VUE_APP_TITLE = 若依管理系统
-
-BABEL_ENV = production
-
-NODE_ENV = production
-
-# 测试环境配置
-ENV = 'staging'
-
-# 若依管理系统/测试环境
-VUE_APP_BASE_API = '/stage-api'
+# 页面标题
+VUE_APP_TITLE = MHD龙岛后台
+
+BABEL_ENV = production
+
+NODE_ENV = production
+
+# 测试环境配置
+ENV = 'staging'
+
+# MHD龙岛后台/测试环境
+VUE_APP_BASE_API = '/stage-api'

+ 93 - 91
ruoyi-ui/package.json

@@ -1,91 +1,93 @@
-{
-  "name": "ruoyi",
-  "version": "3.8.9",
-  "description": "若依管理系统",
-  "author": "若依",
-  "license": "MIT",
-  "scripts": {
-    "dev": "vue-cli-service serve",
-    "build:prod": "vue-cli-service build",
-    "build:stage": "vue-cli-service build --mode staging",
-    "preview": "node build/index.js --preview",
-    "lint": "eslint --ext .js,.vue src"
-  },
-  "husky": {
-    "hooks": {
-      "pre-commit": "lint-staged"
-    }
-  },
-  "lint-staged": {
-    "src/**/*.{js,vue}": [
-      "eslint --fix",
-      "git add"
-    ]
-  },
-  "keywords": [
-    "vue",
-    "admin",
-    "dashboard",
-    "element-ui",
-    "boilerplate",
-    "admin-template",
-    "management-system"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "https://gitee.com/y_project/RuoYi-Vue.git"
-  },
-  "dependencies": {
-    "@riophae/vue-treeselect": "0.4.0",
-    "axios": "0.28.1",
-    "clipboard": "2.0.8",
-    "core-js": "3.37.1",
-    "echarts": "5.4.0",
-    "element-ui": "2.15.14",
-    "file-saver": "2.0.5",
-    "fuse.js": "6.4.3",
-    "highlight.js": "9.18.5",
-    "js-beautify": "1.13.0",
-    "js-cookie": "3.0.1",
-    "jsencrypt": "3.0.0-rc.1",
-    "nprogress": "0.2.0",
-    "quill": "2.0.2",
-    "screenfull": "5.0.2",
-    "sortablejs": "1.10.2",
-    "splitpanes": "2.4.1",
-    "vue": "2.6.12",
-    "vue-count-to": "1.0.13",
-    "vue-cropper": "0.5.5",
-    "vue-meta": "2.4.0",
-    "vue-router": "3.4.9",
-    "vuedraggable": "2.24.3",
-    "vuex": "3.6.0"
-  },
-  "devDependencies": {
-    "@vue/cli-plugin-babel": "4.4.6",
-    "@vue/cli-plugin-eslint": "4.4.6",
-    "@vue/cli-service": "4.4.6",
-    "babel-eslint": "10.1.0",
-    "babel-plugin-dynamic-import-node": "2.3.3",
-    "chalk": "4.1.0",
-    "compression-webpack-plugin": "6.1.2",
-    "connect": "3.6.6",
-    "eslint": "7.15.0",
-    "eslint-plugin-vue": "7.2.0",
-    "lint-staged": "10.5.3",
-    "runjs": "4.4.2",
-    "sass": "1.32.13",
-    "sass-loader": "10.1.1",
-    "script-ext-html-webpack-plugin": "2.1.5",
-    "svg-sprite-loader": "5.1.1",
-    "vue-template-compiler": "2.6.12"
-  },
-  "engines": {
-    "node": ">=8.9",
-    "npm": ">= 3.0.0"
-  },
-  "browserslist": [
-    "> 1%",
-    "last 2 versions"
-  ]
-}
+{
+  "name": "ruoyi",
+  "version": "3.8.9",
+  "description": "MHD龙岛后台",
+  "author": "MHD",
+  "license": "MIT",
+  "scripts": {
+    "npmgx": "npm install -g npm@11.0.0",
+    "init": "npm install",
+    "dev": "vue-cli-service serve",
+    "build:prod": "vue-cli-service build",
+    "build:stage": "vue-cli-service build --mode staging",
+    "preview": "node build/index.js --preview",
+    "lint": "eslint --ext .js,.vue src"
+  },
+  "husky": {
+    "hooks": {
+      "pre-commit": "lint-staged"
+    }
+  },
+  "lint-staged": {
+    "src/**/*.{js,vue}": [
+      "eslint --fix",
+      "git add"
+    ]
+  },
+  "keywords": [
+    "vue",
+    "admin",
+    "dashboard",
+    "element-ui",
+    "boilerplate",
+    "admin-template",
+    "management-system"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "https://gitee.com/y_project/RuoYi-Vue.git"
+  },
+  "dependencies": {
+    "@riophae/vue-treeselect": "0.4.0",
+    "axios": "0.28.1",
+    "clipboard": "2.0.8",
+    "core-js": "3.37.1",
+    "echarts": "5.4.0",
+    "element-ui": "2.15.14",
+    "file-saver": "2.0.5",
+    "fuse.js": "6.4.3",
+    "highlight.js": "9.18.5",
+    "js-beautify": "1.13.0",
+    "js-cookie": "3.0.1",
+    "jsencrypt": "3.0.0-rc.1",
+    "nprogress": "0.2.0",
+    "quill": "2.0.2",
+    "screenfull": "5.0.2",
+    "sortablejs": "1.10.2",
+    "splitpanes": "2.4.1",
+    "vue": "2.6.12",
+    "vue-count-to": "1.0.13",
+    "vue-cropper": "0.5.5",
+    "vue-meta": "2.4.0",
+    "vue-router": "3.4.9",
+    "vuedraggable": "2.24.3",
+    "vuex": "3.6.0"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "4.4.6",
+    "@vue/cli-plugin-eslint": "4.4.6",
+    "@vue/cli-service": "4.4.6",
+    "babel-eslint": "10.1.0",
+    "babel-plugin-dynamic-import-node": "2.3.3",
+    "chalk": "4.1.0",
+    "compression-webpack-plugin": "6.1.2",
+    "connect": "3.6.6",
+    "eslint": "7.15.0",
+    "eslint-plugin-vue": "7.2.0",
+    "lint-staged": "10.5.3",
+    "runjs": "4.4.2",
+    "sass": "1.32.13",
+    "sass-loader": "10.1.1",
+    "script-ext-html-webpack-plugin": "2.1.5",
+    "svg-sprite-loader": "5.1.1",
+    "vue-template-compiler": "2.6.12"
+  },
+  "engines": {
+    "node": ">=8.9",
+    "npm": ">= 3.0.0"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions"
+  ]
+}

+ 44 - 0
ruoyi-ui/src/api/system/count.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询抽奖次数列表
+export function listCount(query) {
+  return request({
+    url: '/system/count/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询抽奖次数详细
+export function getCount(id) {
+  return request({
+    url: '/system/count/' + id,
+    method: 'get'
+  })
+}
+
+// 新增抽奖次数
+export function addCount(data) {
+  return request({
+    url: '/system/count',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改抽奖次数
+export function updateCount(data) {
+  return request({
+    url: '/system/count',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除抽奖次数
+export function delCount(id) {
+  return request({
+    url: '/system/count/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/system/package.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询奖品背包列表
+export function listPackage(query) {
+  return request({
+    url: '/system/package/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询奖品背包详细
+export function getPackage(id) {
+  return request({
+    url: '/system/package/' + id,
+    method: 'get'
+  })
+}
+
+// 新增奖品背包
+export function addPackage(data) {
+  return request({
+    url: '/system/package',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改奖品背包
+export function updatePackage(data) {
+  return request({
+    url: '/system/package',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除奖品背包
+export function delPackage(id) {
+  return request({
+    url: '/system/package/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/system/pool.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询卡池列表
+export function listPool(query) {
+  return request({
+    url: '/system/pool/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询卡池详细
+export function getPool(id) {
+  return request({
+    url: '/system/pool/' + id,
+    method: 'get'
+  })
+}
+
+// 新增卡池
+export function addPool(data) {
+  return request({
+    url: '/system/pool',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改卡池
+export function updatePool(data) {
+  return request({
+    url: '/system/pool',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除卡池
+export function delPool(id) {
+  return request({
+    url: '/system/pool/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/system/prizes.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询奖品池列表
+export function listPrizes(query) {
+  return request({
+    url: '/system/prizes/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询奖品池详细
+export function getPrizes(id) {
+  return request({
+    url: '/system/prizes/' + id,
+    method: 'get'
+  })
+}
+
+// 新增奖品池
+export function addPrizes(data) {
+  return request({
+    url: '/system/prizes',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改奖品池
+export function updatePrizes(data) {
+  return request({
+    url: '/system/prizes',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除奖品池
+export function delPrizes(id) {
+  return request({
+    url: '/system/prizes/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/system/probabilities.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询概率设置列表
+export function listProbabilities(query) {
+  return request({
+    url: '/system/probabilities/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询概率设置详细
+export function getProbabilities(id) {
+  return request({
+    url: '/system/probabilities/' + id,
+    method: 'get'
+  })
+}
+
+// 新增概率设置
+export function addProbabilities(data) {
+  return request({
+    url: '/system/probabilities',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改概率设置
+export function updateProbabilities(data) {
+  return request({
+    url: '/system/probabilities',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除概率设置
+export function delProbabilities(id) {
+  return request({
+    url: '/system/probabilities/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ruoyi-ui/src/api/system/users.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询【请填写功能名称】列表
+export function listUsers(query) {
+  return request({
+    url: '/system/users/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询【请填写功能名称】详细
+export function getUsers(SteamID) {
+  return request({
+    url: '/system/users/' + SteamID,
+    method: 'get'
+  })
+}
+
+// 新增【请填写功能名称】
+export function addUsers(data) {
+  return request({
+    url: '/system/users',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改【请填写功能名称】
+export function updateUsers(data) {
+  return request({
+    url: '/system/users',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除【请填写功能名称】
+export function delUsers(SteamID) {
+  return request({
+    url: '/system/users/' + SteamID,
+    method: 'delete'
+  })
+}

+ 193 - 200
ruoyi-ui/src/layout/components/Navbar.vue

@@ -1,200 +1,193 @@
-<template>
-  <div class="navbar">
-    <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
-
-    <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav"/>
-    <top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/>
-
-    <div class="right-menu">
-      <template v-if="device!=='mobile'">
-        <search id="header-search" class="right-menu-item" />
-
-        <el-tooltip content="源码地址" effect="dark" placement="bottom">
-          <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />
-        </el-tooltip>
-
-        <el-tooltip content="文档地址" effect="dark" placement="bottom">
-          <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />
-        </el-tooltip>
-
-        <screenfull id="screenfull" class="right-menu-item hover-effect" />
-
-        <el-tooltip content="布局大小" effect="dark" placement="bottom">
-          <size-select id="size-select" class="right-menu-item hover-effect" />
-        </el-tooltip>
-
-      </template>
-
-      <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
-        <div class="avatar-wrapper">
-          <img :src="avatar" class="user-avatar">
-          <i class="el-icon-caret-bottom" />
-        </div>
-        <el-dropdown-menu slot="dropdown">
-          <router-link to="/user/profile">
-            <el-dropdown-item>个人中心</el-dropdown-item>
-          </router-link>
-          <el-dropdown-item @click.native="setting = true">
-            <span>布局设置</span>
-          </el-dropdown-item>
-          <el-dropdown-item divided @click.native="logout">
-            <span>退出登录</span>
-          </el-dropdown-item>
-        </el-dropdown-menu>
-      </el-dropdown>
-    </div>
-  </div>
-</template>
-
-<script>
-import { mapGetters } from 'vuex'
-import Breadcrumb from '@/components/Breadcrumb'
-import TopNav from '@/components/TopNav'
-import Hamburger from '@/components/Hamburger'
-import Screenfull from '@/components/Screenfull'
-import SizeSelect from '@/components/SizeSelect'
-import Search from '@/components/HeaderSearch'
-import RuoYiGit from '@/components/RuoYi/Git'
-import RuoYiDoc from '@/components/RuoYi/Doc'
-
-export default {
-  components: {
-    Breadcrumb,
-    TopNav,
-    Hamburger,
-    Screenfull,
-    SizeSelect,
-    Search,
-    RuoYiGit,
-    RuoYiDoc
-  },
-  computed: {
-    ...mapGetters([
-      'sidebar',
-      'avatar',
-      'device'
-    ]),
-    setting: {
-      get() {
-        return this.$store.state.settings.showSettings
-      },
-      set(val) {
-        this.$store.dispatch('settings/changeSetting', {
-          key: 'showSettings',
-          value: val
-        })
-      }
-    },
-    topNav: {
-      get() {
-        return this.$store.state.settings.topNav
-      }
-    }
-  },
-  methods: {
-    toggleSideBar() {
-      this.$store.dispatch('app/toggleSideBar')
-    },
-    async logout() {
-      this.$confirm('确定注销并退出系统吗?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(() => {
-        this.$store.dispatch('LogOut').then(() => {
-          location.href = '/index';
-        })
-      }).catch(() => {});
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.navbar {
-  height: 50px;
-  overflow: hidden;
-  position: relative;
-  background: #fff;
-  box-shadow: 0 1px 4px rgba(0,21,41,.08);
-
-  .hamburger-container {
-    line-height: 46px;
-    height: 100%;
-    float: left;
-    cursor: pointer;
-    transition: background .3s;
-    -webkit-tap-highlight-color:transparent;
-
-    &:hover {
-      background: rgba(0, 0, 0, .025)
-    }
-  }
-
-  .breadcrumb-container {
-    float: left;
-  }
-
-  .topmenu-container {
-    position: absolute;
-    left: 50px;
-  }
-
-  .errLog-container {
-    display: inline-block;
-    vertical-align: top;
-  }
-
-  .right-menu {
-    float: right;
-    height: 100%;
-    line-height: 50px;
-
-    &:focus {
-      outline: none;
-    }
-
-    .right-menu-item {
-      display: inline-block;
-      padding: 0 8px;
-      height: 100%;
-      font-size: 18px;
-      color: #5a5e66;
-      vertical-align: text-bottom;
-
-      &.hover-effect {
-        cursor: pointer;
-        transition: background .3s;
-
-        &:hover {
-          background: rgba(0, 0, 0, .025)
-        }
-      }
-    }
-
-    .avatar-container {
-      margin-right: 30px;
-
-      .avatar-wrapper {
-        margin-top: 5px;
-        position: relative;
-
-        .user-avatar {
-          cursor: pointer;
-          width: 40px;
-          height: 40px;
-          border-radius: 10px;
-        }
-
-        .el-icon-caret-bottom {
-          cursor: pointer;
-          position: absolute;
-          right: -20px;
-          top: 25px;
-          font-size: 12px;
-        }
-      }
-    }
-  }
-}
-</style>
+<template>
+  <div class="navbar">
+    <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
+
+    <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav"/>
+    <top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/>
+
+    <div class="right-menu">
+      <template v-if="device!=='mobile'">
+        <search id="header-search" class="right-menu-item" />
+
+
+        <screenfull id="screenfull" class="right-menu-item hover-effect" />
+
+        <el-tooltip content="布局大小" effect="dark" placement="bottom">
+          <size-select id="size-select" class="right-menu-item hover-effect" />
+        </el-tooltip>
+
+      </template>
+
+      <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
+        <div class="avatar-wrapper">
+          <img :src="avatar" class="user-avatar">
+          <i class="el-icon-caret-bottom" />
+        </div>
+        <el-dropdown-menu slot="dropdown">
+          <router-link to="/user/profile">
+            <el-dropdown-item>个人中心</el-dropdown-item>
+          </router-link>
+          <el-dropdown-item @click.native="setting = true">
+            <span>布局设置</span>
+          </el-dropdown-item>
+          <el-dropdown-item divided @click.native="logout">
+            <span>退出登录</span>
+          </el-dropdown-item>
+        </el-dropdown-menu>
+      </el-dropdown>
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+import Breadcrumb from '@/components/Breadcrumb'
+import TopNav from '@/components/TopNav'
+import Hamburger from '@/components/Hamburger'
+import Screenfull from '@/components/Screenfull'
+import SizeSelect from '@/components/SizeSelect'
+import Search from '@/components/HeaderSearch'
+import RuoYiGit from '@/components/RuoYi/Git'
+import RuoYiDoc from '@/components/RuoYi/Doc'
+
+export default {
+  components: {
+    Breadcrumb,
+    TopNav,
+    Hamburger,
+    Screenfull,
+    SizeSelect,
+    Search,
+    RuoYiGit,
+    RuoYiDoc
+  },
+  computed: {
+    ...mapGetters([
+      'sidebar',
+      'avatar',
+      'device'
+    ]),
+    setting: {
+      get() {
+        return this.$store.state.settings.showSettings
+      },
+      set(val) {
+        this.$store.dispatch('settings/changeSetting', {
+          key: 'showSettings',
+          value: val
+        })
+      }
+    },
+    topNav: {
+      get() {
+        return this.$store.state.settings.topNav
+      }
+    }
+  },
+  methods: {
+    toggleSideBar() {
+      this.$store.dispatch('app/toggleSideBar')
+    },
+    async logout() {
+      this.$confirm('确定注销并退出系统吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.$store.dispatch('LogOut').then(() => {
+          location.href = '/index';
+        })
+      }).catch(() => {});
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.navbar {
+  height: 50px;
+  overflow: hidden;
+  position: relative;
+  background: #fff;
+  box-shadow: 0 1px 4px rgba(0,21,41,.08);
+
+  .hamburger-container {
+    line-height: 46px;
+    height: 100%;
+    float: left;
+    cursor: pointer;
+    transition: background .3s;
+    -webkit-tap-highlight-color:transparent;
+
+    &:hover {
+      background: rgba(0, 0, 0, .025)
+    }
+  }
+
+  .breadcrumb-container {
+    float: left;
+  }
+
+  .topmenu-container {
+    position: absolute;
+    left: 50px;
+  }
+
+  .errLog-container {
+    display: inline-block;
+    vertical-align: top;
+  }
+
+  .right-menu {
+    float: right;
+    height: 100%;
+    line-height: 50px;
+
+    &:focus {
+      outline: none;
+    }
+
+    .right-menu-item {
+      display: inline-block;
+      padding: 0 8px;
+      height: 100%;
+      font-size: 18px;
+      color: #5a5e66;
+      vertical-align: text-bottom;
+
+      &.hover-effect {
+        cursor: pointer;
+        transition: background .3s;
+
+        &:hover {
+          background: rgba(0, 0, 0, .025)
+        }
+      }
+    }
+
+    .avatar-container {
+      margin-right: 30px;
+
+      .avatar-wrapper {
+        margin-top: 5px;
+        position: relative;
+
+        .user-avatar {
+          cursor: pointer;
+          width: 40px;
+          height: 40px;
+          border-radius: 10px;
+        }
+
+        .el-icon-caret-bottom {
+          cursor: pointer;
+          position: absolute;
+          right: -20px;
+          top: 25px;
+          font-size: 12px;
+        }
+      }
+    }
+  }
+}
+</style>

+ 23 - 1136
ruoyi-ui/src/views/index.vue

@@ -1,1136 +1,23 @@
-<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> <s> 满138988063 </s> <a href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=SUc-msaypcqB2UTFif4eqGlBHkKcvMNP&authKey=JdQBouY2PG%2BS%2BCzAfIgbCGNgxyahpfh24IW%2F03rPxGilhqVbisLma%2FFFnt79DHNh&noverify=0&group_code=151450850" target="_blank">151450850</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.9 - 2024-12-30">
-              <ol>
-                <li>用户管理支持分栏拖动</li>
-                <li>修改主题样式本地读取</li>
-                <li>用户头像http(s)链接支持</li>
-                <li>用户管理过滤掉已禁用部门</li>
-                <li>支持自定义显示Excel属性列</li>
-                <li>操作日志记录DELETE请求参数</li>
-                <li>白名单支持对通配符路径匹配</li>
-                <li>校检文件名是否包含特殊字符</li>
-                <li>代码生成创建表屏蔽违规的字符</li>
-                <li>菜单面包屑导航支持多层级显示</li>
-                <li>Excel注解支持wrapText是否允许内容换行</li>
-                <li>代码生成新增配置是否允许文件覆盖到本地</li>
-                <li>修复角色禁用权限不失效问题</li>
-                <li>修复代码生成上级菜单显示问题</li>
-                <li>修复导出子列表对象只能在最后的问题</li>
-                <li>修复TopNav无法正确获取active的问题</li>
-                <li>修复默认关闭Tags-Views内链页面打不开</li>
-                <li>升级oshi到最新版本6.6.5</li>
-                <li>升级tomcat到最新版本9.0.96</li>
-                <li>升级fastjson到最新版2.0.53</li>
-                <li>升级logback到最新版本1.2.13</li>
-                <li>升级spring-framework到最新版本5.3.39</li>
-                <li>升级quill到最新版本2.0.2</li>
-                <li>升级axios到最新版本0.28.1</li>
-                <li>优化身份证脱敏正则</li>
-                <li>优化权限更新后同步缓存</li>
-                <li>优化查询时间范围日期格式</li>
-                <li>优化参数键值更换为多行文本</li>
-                <li>优化导入带标题文件关闭清理</li>
-                <li>优化上传图片带域名不增加前缀</li>
-                <li>优化特殊字符密码修改失败问题</li>
-                <li>优化无用户编号不校验数据权限</li>
-                <li>优化TopNav内链菜单点击没有高亮</li>
-                <li>优化菜单管理切换Mini布局错乱问题</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.8 - 2024-06-30">
-              <ol>
-                <li>菜单管理新增路由名称</li>
-                <li>新增数据脱敏过滤注解</li>
-                <li>用户密码新增非法字符验证</li>
-                <li>限制用户操作数据权限范围</li>
-                <li>代码生成新增创建表结构功能</li>
-                <li>定时任务白名单配置范围缩小</li>
-                <li>优化代码生成主子表关联查询方式</li>
-                <li>Excel注解新增属性comboReadDict</li>
-                <li>Excel注解ColumnType类型新增文本</li>
-                <li>新增国际化资源文件配置</li>
-                <li>升级oshi到最新版本6.6.1</li>
-                <li>升级druid到最新版本1.2.23</li>
-                <li>升级core-js到最新版本3.37.1</li>
-                <li>更新HttpUtils中的User-Agent</li>
-                <li>更新compressionPlugin到6.1.2以兼容node18+</li>
-                <li>升级spring-security到安全版本,防止漏洞风险</li>
-                <li>升级spring-framework到安全版本,防止漏洞风险</li>
-                <li>优化自定义XSS注解匹配方式</li>
-                <li>优化缓存监控键名列表排序显示</li>
-                <li>优化定时任务日志默认按时间排序</li>
-                <li>优化默认文件大小超过2G无效的问题</li>
-                <li>优化查表特殊字符使用反斜杠进行转义</li>
-                <li>优化定时任务cron表达式小时配置显示错误问题</li>
-                <li>优化多个自定数据权限使用in查询,避免多次拼接</li>
-                <li>优化导入Excel时设置dictType属性重复查缓存问题</li>
-                <li>其他细节优化</li>
-              </ol>
-            </el-collapse-item>
-            <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>
-
-<script>
-export default {
-  name: "Index",
-  data() {
-    return {
-      // 版本号
-      version: "3.8.9"
-    };
-  },
-  methods: {
-    goTarget(href) {
-      window.open(href, "_blank");
-    }
-  }
-};
-</script>
-
-<style scoped lang="scss">
-.home {
-  blockquote {
-    padding: 10px 20px;
-    margin: 0 0 20px;
-    font-size: 17.5px;
-    border-left: 5px solid #eee;
-  }
-  hr {
-    margin-top: 20px;
-    margin-bottom: 20px;
-    border: 0;
-    border-top: 1px solid #eee;
-  }
-  .col-item {
-    margin-bottom: 20px;
-  }
-
-  ul {
-    padding: 0;
-    margin: 0;
-  }
-
-  font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 13px;
-  color: #676a6c;
-  overflow-x: hidden;
-
-  ul {
-    list-style-type: none;
-  }
-
-  h4 {
-    margin-top: 0px;
-  }
-
-  h2 {
-    margin-top: 10px;
-    font-size: 26px;
-    font-weight: 100;
-  }
-
-  p {
-    margin-top: 10px;
-
-    b {
-      font-weight: 700;
-    }
-  }
-
-  .update-log {
-    ol {
-      display: block;
-      list-style-type: decimal;
-      margin-block-start: 1em;
-      margin-block-end: 1em;
-      margin-inline-start: 0;
-      margin-inline-end: 0;
-      padding-inline-start: 40px;
-    }
-  }
-}
-</style>
-
+<template>
+  <div>
+
+  </div>
+</template>
+
+<script>
+export default {
+  name: "Index",
+  data() {
+    return {
+      // 版本号
+      version: "3.8.9"
+    };
+  },
+  methods: {
+  }
+};
+</script>
+
+<style>
+
+</style>

+ 219 - 219
ruoyi-ui/src/views/login.vue

@@ -1,219 +1,219 @@
-<template>
-  <div class="login">
-    <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
-      <h3 class="title">若依后台管理系统</h3>
-      <el-form-item prop="username">
-        <el-input
-          v-model="loginForm.username"
-          type="text"
-          auto-complete="off"
-          placeholder="账号"
-        >
-          <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
-        </el-input>
-      </el-form-item>
-      <el-form-item prop="password">
-        <el-input
-          v-model="loginForm.password"
-          type="password"
-          auto-complete="off"
-          placeholder="密码"
-          @keyup.enter.native="handleLogin"
-        >
-          <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
-        </el-input>
-      </el-form-item>
-      <el-form-item prop="code" v-if="captchaEnabled">
-        <el-input
-          v-model="loginForm.code"
-          auto-complete="off"
-          placeholder="验证码"
-          style="width: 63%"
-          @keyup.enter.native="handleLogin"
-        >
-          <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
-        </el-input>
-        <div class="login-code">
-          <img :src="codeUrl" @click="getCode" class="login-code-img"/>
-        </div>
-      </el-form-item>
-      <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">记住密码</el-checkbox>
-      <el-form-item style="width:100%;">
-        <el-button
-          :loading="loading"
-          size="medium"
-          type="primary"
-          style="width:100%;"
-          @click.native.prevent="handleLogin"
-        >
-          <span v-if="!loading">登 录</span>
-          <span v-else>登 录 中...</span>
-        </el-button>
-        <div style="float: right;" v-if="register">
-          <router-link class="link-type" :to="'/register'">立即注册</router-link>
-        </div>
-      </el-form-item>
-    </el-form>
-    <!--  底部  -->
-    <div class="el-login-footer">
-      <span>Copyright © 2018-2024 ruoyi.vip All Rights Reserved.</span>
-    </div>
-  </div>
-</template>
-
-<script>
-import { getCodeImg } from "@/api/login";
-import Cookies from "js-cookie";
-import { encrypt, decrypt } from '@/utils/jsencrypt'
-
-export default {
-  name: "Login",
-  data() {
-    return {
-      codeUrl: "",
-      loginForm: {
-        username: "admin",
-        password: "admin123",
-        rememberMe: false,
-        code: "",
-        uuid: ""
-      },
-      loginRules: {
-        username: [
-          { required: true, trigger: "blur", message: "请输入您的账号" }
-        ],
-        password: [
-          { required: true, trigger: "blur", message: "请输入您的密码" }
-        ],
-        code: [{ required: true, trigger: "change", message: "请输入验证码" }]
-      },
-      loading: false,
-      // 验证码开关
-      captchaEnabled: true,
-      // 注册开关
-      register: false,
-      redirect: undefined
-    };
-  },
-  watch: {
-    $route: {
-      handler: function(route) {
-        this.redirect = route.query && route.query.redirect;
-      },
-      immediate: true
-    }
-  },
-  created() {
-    this.getCode();
-    this.getCookie();
-  },
-  methods: {
-    getCode() {
-      getCodeImg().then(res => {
-        this.captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled;
-        if (this.captchaEnabled) {
-          this.codeUrl = "data:image/gif;base64," + res.img;
-          this.loginForm.uuid = res.uuid;
-        }
-      });
-    },
-    getCookie() {
-      const username = Cookies.get("username");
-      const password = Cookies.get("password");
-      const rememberMe = Cookies.get('rememberMe')
-      this.loginForm = {
-        username: username === undefined ? this.loginForm.username : username,
-        password: password === undefined ? this.loginForm.password : decrypt(password),
-        rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
-      };
-    },
-    handleLogin() {
-      this.$refs.loginForm.validate(valid => {
-        if (valid) {
-          this.loading = true;
-          if (this.loginForm.rememberMe) {
-            Cookies.set("username", this.loginForm.username, { expires: 30 });
-            Cookies.set("password", encrypt(this.loginForm.password), { expires: 30 });
-            Cookies.set('rememberMe', this.loginForm.rememberMe, { expires: 30 });
-          } else {
-            Cookies.remove("username");
-            Cookies.remove("password");
-            Cookies.remove('rememberMe');
-          }
-          this.$store.dispatch("Login", this.loginForm).then(() => {
-            this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
-          }).catch(() => {
-            this.loading = false;
-            if (this.captchaEnabled) {
-              this.getCode();
-            }
-          });
-        }
-      });
-    }
-  }
-};
-</script>
-
-<style rel="stylesheet/scss" lang="scss">
-.login {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  height: 100%;
-  background-image: url("../assets/images/login-background.jpg");
-  background-size: cover;
-}
-.title {
-  margin: 0px auto 30px auto;
-  text-align: center;
-  color: #707070;
-}
-
-.login-form {
-  border-radius: 6px;
-  background: #ffffff;
-  width: 400px;
-  padding: 25px 25px 5px 25px;
-  .el-input {
-    height: 38px;
-    input {
-      height: 38px;
-    }
-  }
-  .input-icon {
-    height: 39px;
-    width: 14px;
-    margin-left: 2px;
-  }
-}
-.login-tip {
-  font-size: 13px;
-  text-align: center;
-  color: #bfbfbf;
-}
-.login-code {
-  width: 33%;
-  height: 38px;
-  float: right;
-  img {
-    cursor: pointer;
-    vertical-align: middle;
-  }
-}
-.el-login-footer {
-  height: 40px;
-  line-height: 40px;
-  position: fixed;
-  bottom: 0;
-  width: 100%;
-  text-align: center;
-  color: #fff;
-  font-family: Arial;
-  font-size: 12px;
-  letter-spacing: 1px;
-}
-.login-code-img {
-  height: 38px;
-}
-</style>
+<template>
+  <div class="login">
+    <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
+      <h3 class="title">MHD龙岛后台</h3>
+      <el-form-item prop="username">
+        <el-input
+          v-model="loginForm.username"
+          type="text"
+          auto-complete="off"
+          placeholder="账号"
+        >
+          <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
+        </el-input>
+      </el-form-item>
+      <el-form-item prop="password">
+        <el-input
+          v-model="loginForm.password"
+          type="password"
+          auto-complete="off"
+          placeholder="密码"
+          @keyup.enter.native="handleLogin"
+        >
+          <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
+        </el-input>
+      </el-form-item>
+      <el-form-item prop="code" v-if="captchaEnabled">
+        <el-input
+          v-model="loginForm.code"
+          auto-complete="off"
+          placeholder="验证码"
+          style="width: 63%"
+          @keyup.enter.native="handleLogin"
+        >
+          <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
+        </el-input>
+        <div class="login-code">
+          <img :src="codeUrl" @click="getCode" class="login-code-img"/>
+        </div>
+      </el-form-item>
+      <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">记住密码</el-checkbox>
+      <el-form-item style="width:100%;">
+        <el-button
+          :loading="loading"
+          size="medium"
+          type="primary"
+          style="width:100%;"
+          @click.native.prevent="handleLogin"
+        >
+          <span v-if="!loading">登 录</span>
+          <span v-else>登 录 中...</span>
+        </el-button>
+        <div style="float: right;" v-if="register">
+          <router-link class="link-type" :to="'/register'">立即注册</router-link>
+        </div>
+      </el-form-item>
+    </el-form>
+    <!--  底部  -->
+    <div class="el-login-footer">
+      <span>Copyright © 2018-2024 ruoyi.vip All Rights Reserved.</span>
+    </div>
+  </div>
+</template>
+
+<script>
+import { getCodeImg } from "@/api/login";
+import Cookies from "js-cookie";
+import { encrypt, decrypt } from '@/utils/jsencrypt'
+
+export default {
+  name: "Login",
+  data() {
+    return {
+      codeUrl: "",
+      loginForm: {
+        username: "admin",
+        password: "admin123",
+        rememberMe: false,
+        code: "",
+        uuid: ""
+      },
+      loginRules: {
+        username: [
+          { required: true, trigger: "blur", message: "请输入您的账号" }
+        ],
+        password: [
+          { required: true, trigger: "blur", message: "请输入您的密码" }
+        ],
+        code: [{ required: true, trigger: "change", message: "请输入验证码" }]
+      },
+      loading: false,
+      // 验证码开关
+      captchaEnabled: true,
+      // 注册开关
+      register: false,
+      redirect: undefined
+    };
+  },
+  watch: {
+    $route: {
+      handler: function(route) {
+        this.redirect = route.query && route.query.redirect;
+      },
+      immediate: true
+    }
+  },
+  created() {
+    this.getCode();
+    this.getCookie();
+  },
+  methods: {
+    getCode() {
+      getCodeImg().then(res => {
+        this.captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled;
+        if (this.captchaEnabled) {
+          this.codeUrl = "data:image/gif;base64," + res.img;
+          this.loginForm.uuid = res.uuid;
+        }
+      });
+    },
+    getCookie() {
+      const username = Cookies.get("username");
+      const password = Cookies.get("password");
+      const rememberMe = Cookies.get('rememberMe')
+      this.loginForm = {
+        username: username === undefined ? this.loginForm.username : username,
+        password: password === undefined ? this.loginForm.password : decrypt(password),
+        rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
+      };
+    },
+    handleLogin() {
+      this.$refs.loginForm.validate(valid => {
+        if (valid) {
+          this.loading = true;
+          if (this.loginForm.rememberMe) {
+            Cookies.set("username", this.loginForm.username, { expires: 30 });
+            Cookies.set("password", encrypt(this.loginForm.password), { expires: 30 });
+            Cookies.set('rememberMe', this.loginForm.rememberMe, { expires: 30 });
+          } else {
+            Cookies.remove("username");
+            Cookies.remove("password");
+            Cookies.remove('rememberMe');
+          }
+          this.$store.dispatch("Login", this.loginForm).then(() => {
+            this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
+          }).catch(() => {
+            this.loading = false;
+            if (this.captchaEnabled) {
+              this.getCode();
+            }
+          });
+        }
+      });
+    }
+  }
+};
+</script>
+
+<style rel="stylesheet/scss" lang="scss">
+.login {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  height: 100%;
+  background-image: url("../assets/images/login-background.jpg");
+  background-size: cover;
+}
+.title {
+  margin: 0px auto 30px auto;
+  text-align: center;
+  color: #707070;
+}
+
+.login-form {
+  border-radius: 6px;
+  background: #ffffff;
+  width: 400px;
+  padding: 25px 25px 5px 25px;
+  .el-input {
+    height: 38px;
+    input {
+      height: 38px;
+    }
+  }
+  .input-icon {
+    height: 39px;
+    width: 14px;
+    margin-left: 2px;
+  }
+}
+.login-tip {
+  font-size: 13px;
+  text-align: center;
+  color: #bfbfbf;
+}
+.login-code {
+  width: 33%;
+  height: 38px;
+  float: right;
+  img {
+    cursor: pointer;
+    vertical-align: middle;
+  }
+}
+.el-login-footer {
+  height: 40px;
+  line-height: 40px;
+  position: fixed;
+  bottom: 0;
+  width: 100%;
+  text-align: center;
+  color: #fff;
+  font-family: Arial;
+  font-size: 12px;
+  letter-spacing: 1px;
+}
+.login-code-img {
+  height: 38px;
+}
+</style>

+ 210 - 210
ruoyi-ui/src/views/register.vue

@@ -1,210 +1,210 @@
-<template>
-  <div class="register">
-    <el-form ref="registerForm" :model="registerForm" :rules="registerRules" class="register-form">
-      <h3 class="title">若依后台管理系统</h3>
-      <el-form-item prop="username">
-        <el-input v-model="registerForm.username" type="text" auto-complete="off" placeholder="账号">
-          <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
-        </el-input>
-      </el-form-item>
-      <el-form-item prop="password">
-        <el-input
-          v-model="registerForm.password"
-          type="password"
-          auto-complete="off"
-          placeholder="密码"
-          @keyup.enter.native="handleRegister"
-        >
-          <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
-        </el-input>
-      </el-form-item>
-      <el-form-item prop="confirmPassword">
-        <el-input
-          v-model="registerForm.confirmPassword"
-          type="password"
-          auto-complete="off"
-          placeholder="确认密码"
-          @keyup.enter.native="handleRegister"
-        >
-          <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
-        </el-input>
-      </el-form-item>
-      <el-form-item prop="code" v-if="captchaEnabled">
-        <el-input
-          v-model="registerForm.code"
-          auto-complete="off"
-          placeholder="验证码"
-          style="width: 63%"
-          @keyup.enter.native="handleRegister"
-        >
-          <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
-        </el-input>
-        <div class="register-code">
-          <img :src="codeUrl" @click="getCode" class="register-code-img"/>
-        </div>
-      </el-form-item>
-      <el-form-item style="width:100%;">
-        <el-button
-          :loading="loading"
-          size="medium"
-          type="primary"
-          style="width:100%;"
-          @click.native.prevent="handleRegister"
-        >
-          <span v-if="!loading">注 册</span>
-          <span v-else>注 册 中...</span>
-        </el-button>
-        <div style="float: right;">
-          <router-link class="link-type" :to="'/login'">使用已有账户登录</router-link>
-        </div>
-      </el-form-item>
-    </el-form>
-    <!--  底部  -->
-    <div class="el-register-footer">
-      <span>Copyright © 2018-2024 ruoyi.vip All Rights Reserved.</span>
-    </div>
-  </div>
-</template>
-
-<script>
-import { getCodeImg, register } from "@/api/login";
-
-export default {
-  name: "Register",
-  data() {
-    const equalToPassword = (rule, value, callback) => {
-      if (this.registerForm.password !== value) {
-        callback(new Error("两次输入的密码不一致"));
-      } else {
-        callback();
-      }
-    };
-    return {
-      codeUrl: "",
-      registerForm: {
-        username: "",
-        password: "",
-        confirmPassword: "",
-        code: "",
-        uuid: ""
-      },
-      registerRules: {
-        username: [
-          { required: true, trigger: "blur", message: "请输入您的账号" },
-          { min: 2, max: 20, message: '用户账号长度必须介于 2 和 20 之间', trigger: 'blur' }
-        ],
-        password: [
-          { required: true, trigger: "blur", message: "请输入您的密码" },
-          { min: 5, max: 20, message: "用户密码长度必须介于 5 和 20 之间", trigger: "blur" },
-          { pattern: /^[^<>"'|\\]+$/, message: "不能包含非法字符:< > \" ' \\\ |", trigger: "blur" }
-        ],
-        confirmPassword: [
-          { required: true, trigger: "blur", message: "请再次输入您的密码" },
-          { required: true, validator: equalToPassword, trigger: "blur" }
-        ],
-        code: [{ required: true, trigger: "change", message: "请输入验证码" }]
-      },
-      loading: false,
-      captchaEnabled: true
-    };
-  },
-  created() {
-    this.getCode();
-  },
-  methods: {
-    getCode() {
-      getCodeImg().then(res => {
-        this.captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled;
-        if (this.captchaEnabled) {
-          this.codeUrl = "data:image/gif;base64," + res.img;
-          this.registerForm.uuid = res.uuid;
-        }
-      });
-    },
-    handleRegister() {
-      this.$refs.registerForm.validate(valid => {
-        if (valid) {
-          this.loading = true;
-          register(this.registerForm).then(res => {
-            const username = this.registerForm.username;
-            this.$alert("<font color='red'>恭喜你,您的账号 " + username + " 注册成功!</font>", '系统提示', {
-              dangerouslyUseHTMLString: true,
-              type: 'success'
-            }).then(() => {
-              this.$router.push("/login");
-            }).catch(() => {});
-          }).catch(() => {
-            this.loading = false;
-            if (this.captchaEnabled) {
-              this.getCode();
-            }
-          })
-        }
-      });
-    }
-  }
-};
-</script>
-
-<style rel="stylesheet/scss" lang="scss">
-.register {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  height: 100%;
-  background-image: url("../assets/images/login-background.jpg");
-  background-size: cover;
-}
-.title {
-  margin: 0px auto 30px auto;
-  text-align: center;
-  color: #707070;
-}
-
-.register-form {
-  border-radius: 6px;
-  background: #ffffff;
-  width: 400px;
-  padding: 25px 25px 5px 25px;
-  .el-input {
-    height: 38px;
-    input {
-      height: 38px;
-    }
-  }
-  .input-icon {
-    height: 39px;
-    width: 14px;
-    margin-left: 2px;
-  }
-}
-.register-tip {
-  font-size: 13px;
-  text-align: center;
-  color: #bfbfbf;
-}
-.register-code {
-  width: 33%;
-  height: 38px;
-  float: right;
-  img {
-    cursor: pointer;
-    vertical-align: middle;
-  }
-}
-.el-register-footer {
-  height: 40px;
-  line-height: 40px;
-  position: fixed;
-  bottom: 0;
-  width: 100%;
-  text-align: center;
-  color: #fff;
-  font-family: Arial;
-  font-size: 12px;
-  letter-spacing: 1px;
-}
-.register-code-img {
-  height: 38px;
-}
-</style>
+<template>
+  <div class="register">
+    <el-form ref="registerForm" :model="registerForm" :rules="registerRules" class="register-form">
+      <h3 class="title">MHD龙岛后台</h3>
+      <el-form-item prop="username">
+        <el-input v-model="registerForm.username" type="text" auto-complete="off" placeholder="账号">
+          <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
+        </el-input>
+      </el-form-item>
+      <el-form-item prop="password">
+        <el-input
+          v-model="registerForm.password"
+          type="password"
+          auto-complete="off"
+          placeholder="密码"
+          @keyup.enter.native="handleRegister"
+        >
+          <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
+        </el-input>
+      </el-form-item>
+      <el-form-item prop="confirmPassword">
+        <el-input
+          v-model="registerForm.confirmPassword"
+          type="password"
+          auto-complete="off"
+          placeholder="确认密码"
+          @keyup.enter.native="handleRegister"
+        >
+          <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
+        </el-input>
+      </el-form-item>
+      <el-form-item prop="code" v-if="captchaEnabled">
+        <el-input
+          v-model="registerForm.code"
+          auto-complete="off"
+          placeholder="验证码"
+          style="width: 63%"
+          @keyup.enter.native="handleRegister"
+        >
+          <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
+        </el-input>
+        <div class="register-code">
+          <img :src="codeUrl" @click="getCode" class="register-code-img"/>
+        </div>
+      </el-form-item>
+      <el-form-item style="width:100%;">
+        <el-button
+          :loading="loading"
+          size="medium"
+          type="primary"
+          style="width:100%;"
+          @click.native.prevent="handleRegister"
+        >
+          <span v-if="!loading">注 册</span>
+          <span v-else>注 册 中...</span>
+        </el-button>
+        <div style="float: right;">
+          <router-link class="link-type" :to="'/login'">使用已有账户登录</router-link>
+        </div>
+      </el-form-item>
+    </el-form>
+    <!--  底部  -->
+    <div class="el-register-footer">
+      <span>Copyright © 2018-2024 ruoyi.vip All Rights Reserved.</span>
+    </div>
+  </div>
+</template>
+
+<script>
+import { getCodeImg, register } from "@/api/login";
+
+export default {
+  name: "Register",
+  data() {
+    const equalToPassword = (rule, value, callback) => {
+      if (this.registerForm.password !== value) {
+        callback(new Error("两次输入的密码不一致"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      codeUrl: "",
+      registerForm: {
+        username: "",
+        password: "",
+        confirmPassword: "",
+        code: "",
+        uuid: ""
+      },
+      registerRules: {
+        username: [
+          { required: true, trigger: "blur", message: "请输入您的账号" },
+          { min: 2, max: 20, message: '用户账号长度必须介于 2 和 20 之间', trigger: 'blur' }
+        ],
+        password: [
+          { required: true, trigger: "blur", message: "请输入您的密码" },
+          { min: 5, max: 20, message: "用户密码长度必须介于 5 和 20 之间", trigger: "blur" },
+          { pattern: /^[^<>"'|\\]+$/, message: "不能包含非法字符:< > \" ' \\\ |", trigger: "blur" }
+        ],
+        confirmPassword: [
+          { required: true, trigger: "blur", message: "请再次输入您的密码" },
+          { required: true, validator: equalToPassword, trigger: "blur" }
+        ],
+        code: [{ required: true, trigger: "change", message: "请输入验证码" }]
+      },
+      loading: false,
+      captchaEnabled: true
+    };
+  },
+  created() {
+    this.getCode();
+  },
+  methods: {
+    getCode() {
+      getCodeImg().then(res => {
+        this.captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled;
+        if (this.captchaEnabled) {
+          this.codeUrl = "data:image/gif;base64," + res.img;
+          this.registerForm.uuid = res.uuid;
+        }
+      });
+    },
+    handleRegister() {
+      this.$refs.registerForm.validate(valid => {
+        if (valid) {
+          this.loading = true;
+          register(this.registerForm).then(res => {
+            const username = this.registerForm.username;
+            this.$alert("<font color='red'>恭喜你,您的账号 " + username + " 注册成功!</font>", '系统提示', {
+              dangerouslyUseHTMLString: true,
+              type: 'success'
+            }).then(() => {
+              this.$router.push("/login");
+            }).catch(() => {});
+          }).catch(() => {
+            this.loading = false;
+            if (this.captchaEnabled) {
+              this.getCode();
+            }
+          })
+        }
+      });
+    }
+  }
+};
+</script>
+
+<style rel="stylesheet/scss" lang="scss">
+.register {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  height: 100%;
+  background-image: url("../assets/images/login-background.jpg");
+  background-size: cover;
+}
+.title {
+  margin: 0px auto 30px auto;
+  text-align: center;
+  color: #707070;
+}
+
+.register-form {
+  border-radius: 6px;
+  background: #ffffff;
+  width: 400px;
+  padding: 25px 25px 5px 25px;
+  .el-input {
+    height: 38px;
+    input {
+      height: 38px;
+    }
+  }
+  .input-icon {
+    height: 39px;
+    width: 14px;
+    margin-left: 2px;
+  }
+}
+.register-tip {
+  font-size: 13px;
+  text-align: center;
+  color: #bfbfbf;
+}
+.register-code {
+  width: 33%;
+  height: 38px;
+  float: right;
+  img {
+    cursor: pointer;
+    vertical-align: middle;
+  }
+}
+.el-register-footer {
+  height: 40px;
+  line-height: 40px;
+  position: fixed;
+  bottom: 0;
+  width: 100%;
+  text-align: center;
+  color: #fff;
+  font-family: Arial;
+  font-size: 12px;
+  letter-spacing: 1px;
+}
+.register-code-img {
+  height: 38px;
+}
+</style>

+ 316 - 0
ruoyi-ui/src/views/system/count/index.vue

@@ -0,0 +1,316 @@
+<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="steamId" prop="steamId">
+        <el-input
+          v-model="queryParams.steamId"
+          placeholder="请输入steamId"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="账号" prop="zhanghao">
+        <el-input
+          v-model="queryParams.zhanghao"
+          placeholder="请输入账号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="steam名称" prop="steamName">
+        <el-input
+          v-model="queryParams.steamName"
+          placeholder="请输入steam名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <!--<el-form-item label="卡池id" prop="poolId">-->
+      <!--  <el-input-->
+      <!--    v-model="queryParams.poolId"-->
+      <!--    placeholder="请输入卡池id"-->
+      <!--    clearable-->
+      <!--    @keyup.enter.native="handleQuery"-->
+      <!--  />-->
+      <!--</el-form-item>-->
+      <!--<el-form-item label="卡池名称" prop="poolName">-->
+      <!--  <el-input-->
+      <!--    v-model="queryParams.poolName"-->
+      <!--    placeholder="请输入卡池名称"-->
+      <!--    clearable-->
+      <!--    @keyup.enter.native="handleQuery"-->
+      <!--  />-->
+      <!--</el-form-item>-->
+      <el-form-item label="剩余抽奖次数" prop="count">
+        <el-input
+          v-model="queryParams.count"
+          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="['system:count: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="['system:count: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="['system:count: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="['system:count:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="countList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <!--<el-table-column label="Id" align="center" prop="id" />-->
+      <el-table-column type="index" label="序号" width="60" align="center" />
+      <el-table-column label="steamId" align="center" prop="steamId" />
+      <el-table-column label="账号" align="center" prop="zhanghao" />
+      <el-table-column label="steam名称" align="center" prop="steamName" />
+      <el-table-column label="卡池id" align="center" prop="poolId" />
+      <el-table-column label="卡池名称" align="center" prop="poolName" />
+      <el-table-column label="剩余抽奖次数" align="center" prop="count" />
+      <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="['system:count:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:count: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="steamId" prop="steamId">
+          <el-input v-model="form.steamId" placeholder="请输入steamId" />
+        </el-form-item>
+        <el-form-item label="账号" prop="zhanghao">
+          <el-input v-model="form.zhanghao" placeholder="请输入账号" />
+        </el-form-item>
+        <el-form-item label="steam名称" prop="steamName">
+          <el-input v-model="form.steamName" placeholder="请输入steam名称" />
+        </el-form-item>
+        <el-form-item label="卡池id" prop="poolId">
+          <el-input v-model="form.poolId" placeholder="请输入卡池id" />
+        </el-form-item>
+        <el-form-item label="卡池名称" prop="poolName">
+          <el-input v-model="form.poolName" placeholder="请输入卡池名称" />
+        </el-form-item>
+        <el-form-item label="剩余抽奖次数" prop="count">
+          <el-input v-model="form.count" 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 { listCount, getCount, delCount, addCount, updateCount } from "@/api/system/count";
+
+export default {
+  name: "Count",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 抽奖次数表格数据
+      countList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        steamId: null,
+        zhanghao: null,
+        steamName: null,
+        poolId: null,
+        poolName: null,
+        count: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询抽奖次数列表 */
+    getList() {
+      this.loading = true;
+      listCount(this.queryParams).then(response => {
+        this.countList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        steamId: null,
+        zhanghao: null,
+        steamName: null,
+        poolId: null,
+        poolName: null,
+        count: 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
+      getCount(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) {
+            updateCount(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addCount(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 delCount(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('system/count/export', {
+        ...this.queryParams
+      }, `count_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 537 - 0
ruoyi-ui/src/views/system/package/index.vue

@@ -0,0 +1,537 @@
+<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="steamId" prop="steamId">
+        <el-input
+          v-model="queryParams.steamId"
+          placeholder="请输入steamId"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="账号" prop="zhanghao">
+        <el-input
+          v-model="queryParams.zhanghao"
+          placeholder="请输入账号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="steam名称" prop="steamName">
+        <el-input
+          v-model="queryParams.steamName"
+          placeholder="请输入steam名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <!--<el-form-item label="卡池id" prop="poolId">-->
+      <!--  <el-input-->
+      <!--    v-model="queryParams.poolId"-->
+      <!--    placeholder="请输入卡池id"-->
+      <!--    clearable-->
+      <!--    @keyup.enter.native="handleQuery"-->
+      <!--  />-->
+      <!--</el-form-item>-->
+      <el-form-item label="卡池名称" prop="poolName">
+        <el-input
+          v-model="queryParams.poolName"
+          placeholder="请输入卡池名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <!--<el-form-item label="奖品id" prop="prizeId">-->
+      <!--  <el-input-->
+      <!--    v-model="queryParams.prizeId"-->
+      <!--    placeholder="请输入奖品id"-->
+      <!--    clearable-->
+      <!--    @keyup.enter.native="handleQuery"-->
+      <!--  />-->
+      <!--</el-form-item>-->
+      <el-form-item label="奖品名称" prop="prizeName">
+        <el-input
+          v-model="queryParams.prizeName"
+          placeholder="请输入奖品名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="稀有度" prop="quality">
+        <el-input
+          v-model="queryParams.quality"
+          placeholder="请输入稀有度"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="是否核销" prop="isCheck">
+        <el-select
+          v-model="queryParams.isCheck"
+          placeholder="请选择是否核销"
+          clearable
+        >
+          <el-option label="是" :value="1" />
+          <el-option label="否" :value="0" />
+        </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="['system:package: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="['system:package: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="['system:package: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="['system:package:export']"
+          >导出
+        </el-button>
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      v-loading="loading"
+      :data="packageList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+      <!--<el-table-column label="自增id" align="center" prop="id" />-->
+      <el-table-column type="index" label="序号" width="60" align="center" />
+      <el-table-column label="steamId" align="center" prop="steamId" />
+      <el-table-column label="账号" align="center" prop="zhanghao" />
+      <el-table-column label="steam名称" align="center" prop="steamName" />
+      <!--<el-table-column label="卡池id" align="center" prop="poolId"/>-->
+      <el-table-column label="卡池名称" align="center" prop="poolName" />
+      <!--<el-table-column label="奖品id" align="center" prop="prizeId"/>-->
+      <el-table-column label="奖品名称" align="center" prop="prizeName" />
+      <el-table-column label="稀有度" align="center" prop="quality">
+        <template slot-scope="scope">
+          <el-tag
+            v-if="scope.row.quality === '史诗'"
+            :style="{
+              background: '#f5edfa',
+              color: '#a259ec',
+              borderColor: '#a259ec',
+            }"
+            >史诗</el-tag
+          >
+          <el-tag
+            v-else-if="scope.row.quality === '稀有'"
+            :style="{
+              background: '#ecf5ff',
+              color: '#409EFF',
+              borderColor: '#409EFF',
+            }"
+            >稀有</el-tag
+          >
+          <el-tag
+            v-else-if="scope.row.quality === '精良'"
+            :style="{
+              background: '#f0f9eb',
+              color: '#67C23A',
+              borderColor: '#67C23A',
+            }"
+            >精良</el-tag
+          >
+          <el-tag
+            v-else-if="scope.row.quality === '普通'"
+            :style="{
+              background: '#f4f4f5',
+              color: '#909399',
+              borderColor: '#909399',
+            }"
+            >普通</el-tag
+          >
+          <el-tag v-else>{{ scope.row.quality }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="中奖时间"
+        align="center"
+        prop="createTime"
+        width="180"
+      >
+        <template slot-scope="scope">
+          <span>{{
+            parseTime(scope.row.createTime, "{y}-{m}-{d} {h}:{i}:{s}")
+          }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="是否核销" align="center" prop="isCheck">
+        <template slot-scope="scope">
+          <el-tag v-if="scope.row.isCheck == 1" type="success">是</el-tag>
+          <el-tag v-else type="danger">否</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="核销时间"
+        align="center"
+        prop="checkTime"
+        width="180"
+      >
+        <template slot-scope="scope">
+          <span>{{
+            parseTime(scope.row.checkTime, "{y}-{m}-{d} {h}:{i}:{s}")
+          }}</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)"
+            :disabled="scope.row.isCheck == 1"
+            v-hasPermi="['system:package:edit']"
+            >修改
+          </el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:package: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="steamId" prop="steamId">
+          <el-input v-model="form.steamId" placeholder="请输入steamId" />
+        </el-form-item> -->
+        <!-- <el-form-item label="账号" prop="zhanghao">
+          <el-input v-model="form.zhanghao" placeholder="请输入账号" />
+        </el-form-item>
+        <el-form-item label="steam名称" prop="steamName">
+          <el-input v-model="form.steamName" placeholder="请输入steam名称" />
+        </el-form-item>
+        <el-form-item label="卡池id" prop="poolId">
+          <el-input v-model="form.poolId" placeholder="请输入卡池id" />
+        </el-form-item> -->
+        <!-- <el-form-item label="卡池名称" prop="poolName">
+          <el-input v-model="form.poolName" placeholder="请输入卡池名称" />
+        </el-form-item>
+        <el-form-item label="奖品id" prop="prizeId">
+          <el-input v-model="form.prizeId" placeholder="请输入奖品id" />
+        </el-form-item>
+        <el-form-item label="奖品名称" prop="prizeName">
+          <el-input v-model="form.prizeName" placeholder="请输入奖品名称" />
+        </el-form-item> -->
+        <!--<el-form-item label="稀有度" prop="quality">-->
+        <!--  <el-input v-model="form.quality" placeholder="请输入稀有度" />-->
+        <!--</el-form-item>-->
+        <el-form-item label="是否核销" prop="isCheck">
+          <el-select
+            v-model="form.isCheck"
+            placeholder="请选择是否核销"
+            style="width: 120px"
+          >
+            <el-option label="是" :value="1" />
+            <el-option label="否" :value="0" />
+          </el-select>
+        </el-form-item>
+        <!-- <el-form-item label="核销时间" prop="checkTime">
+          <el-date-picker
+            clearable
+            v-model="form.checkTime"
+            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>
+  </div>
+</template>
+
+<script>
+import {
+  listPackage,
+  getPackage,
+  delPackage,
+  addPackage,
+  updatePackage,
+} from "@/api/system/package";
+
+export default {
+  name: "Package",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 奖品背包表格数据
+      packageList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        steamId: null,
+        zhanghao: null,
+        steamName: null,
+        poolId: null,
+        poolName: null,
+        prizeId: null,
+        prizeName: null,
+        quality: null,
+        isCheck: null,
+        checkTime: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        steamId: [
+          { required: true, message: "steamId不能为空", trigger: "blur" },
+        ],
+        poolId: [
+          { required: true, message: "卡池id不能为空", trigger: "blur" },
+        ],
+        prizeId: [
+          { required: true, message: "奖品id不能为空", trigger: "blur" },
+        ],
+      },
+      verifySelectValue: 1,
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询奖品背包列表 */
+    getList() {
+      this.loading = true;
+      listPackage(this.queryParams).then((response) => {
+        this.packageList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        steamId: null,
+        zhanghao: null,
+        steamName: null,
+        poolId: null,
+        poolName: null,
+        prizeId: null,
+        prizeName: null,
+        quality: null,
+        createTime: null,
+        isCheck: null,
+        checkTime: 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;
+      getPackage(id).then((response) => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改奖品背包";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          // 如果核销为1,自动填充核销时间
+          if (this.form.isCheck === 1) {
+            const now = new Date();
+            const yyyy = now.getFullYear();
+            const mm = String(now.getMonth() + 1).padStart(2, "0");
+            const dd = String(now.getDate()).padStart(2, "0");
+            const hh = String(now.getHours()).padStart(2, "0");
+            const mi = String(now.getMinutes()).padStart(2, "0");
+            const ss = String(now.getSeconds()).padStart(2, "0");
+            this.form.checkTime = `${yyyy}-${mm}-${dd} ${hh}:${mi}:${ss}`;
+          }
+          if (this.form.id != null) {
+            updatePackage(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addPackage(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 delPackage(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "system/package/export",
+        {
+          ...this.queryParams,
+        },
+        `package_${new Date().getTime()}.xlsx`
+      );
+    },
+    handleVerifyResult(val) {
+      // val为1表示是,0表示否
+      console.log("用户选择是否核销:", val);
+      this.lotteryResultDialogVisible = false;
+      // 这里可以根据val做后续处理,比如请求后端核销接口
+    },
+  },
+};
+</script>
+
+<style scoped>
+.custom-modal-select {
+  padding: 6px 18px;
+  border-radius: 6px;
+  border: 1px solid #ffbf69;
+  font-size: 1rem;
+  outline: none;
+  margin-right: 8px;
+}
+.custom-modal-select:focus {
+  border-color: #ff9f1c;
+}
+</style>

+ 497 - 0
ruoyi-ui/src/views/system/pool/index.vue

@@ -0,0 +1,497 @@
+<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="title">
+        <el-input
+          v-model="queryParams.title"
+          placeholder="请输入卡池名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="价格" prop="price">
+        <el-input
+          v-model="queryParams.price"
+          placeholder="请输入价格"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="概要" prop="description">
+        <el-input
+          v-model="queryParams.description"
+          placeholder="请输入概要"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="边界颜色" prop="borderColor">
+        <el-select
+          v-model="queryParams.borderColor"
+          placeholder="请选择边界颜色"
+          clearable
+          style="width: 180px"
+        >
+          <el-option label="border-primary" value="border-primary" />
+          <el-option label="border-secondary" value="border-secondary" />
+          <el-option label="border-blue-500" value="border-blue-500" />
+          <el-option label="border-gray-500" value="border-gray-500" />
+          <el-option label="border-green-500" value="border-green-500" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="背景颜色" prop="bgColor">
+        <el-select
+          v-model="queryParams.bgColor"
+          placeholder="请选择背景颜色"
+          clearable
+          style="width: 180px"
+        >
+          <el-option label="bg-primary/10" value="bg-primary/10" />
+          <el-option label="bg-secondary/10" value="bg-secondary/10" />
+          <el-option label="bg-blue-500/10" value="bg-blue-500/10" />
+          <el-option label="bg-gray-500/10" value="bg-gray-500/10" />
+          <el-option label="bg-green-500/10" value="bg-green-500/10" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="字体颜色" prop="textColor">
+        <el-select
+          v-model="queryParams.textColor"
+          placeholder="请选择字体颜色"
+          clearable
+          style="width: 180px"
+        >
+          <el-option label="text-primary" value="text-primary" />
+          <el-option label="text-secondary" value="text-secondary" />
+          <el-option label="text-blue-500" value="text-blue-500" />
+          <el-option label="text-gray-500" value="text-gray-500" />
+          <el-option label="text-green-500" value="text-green-500" />
+        </el-select>
+      </el-form-item>
+      <!-- <el-form-item label="描述" prop="fullDescription">
+        <el-input
+          v-model="queryParams.fullDescription"
+          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="['system:pool: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="['system:pool: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="['system:pool: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="['system:pool:export']"
+          >导出</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      v-loading="loading"
+      :data="poolList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column type="index" label="序号" width="60" align="center" />
+      <el-table-column label="id" align="center" prop="id" />
+      <el-table-column label="卡池名称" align="center" prop="title" />
+      <el-table-column label="价格" align="center" prop="price" />
+      <el-table-column label="概要" align="center" prop="description" />
+      <el-table-column label="边界颜色" align="center" prop="borderColor" />
+      <el-table-column label="背景颜色" align="center" prop="bgColor" />
+      <el-table-column label="字体颜色" align="center" prop="textColor" />
+      <el-table-column label="描述" align="center" prop="fullDescription" />
+      <el-table-column label="抽奖次数" align="center" prop="count" />
+      <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="['system:pool:edit']"
+            >修改</el-button
+          >
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:pool:remove']"
+            >删除</el-button
+          >
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-refresh"
+            @click="handleRewardPoolUpdate(scope.row)"
+            v-hasPermi="['system:pool:rewardPoolEdit']"
+            >修改奖池</el-button
+          >
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-refresh"
+            @click="handleProbabilityUpdate(scope.row)"
+            v-hasPermi="['system:pool:probabilityEdit']"
+            >修改概率</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="title">
+          <el-input v-model="form.title" placeholder="请输入卡池名称" />
+        </el-form-item>
+        <el-form-item label="价格" prop="price">
+          <el-input v-model="form.price" placeholder="请输入价格" />
+        </el-form-item>
+        <el-form-item label="概要" prop="description">
+          <el-input v-model="form.description" placeholder="请输入概要" />
+        </el-form-item>
+        <el-form-item label="边界颜色" prop="borderColor">
+          <el-select
+            v-model="form.borderColor"
+            placeholder="请选择边界颜色"
+            style="width: 100%"
+          >
+            <el-option label="border-primary" value="border-primary" />
+            <el-option label="border-secondary" value="border-secondary" />
+            <el-option label="border-blue-500" value="border-blue-500" />
+            <el-option label="border-gray-500" value="border-gray-500" />
+            <el-option label="border-green-500" value="border-green-500" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="背景颜色" prop="bgColor">
+          <el-select
+            v-model="form.bgColor"
+            placeholder="请选择背景颜色"
+            style="width: 100%"
+          >
+            <el-option label="bg-primary/10" value="bg-primary/10" />
+            <el-option label="bg-secondary/10" value="bg-secondary/10" />
+            <el-option label="bg-blue-500/10" value="bg-blue-500/10" />
+            <el-option label="bg-gray-500/10" value="bg-gray-500/10" />
+            <el-option label="bg-green-500/10" value="bg-green-500/10" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="字体颜色" prop="textColor">
+          <el-select
+            v-model="form.textColor"
+            placeholder="请选择字体颜色"
+            style="width: 100%"
+          >
+            <el-option label="text-primary" value="text-primary" />
+            <el-option label="text-secondary" value="text-secondary" />
+            <el-option label="text-blue-500" value="text-blue-500" />
+            <el-option label="text-gray-500" value="text-gray-500" />
+            <el-option label="text-green-500" value="text-green-500" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="描述" prop="fullDescription">
+          <el-input
+            type="textarea"
+            v-model="form.fullDescription"
+            placeholder="请输入描述"
+            rows="5"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="抽奖次数" prop="count">
+          <el-input v-model="form.count" 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="奖池信息"
+      :visible.sync="showPrizesDialog"
+      width="60%"
+      append-to-body
+      @close="showPrizesDialog = false"
+    >
+      <Prizes v-if="showPrizesDialog" :pool="currentPool" />
+    </el-dialog>
+
+    <el-dialog
+      title="概率信息"
+      :visible.sync="showProbabilitiesDialog"
+      width="40%"
+      append-to-body
+      @close="showProbabilitiesDialog = false"
+    >
+      <Probabilities v-if="showProbabilitiesDialog" :pool="currentPool" />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listPool,
+  getPool,
+  delPool,
+  addPool,
+  updatePool,
+} from "@/api/system/pool";
+import Prizes from "../prizes/index.vue";
+import Probabilities from "../probabilities/index.vue";
+
+export default {
+  name: "Pool",
+  components: {
+    Prizes,
+    Probabilities,
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 卡池表格数据
+      poolList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        title: null,
+        price: null,
+        description: null,
+        borderColor: null,
+        bgColor: null,
+        textColor: null,
+        fullDescription: null,
+        count: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        price: [
+          { required: true, message: "价格不能为空", trigger: "blur" }
+        ],
+        count: [
+          { required: true, message: "抽奖次数不能为空", trigger: "blur" }
+        ]
+      },
+      showPrizesDialog: false,
+      currentPool: null,
+      showProbabilitiesDialog: false,
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询卡池列表 */
+    getList() {
+      this.loading = true;
+      listPool(this.queryParams).then((response) => {
+        this.poolList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        title: null,
+        price: null,
+        description: null,
+        borderColor: null,
+        bgColor: null,
+        textColor: null,
+        fullDescription: null,
+        count: 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.form.borderColor = 'border-blue-500'
+      this.form.bgColor = 'bg-blue-500/10'
+      this.form.textColor = 'text-blue-500'
+      this.open = true;
+      this.title = "添加卡池";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getPool(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) {
+            updatePool(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addPool(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 delPool(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "system/pool/export",
+        {
+          ...this.queryParams,
+        },
+        `pool_${new Date().getTime()}.xlsx`
+      );
+    },
+    handleRewardPoolUpdate(row) {
+      this.currentPool = row;
+      this.showPrizesDialog = true;
+    },
+    handleProbabilityUpdate(row) {
+      this.currentPool = row;
+      this.showProbabilitiesDialog = true;
+    },
+  },
+};
+</script>

+ 438 - 0
ruoyi-ui/src/views/system/prizes/index.vue

@@ -0,0 +1,438 @@
+<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="quality">
+        <el-select
+          v-model="queryParams.quality"
+          placeholder="请选择稀有度"
+          clearable
+          style="width: 180px"
+        >
+          <el-option label="史诗" value="史诗" />
+          <el-option label="稀有" value="稀有" />
+          <el-option label="精良" value="精良" />
+          <el-option label="普通" value="普通" />
+        </el-select>
+      </el-form-item>
+      <!-- <el-form-item label="背景颜色" prop="bgColor">
+        <el-input
+          v-model="queryParams.bgColor"
+          placeholder="请输入背景颜色"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="字体颜色" prop="textColor">
+        <el-input
+          v-model="queryParams.textColor"
+          placeholder="请输入字体颜色"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item> -->
+      <!--<el-form-item label="描述" prop="fullDescription">-->
+      <!--  <el-input-->
+      <!--    v-model="queryParams.fullDescription"-->
+      <!--    placeholder="请输入描述"-->
+      <!--    clearable-->
+      <!--    @keyup.enter.native="handleQuery"-->
+      <!--  />-->
+      <!--</el-form-item>-->
+      <!-- <el-form-item label="关联卡池id" prop="poolId">
+        <el-input
+          v-model="queryParams.poolId"
+          placeholder="请输入关联卡池id"
+          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="['system:prizes: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="['system:prizes: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="['system:prizes: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="['system:prizes:export']"
+          >导出</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      v-loading="loading"
+      :data="prizesList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+      <!--<el-table-column label="id" align="center" prop="id" />-->
+      <el-table-column type="index" label="序号" width="60" align="center" />
+      <el-table-column label="奖品名称" align="center" prop="name" />
+      <el-table-column label="稀有度" align="center" prop="quality" />
+      <!-- <el-table-column label="背景颜色" align="center" prop="bgColor" />
+      <el-table-column label="字体颜色" align="center" prop="textColor" /> -->
+      <!--<el-table-column label="描述" align="center" prop="fullDescription" />-->
+      <!-- <el-table-column label="关联卡池id" align="center" prop="poolId" /> -->
+      <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="['system:prizes:edit']"
+            >修改</el-button
+          >
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:prizes: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="name">
+          <el-input v-model="form.name" placeholder="请输入奖品名称" />
+        </el-form-item>
+        <el-form-item label="稀有度" prop="quality">
+          <el-select
+            v-model="form.quality"
+            placeholder="请选择稀有度"
+            style="width: 100%"
+            @change="handleRarityChange"
+          >
+            <el-option label="史诗" value="史诗" />
+            <el-option label="稀有" value="稀有" />
+            <el-option label="精良" value="精良" />
+            <el-option label="普通" value="普通" />
+          </el-select>
+        </el-form-item>
+        <!-- <el-form-item label="背景颜色" prop="bgColor">
+          <el-input v-model="form.bgColor" placeholder="请输入背景颜色" />
+        </el-form-item>
+        <el-form-item label="字体颜色" prop="textColor">
+          <el-input v-model="form.textColor" placeholder="请输入字体颜色" />
+        </el-form-item> -->
+        <!--<el-form-item label="描述" prop="fullDescription">-->
+        <!--  <el-input v-model="form.fullDescription" placeholder="请输入描述" />-->
+        <!--</el-form-item>-->
+        <!-- <el-form-item label="关联卡池id" prop="poolId">
+          <el-input v-model="form.poolId" placeholder="请输入关联卡池id" />
+        </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 {
+  listPrizes,
+  getPrizes,
+  delPrizes,
+  addPrizes,
+  updatePrizes,
+} from "@/api/system/prizes";
+
+export default {
+  name: "Prizes",
+  props: {
+    pool: {
+      type: Object,
+      default: null,
+    },
+  },
+  computed: {
+    poolId() {
+      return this.pool ? this.pool.id : null;
+    },
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 奖品池表格数据
+      prizesList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: null,
+        quality: null,
+        bgColor: null,
+        textColor: null,
+        fullDescription: null,
+        quality: null, // 新增
+        poolId: this.poolId,
+      },
+      // 表单参数
+      form: {
+        id: null,
+        name: null,
+        quality: null,
+        bgColor: null,
+        textColor: null,
+        fullDescription: null,
+        quality: null, // 新增
+        poolId: null,
+      },
+      // 表单校验
+      rules: {
+        poolId: [
+          { required: true, message: "关联卡池id不能为空", trigger: "blur" },
+        ],
+      },
+    };
+  },
+  mounted() {
+    console.log(this.pool);
+    // 直接用 this.pool.id
+    this.loadDataByPoolId(this.pool.id);
+    this.getList();
+  },
+  methods: {
+    loadDataByPoolId(poolId) {
+      this.queryParams.poolId = poolId;
+      this.getList();
+    },
+    /** 查询奖品池列表 */
+    getList() {
+      this.loading = true;
+      listPrizes(this.queryParams).then((response) => {
+        this.prizesList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        name: null,
+        quality: null,
+        bgColor: null,
+        textColor: null,
+        fullDescription: null,
+        quality: null, // 新增
+        poolId: 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;
+      getPrizes(id).then((response) => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改奖品池";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        this.form.poolId = this.poolId;
+
+        if (valid) {
+          if (this.form.id != null) {
+            updatePrizes(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addPrizes(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 delPrizes(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "system/prizes/export",
+        {
+          ...this.queryParams,
+        },
+        `prizes_${new Date().getTime()}.xlsx`
+      );
+    },
+    handleRarityChange(value) {
+      const map = {
+        史诗: {
+          bgColor: "bg-rarity-epic",
+          textColor: "text-rarity-epic",
+        },
+        稀有: {
+          bgColor: "bg-rarity-rare",
+          textColor: "text-rarity-rare",
+        },
+        精良: {
+          bgColor: "bg-rarity-fine",
+          textColor: "text-rarity-fine",
+        },
+        普通: {
+          bgColor: "bg-rarity-common",
+          textColor: "text-rarity-common",
+        },
+      };
+      if (map[value]) {
+        this.form.bgColor = map[value].bgColor;
+        this.form.textColor = map[value].textColor;
+      } else {
+        this.form.bgColor = "";
+        this.form.textColor = "";
+      }
+    },
+  },
+};
+</script>

+ 434 - 0
ruoyi-ui/src/views/system/probabilities/index.vue

@@ -0,0 +1,434 @@
+<template>
+  <div class="app-container">
+    <!--<el-form-->
+    <!--  :model="queryParams"-->
+    <!--  ref="queryForm"-->
+    <!--  size="small"-->
+    <!--  :inline="true"-->
+    <!--  v-show="showSearch"-->
+    <!--  label-width="68px"-->
+    <!--&gt;-->
+    <!--  <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="value">-->
+    <!--    <el-input-->
+    <!--      v-model="queryParams.value"-->
+    <!--      placeholder="请输入概率值"-->
+    <!--      clearable-->
+    <!--      @keyup.enter.native="handleQuery"-->
+    <!--    />-->
+    <!--  </el-form-item>-->
+    <!--  <el-form-item label="背景颜色" prop="bgColor">-->
+    <!--    <el-select-->
+    <!--      v-model="queryParams.bgColor"-->
+    <!--      placeholder="请选择背景颜色"-->
+    <!--      clearable-->
+    <!--      style="width: 180px"-->
+    <!--    >-->
+    <!--      <el-option label="bg-rarity-epic" value="bg-rarity-epic" />-->
+    <!--      <el-option label="bg-rarity-rare" value="bg-rarity-rare" />-->
+    <!--      <el-option label="bg-rarity-fine" value="bg-rarity-fine" />-->
+    <!--      <el-option label="bg-rarity-common" value="bg-rarity-common" />-->
+    <!--    </el-select>-->
+    <!--  </el-form-item>-->
+    <!--  <el-form-item label="稀有度" prop="rarity">-->
+    <!--    <el-select-->
+    <!--      v-model="queryParams.rarity"-->
+    <!--      placeholder="请选择稀有度"-->
+    <!--      clearable-->
+    <!--      style="width: 180px"-->
+    <!--    >-->
+    <!--      <el-option label="史诗" value="史诗" />-->
+    <!--      <el-option label="稀有" value="稀有" />-->
+    <!--      <el-option label="精良" value="精良" />-->
+    <!--      <el-option label="普通" value="普通" />-->
+    <!--    </el-select>-->
+    <!--  </el-form-item>-->
+    <!--  &lt;!&ndash;<el-form-item label="关联卡池id" prop="poolId">&ndash;&gt;-->
+    <!--  &lt;!&ndash;  <el-input&ndash;&gt;-->
+    <!--  &lt;!&ndash;    v-model="queryParams.poolId"&ndash;&gt;-->
+    <!--  &lt;!&ndash;    placeholder="请输入关联卡池id"&ndash;&gt;-->
+    <!--  &lt;!&ndash;    clearable&ndash;&gt;-->
+    <!--  &lt;!&ndash;    @keyup.enter.native="handleQuery"&ndash;&gt;-->
+    <!--  &lt;!&ndash;  />&ndash;&gt;-->
+    <!--  &lt;!&ndash;</el-form-item>&ndash;&gt;-->
+    <!--  <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="['system:probabilities: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="['system:probabilities: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="['system:probabilities: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="['system:probabilities:export']"
+          >导出</el-button
+        >
+      </el-col>
+      <el-col :span="6" style="display: flex; align-items: center">
+        <span
+          style="margin-left: 10px"
+          :style="{ color: totalProbability === 100 ? '#409EFF' : 'red' }"
+        >
+          总概率值:{{ totalProbability }}
+        </span>
+      </el-col>
+      <!--<right-toolbar-->
+      <!--  :showSearch.sync="showSearch"-->
+      <!--  @queryTable="getList"-->
+      <!--&gt;</right-toolbar>-->
+    </el-row>
+
+    <el-table
+      v-loading="loading"
+      :data="probabilitiesList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+      <!--<el-table-column label="id" align="center" prop="id" />-->
+      <!--<el-table-column type="index" label="序号" width="60" align="center" />-->
+      <el-table-column label="品质" align="center" prop="name" />
+      <el-table-column
+        label="概率值"
+        align="center"
+        prop="value"
+      ></el-table-column>
+      <!--<el-table-column label="颜色设置" align="center" prop="colorClass" />-->
+      <!--<el-table-column label="关联卡池id" align="center" prop="poolId" />-->
+      <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="['system:probabilities:edit']"
+            >修改概率</el-button
+          >
+          <!--<el-button-->
+          <!--  size="mini"-->
+          <!--  type="text"-->
+          <!--  icon="el-icon-delete"-->
+          <!--  @click="handleDelete(scope.row)"-->
+          <!--  v-hasPermi="['system:probabilities:remove']"-->
+          <!--  >删除</el-button-->
+          <!--&gt;-->
+        </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
+      style="margin-right: 0"
+    >
+      <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="概率值" prop="value">
+          <el-input v-model="form.value" placeholder="请输入概率值" />
+        </el-form-item>
+        <!--<el-form-item label="背景颜色" prop="bgColor">-->
+        <!--  <el-select-->
+        <!--    v-model="form.bgColor"-->
+        <!--    placeholder="请选择背景颜色"-->
+        <!--    style="width: 100%"-->
+        <!--  >-->
+        <!--    <el-option label="bg-rarity-epic" value="bg-rarity-epic" />-->
+        <!--    <el-option label="bg-rarity-rare" value="bg-rarity-rare" />-->
+        <!--    <el-option label="bg-rarity-fine" value="bg-rarity-fine" />-->
+        <!--    <el-option label="bg-rarity-common" value="bg-rarity-common" />-->
+        <!--  </el-select>-->
+        <!--</el-form-item>-->
+        <!--<el-form-item label="稀有度" prop="rarity">-->
+        <!--  <el-select-->
+        <!--    v-model="form.rarity"-->
+        <!--    placeholder="请选择稀有度"-->
+        <!--    style="width: 100%"-->
+        <!--  >-->
+        <!--    <el-option label="史诗" value="史诗" />-->
+        <!--    <el-option label="稀有" value="稀有" />-->
+        <!--    <el-option label="精良" value="精良" />-->
+        <!--    <el-option label="普通" value="普通" />-->
+        <!--  </el-select>-->
+        <!--</el-form-item>-->
+        <!--<el-form-item label="关联卡池id" prop="poolId">-->
+        <!--  <el-input v-model="form.poolId" placeholder="请输入关联卡池id" />-->
+        <!--</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 {
+  listProbabilities,
+  getProbabilities,
+  delProbabilities,
+  addProbabilities,
+  updateProbabilities,
+} from "@/api/system/probabilities";
+
+export default {
+  name: "Probabilities",
+  props: {
+    pool: {
+      type: Object,
+      default: null,
+    },
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 概率设置表格数据
+      probabilitiesList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: null,
+        value: null,
+        colorClass: null,
+        poolId: this.poolId,
+        rarity: null, // 新增
+      },
+      // 表单参数
+      form: {
+        id: null,
+        name: null,
+        value: null,
+        colorClass: null,
+        poolId: null,
+        rarity: null, // 新增
+      },
+      // 表单校验
+      rules: {
+        poolId: [
+          { required: true, message: "关联卡池id不能为空", trigger: "blur" },
+        ],
+      },
+      poolId: null,
+    };
+  },
+  mounted() {
+    console.log(this.pool);
+    // 直接用 this.pool.id
+    this.loadDataByPoolId(this.pool.id);
+    this.getList();
+  },
+  methods: {
+    loadDataByPoolId(poolId) {
+      this.queryParams.poolId = poolId;
+      this.getList();
+    },
+    /** 查询概率设置列表 */
+    getList() {
+      this.loading = true;
+      listProbabilities(this.queryParams).then((response) => {
+        this.probabilitiesList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        name: null,
+        value: null,
+        colorClass: null,
+        poolId: null,
+        rarity: 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;
+      getProbabilities(id).then((response) => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改概率设置";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        this.form.poolId = this.poolId;
+
+        if (valid) {
+          if (this.form.id != null) {
+            updateProbabilities(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addProbabilities(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 delProbabilities(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "system/probabilities/export",
+        {
+          ...this.queryParams,
+        },
+        `probabilities_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+  computed: {
+    totalProbability() {
+      return this.probabilitiesList.reduce(
+        (sum, row) => sum + Number(row.value || 0),
+        0
+      );
+    },
+  },
+  watch: {
+    totalProbability(newVal) {
+      if (newVal !== 100) {
+        this.$message.error("当前总概率值不为100,请赶快修改!");
+      }
+    },
+  },
+};
+</script>

+ 462 - 0
ruoyi-ui/src/views/system/users/index.vue

@@ -0,0 +1,462 @@
+<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="${comment}" prop="jifen">
+        <el-input
+          v-model="queryParams.jifen"
+          placeholder="请输入${comment}"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="${comment}" prop="level">
+        <el-input
+          v-model="queryParams.level"
+          placeholder="请输入${comment}"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="${comment}" prop="regtime">
+        <el-date-picker clearable
+          v-model="queryParams.regtime"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="请选择${comment}">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="${comment}" prop="killed">
+        <el-input
+          v-model="queryParams.killed"
+          placeholder="请输入${comment}"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="${comment}" prop="shadi">
+        <el-input
+          v-model="queryParams.shadi"
+          placeholder="请输入${comment}"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="${comment}" prop="onlinetime">
+        <el-input
+          v-model="queryParams.onlinetime"
+          placeholder="请输入${comment}"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="${comment}" prop="isshouchong">
+        <el-input
+          v-model="queryParams.isshouchong"
+          placeholder="请输入${comment}"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="${comment}" prop="clanId">
+        <el-input
+          v-model="queryParams.clanId"
+          placeholder="请输入${comment}"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="${comment}" prop="lastConnectTime">
+        <el-date-picker clearable
+          v-model="queryParams.lastConnectTime"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="请选择${comment}">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="${comment}" prop="X">
+        <el-input
+          v-model="queryParams.X"
+          placeholder="请输入${comment}"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="${comment}" prop="Y">
+        <el-input
+          v-model="queryParams.Y"
+          placeholder="请输入${comment}"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="${comment}" prop="Z">
+        <el-input
+          v-model="queryParams.Z"
+          placeholder="请输入${comment}"
+          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="['system:users: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="['system:users: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="['system:users: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="['system:users:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="usersList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="${comment}" align="center" prop="SteamID" />
+      <el-table-column label="${comment}" align="center" prop="zhanghao" />
+      <el-table-column label="${comment}" align="center" prop="mima" />
+      <el-table-column label="${comment}" align="center" prop="jifen" />
+      <el-table-column label="${comment}" align="center" prop="level" />
+      <el-table-column label="${comment}" align="center" prop="regtime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.regtime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="${comment}" align="center" prop="qiandaotime" />
+      <el-table-column label="${comment}" align="center" prop="SteamName" />
+      <el-table-column label="${comment}" align="center" prop="GameStatus" />
+      <el-table-column label="${comment}" align="center" prop="killed" />
+      <el-table-column label="${comment}" align="center" prop="shadi" />
+      <el-table-column label="${comment}" align="center" prop="onlinetime" />
+      <el-table-column label="${comment}" align="center" prop="konglong" />
+      <el-table-column label="${comment}" align="center" prop="isshouchong" />
+      <el-table-column label="${comment}" align="center" prop="clanId" />
+      <el-table-column label="${comment}" align="center" prop="lastConnectTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.lastConnectTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="${comment}" align="center" prop="prefix" />
+      <el-table-column label="${comment}" align="center" prop="lastConnectIp" />
+      <el-table-column label="${comment}" align="center" prop="X" />
+      <el-table-column label="${comment}" align="center" prop="Y" />
+      <el-table-column label="${comment}" align="center" prop="Z" />
+      <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="['system:users:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:users: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="${comment}" prop="zhanghao">
+          <el-input v-model="form.zhanghao" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="${comment}" prop="mima">
+          <el-input v-model="form.mima" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="${comment}" prop="jifen">
+          <el-input v-model="form.jifen" placeholder="请输入${comment}" />
+        </el-form-item>
+        <el-form-item label="${comment}" prop="level">
+          <el-input v-model="form.level" placeholder="请输入${comment}" />
+        </el-form-item>
+        <el-form-item label="${comment}" prop="regtime">
+          <el-date-picker clearable
+            v-model="form.regtime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择${comment}">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="${comment}" prop="qiandaotime">
+          <el-input v-model="form.qiandaotime" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="${comment}" prop="SteamName">
+          <el-input v-model="form.SteamName" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="${comment}" prop="killed">
+          <el-input v-model="form.killed" placeholder="请输入${comment}" />
+        </el-form-item>
+        <el-form-item label="${comment}" prop="shadi">
+          <el-input v-model="form.shadi" placeholder="请输入${comment}" />
+        </el-form-item>
+        <el-form-item label="${comment}" prop="onlinetime">
+          <el-input v-model="form.onlinetime" placeholder="请输入${comment}" />
+        </el-form-item>
+        <el-form-item label="${comment}" prop="konglong">
+          <el-input v-model="form.konglong" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="${comment}" prop="isshouchong">
+          <el-input v-model="form.isshouchong" placeholder="请输入${comment}" />
+        </el-form-item>
+        <el-form-item label="${comment}" prop="clanId">
+          <el-input v-model="form.clanId" placeholder="请输入${comment}" />
+        </el-form-item>
+        <el-form-item label="${comment}" prop="lastConnectTime">
+          <el-date-picker clearable
+            v-model="form.lastConnectTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择${comment}">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="${comment}" prop="prefix">
+          <el-input v-model="form.prefix" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="${comment}" prop="lastConnectIp">
+          <el-input v-model="form.lastConnectIp" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="${comment}" prop="X">
+          <el-input v-model="form.X" placeholder="请输入${comment}" />
+        </el-form-item>
+        <el-form-item label="${comment}" prop="Y">
+          <el-input v-model="form.Y" placeholder="请输入${comment}" />
+        </el-form-item>
+        <el-form-item label="${comment}" prop="Z">
+          <el-input v-model="form.Z" placeholder="请输入${comment}" />
+        </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 { listUsers, getUsers, delUsers, addUsers, updateUsers } from "@/api/system/users";
+
+export default {
+  name: "Users",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 【请填写功能名称】表格数据
+      usersList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        zhanghao: null,
+        mima: null,
+        jifen: null,
+        level: null,
+        regtime: null,
+        qiandaotime: null,
+        SteamName: null,
+        GameStatus: null,
+        killed: null,
+        shadi: null,
+        onlinetime: null,
+        konglong: null,
+        isshouchong: null,
+        clanId: null,
+        lastConnectTime: null,
+        prefix: null,
+        lastConnectIp: null,
+        X: null,
+        Y: null,
+        Z: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询【请填写功能名称】列表 */
+    getList() {
+      this.loading = true;
+      listUsers(this.queryParams).then(response => {
+        this.usersList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        SteamID: null,
+        zhanghao: null,
+        mima: null,
+        jifen: null,
+        level: null,
+        regtime: null,
+        qiandaotime: null,
+        SteamName: null,
+        GameStatus: null,
+        killed: null,
+        shadi: null,
+        onlinetime: null,
+        konglong: null,
+        isshouchong: null,
+        clanId: null,
+        lastConnectTime: null,
+        prefix: null,
+        lastConnectIp: null,
+        X: null,
+        Y: null,
+        Z: 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.SteamID)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加【请填写功能名称】";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const SteamID = row.SteamID || this.ids
+      getUsers(SteamID).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改【请填写功能名称】";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.SteamID != null) {
+            updateUsers(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUsers(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const SteamIDs = row.SteamID || this.ids;
+      this.$modal.confirm('是否确认删除【请填写功能名称】编号为"' + SteamIDs + '"的数据项?').then(function() {
+        return delUsers(SteamIDs);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('system/users/export', {
+        ...this.queryParams
+      }, `users_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 131 - 131
ruoyi-ui/vue.config.js

@@ -1,131 +1,131 @@
-'use strict'
-const path = require('path')
-
-function resolve(dir) {
-  return path.join(__dirname, dir)
-}
-
-const CompressionPlugin = require('compression-webpack-plugin')
-
-const name = process.env.VUE_APP_TITLE || '若依管理系统' // 网页标题
-
-const port = process.env.port || process.env.npm_config_port || 80 // 端口
-
-// vue.config.js 配置说明
-//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
-// 这里只列一部分,具体配置参考文档
-module.exports = {
-  // 部署生产环境和开发环境下的URL。
-  // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
-  // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
-  publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
-  // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
-  outputDir: 'dist',
-  // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
-  assetsDir: 'static',
-  // 是否开启eslint保存检测,有效值:ture | false | 'error'
-  lintOnSave: process.env.NODE_ENV === 'development',
-  // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
-  productionSourceMap: false,
-  transpileDependencies: ['quill'],
-  // webpack-dev-server 相关配置
-  devServer: {
-    host: '0.0.0.0',
-    port: port,
-    open: true,
-    proxy: {
-      // detail: https://cli.vuejs.org/config/#devserver-proxy
-      [process.env.VUE_APP_BASE_API]: {
-        target: `http://localhost:8080`,
-        changeOrigin: true,
-        pathRewrite: {
-          ['^' + process.env.VUE_APP_BASE_API]: ''
-        }
-      }
-    },
-    disableHostCheck: true
-  },
-  css: {
-    loaderOptions: {
-      sass: {
-        sassOptions: { outputStyle: "expanded" }
-      }
-    }
-  },
-  configureWebpack: {
-    name: name,
-    resolve: {
-      alias: {
-        '@': resolve('src')
-      }
-    },
-    plugins: [
-      // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件
-      new CompressionPlugin({
-        cache: false,                                  // 不启用文件缓存
-        test: /\.(js|css|html|jpe?g|png|gif|svg)?$/i,  // 压缩文件格式
-        filename: '[path][base].gz[query]',            // 压缩后的文件名
-        algorithm: 'gzip',                             // 使用gzip压缩
-        minRatio: 0.8,                                 // 压缩比例,小于 80% 的文件不会被压缩
-        deleteOriginalAssets: false                    // 压缩后删除原文件
-      })
-    ],
-  },
-  chainWebpack(config) {
-    config.plugins.delete('preload') // TODO: need test
-    config.plugins.delete('prefetch') // TODO: need test
-
-    // set svg-sprite-loader
-    config.module
-      .rule('svg')
-      .exclude.add(resolve('src/assets/icons'))
-      .end()
-    config.module
-      .rule('icons')
-      .test(/\.svg$/)
-      .include.add(resolve('src/assets/icons'))
-      .end()
-      .use('svg-sprite-loader')
-      .loader('svg-sprite-loader')
-      .options({
-        symbolId: 'icon-[name]'
-      })
-      .end()
-
-    config.when(process.env.NODE_ENV !== 'development', config => {
-          config
-            .plugin('ScriptExtHtmlWebpackPlugin')
-            .after('html')
-            .use('script-ext-html-webpack-plugin', [{
-            // `runtime` must same as runtimeChunk name. default is `runtime`
-              inline: /runtime\..*\.js$/
-            }])
-            .end()
-
-          config.optimization.splitChunks({
-            chunks: 'all',
-            cacheGroups: {
-              libs: {
-                name: 'chunk-libs',
-                test: /[\\/]node_modules[\\/]/,
-                priority: 10,
-                chunks: 'initial' // only package third parties that are initially dependent
-              },
-              elementUI: {
-                name: 'chunk-elementUI', // split elementUI into a single package
-                test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm
-                priority: 20 // the weight needs to be larger than libs and app or it will be packaged into libs or app
-              },
-              commons: {
-                name: 'chunk-commons',
-                test: resolve('src/components'), // can customize your rules
-                minChunks: 3, //  minimum common number
-                priority: 5,
-                reuseExistingChunk: true
-              }
-            }
-          })
-          config.optimization.runtimeChunk('single')
-    })
-  }
-}
+'use strict'
+const path = require('path')
+
+function resolve(dir) {
+  return path.join(__dirname, dir)
+}
+
+const CompressionPlugin = require('compression-webpack-plugin')
+
+const name = process.env.VUE_APP_TITLE || 'MHD龙岛后台' // 网页标题
+
+const port = process.env.port || process.env.npm_config_port || 80 // 端口
+
+// vue.config.js 配置说明
+//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
+// 这里只列一部分,具体配置参考文档
+module.exports = {
+  // 部署生产环境和开发环境下的URL。
+  // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
+  // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
+  publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
+  // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
+  outputDir: 'dist',
+  // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
+  assetsDir: 'static',
+  // 是否开启eslint保存检测,有效值:ture | false | 'error'
+  lintOnSave: process.env.NODE_ENV === 'development',
+  // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
+  productionSourceMap: false,
+  transpileDependencies: ['quill'],
+  // webpack-dev-server 相关配置
+  devServer: {
+    host: '0.0.0.0',
+    port: port,
+    open: true,
+    proxy: {
+      // detail: https://cli.vuejs.org/config/#devserver-proxy
+      [process.env.VUE_APP_BASE_API]: {
+        target: `http://119.45.22.217:8080`,
+        changeOrigin: true,
+        pathRewrite: {
+          ['^' + process.env.VUE_APP_BASE_API]: ''
+        }
+      }
+    },
+    disableHostCheck: true
+  },
+  css: {
+    loaderOptions: {
+      sass: {
+        sassOptions: { outputStyle: "expanded" }
+      }
+    }
+  },
+  configureWebpack: {
+    name: name,
+    resolve: {
+      alias: {
+        '@': resolve('src')
+      }
+    },
+    plugins: [
+      // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件
+      new CompressionPlugin({
+        cache: false,                                  // 不启用文件缓存
+        test: /\.(js|css|html|jpe?g|png|gif|svg)?$/i,  // 压缩文件格式
+        filename: '[path][base].gz[query]',            // 压缩后的文件名
+        algorithm: 'gzip',                             // 使用gzip压缩
+        minRatio: 0.8,                                 // 压缩比例,小于 80% 的文件不会被压缩
+        deleteOriginalAssets: false                    // 压缩后删除原文件
+      })
+    ],
+  },
+  chainWebpack(config) {
+    config.plugins.delete('preload') // TODO: need test
+    config.plugins.delete('prefetch') // TODO: need test
+
+    // set svg-sprite-loader
+    config.module
+      .rule('svg')
+      .exclude.add(resolve('src/assets/icons'))
+      .end()
+    config.module
+      .rule('icons')
+      .test(/\.svg$/)
+      .include.add(resolve('src/assets/icons'))
+      .end()
+      .use('svg-sprite-loader')
+      .loader('svg-sprite-loader')
+      .options({
+        symbolId: 'icon-[name]'
+      })
+      .end()
+
+    config.when(process.env.NODE_ENV !== 'development', config => {
+          config
+            .plugin('ScriptExtHtmlWebpackPlugin')
+            .after('html')
+            .use('script-ext-html-webpack-plugin', [{
+            // `runtime` must same as runtimeChunk name. default is `runtime`
+              inline: /runtime\..*\.js$/
+            }])
+            .end()
+
+          config.optimization.splitChunks({
+            chunks: 'all',
+            cacheGroups: {
+              libs: {
+                name: 'chunk-libs',
+                test: /[\\/]node_modules[\\/]/,
+                priority: 10,
+                chunks: 'initial' // only package third parties that are initially dependent
+              },
+              elementUI: {
+                name: 'chunk-elementUI', // split elementUI into a single package
+                test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm
+                priority: 20 // the weight needs to be larger than libs and app or it will be packaged into libs or app
+              },
+              commons: {
+                name: 'chunk-commons',
+                test: resolve('src/components'), // can customize your rules
+                minChunks: 3, //  minimum common number
+                priority: 5,
+                reuseExistingChunk: true
+              }
+            }
+          })
+          config.optimization.runtimeChunk('single')
+    })
+  }
+}