Forráskód Böngészése

2025-7-24 无支付版本

“LosinoLoveJava 3 hete
szülő
commit
69e7c6b3c4

+ 13 - 7
ruoyi-admin/pom.xml

@@ -61,6 +61,12 @@
             <artifactId>ruoyi-generator</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.github.wechatpay-apiv3</groupId>
+            <artifactId>wechatpay-java</artifactId>
+            <version>0.2.17</version>
+        </dependency>
+
     </dependencies>
 
     <build>
@@ -80,17 +86,17 @@
                     </execution>
                 </executions>
             </plugin>
-            <plugin>   
-                <groupId>org.apache.maven.plugins</groupId>   
-                <artifactId>maven-war-plugin</artifactId>   
-                <version>3.1.0</version>   
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>3.1.0</version>
                 <configuration>
                     <failOnMissingWebXml>false</failOnMissingWebXml>
                     <warName>${project.artifactId}</warName>
-                </configuration>   
-           </plugin>   
+                </configuration>
+           </plugin>
         </plugins>
         <finalName>${project.artifactId}</finalName>
     </build>
 
-</project>
+</project>

+ 98 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/controller/SysXWechatOrderController.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.SysXWechatOrder;
+import com.ruoyi.system.service.ISysXWechatOrderService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 支付记录Controller
+ *
+ * @author ruoyi
+ * @date 2025-07-24
+ */
+@RestController
+@RequestMapping("/system/order")
+public class SysXWechatOrderController extends BaseController
+{
+    @Autowired
+    private ISysXWechatOrderService sysXWechatOrderService;
+
+    /**
+     * 查询支付记录列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(SysXWechatOrder sysXWechatOrder)
+    {
+        startPage();
+        List<SysXWechatOrder> list = sysXWechatOrderService.selectSysXWechatOrderList(sysXWechatOrder);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出支付记录列表
+     */
+    @Log(title = "支付记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysXWechatOrder sysXWechatOrder)
+    {
+        List<SysXWechatOrder> list = sysXWechatOrderService.selectSysXWechatOrderList(sysXWechatOrder);
+        ExcelUtil<SysXWechatOrder> util = new ExcelUtil<SysXWechatOrder>(SysXWechatOrder.class);
+        util.exportExcel(response, list, "支付记录数据");
+    }
+
+    /**
+     * 获取支付记录详细信息
+     */
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(sysXWechatOrderService.selectSysXWechatOrderById(id));
+    }
+
+    /**
+     * 新增支付记录
+     */
+    @Log(title = "支付记录", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysXWechatOrder sysXWechatOrder)
+    {
+        return toAjax(sysXWechatOrderService.insertSysXWechatOrder(sysXWechatOrder));
+    }
+
+    /**
+     * 修改支付记录
+     */
+    @Log(title = "支付记录", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysXWechatOrder sysXWechatOrder)
+    {
+        return toAjax(sysXWechatOrderService.updateSysXWechatOrder(sysXWechatOrder));
+    }
+
+    /**
+     * 删除支付记录
+     */
+    @Log(title = "支付记录", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(sysXWechatOrderService.deleteSysXWechatOrderByIds(ids));
+    }
+}

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

