Przeglądaj źródła

add:app 提现 看课发红包 提现风控

ct 1 dzień temu
rodzic
commit
ff7ae5945b

+ 53 - 0
src/api/his/consecutiveWithdrawRecord.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询连续提现记录列表
+export function listRecord(query) {
+  return request({
+    url: '/his/consecutiveWithdrawRecord/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询连续提现记录详细
+export function getRecord(id) {
+  return request({
+    url: '/his/consecutiveWithdrawRecord/' + id,
+    method: 'get'
+  })
+}
+
+// 新增连续提现记录
+export function addRecord(data) {
+  return request({
+    url: '/his/record',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改连续提现记录
+export function updateRecord(data) {
+  return request({
+    url: '/his/record',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除连续提现记录
+export function delRecord(id) {
+  return request({
+    url: '/his/consecutiveWithdrawRecord/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出连续提现记录
+export function exportRecord(query) {
+  return request({
+    url: '/his/consecutiveWithdrawRecord/export',
+    method: 'get',
+    params: query
+  })
+}

+ 27 - 0
src/api/his/integralRedPacketLog.js

@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+
+// 查询积分佣金红包记录列表
+export function listLog(query) {
+  return request({
+    url: '/his/integralRedPacketLog/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询积分佣金红包记录详细
+export function getLog(logId) {
+  return request({
+    url: '/his/integralRedPacketLog/' + logId,
+    method: 'get'
+  })
+}
+
+// 导出积分佣金红包记录
+export function exportLog(query) {
+  return request({
+    url: '/his/integralRedPacketLog/export',
+    method: 'get',
+    params: query
+  })
+}

+ 62 - 0
src/api/his/withdrawDetail.js

@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 查询广告分佣列表
+export function listProfit(query) {
+  return request({
+    url: '/adv/profit/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询广告分佣详细
+export function getProfit(id) {
+  return request({
+    url: '/adv/profit/' + id,
+    method: 'get'
+  })
+}
+
+// 新增广告分佣
+export function addProfit(data) {
+  return request({
+    url: '/adv/profit',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改广告分佣
+export function updateProfit(data) {
+  return request({
+    url: '/adv/profit',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除广告分佣
+export function delProfit(id) {
+  return request({
+    url: '/adv/profit/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出广告分佣
+export function exportProfit(query) {
+  return request({
+    url: '/adv/profit/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询用户可提现 和 已提现总金额
+export function getWithFinishAndMayWithdraw(query) {
+  return request({
+    url: '/adv/profit/getWithFinishAndMayWithdraw',
+    method: 'get',
+    params: query
+  })
+}

+ 497 - 0
src/views/his/withdrawDetail/index.vue

@@ -0,0 +1,497 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="用户id" prop="userId">
+        <el-input
+          v-model="queryParams.userId"
+          placeholder="请输入用户id"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="用户昵称" prop="nickName">
+        <el-input
+          v-model="queryParams.nickName"
+          placeholder="请输入用户昵称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="批次单号" prop="outBatchNo">
+        <el-input
+          v-model="queryParams.outBatchNo"
+          placeholder="请输入批次单号"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="订单号" prop="batchId">
+        <el-input
+          v-model="queryParams.batchId"
+          placeholder="请输入微信批次单号(订单号)"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="提现金额(元)" label-width="100px">
+        <div class="amount-range">
+          <el-input
+            v-model="queryParams.minAmount"
+            placeholder=""
+            clearable
+            size="small"
+            style="width: 140px"
+            @keyup.enter.native="handleQuery"
+            @input="handleAmountInput('minAmount', $event)"
+          />
+          <span class="separator">-</span>
+          <el-input
+            v-model="queryParams.maxAmount"
+            placeholder=""
+            clearable
+            size="small"
+            style="width: 140px"
+            @keyup.enter.native="handleQuery"
+            @input="handleAmountInput('maxAmount', $event)"
+          />
+        </div>
+      </el-form-item>
+      <!-- 提现时间范围 -->
+      <el-form-item label="提现时间">
+        <el-date-picker
+          v-model="timeRange"
+          type="datetimerange"
+          range-separator="至"
+          start-placeholder="开始时间"
+          end-placeholder="结束时间"
+          :default-time="['00:00:00', '23:59:59']"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          size="small"
+          style="width: 510px"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
+          <el-option label="发送成功" :value="1" />
+          <el-option label="领取中" value="0" />
+          <el-option label="已取消" :value="-2" />
+          <el-option label="发送失败" :value="-1" />
+
+        </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-form :model="queryParams" ref="totalMoney" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="可提现总金额" prop="totalMayWithdraw">
+        <el-input
+          v-model="totalMoney.totalMayWithdraw"
+          placeholder=""
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+          disabled
+        />
+      </el-form-item>
+
+      <el-form-item label="已提现总金额" prop="totalWithdrawFinish">
+        <el-input
+          v-model="totalMoney.totalWithdrawFinish"
+          placeholder=""
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+          disabled
+        />
+      </el-form-item>
+      <el-form-item label="领取中金额" prop="withdrawMoney">
+        <el-input
+          v-model="totalMoney.withdrawMoney"
+          placeholder=""
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+          disabled
+        />
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['his:integralRedPacketLog:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="logList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="日志Id" align="center" prop="logId" />
+      <el-table-column label="用户id" align="center" prop="userId" />
+      <el-table-column label="用户昵称" align="center" prop="nickName" />
+      <el-table-column label="提现金额" align="center" prop="amount" />
+      <el-table-column label="提现时间" align="center" prop="createTime" />
+      <el-table-column label="批次单号" align="center" prop="outBatchNo" width="250px"/>
+      <el-table-column label="微信批次单号" align="center" prop="batchId" />
+      <el-table-column label="状态" align="center" prop="status" >
+        <template slot-scope="{ row }">
+          <el-tag :type="getStatusType(row.status)" size="small">
+            {{ getStatusText(row.status) }}
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="退佣状态" align="center" prop="returnedStatus" >
+        <template slot-scope="{ row }">
+          <span :class="row.returnedStatus === 1 ? 'status-yes' : 'status-no'">
+            {{ row.returnedStatus === 1 ? '是' : '否' }}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark" />
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+  </div>
+</template>
+
+<script>
+import {
+  listProfit,
+  getProfit,
+  delProfit,
+  addProfit,
+  updateProfit,
+  exportProfit,
+  getWithFinishAndMayWithdraw
+} from "@/api/his/withdrawDetail";
+import { listLog, getLog, delLog, addLog, updateLog, exportLog } from "@/api/his/integralRedPacketLog";
+
+export default {
+  name: "Profit",
+  data() {
+    return {
+      minAmount: undefined,
+      maxAmount: undefined,
+      timeRange: [],
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 广告分佣表格数据
+      logList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      firstLoginTime: null,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userId: null,
+        nickName: null,
+        beginTime:null,
+        endTime:null,
+        minAmount: null,
+        maxAmount: null,
+        outBatchNo: null,
+        batchId: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        adTransId: [
+          { required: true, message: "广告回调唯一交易ID不能为空", trigger: "blur" }
+        ],
+      },
+      // 可提现总金额 和 已提现总金额
+      totalMoney: {
+        totalWithdrawFinish: null,
+        totalMayWithdraw: null,
+        withdrawMoney: null
+      },
+    };
+  },
+  created() {
+    this.getList();
+    this.selectMoney();
+  },
+  methods: {
+    // 金额输入校验(只允许数字和小数点,最多两位小数)
+    handleAmountInput(field, value) {
+      // 移除非数字和非小数点字符
+      let newValue = value.replace(/[^\d.]/g, '')
+
+      // 只允许一个小数点
+      const parts = newValue.split('.')
+      if (parts.length > 2) {
+        newValue = parts[0] + '.' + parts.slice(1).join('')
+      }
+
+      // 限制最多两位小数
+      if (parts[1] && parts[1].length > 2) {
+        newValue = parts[0] + '.' + parts[1].substring(0, 2)
+      }
+
+      // 以0开头但不是0.的情况处理
+      if (newValue.startsWith('0') && newValue.length > 1 && !newValue.startsWith('0.')) {
+        newValue = newValue.substring(1)
+      }
+
+      this.queryParams[field] = newValue === '' ? null : newValue
+    },
+
+
+    getStatusText(status) {
+      const map = {
+        1: '发送成功',
+        '-3': '取消中',
+        '-2': '已取消',
+        '-1': '发送失败',
+        0: '领取中'
+      }
+      return map[status] || '领取中' // 其余状态默认显示领取中
+    },
+    getStatusType(status) {
+      const map = {
+        1: 'success',      // 绿色
+        '-3': 'warning',   // 黄色
+        '-2': 'info',      // 灰色
+        '-1': 'danger'     // 红色
+      }
+      return map[status] || '' // 领取中为默认蓝色/白色
+    },
+    changeLoginTime(){
+      if(this.firstLoginTime!=null){
+        this.queryParams.sTime=this.firstLoginTime[0];
+        this.queryParams.eTime=this.firstLoginTime[1];
+      }else{
+        this.queryParams.sTime=null;
+        this.queryParams.eTime=null;
+      }
+    },
+    /** 查询广告分佣列表 */
+    getList() {
+      this.loading = true;
+      const params = this.queryParams
+      const minAmount = this.queryParams.minAmount ? parseFloat(this.queryParams.minAmount) : null
+      const maxAmount = this.queryParams.maxAmount ? parseFloat(this.queryParams.maxAmount) : null
+
+      // 校验范围逻辑
+      if (minAmount !== null && maxAmount !== null && minAmount > maxAmount) {
+        this.$message.warning('最小金额不能大于最大金额')
+        return
+      }
+
+      if (minAmount !== null) {
+        params.minAmount = minAmount
+      }
+      if (maxAmount !== null) {
+        params.maxAmount = maxAmount
+      }
+      // 时间范围处理
+      if (this.timeRange && this.timeRange.length>0) {
+        params.beginTime = this.timeRange[0]
+        params.endTime = this.timeRange[1]
+      } else {
+        this.timeRange= []
+      }
+      listLog(params).then(response => {
+        this.logList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 查询可提现总金额 和 已提现总金额 */
+    selectMoney() {
+      getWithFinishAndMayWithdraw().then(response => {
+        this.totalMoney.totalMayWithdraw = response.totalMayWithdraw;
+        this.totalMoney.totalWithdrawFinish = response.totalWithdrawFinish;
+        this.totalMoney.withdrawMoney = response.withdrawMoney;
+      })
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        adTransId: null,
+        adTaskId: null,
+        sumMoney: null,
+        userId: null,
+        userMoney: null,
+        companyId: null,
+        companyMoney: null,
+        huyiMoney: null,
+        yunlianMoney: null,
+        createTime: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.selectMoney();
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.queryParams = {
+        userId : null,
+        nickName : null,
+        beginTime : null,
+        endTime : null,
+        minAmount : null,
+        maxAmount : null,
+        outBatchNo : null,
+        batchId : null,
+        pageNum : 1,
+        pageSize : 10,
+      }
+      this.timeRange = [];
+      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
+      getProfit(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) {
+            updateProfit(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addProfit(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除广告分佣编号为"' + ids + '"的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(function() {
+        return delProfit(ids);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+
+      const params = this.queryParams
+      const minAmount = this.queryParams.minAmount ? parseFloat(this.queryParams.minAmount) : null
+      const maxAmount = this.queryParams.maxAmount ? parseFloat(this.queryParams.maxAmount) : null
+
+      // 校验范围逻辑
+      if (minAmount !== null && maxAmount !== null && minAmount > maxAmount) {
+        this.$message.warning('最小金额不能大于最大金额')
+        return
+      }
+
+      if (minAmount !== null) {
+        params.minAmount = minAmount
+      }
+      if (maxAmount !== null) {
+        params.maxAmount = maxAmount
+      }
+      // 时间范围处理
+      if (this.timeRange && this.timeRange.length>0) {
+        params.beginTime = this.timeRange[0]
+        params.endTime = this.timeRange[1]
+      } else {
+        this.timeRange= []
+      }
+      this.$confirm('是否确认导出所有提现数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        this.exportLoading = true;
+        return exportLog(params);
+      }).then(response => {
+        this.download(response.msg);
+        this.exportLoading = false;
+      }).catch(() => {});
+    }
+  }
+};
+</script>
+<style scoped>
+.amount-range {
+  display: flex;
+  align-items: center;
+}
+.separator {
+  margin: 0 8px;
+  color: #909399;
+}
+</style>

+ 385 - 0
src/views/his/withdrawDetail/lockdownUser.vue

@@ -0,0 +1,385 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="用户ID" prop="userId">
+        <el-input
+          v-model="queryParams.userId"
+          placeholder="请输入用户ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="用户昵称" prop="nickName">
+        <el-input
+          v-model="queryParams.nickName"
+          placeholder="请输入用户昵称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="连续天数" prop="consecutiveDays">
+        <el-input
+          v-model="queryParams.consecutiveDays"
+          placeholder="请输入连续天数"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="开始日期" prop="startDate">
+        <el-date-picker clearable size="small"
+          v-model="queryParams.startDate"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="选择连续开始日期">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="结束日期" prop="endDate">
+        <el-date-picker clearable size="small"
+          v-model="queryParams.endDate"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="选择连续结束日期">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="提现次数" prop="withdrawCount">
+        <el-input
+          v-model="queryParams.withdrawCount"
+          placeholder="请输入连续期间提现次数"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="连续金额" prop="totalAmount">
+        <el-input
+          v-model="queryParams.totalAmount"
+          placeholder="请输入连续期间提现总金额"
+          clearable
+          size="small"
+          @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="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdateUser"
+          v-hasPermi="['his:user:disabledUsers']"
+        >禁用</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['his:consecutiveWithdrawRecord:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="recordList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="用户ID" align="center" prop="userId" />
+      <el-table-column label="用户昵称" align="center" prop="nickName" />
+      <el-table-column label="连续天数" align="center" prop="consecutiveDays" />
+      <el-table-column label="连续开始日期" align="center" prop="startDate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.startDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="连续结束日期" align="center" prop="endDate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.endDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="连续期间提现次数" align="center" prop="withdrawCount" />
+      <el-table-column label="连续期间提现总金额" align="center" prop="totalAmount" />
+      <el-table-column label="备注" align="center" prop="remark" />
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改连续提现记录对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="用户ID" prop="userId">
+          <el-input v-model="form.userId" placeholder="请输入用户ID" />
+        </el-form-item>
+        <el-form-item label="连续天数" prop="consecutiveDays">
+          <el-input v-model="form.consecutiveDays" placeholder="请输入连续天数" />
+        </el-form-item>
+        <el-form-item label="连续开始日期" prop="startDate">
+          <el-date-picker clearable size="small"
+            v-model="form.startDate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择连续开始日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="连续结束日期" prop="endDate">
+          <el-date-picker clearable size="small"
+            v-model="form.endDate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择连续结束日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="连续期间提现次数" prop="withdrawCount">
+          <el-input v-model="form.withdrawCount" placeholder="请输入连续期间提现次数" />
+        </el-form-item>
+        <el-form-item label="连续期间提现总金额" prop="totalAmount">
+          <el-input v-model="form.totalAmount" placeholder="请输入连续期间提现总金额" />
+        </el-form-item>
+
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" type="textarea" 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="updateUser.title" :visible.sync="updateUser.open" width="500px" append-to-body>
+      <el-form label-width="80px">
+        <el-form-item label="禁用备注" prop="remark">
+          <el-input v-model="userRemark" placeholder="请输入禁用备注" />
+        </el-form-item>
+
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitUserForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listRecord, getRecord, delRecord, addRecord, updateRecord, exportRecord } from "@/api/his/consecutiveWithdrawRecord";
+import { disabledUsers } from "@/api/his/user";
+
+export default {
+  name: "Record",
+  data() {
+    return {
+      userRemark: "",
+      updateUser:{
+        title:"",
+        open:false
+      },
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      userIds: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 连续提现记录表格数据
+      recordList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userId: null,
+        consecutiveDays: null,
+        startDate: null,
+        endDate: null,
+        withdrawCount: null,
+        totalAmount: null,
+        status: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        userId: [
+          { required: true, message: "用户ID不能为空", trigger: "blur" }
+        ],
+        consecutiveDays: [
+          { required: true, message: "连续天数不能为空", trigger: "blur" }
+        ],
+        startDate: [
+          { required: true, message: "连续开始日期不能为空", trigger: "blur" }
+        ],
+        endDate: [
+          { required: true, message: "连续结束日期不能为空", trigger: "blur" }
+        ],
+        withdrawCount: [
+          { required: true, message: "连续期间提现次数不能为空", trigger: "blur" }
+        ],
+        totalAmount: [
+          { required: true, message: "连续期间提现总金额不能为空", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询连续提现记录列表 */
+    getList() {
+      this.loading = true;
+      listRecord(this.queryParams).then(response => {
+        this.recordList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        userId: null,
+        consecutiveDays: null,
+        startDate: null,
+        endDate: null,
+        withdrawCount: null,
+        totalAmount: null,
+        status: 0,
+        remark: null,
+        createTime: null,
+        updateTime: 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.userIds = selection.map(item => item.userId)
+      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
+      getRecord(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改连续提现记录";
+      });
+    },
+    /** 修改按钮操作 */
+    handleUpdateUser() {
+      this.updateUser.open = true;
+      this.updateUser.title = "禁用用户";
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateRecord(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addRecord(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    submitUserForm(){
+      const params = {userIds: this.userIds,remark: this.userRemark};
+      disabledUsers(params).then(response => {
+        this.msgSuccess("禁用成功");
+        this.updateUser.open = false;
+        this.getList();
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除连续提现记录编号为"' + ids + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delRecord(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有连续提现记录数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportRecord(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>

+ 676 - 1
src/views/system/config/config.vue

@@ -2129,6 +2129,242 @@
               </el-tooltip>
             </el-form-item>
 
+            <!-- 游戏列表区域 -->
+            <el-form-item label="游戏列表" class="game-list-item">
+              <div class="game-list-header">
+                <el-button type="primary" size="small" @click="addGameConfig" icon="el-icon-plus">
+                  新增游戏
+                </el-button>
+                <span class="game-list-tip">最多可添加10个游戏</span>
+              </div>
+
+              <!-- 游戏列表表格 -->
+              <el-table
+                :data="form25.gameList"
+                border
+                style="width: 100%; margin-top: 15px;"
+                v-loading="gameListLoading"
+              >
+                <el-table-column label="序号" width="60" align="center">
+                  <template slot-scope="scope">
+                    <span>{{ scope.$index + 1 }}</span>
+                  </template>
+                </el-table-column>
+
+                <el-table-column label="游戏图片" width="200" align="center">
+                  <template slot-scope="scope">
+                    <div v-if="scope.row.editing">
+                      <ImageUpload
+                        v-model="scope.row.image"
+                        :limit="1"
+                        :file-type='["png", "jpg", "jpeg"]'
+                        :width="30"
+                        :height="30"
+                      />
+                    </div>
+                    <div v-else class="game-image-preview">
+                      <el-image
+                        v-if="scope.row.image"
+                        :src="scope.row.image"
+                        :preview-src-list="[scope.row.image]"
+                        style="width: 50px; height: 50px; border-radius: 4px;"
+                      >
+                        <div slot="error" class="image-slot">
+                          <i class="el-icon-picture-outline"></i>
+                        </div>
+                      </el-image>
+                      <span v-else class="no-image">暂无图片</span>
+                    </div>
+                  </template>
+                </el-table-column>
+
+                <el-table-column label="游戏名称" min-width="150">
+                  <template slot-scope="scope">
+                    <el-input
+                      v-if="scope.row.editing"
+                      v-model="scope.row.name"
+                      placeholder="请输入游戏名称"
+                      size="small"
+                    ></el-input>
+                    <span v-else>{{ scope.row.name || '-' }}</span>
+                  </template>
+                </el-table-column>
+
+                <el-table-column label="游戏链接" min-width="200">
+                  <template slot-scope="scope">
+                    <el-input
+                      v-if="scope.row.editing"
+                      v-model="scope.row.url"
+                      placeholder="请输入游戏链接"
+                      size="small"
+                    ></el-input>
+                    <span v-else class="game-link">{{ scope.row.url || '-' }}</span>
+                  </template>
+                </el-table-column>
+
+                <el-table-column label="排序" width="100" align="center">
+                  <template slot-scope="scope">
+                    <el-input-number
+                      v-if="scope.row.editing"
+                      v-model="scope.row.sort"
+                      :min="0"
+                      :max="999"
+                      size="small"
+                      controls-position="right"
+                      style="width: 80px;"
+                    ></el-input-number>
+                    <span v-else>{{ scope.row.sort || 0 }}</span>
+                  </template>
+                </el-table-column>
+
+                <el-table-column label="状态" width="80" align="center">
+                  <template slot-scope="scope">
+                    <el-switch
+                      v-if="scope.row.editing"
+                      v-model="scope.row.status"
+                      :active-value="1"
+                      :inactive-value="0"
+                      active-color="#13ce66"
+                      inactive-color="#ff4949"
+                    ></el-switch>
+                    <el-tag v-else :type="scope.row.status === 1 ? 'success' : 'info'" size="small">
+                      {{ scope.row.status === 1 ? '启用' : '禁用' }}
+                    </el-tag>
+                  </template>
+                </el-table-column>
+
+                <el-table-column label="操作" width="150" fixed="right" align="center">
+                  <template slot-scope="scope">
+                    <el-button
+                      v-if="!scope.row.editing"
+                      type="text"
+                      size="small"
+                      icon="el-icon-edit"
+                      @click="editGame(scope.$index)"
+                    >编辑</el-button>
+                    <el-button
+                      v-if="scope.row.editing"
+                      type="text"
+                      size="small"
+                      icon="el-icon-check"
+                      @click="saveGame(scope.$index)"
+                    >保存</el-button>
+                    <el-button
+                      v-if="!scope.row.editing"
+                      type="text"
+                      size="small"
+                      icon="el-icon-delete"
+                      class="delete-btn"
+                      @click="deleteGame(scope.$index)"
+                    >删除</el-button>
+                    <el-button
+                      v-if="scope.row.editing"
+                      type="text"
+                      size="small"
+                      icon="el-icon-close"
+                      @click="cancelEdit(scope.$index)"
+                    >取消</el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </el-form-item>
+          </el-card>
+          <el-card class="config-card" shadow="hover">
+            <div class="section-title">
+              <div class="title-icon icon-promotion">
+                <i class="el-icon-bank-card"></i>
+              </div>
+              <div class="title-text">
+                <h3>提现配置</h3>
+                <p class="subtitle">配置APP商家转账配置</p>
+              </div>
+            </div>
+
+            <el-divider></el-divider>
+            <el-form-item label="一次最大提现金额(元)" prop="maxApplicationAmount">
+              <el-input-number
+                v-model="form25.maxApplicationAmount"
+                :min="0.10"
+                :max="999999.99"
+                :precision="2"
+                :step="0.01"
+                placeholder="最大提现金额"
+                controls-position="right"
+
+              />
+            </el-form-item>
+            <el-form-item label="一天允提现次数(次)" prop="withdrawNum">
+              <el-input-number
+                v-model="form25.withdrawNum"
+                :min="0"
+                :max="99"
+                :precision="0"
+                :step="1"
+                placeholder="提现次数"
+                controls-position="right"
+
+              />
+            </el-form-item>
+            <el-form-item label="连续提现封控(天)" prop="limitDayNum">
+              <el-input-number
+                v-model="form25.limitDayNum"
+                :min="1"
+                :max="99"
+                :precision="0"
+                :step="1"
+                placeholder="连续提现几天封控"
+                controls-position="right"
+
+              />
+            </el-form-item>
+            <el-form-item label="连续提现累计金额封控(元)" prop="limitAmount">
+              <el-input-number
+                v-model="form25.limitAmount"
+                :min="0.10"
+                :max="999999.99"
+                :precision="2"
+                :step="0.01"
+                placeholder="连续提现累计金额封控"
+                controls-position="right"
+              />
+            </el-form-item>
+
+            <el-form-item label="红包接口类型" prop="isNew">
+              <el-radio-group v-model="form25.isNew" >
+                <el-radio label="0">商家转账到零钱(旧)</el-radio>
+                <el-radio label="1">商家转账到零钱(新)</el-radio>
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item label="商户号" prop="mchId">
+              <el-input v-model="form25.mchId" placeholder="请输入商户号"></el-input>
+            </el-form-item>
+            <el-form-item label="商户密钥" prop="mchKey">
+              <el-input v-model="form25.mchKey" placeholder="请输入商户密钥" show-password></el-input>
+            </el-form-item>
+            <el-form-item label="p12证书路径" prop="keyPath">
+              <el-input v-model="form25.keyPath" placeholder="请输入p12证书路径"></el-input>
+            </el-form-item>
+            <el-form-item label="apiV3密钥" prop="apiV3Key">
+              <el-input v-model="form25.apiV3Key" placeholder="请输入apiV3密钥" show-password></el-input>
+            </el-form-item>
+            <el-form-item label="公钥ID" prop="publicKeyId">
+              <el-input v-model="form25.publicKeyId" placeholder="请输入公钥ID"></el-input>
+            </el-form-item>
+            <el-form-item label="公钥证书路径" prop="publicKeyPath">
+              <el-input v-model="form25.publicKeyPath" placeholder="请输入公钥证书路径"></el-input>
+            </el-form-item>
+            <el-form-item label="私钥路径" prop="privateKeyPath">
+              <el-input v-model="form25.privateKeyPath" placeholder="请输入私钥路径"></el-input>
+            </el-form-item>
+            <el-form-item label="证书路径" prop="privateCertPath">
+              <el-input v-model="form25.privateCertPath" placeholder="请输入证书路径"></el-input>
+            </el-form-item>
+            <el-form-item label="看课奖励回调地址" prop="notifyUrl">
+              <el-input v-model="form25.notifyUrl" placeholder="请输入回调地址"></el-input>
+            </el-form-item>
+            <el-form-item label="提现回调地址" prop="withdrawalNotifyUrl">
+              <el-input v-model="form25.withdrawalNotifyUrl" placeholder="请输入回调地址"></el-input>
+            </el-form-item>
           </el-card>
 
           <!-- 操作按钮 -->
@@ -2726,6 +2962,185 @@
         </div>
       </el-tab-pane>
 
+
+      <el-tab-pane label="app页面配置" name="app.pageConfig">
+        <el-form
+          ref="form35"
+          :model="form35"
+          label-width="160px"
+        >
+
+          <!-- 主页面 -->
+          <el-divider content-position="left">主页面</el-divider>
+          <el-form-item label="健康页面" prop="mainPage.health">
+            <el-radio v-model="form35.mainPage.health" label="1">显示</el-radio>
+            <el-radio v-model="form35.mainPage.health" label="0">隐藏</el-radio>
+          </el-form-item>
+
+          <el-form-item label="精选页面" prop="mainPage.featured">
+            <el-radio v-model="form35.mainPage.featured" label="1">显示</el-radio>
+            <el-radio v-model="form35.mainPage.featured" label="0">隐藏</el-radio>
+          </el-form-item>
+
+          <el-form-item label="优选页面" prop="mainPage.preferred">
+            <el-radio v-model="form35.mainPage.preferred" label="1">显示</el-radio>
+            <el-radio v-model="form35.mainPage.preferred" label="0">隐藏</el-radio>
+          </el-form-item>
+
+          <!-- 消息子页面 -->
+          <!--           <el-divider content-position="left">消息 - 子页面</el-divider>-->
+
+          <!--           <el-form-item label="消息列表" prop="subPage.message.message">-->
+          <!--             <el-radio v-model="form35.subPage.message.message" label="1">显示</el-radio>-->
+          <!--             <el-radio v-model="form35.subPage.message.message" label="0">隐藏</el-radio>-->
+          <!--           </el-form-item>-->
+
+          <!--           <el-form-item label="通讯录" prop="subPage.message.contacts">-->
+          <!--             <el-radio v-model="form35.subPage.message.contacts" label="1">显示</el-radio>-->
+          <!--             <el-radio v-model="form35.subPage.message.contacts" label="0">隐藏</el-radio>-->
+          <!--           </el-form-item>-->
+
+          <!--           <el-form-item label="搜索" prop="subPage.message.search">-->
+          <!--             <el-radio v-model="form35.subPage.message.search" label="1">显示</el-radio>-->
+          <!--             <el-radio v-model="form35.subPage.message.search" label="0">隐藏</el-radio>-->
+          <!--           </el-form-item>-->
+
+          <!-- 健康子页面 -->
+          <el-divider content-position="left">健康 - 子页面</el-divider>
+
+          <el-form-item label="医疗服务" prop="subPage.health.medicalService">
+            <el-radio v-model="form35.subPage.health.medicalService" label="1">显示</el-radio>
+            <el-radio v-model="form35.subPage.health.medicalService" label="0">隐藏</el-radio>
+          </el-form-item>
+
+          <el-form-item label="健康管理" prop="subPage.health.healthManagement">
+            <el-radio v-model="form35.subPage.health.healthManagement" label="1">显示</el-radio>
+            <el-radio v-model="form35.subPage.health.healthManagement" label="0">隐藏</el-radio>
+          </el-form-item>
+
+          <el-form-item label="名家讲堂" prop="subPage.health.famousLecture">
+            <el-radio v-model="form35.subPage.health.famousLecture" label="1">显示</el-radio>
+            <el-radio v-model="form35.subPage.health.famousLecture" label="0">隐藏</el-radio>
+          </el-form-item>
+
+          <el-form-item label="学习中心" prop="subPage.health.learningCenter">
+            <el-radio v-model="form35.subPage.health.learningCenter" label="1">显示</el-radio>
+            <el-radio v-model="form35.subPage.health.learningCenter" label="0">隐藏</el-radio>
+          </el-form-item>
+
+          <!-- 精选子页面 -->
+          <!-- 精选 - 子页面 -->
+          <el-divider content-position="left">精选 - 子页面</el-divider>
+
+          <!-- 短视频 -->
+          <el-form-item label="短视频">
+            <el-radio
+              v-model="form35.subPage.featured.shortVideo"
+              label="1"
+            >显示</el-radio>
+            <el-radio
+              v-model="form35.subPage.featured.shortVideo"
+              label="0"
+            >隐藏</el-radio>
+
+            <el-input
+              v-model="form35.subPage.featured.shortVideoH5Url"
+              placeholder="请输入短视频 H5 链接"
+              clearable
+              style="margin-top: 8px"
+            />
+          </el-form-item>
+          <!-- 直播 -->
+          <el-form-item label="直播">
+            <el-radio
+              v-model="form35.subPage.featured.live"
+              label="1"
+            >显示</el-radio>
+            <el-radio
+              v-model="form35.subPage.featured.live"
+              label="0"
+            >隐藏</el-radio>
+
+            <el-input
+              v-model="form35.subPage.featured.liveH5Url"
+              placeholder="请输入直播 H5 链接"
+              clearable
+              style="margin-top: 8px"
+            />
+          </el-form-item>
+          <!-- 短剧 -->
+          <el-form-item label="短剧">
+            <el-radio
+              v-model="form35.subPage.featured.shortDrama"
+              label="1"
+            >显示</el-radio>
+            <el-radio
+              v-model="form35.subPage.featured.shortDrama"
+              label="0"
+            >隐藏</el-radio>
+
+            <el-input
+              v-model="form35.subPage.featured.shortDramaH5Url"
+              placeholder="请输入短剧 H5 链接"
+              clearable
+              style="margin-top: 8px"
+            />
+          </el-form-item>
+
+          <!-- 游戏 -->
+          <el-form-item label="游戏">
+            <el-radio
+              v-model="form35.subPage.featured.game"
+              label="1"
+            >显示</el-radio>
+            <el-radio
+              v-model="form35.subPage.featured.game"
+              label="0"
+            >隐藏</el-radio>
+
+            <el-input
+              v-model="form35.subPage.featured.gameH5Url"
+              placeholder="请输入游戏 H5 链接"
+              clearable
+              style="margin-top: 8px"
+            />
+          </el-form-item>
+
+          <!-- 任务广场 -->
+          <el-form-item label="任务广场">
+            <el-radio
+              v-model="form35.subPage.featured.taskSquare"
+              label="1"
+            >显示</el-radio>
+            <el-radio
+              v-model="form35.subPage.featured.taskSquare"
+              label="0"
+            >隐藏</el-radio>
+
+            <el-input
+              v-model="form35.subPage.featured.taskSquareH5Url"
+              placeholder="请输入任务广场 H5 链接"
+              clearable
+              style="margin-top: 8px"
+            />
+          </el-form-item>
+
+          <!-- 优选子页面 -->
+          <el-divider content-position="left">优选 - 子页面</el-divider>
+
+          <el-form-item label="现金 + 积分购买" prop="subPage.preferred.cashAndPointsPurchase">
+            <el-radio v-model="form35.subPage.preferred.cashAndPointsPurchase" label="1">显示</el-radio>
+            <el-radio v-model="form35.subPage.preferred.cashAndPointsPurchase" label="0">隐藏</el-radio>
+          </el-form-item>
+
+          <!-- 提交 -->
+          <div class="footer">
+            <el-button type="primary" @click="submitForm35">提 交</el-button>
+          </div>
+
+        </el-form>
+      </el-tab-pane>
+
     </el-tabs>
 
 
@@ -2839,6 +3254,7 @@ export default {
       form23: {},
       form24: {},
       form25: {},
+      gameListLoading: false,
       form26: {
         bloodGlucose: {
           fasting: { normal: '' },
@@ -2926,6 +3342,36 @@ export default {
       },
       form32:{},
       form34:{},
+      form35: {
+        mainPage: {
+          health: "1",
+          featured: "1",
+          preferred: "1"
+        },
+        subPage: {
+          message: {
+            message: "1",
+            contacts: "1",
+            search: "1"
+          },
+          health: {
+            medicalService: "1",
+            healthManagement: "1",
+            famousLecture: "1",
+            learningCenter: "1"
+          },
+          featured: {
+            shortVideo: "1",
+            live: "1",
+            shortDrama: "1",
+            game: "1",
+            taskSquare: "1"
+          },
+          preferred: {
+            cashAndPointsPurchase: "1"
+          }
+        }
+      },
       storeProductScrmColumns:[],
       storeScrmColumns: [],
       photoArr: [],
@@ -3037,6 +3483,119 @@ export default {
     },
   },
   methods: {
+    /**
+     * 新增游戏配置
+     */
+    addGameConfig() {
+      if (!this.form25.gameList) {
+        this.$set(this.form25, 'gameList', [])
+      }
+
+      // 限制最多10个游戏
+      if (this.form25.gameList.length >= 10) {
+        this.$message.warning('最多只能添加10个游戏')
+        return
+      }
+
+      // 添加新游戏配置
+      this.form25.gameList.push({
+        id: Date.now() + Math.random(), // 临时ID
+        image: '',
+        name: '',
+        url: '',
+        sort: this.form25.gameList.length,
+        status: 1, // 默认启用
+        editing: true // 新增时直接进入编辑状态
+      })
+
+      this.$forceUpdate()
+    },
+
+    /**
+     * 编辑游戏
+     */
+    editGame(index) {
+      // 如果已经有其他行在编辑,先保存或取消
+      const editingIndex = this.form25.gameList.findIndex(item => item.editing)
+      if (editingIndex !== -1 && editingIndex !== index) {
+        this.$confirm('当前有其他游戏正在编辑,是否继续?', '提示', {
+          confirmButtonText: '继续',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          // 取消其他行的编辑状态
+          this.form25.gameList[editingIndex].editing = false
+          // 设置当前行为编辑状态
+          this.$set(this.form25.gameList[index], 'editing', true)
+        }).catch(() => {})
+      } else {
+        this.$set(this.form25.gameList[index], 'editing', true)
+      }
+    },
+
+    /**
+     * 保存游戏
+     */
+    saveGame(index) {
+      const game = this.form25.gameList[index]
+
+      // 验证必填项
+      if (!game.name) {
+        this.$message.error('请输入游戏名称')
+        return
+      }
+      if (!game.url) {
+        this.$message.error('请输入游戏链接')
+        return
+      }
+      if (!game.image) {
+        this.$message.error('请上传游戏图片')
+        return
+      }
+
+      // 验证URL格式
+      const urlPattern = /^(http|https):\/\/[^\s]+$/
+      if (!urlPattern.test(game.url)) {
+        this.$message.error('请输入正确的游戏链接(以http://或https://开头)')
+        return
+      }
+
+      // 保存成功,退出编辑状态
+      this.$set(this.form25.gameList[index], 'editing', false)
+      this.$message.success('保存成功')
+    },
+
+    /**
+     * 取消编辑
+     */
+    cancelEdit(index) {
+      const game = this.form25.gameList[index]
+
+      // 如果是新增但未保存(没有id),直接删除
+      if (!game.id || game.id.toString().includes('.')) {
+        this.form25.gameList.splice(index, 1)
+      } else {
+        this.$set(this.form25.gameList[index], 'editing', false)
+      }
+    },
+
+    /**
+     * 删除游戏
+     */
+    deleteGame(index) {
+      this.$confirm('确定要删除这个游戏吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.form25.gameList.splice(index, 1)
+        // 重新排序
+        this.form25.gameList.forEach((item, idx) => {
+          item.sort = idx
+        })
+        this.$message.success('删除成功')
+      }).catch(() => {})
+    },
 
     // 处理开关配置
     handleSwitchConfig(row) {
@@ -3193,7 +3752,7 @@ export default {
           this.configId = null;
           this.configKey = key;
         }
-        
+
         // 如果 response.data 为空,后续逻辑直接返回,避免报错
         if (!response.data || !response.data.configValue) {
           return;
@@ -3361,6 +3920,38 @@ export default {
           this.configKey = response.data.configKey
           this.form34 =JSON.parse(response.data.configValue);
         }
+        if(key=="app.pageConfig"){
+          const defaultForm = this.form35
+          const parsed = response.data && response.data.configValue ? JSON.parse(response.data.configValue) : {}
+          this.form35 = {
+            ...defaultForm,
+            ...parsed,
+            mainPage: {
+              ...defaultForm.mainPage,
+              ...(parsed.mainPage || {})
+            },
+            subPage: {
+              ...defaultForm.subPage,
+              ...(parsed.subPage || {}),
+              message: {
+                ...defaultForm.subPage.message,
+                ...(((parsed.subPage || {}).message) || {})
+              },
+              health: {
+                ...defaultForm.subPage.health,
+                ...(((parsed.subPage || {}).health) || {})
+              },
+              featured: {
+                ...defaultForm.subPage.featured,
+                ...(((parsed.subPage || {}).featured) || {})
+              },
+              preferred: {
+                ...defaultForm.subPage.preferred,
+                ...(((parsed.subPage || {}).preferred) || {})
+              }
+            }
+          }
+        }
       })
     },
     /** 提交按钮 */
@@ -3659,6 +4250,14 @@ export default {
         }
       });
     },
+    submitForm35(){
+      var param={configId:this.configId,configValue:JSON.stringify(this.form35)}
+      updateConfigByKey(param).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("修改成功");
+        }
+      });
+    },
     submitForm31(){
       var param={configId:this.configId,configKey: this.configKey,configValue:JSON.stringify(this.form34)}
       updateConfigByKey(param).then(response => {
@@ -4127,4 +4726,80 @@ export default {
     padding: 16px;
   }
 }
+
+
+/* 游戏列表样式 */
+.game-list-item {
+  margin-top: 20px;
+}
+
+.game-list-header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin-bottom: 10px;
+}
+
+.game-list-tip {
+  font-size: 12px;
+  color: #909399;
+}
+
+.game-image-preview {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  min-height: 50px;
+}
+
+.no-image {
+  font-size: 12px;
+  color: #909399;
+}
+
+.game-link {
+  display: inline-block;
+  max-width: 200px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  color: #409EFF;
+  cursor: pointer;
+}
+
+.delete-btn {
+  color: #f56c6c !important;
+}
+
+.delete-btn:hover {
+  color: #f78989 !important;
+}
+
+/* 表格样式优化 */
+::v-deep .el-table .cell {
+  padding-left: 8px;
+  padding-right: 8px;
+}
+
+::v-deep .el-table th {
+  background-color: #f5f7fa;
+  color: #606266;
+}
+
+::v-deep .el-table--border {
+  border-radius: 8px;
+  overflow: hidden;
+}
+
+/* 图片上传组件样式调整 */
+::v-deep .image-upload {
+  width: 60px;
+  height: 60px;
+}
+
+::v-deep .image-upload .el-upload--picture-card {
+  width: 60px;
+  height: 60px;
+  line-height: 64px;
+}
 </style>