@@ -34,7 +34,7 @@ public class WechatController {
         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("spbill_create_ip", "119.45.22.217");
         data.put("notify_url", notifyUrl);
         data.put("trade_type", "NATIVE");
         String sign = createSign(data, apiKey);

+ 136 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/domain/SysXWechatOrder.java

@@ -0,0 +1,136 @@
+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_wechat_order
+ * 
+ * @author ruoyi
+ * @date 2025-07-24
+ */
+public class SysXWechatOrder extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 自增id */
+    private Long id;
+
+    /** 订单号 */
+    @Excel(name = "订单号")
+    private String orderId;
+
+    /** 产品描述 */
+    @Excel(name = "产品描述")
+    private String body;
+
+    /** 获得次数 */
+    @Excel(name = "获得次数")
+    private String count;
+
+    /** 付款金额 */
+    @Excel(name = "付款金额")
+    private String totalFee;
+
+    /** 付款用户steamId */
+    @Excel(name = "付款用户steamId")
+    private String steamId;
+
+    /** 付款用户steamName */
+    @Excel(name = "付款用户steamName")
+    private String steamName;
+
+    /** 付款用户账号 */
+    @Excel(name = "付款用户账号")
+    private String zhanghao;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setOrderId(String orderId) 
+    {
+        this.orderId = orderId;
+    }
+
+    public String getOrderId() 
+    {
+        return orderId;
+    }
+    public void setBody(String body) 
+    {
+        this.body = body;
+    }
+
+    public String getBody() 
+    {
+        return body;
+    }
+    public void setCount(String count) 
+    {
+        this.count = count;
+    }
+
+    public String getCount() 
+    {
+        return count;
+    }
+    public void setTotalFee(String totalFee) 
+    {
+        this.totalFee = totalFee;
+    }
+
+    public String getTotalFee() 
+    {
+        return totalFee;
+    }
+    public void setSteamId(String steamId) 
+    {
+        this.steamId = steamId;
+    }
+
+    public String getSteamId() 
+    {
+        return steamId;
+    }
+    public void setSteamName(String steamName) 
+    {
+        this.steamName = steamName;
+    }
+
+    public String getSteamName() 
+    {
+        return steamName;
+    }
+    public void setZhanghao(String zhanghao) 
+    {
+        this.zhanghao = zhanghao;
+    }
+
+    public String getZhanghao() 
+    {
+        return zhanghao;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("orderId", getOrderId())
+            .append("body", getBody())
+            .append("count", getCount())
+            .append("totalFee", getTotalFee())
+            .append("steamId", getSteamId())
+            .append("steamName", getSteamName())
+            .append("zhanghao", getZhanghao())
+            .append("createTime", getCreateTime())
+            .toString();
+    }
+}

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

@@ -0,0 +1,61 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.system.domain.SysXWechatOrder;
+
+/**
+ * 支付记录Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2025-07-24
+ */
+public interface SysXWechatOrderMapper 
+{
+    /**
+     * 查询支付记录
+     * 
+     * @param id 支付记录主键
+     * @return 支付记录
+     */
+    public SysXWechatOrder selectSysXWechatOrderById(Long id);
+
+    /**
+     * 查询支付记录列表
+     * 
+     * @param sysXWechatOrder 支付记录
+     * @return 支付记录集合
+     */
+    public List<SysXWechatOrder> selectSysXWechatOrderList(SysXWechatOrder sysXWechatOrder);
+
+    /**
+     * 新增支付记录
+     * 
+     * @param sysXWechatOrder 支付记录
+     * @return 结果
+     */
+    public int insertSysXWechatOrder(SysXWechatOrder sysXWechatOrder);
+
+    /**
+     * 修改支付记录
+     * 
+     * @param sysXWechatOrder 支付记录
+     * @return 结果
+     */
+    public int updateSysXWechatOrder(SysXWechatOrder sysXWechatOrder);
+
+    /**
+     * 删除支付记录
+     * 
+     * @param id 支付记录主键
+     * @return 结果
+     */
+    public int deleteSysXWechatOrderById(Long id);
+
+    /**
+     * 批量删除支付记录
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteSysXWechatOrderByIds(Long[] ids);
+}

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

@@ -0,0 +1,61 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+import com.ruoyi.system.domain.SysXWechatOrder;
+
+/**
+ * 支付记录Service接口
+ * 
+ * @author ruoyi
+ * @date 2025-07-24
+ */
+public interface ISysXWechatOrderService 
+{
+    /**
+     * 查询支付记录
+     * 
+     * @param id 支付记录主键
+     * @return 支付记录
+     */
+    public SysXWechatOrder selectSysXWechatOrderById(Long id);
+
+    /**
+     * 查询支付记录列表
+     * 
+     * @param sysXWechatOrder 支付记录
+     * @return 支付记录集合
+     */
+    public List<SysXWechatOrder> selectSysXWechatOrderList(SysXWechatOrder sysXWechatOrder);
+
+    /**
+     * 新增支付记录
+     * 
+     * @param sysXWechatOrder 支付记录
+     * @return 结果
+     */
+    public int insertSysXWechatOrder(SysXWechatOrder sysXWechatOrder);
+
+    /**
+     * 修改支付记录
+     * 
+     * @param sysXWechatOrder 支付记录
+     * @return 结果
+     */
+    public int updateSysXWechatOrder(SysXWechatOrder sysXWechatOrder);
+
+    /**
+     * 批量删除支付记录
+     * 
+     * @param ids 需要删除的支付记录主键集合
+     * @return 结果
+     */
+    public int deleteSysXWechatOrderByIds(Long[] ids);
+
+    /**
+     * 删除支付记录信息
+     * 
+     * @param id 支付记录主键
+     * @return 结果
+     */
+    public int deleteSysXWechatOrderById(Long id);
+}

+ 95 - 0
ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/SysXWechatOrderServiceImpl.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.SysXWechatOrderMapper;
+import com.ruoyi.system.domain.SysXWechatOrder;
+import com.ruoyi.system.service.ISysXWechatOrderService;
+
+/**
+ * 支付记录Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2025-07-24
+ */
+@Service
+public class SysXWechatOrderServiceImpl implements ISysXWechatOrderService 
+{
+    @Autowired
+    private SysXWechatOrderMapper sysXWechatOrderMapper;
+
+    /**
+     * 查询支付记录
+     * 
+     * @param id 支付记录主键
+     * @return 支付记录
+     */
+    @Override
+    public SysXWechatOrder selectSysXWechatOrderById(Long id)
+    {
+        return sysXWechatOrderMapper.selectSysXWechatOrderById(id);
+    }
+
+    /**
+     * 查询支付记录列表
+     * 
+     * @param sysXWechatOrder 支付记录
+     * @return 支付记录
+     */
+    @Override
+    public List<SysXWechatOrder> selectSysXWechatOrderList(SysXWechatOrder sysXWechatOrder)
+    {
+        return sysXWechatOrderMapper.selectSysXWechatOrderList(sysXWechatOrder);
+    }
+
+    /**
+     * 新增支付记录
+     * 
+     * @param sysXWechatOrder 支付记录
+     * @return 结果
+     */
+    @Override
+    public int insertSysXWechatOrder(SysXWechatOrder sysXWechatOrder)
+    {
+        sysXWechatOrder.setCreateTime(DateUtils.getNowDate());
+        return sysXWechatOrderMapper.insertSysXWechatOrder(sysXWechatOrder);
+    }
+
+    /**
+     * 修改支付记录
+     * 
+     * @param sysXWechatOrder 支付记录
+     * @return 结果
+     */
+    @Override
+    public int updateSysXWechatOrder(SysXWechatOrder sysXWechatOrder)
+    {
+        return sysXWechatOrderMapper.updateSysXWechatOrder(sysXWechatOrder);
+    }
+
+    /**
+     * 批量删除支付记录
+     * 
+     * @param ids 需要删除的支付记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysXWechatOrderByIds(Long[] ids)
+    {
+        return sysXWechatOrderMapper.deleteSysXWechatOrderByIds(ids);
+    }
+
+    /**
+     * 删除支付记录信息
+     * 
+     * @param id 支付记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysXWechatOrderById(Long id)
+    {
+        return sysXWechatOrderMapper.deleteSysXWechatOrderById(id);
+    }
+}

+ 1 - 1
ruoyi-admin/src/main/resources/application.yml

@@ -137,4 +137,4 @@ wechat:
   # B5D4rnsKpcbGBhtzz7ZH4PUuvF8Y3TpD
   api_key: "B5D4rnsKpcbGBhtzz7ZH4PUuvF8Y3TpD"
   # 回调地址
-  notify_url: http://kldlongdao.com/LotteryPage/
+  notify_url: http://kldlongdao.com:8080/notify

+ 90 - 0
ruoyi-admin/src/main/resources/mapper/system/SysXWechatOrderMapper.xml

@@ -0,0 +1,90 @@
+<?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.SysXWechatOrderMapper">
+    
+    <resultMap type="SysXWechatOrder" id="SysXWechatOrderResult">
+        <result property="id"    column="id"    />
+        <result property="orderId"    column="order_id"    />
+        <result property="body"    column="body"    />
+        <result property="count"    column="count"    />
+        <result property="totalFee"    column="total_fee"    />
+        <result property="steamId"    column="steam_id"    />
+        <result property="steamName"    column="steam_name"    />
+        <result property="zhanghao"    column="zhanghao"    />
+        <result property="createTime"    column="create_time"    />
+    </resultMap>
+
+    <sql id="selectSysXWechatOrderVo">
+        select id, order_id, body, count, total_fee, steam_id, steam_name, zhanghao, create_time from sys_x_wechat_order
+    </sql>
+
+    <select id="selectSysXWechatOrderList" parameterType="SysXWechatOrder" resultMap="SysXWechatOrderResult">
+        <include refid="selectSysXWechatOrderVo"/>
+        <where>  
+            <if test="orderId != null  and orderId != ''"> and order_id = #{orderId}</if>
+            <if test="body != null  and body != ''"> and body = #{body}</if>
+            <if test="count != null  and count != ''"> and count = #{count}</if>
+            <if test="totalFee != null  and totalFee != ''"> and total_fee = #{totalFee}</if>
+            <if test="steamId != null  and steamId != ''"> and steam_id = #{steamId}</if>
+            <if test="steamName != null  and steamName != ''"> and steam_name like concat('%', #{steamName}, '%')</if>
+            <if test="zhanghao != null  and zhanghao != ''"> and zhanghao = #{zhanghao}</if>
+        </where>
+    </select>
+    
+    <select id="selectSysXWechatOrderById" parameterType="Long" resultMap="SysXWechatOrderResult">
+        <include refid="selectSysXWechatOrderVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertSysXWechatOrder" parameterType="SysXWechatOrder" useGeneratedKeys="true" keyProperty="id">
+        insert into sys_x_wechat_order
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="orderId != null">order_id,</if>
+            <if test="body != null">body,</if>
+            <if test="count != null">count,</if>
+            <if test="totalFee != null">total_fee,</if>
+            <if test="steamId != null">steam_id,</if>
+            <if test="steamName != null">steam_name,</if>
+            <if test="zhanghao != null">zhanghao,</if>
+            <if test="createTime != null">create_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="orderId != null">#{orderId},</if>
+            <if test="body != null">#{body},</if>
+            <if test="count != null">#{count},</if>
+            <if test="totalFee != null">#{totalFee},</if>
+            <if test="steamId != null">#{steamId},</if>
+            <if test="steamName != null">#{steamName},</if>
+            <if test="zhanghao != null">#{zhanghao},</if>
+            <if test="createTime != null">#{createTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSysXWechatOrder" parameterType="SysXWechatOrder">
+        update sys_x_wechat_order
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="orderId != null">order_id = #{orderId},</if>
+            <if test="body != null">body = #{body},</if>
+            <if test="count != null">count = #{count},</if>
+            <if test="totalFee != null">total_fee = #{totalFee},</if>
+            <if test="steamId != null">steam_id = #{steamId},</if>
+            <if test="steamName != null">steam_name = #{steamName},</if>
+            <if test="zhanghao != null">zhanghao = #{zhanghao},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteSysXWechatOrderById" parameterType="Long">
+        delete from sys_x_wechat_order where id = #{id}
+    </delete>
+
+    <delete id="deleteSysXWechatOrderByIds" parameterType="String">
+        delete from sys_x_wechat_order where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

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

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询支付记录列表
+export function listOrder(query) {
+  return request({
+    url: '/system/order/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询支付记录详细
+export function getOrder(id) {
+  return request({
+    url: '/system/order/' + id,
+    method: 'get'
+  })
+}
+
+// 新增支付记录
+export function addOrder(data) {
+  return request({
+    url: '/system/order',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改支付记录
+export function updateOrder(data) {
+  return request({
+    url: '/system/order',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除支付记录
+export function delOrder(id) {
+  return request({
+    url: '/system/order/' + id,
+    method: 'delete'
+  })
+}

+ 105 - 39
ruoyi-ui/src/views/system/count/index.vue

@@ -1,6 +1,13 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+    <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"
@@ -50,8 +57,16 @@
         />
       </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-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>
 
@@ -64,7 +79,8 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['system:count:add']"
-        >新增</el-button>
+          >新增</el-button
+        >
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -75,7 +91,8 @@
           :disabled="single"
           @click="handleUpdate"
           v-hasPermi="['system:count:edit']"
-        >修改</el-button>
+          >修改</el-button
+        >
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -86,7 +103,8 @@
           :disabled="multiple"
           @click="handleDelete"
           v-hasPermi="['system:count:remove']"
-        >删除</el-button>
+          >删除</el-button
+        >
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -96,12 +114,20 @@
           size="mini"
           @click="handleExport"
           v-hasPermi="['system:count:export']"
-        >导出</el-button>
+          >导出</el-button
+        >
       </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="countList" @selection-change="handleSelectionChange">
+    <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" />
@@ -111,7 +137,11 @@
       <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">
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
         <template slot-scope="scope">
           <el-button
             size="mini"
@@ -119,20 +149,22 @@
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
             v-hasPermi="['system:count:edit']"
-          >修改</el-button>
+            >修改</el-button
+          >
           <el-button
             size="mini"
             type="text"
             icon="el-icon-delete"
             @click="handleDelete(scope.row)"
             v-hasPermi="['system:count:remove']"
-          >删除</el-button>
+            >删除</el-button
+          >
         </template>
       </el-table-column>
     </el-table>
 
     <pagination
-      v-show="total>0"
+      v-show="total > 0"
       :total="total"
       :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize"
@@ -140,7 +172,13 @@
     />
 
     <!-- 添加或修改抽奖次数对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      width="500px"
+      append-to-body
+      :before-close="(done) => handleDialogClose(done)"
+    >
       <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" />
@@ -170,7 +208,13 @@
 </template>
 
 <script>
-import { listCount, getCount, delCount, addCount, updateCount } from "@/api/system/count";
+import {
+  listCount,
+  getCount,
+  delCount,
+  addCount,
+  updateCount,
+} from "@/api/system/count";
 
 export default {
   name: "Count",
@@ -203,13 +247,12 @@ export default {
         steamName: null,
         poolId: null,
         poolName: null,
-        count: null
+        count: null,
       },
       // 表单参数
       form: {},
       // 表单校验
-      rules: {
-      }
+      rules: {},
     };
   },
   created() {
@@ -219,7 +262,7 @@ export default {
     /** 查询抽奖次数列表 */
     getList() {
       this.loading = true;
-      listCount(this.queryParams).then(response => {
+      listCount(this.queryParams).then((response) => {
         this.countList = response.rows;
         this.total = response.total;
         this.loading = false;
@@ -239,7 +282,7 @@ export default {
         steamName: null,
         poolId: null,
         poolName: null,
-        count: null
+        count: null,
       };
       this.resetForm("form");
     },
@@ -255,9 +298,9 @@ export default {
     },
     // 多选框选中数据
     handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.id)
-      this.single = selection.length!==1
-      this.multiple = !selection.length
+      this.ids = selection.map((item) => item.id);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
     },
     /** 新增按钮操作 */
     handleAdd() {
@@ -268,8 +311,8 @@ export default {
     /** 修改按钮操作 */
     handleUpdate(row) {
       this.reset();
-      const id = row.id || this.ids
-      getCount(id).then(response => {
+      const id = row.id || this.ids;
+      getCount(id).then((response) => {
         this.form = response.data;
         this.open = true;
         this.title = "修改抽奖次数";
@@ -277,16 +320,16 @@ export default {
     },
     /** 提交按钮 */
     submitForm() {
-      this.$refs["form"].validate(valid => {
+      this.$refs["form"].validate((valid) => {
         if (valid) {
           if (this.form.id != null) {
-            updateCount(this.form).then(response => {
+            updateCount(this.form).then((response) => {
               this.$modal.msgSuccess("修改成功");
               this.open = false;
               this.getList();
             });
           } else {
-            addCount(this.form).then(response => {
+            addCount(this.form).then((response) => {
               this.$modal.msgSuccess("新增成功");
               this.open = false;
               this.getList();
@@ -298,19 +341,42 @@ export default {
     /** 删除按钮操作 */
     handleDelete(row) {
       const ids = row.id || this.ids;
-      this.$modal.confirm('是否确认删除抽奖次数编号为"' + ids + '"的数据项?').then(function() {
-        return delCount(ids);
-      }).then(() => {
-        this.getList();
-        this.$modal.msgSuccess("删除成功");
-      }).catch(() => {});
+      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`)
-    }
-  }
+      this.download(
+        "system/count/export",
+        {
+          ...this.queryParams,
+        },
+        `count_${new Date().getTime()}.xlsx`
+      );
+    },
+    handleDialogClose(done) {
+      this.$confirm("确定要关闭弹窗吗?未保存的数据将会丢失。", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.open = false;
+          this.reset();
+          if (done) done();
+        })
+        .catch(() => {
+          // 用户取消,不关闭弹窗
+        });
+    },
+  },
 };
 </script>

+ 349 - 0
ruoyi-ui/src/views/system/order/index.vue

@@ -0,0 +1,349 @@
+<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="orderId">
+        <el-input
+          v-model="queryParams.orderId"
+          placeholder="请输入订单号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="产品描述" prop="body">
+        <el-input
+          v-model="queryParams.body"
+          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 label="付款金额" prop="totalFee">
+        <el-input
+          v-model="queryParams.totalFee"
+          placeholder="请输入付款金额"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <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="付款用户steamName" prop="steamName">
+        <el-input
+          v-model="queryParams.steamName"
+          placeholder="请输入付款用户steamName"
+          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>
+        <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:order: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:order: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:order: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:order:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="orderList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column type="index" label="序号" width="55" align="center" />
+      <!--<el-table-column label="自增id" align="center" prop="id" />-->
+      <el-table-column label="订单号" align="center" prop="orderId" />
+      <el-table-column label="产品描述" align="center" prop="body" />
+      <el-table-column label="获得次数" align="center" prop="count" />
+      <el-table-column label="付款金额" align="center" prop="totalFee" />
+      <el-table-column label="付款用户steamId" align="center" prop="steamId" />
+      <el-table-column label="付款用户steamName" align="center" prop="steamName" />
+      <el-table-column label="付款用户账号" align="center" prop="zhanghao" />
+      <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:order:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:order: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
+      :before-close="handleDialogClose"
+    >
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="订单号" prop="orderId">
+          <el-input v-model="form.orderId" placeholder="请输入订单号" />
+        </el-form-item>
+        <el-form-item label="产品描述" prop="body">
+          <el-input v-model="form.body" placeholder="请输入产品描述" />
+        </el-form-item>
+        <el-form-item label="获得次数" prop="count">
+          <el-input v-model="form.count" placeholder="请输入获得次数" />
+        </el-form-item>
+        <el-form-item label="付款金额" prop="totalFee">
+          <el-input v-model="form.totalFee" placeholder="请输入付款金额" />
+        </el-form-item>
+        <el-form-item label="付款用户steamId" prop="steamId">
+          <el-input v-model="form.steamId" placeholder="请输入付款用户steamId" />
+        </el-form-item>
+        <el-form-item label="付款用户steamName" prop="steamName">
+          <el-input v-model="form.steamName" placeholder="请输入付款用户steamName" />
+        </el-form-item>
+        <el-form-item label="付款用户账号" prop="zhanghao">
+          <el-input v-model="form.zhanghao" 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 { listOrder, getOrder, delOrder, addOrder, updateOrder } from "@/api/system/order";
+
+export default {
+  name: "Order",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 支付记录表格数据
+      orderList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        orderId: null,
+        body: null,
+        count: null,
+        totalFee: null,
+        steamId: null,
+        steamName: null,
+        zhanghao: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询支付记录列表 */
+    getList() {
+      this.loading = true;
+      listOrder(this.queryParams).then(response => {
+        this.orderList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      // 触发 el-dialog 的关闭(会自动走 before-close)
+      this.open = false;
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        orderId: null,
+        body: null,
+        count: null,
+        totalFee: null,
+        steamId: null,
+        steamName: null,
+        zhanghao: null,
+        createTime: 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
+      getOrder(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) {
+            updateOrder(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addOrder(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 delOrder(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('system/order/export', {
+        ...this.queryParams
+      }, `order_${new Date().getTime()}.xlsx`)
+    },
+    handleDialogClose(done) {
+      this.$confirm('确定要关闭窗口吗?未保存的数据将会丢失。', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        done(); // 关闭弹窗
+        this.reset();
+      }).catch(() => {
+        // 用户取消,不关闭弹窗
+      });
+    }
+  }
+};
+</script>

+ 22 - 1
ruoyi-ui/src/views/system/package/index.vue

@@ -271,7 +271,13 @@
     />
 
     <!-- 添加或修改奖品背包对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      width="500px"
+      append-to-body
+      :before-close="(done) => handleDialogClose(done)"
+    >
       <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" />
@@ -518,6 +524,21 @@ export default {
       this.lotteryResultDialogVisible = false;
       // 这里可以根据val做后续处理,比如请求后端核销接口
     },
+    handleDialogClose(done) {
+      this.$confirm("确定要关闭弹窗吗?未保存的数据将会丢失。", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.open = false;
+          this.reset();
+          if (done) done();
+        })
+        .catch(() => {
+          // 用户取消,不关闭弹窗
+        });
+    },
   },
 };
 </script>

+ 56 - 14
ruoyi-ui/src/views/system/pool/index.vue

@@ -156,7 +156,11 @@
     >
       <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="id" align="center" prop="id">
+        <template slot-scope="scope">
+          <span class="highlight-id">{{ scope.row.id }}</span>
+        </template>
+      </el-table-column>
       <el-table-column label="卡池名称" align="center" prop="title" />
       <el-table-column label="价格" align="center" prop="price" />
       <el-table-column label="概要" align="center" prop="description" />
@@ -216,7 +220,13 @@
     />
 
     <!-- 添加或修改卡池对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      width="500px"
+      append-to-body
+      :before-close="(done) => handleDialogClose('main', done)"
+    >
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-form-item label="卡池名称" prop="title">
           <el-input v-model="form.title" placeholder="请输入卡池名称" />
@@ -289,7 +299,7 @@
       :visible.sync="showPrizesDialog"
       width="60%"
       append-to-body
-      @close="showPrizesDialog = false"
+      :before-close="(done) => handleDialogClose('prizes', done)"
     >
       <Prizes v-if="showPrizesDialog" :pool="currentPool" />
     </el-dialog>
@@ -299,7 +309,7 @@
       :visible.sync="showProbabilitiesDialog"
       width="40%"
       append-to-body
-      @close="showProbabilitiesDialog = false"
+      :before-close="(done) => handleDialogClose('probabilities', done)"
     >
       <Probabilities v-if="showProbabilitiesDialog" :pool="currentPool" />
     </el-dialog>
@@ -354,18 +364,16 @@ export default {
         bgColor: null,
         textColor: null,
         fullDescription: null,
-        count: null
+        count: null,
       },
       // 表单参数
       form: {},
       // 表单校验
       rules: {
-        price: [
-          { required: true, message: "价格不能为空", trigger: "blur" }
-        ],
+        price: [{ required: true, message: "价格不能为空", trigger: "blur" }],
         count: [
-          { required: true, message: "抽奖次数不能为空", trigger: "blur" }
-        ]
+          { required: true, message: "抽奖次数不能为空", trigger: "blur" },
+        ],
       },
       showPrizesDialog: false,
       currentPool: null,
@@ -401,7 +409,7 @@ export default {
         bgColor: null,
         textColor: null,
         fullDescription: null,
-        count: null
+        count: null,
       };
       this.resetForm("form");
     },
@@ -424,9 +432,9 @@ export default {
     /** 新增按钮操作 */
     handleAdd() {
       this.reset();
-      this.form.borderColor = 'border-blue-500'
-      this.form.bgColor = 'bg-blue-500/10'
-      this.form.textColor = 'text-blue-500'
+      this.form.borderColor = "border-blue-500";
+      this.form.bgColor = "bg-blue-500/10";
+      this.form.textColor = "text-blue-500";
       this.open = true;
       this.title = "添加卡池";
     },
@@ -492,6 +500,40 @@ export default {
       this.currentPool = row;
       this.showProbabilitiesDialog = true;
     },
+    handleDialogClose(type, done) {
+      this.$confirm("确定要关闭弹窗吗?未保存的数据将会丢失。", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          // 用户确认,关闭对应弹窗
+          if (type === "main") {
+            this.open = false;
+            this.reset();
+          } else if (type === "prizes") {
+            this.showPrizesDialog = false;
+          } else if (type === "probabilities") {
+            this.showProbabilitiesDialog = false;
+          }
+          if (done) done(); // 调用 done() 表示确认关闭
+        })
+        .catch(() => {
+          // 用户取消,不关闭弹窗
+          // 不调用 done(),弹窗不会关闭
+        });
+    },
   },
 };
 </script>
+
+<style scoped>
+.highlight-id {
+  color: #e74c3c; /* 红色,可自定义 */
+  font-weight: bold;
+  font-size: 16px;
+  background: #fff3e0; /* 淡背景色,可选 */
+  padding: 2px 6px;
+  border-radius: 4px;
+}
+</style>

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

@@ -36,7 +36,7 @@ module.exports = {
     proxy: {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
-        target: `http://119.45.22.217:8080`,
+        target: `http://127.0.0.1:8080`,
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API]: ''