Bläddra i källkod

1、迁移配置信息

yys 3 veckor sedan
förälder
incheckning
5bd1835589
1 ändrade filer med 882 tillägg och 42 borttagningar
  1. 882 42
      src/views/system/config/config.vue

+ 882 - 42
src/views/system/config/config.vue

@@ -1077,6 +1077,12 @@
               />
             </el-select>
           </el-form-item>
+          <el-form-item label="舌诊appkey" prop="tongueAppKey">
+            <el-input v-model="form13.tongueAppKey" label="请输入舌诊密钥"></el-input>
+          </el-form-item>
+          <el-form-item   label="App推送通知地址" prop="appPushUrl">
+            <el-input   v-model="form13.appPushUrl"  label="请输入App推送通知地址"></el-input>
+          </el-form-item>
           <el-form-item label="erpAppKey" v-if="form13.erpOpen == 1 && form13.erpType == 1 " prop="erpAppKey">
             <el-input v-model="form13.erpAppKey" label="请输入erpAppKey"></el-input>
           </el-form-item>
@@ -2013,27 +2019,279 @@
       <el-tab-pane label="公司销售角色默认生成配置" name="companymenu.config">
         <companyMenuConfig></companyMenuConfig>
       </el-tab-pane>
-      <el-tab-pane label="APP推广" name="app.config">
-        <el-form ref="form25" :model="form25" :rules="rules25" label-width="160px">
-          <el-form-item label="APP推广图片" prop="images">
-            <Material v-model="appImages" type="image" :num="10" :width="150" :height="150"/>
-          </el-form-item>
-          <el-form-item label="APP推广视频" prop="videoUrl">
-            <div>
-              <el-upload
-                ref="upload"
-                class="upload-demo"
-                :action="uploadUrl"
-                :on-success="appHandleSuccess"
-                :before-upload="beforeUpload"
-                :limit="1"
-                :accept="videoAccept"
-              >
-                <el-button size="small" type="primary">点击上传视频</el-button>
-              </el-upload>
-              <video :src="form25.videoUrl" controls style="max-width: 400px; max-height: 400px;"></video>
+      <el-tab-pane label="APP设置" name="app.config">
+        <el-form ref="form25" :model="form25" :rules="rules25" label-width="160px" class="app-config-form">
+
+          <!-- 客服配置卡片 -->
+          <el-card class="config-card" shadow="hover">
+            <!-- 标题区域移到body内 -->
+            <div class="section-title">
+              <div class="title-icon">
+                <i class="el-icon-service"></i>
+              </div>
+              <div class="title-text">
+                <h3>APP客服配置</h3>
+                <p class="subtitle">配置企业微信客服相关参数</p>
+              </div>
             </div>
-          </el-form-item>
+
+            <el-divider></el-divider>
+
+            <el-form-item label="企微主体" prop="corpId">
+              <el-select
+                v-model="form25.corpId"
+                clearable filterable
+                placeholder="请选择企微主体"
+                style="width: 320px;">
+                <el-option
+                  v-for="item in corpOptions"
+                  :key="item.corpId"
+                  :label="item.corpName"
+                  :value="item.corpId"
+                >
+                </el-option>
+              </el-select>
+              <el-tooltip content="选择企业微信的主体" placement="right">
+                <i class="el-icon-question help-icon"></i>
+              </el-tooltip>
+            </el-form-item>
+            <el-form-item label="客服链接" prop="corpUrl">
+              <el-input v-model="form25.corpUrl" label="请输入" style="width: 500px;"></el-input>
+            </el-form-item>
+          </el-card>
+
+          <!-- APP推广卡片 -->
+          <el-card class="config-card" shadow="hover">
+            <div class="section-title">
+              <div class="title-icon icon-promotion">
+                <i class="el-icon-mobile-phone"></i>
+              </div>
+              <div class="title-text">
+                <h3>APP推广</h3>
+                <p class="subtitle">配置APP推广素材,支持图片和视频</p>
+              </div>
+            </div>
+
+            <el-divider></el-divider>
+
+            <el-form-item label="APP推广图片" prop="images">
+              <Material v-model="appImages" type="image" :num="10" :width="150" :height="150"/>
+            </el-form-item>
+            <el-form-item label="APP推广视频" prop="videoUrl">
+              <div>
+                <el-upload
+                  ref="upload"
+                  class="upload-demo"
+                  :action="uploadUrl"
+                  :on-success="appHandleSuccess"
+                  :before-upload="beforeUpload"
+                  :limit="1"
+                  :accept="videoAccept"
+                >
+                  <el-button size="small" type="primary">点击上传视频</el-button>
+                </el-upload>
+                <video :src="form25.videoUrl" controls style="max-width: 400px; max-height: 400px;"></video>
+              </div>
+            </el-form-item>
+            <el-form-item label="舌诊开关">
+              <el-radio-group v-model="form25.tongueFlag">
+                <el-radio :label="1" >开</el-radio>
+                <el-radio :label="0">关</el-radio>
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item label="应用appId" prop="appId">
+              <el-input v-model="form25.appId" style="width: 300px;"></el-input>
+            </el-form-item>
+          </el-card>
+
+          <!-- 游戏配置卡片 - 增强版 -->
+          <el-card class="config-card" shadow="hover">
+            <div class="section-title">
+              <div class="title-icon icon-game">
+                <i class="el-icon-s-flag"></i>
+              </div>
+              <div class="title-text">
+                <h3>游戏配置</h3>
+                <p class="subtitle">配置APP内小游戏列表及相关参数</p>
+              </div>
+            </div>
+
+            <el-divider></el-divider>
+
+            <!-- 游戏获得积分 -->
+            <el-form-item label="游戏获得积分" prop="addIntegral">
+              <el-input-number
+                v-model="form25.addIntegral"
+                :min="-999999"
+                :max="999999"
+                :step="1"
+                :precision="0"
+                controls-position="right"
+                style="width: 320px;">
+              </el-input-number>
+              <el-tooltip content="玩一局游戏获得的积分(负数为扣减),默认100" placement="right">
+                <i class="el-icon-question help-icon"></i>
+              </el-tooltip>
+            </el-form-item>
+
+            <!-- 视频获得积分 -->
+            <el-form-item label="视频获得积分" prop="defaultRewardGold">
+              <el-input-number
+                v-model="form25.defaultRewardGold"
+                :min="-999999"
+                :max="999999"
+                :step="1"
+                :precision="0"
+                controls-position="right"
+                style="width: 320px;">
+              </el-input-number>
+              <el-tooltip content="观看视频获得的金币(负数为扣减),默认100" placement="right">
+                <i class="el-icon-question help-icon"></i>
+              </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>
+
+          <!-- 操作按钮 -->
           <div class="footer">
             <el-button type="primary" @click="submitForm25">提 交</el-button>
           </div>
@@ -2607,7 +2865,10 @@
             </el-radio-group>
           </el-form-item>
           <el-form-item label="直播流链接" prop="domain">
-            <el-input v-model="form32.domain" label="请输入domain"></el-input>
+            <el-input v-model="form32.domain" placeholder="请输入直播流链接"></el-input>
+          </el-form-item>
+          <el-form-item label="推流链接" prop="http">
+            <el-input v-model="form32.http" placeholder="请输入推流链接"></el-input>
           </el-form-item>
           <br>
           <div class="footer">
@@ -2615,6 +2876,163 @@
           </div>
         </el-form>
       </el-tab-pane>
+
+      <!--   福袋配置    -->
+      <el-tab-pane label="福袋配置" name="luckyBag.config">
+        <!--   单个客服每周(7天)给同客户发送数量次数限制      -->
+        <el-form ref="form36" :model="form36" :rules="rules36" label-width="300px">
+          <el-form-item label="单个客服每周(7天)给同客户发送数量次数限制">
+            <el-tooltip class="item" effect="dark" placement="top-end">
+              <el-input-number
+                v-model="form36.weekLimit"
+                :min="0"
+                :step="1"
+                :precision="0"
+              ></el-input-number>
+            </el-tooltip>
+          </el-form-item>
+          <el-form-item label="福袋封面图标">
+            <ImageUpload v-model="form36.miniprogramPicUrl" :file-type='["png", "jpg", "jpeg"]' :limit="1" />
+          </el-form-item>
+        </el-form>
+
+        <div class="footer">
+          <el-button type="primary" @click="submitForm36">提  交</el-button>
+        </div>
+      </el-tab-pane>
+      <el-tab-pane label="提现配置" name="his.AppRedPacket">
+        <!-- 添加 ref 和 rules -->
+        <el-form ref="form35" :model="form35" label-width="160px">
+
+          <el-form-item label="红包接口类型" prop="isNew">
+            <el-radio-group v-model="form35.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="form35.mchId" placeholder="请输入商户号"></el-input>
+          </el-form-item>
+          <el-form-item label="商户密钥" prop="mchKey">
+            <el-input v-model="form35.mchKey" placeholder="请输入商户密钥" show-password></el-input>
+          </el-form-item>
+          <el-form-item label="p12证书路径" prop="keyPath">
+            <el-input v-model="form35.keyPath" placeholder="请输入p12证书路径"></el-input>
+          </el-form-item>
+          <el-form-item label="apiV3密钥" prop="apiV3Key">
+            <el-input v-model="form35.apiV3Key" placeholder="请输入apiV3密钥" show-password></el-input>
+          </el-form-item>
+          <el-form-item label="公钥ID" prop="publicKeyId">
+            <el-input v-model="form35.publicKeyId" placeholder="请输入公钥ID"></el-input>
+          </el-form-item>
+          <el-form-item label="公钥证书路径" prop="publicKeyPath">
+            <el-input v-model="form35.publicKeyPath" placeholder="请输入公钥证书路径"></el-input>
+          </el-form-item>
+          <el-form-item label="私钥路径" prop="privateKeyPath">
+            <el-input v-model="form35.privateKeyPath" placeholder="请输入私钥路径"></el-input>
+          </el-form-item>
+          <el-form-item label="证书路径" prop="privateCertPath">
+            <el-input v-model="form35.privateCertPath" placeholder="请输入证书路径"></el-input>
+          </el-form-item>
+          <el-form-item label="回调地址" prop="notifyUrl">
+            <el-input v-model="form35.notifyUrl" placeholder="请输入回调地址"></el-input>
+          </el-form-item>
+
+
+          <!--          <el-form-item label="红包接口类型" prop="isNew">-->
+          <!--            <el-radio-group v-model="form35.isNew" >-->
+          <!--              <el-radio label="0">商家转账到零钱(旧)</el-radio>-->
+          <!--              <el-radio label="1">商家转账到零钱(新)</el-radio>-->
+          <!--            </el-radio-group>-->
+          <!--          </el-form-item>-->
+
+          <!--          &lt;!&ndash; 公共字段 &ndash;&gt;-->
+          <!--          <el-form-item label="商户号" prop="mchId">-->
+          <!--            <el-input v-model="form35.mchId" placeholder="请输入商户号"></el-input>-->
+          <!--          </el-form-item>-->
+
+          <!--          <el-form-item label="回调地址" prop="notifyUrl">-->
+          <!--            <el-input v-model="form35.notifyUrl" placeholder="请输入回调地址"></el-input>-->
+          <!--          </el-form-item>-->
+
+          <!--          &lt;!&ndash; 旧版接口字段 &ndash;&gt;-->
+          <!--          <template v-if="form35.isNew === '0'">-->
+          <!--            <el-form-item label="商户密钥" prop="mchKey">-->
+          <!--              <el-input v-model="form35.mchKey" placeholder="请输入商户密钥" show-password></el-input>-->
+          <!--            </el-form-item>-->
+          <!--            <el-form-item label="API证书(p12)" prop="keyPath">-->
+          <!--              <el-input v-model="form35.keyPath" placeholder="请输入p12证书路径">-->
+          <!--                <template #append>-->
+          <!--                  <el-button @click="handleSelectFile('keyPath')">选择文件</el-button>-->
+          <!--                </template>-->
+          <!--              </el-input>-->
+          <!--              <div class="form-tips">商户平台下载的apiclient_cert.p12证书</div>-->
+          <!--            </el-form-item>-->
+          <!--          </template>-->
+
+          <!--          &lt;!&ndash; 新版接口字段 &ndash;&gt;-->
+          <!--          <template v-if="form35.isNew === '1'">-->
+          <!--            <el-form-item label="APIv3密钥" prop="apiV3Key">-->
+          <!--              <el-input v-model="form35.apiV3Key" placeholder="请输入APIv3密钥" show-password></el-input>-->
+          <!--              <div class="form-tips">商户平台API安全页面设置的APIv3密钥</div>-->
+          <!--            </el-form-item>-->
+
+          <!--            <el-form-item label="商户API证书" prop="privateCertPath">-->
+          <!--              <el-input v-model="form35.privateCertPath" placeholder="请输入商户API证书路径">-->
+          <!--                <template #append>-->
+          <!--                  <el-button @click="handleSelectFile('privateCertPath')">选择文件</el-button>-->
+          <!--                </template>-->
+          <!--              </el-input>-->
+          <!--              <div class="form-tips">apiclient_cert.pem证书文件</div>-->
+          <!--            </el-form-item>-->
+
+          <!--            <el-form-item label="商户私钥" prop="privateKeyPath">-->
+          <!--              <el-input v-model="form35.privateKeyPath" placeholder="请输入商户私钥路径">-->
+          <!--                <template #append>-->
+          <!--                  <el-button @click="handleSelectFile('privateKeyPath')">选择文件</el-button>-->
+          <!--                </template>-->
+          <!--              </el-input>-->
+          <!--              <div class="form-tips">apiclient_key.pem私钥文件</div>-->
+          <!--            </el-form-item>-->
+
+          <!--            <el-form-item label="平台公钥证书" prop="publicKeyPath">-->
+          <!--              <el-input v-model="form35.publicKeyPath" placeholder="请输入平台公钥证书路径">-->
+          <!--                <template #append>-->
+          <!--                  <el-button @click="handleSelectFile('publicKeyPath')">选择文件</el-button>-->
+          <!--                </template>-->
+          <!--              </el-input>-->
+          <!--              <div class="form-tips">微信支付平台证书(自动更新时可留空)</div>-->
+          <!--            </el-form-item>-->
+
+          <!--            <el-form-item label="证书序列号" prop="serialNo">-->
+          <!--              <el-input v-model="form35.serialNo" placeholder="请输入证书序列号"></el-input>-->
+          <!--              <div class="form-tips">商户API证书的序列号,可在证书文件中查看</div>-->
+          <!--            </el-form-item>-->
+          <!--          </template>-->
+
+          <div class="footer">
+            <el-button type="primary" @click="submitForm35">提 交</el-button>
+          </div>
+        </el-form>
+      </el-tab-pane>
+
+      <el-tab-pane label="IM配置" name="im.config">
+        <!--   小米     -->
+        <el-form ref="form34" :model="form34" :rules="rules34" label-width="300px">
+          <el-form-item label="离线推送 小米系统申请channel_id">
+            <el-input v-model="form34.xm_channel_id" style="width: 200px"></el-input>
+          </el-form-item>
+          <el-form-item label="离线推送 华为系统申请channel_id">
+            <el-input v-model="form34.hw_channel_id" style="width: 200px"></el-input>
+          </el-form-item>
+
+        </el-form>
+
+        <div class="footer">
+          <el-button type="primary" @click="submitForm34">提  交</el-button>
+        </div>
+      </el-tab-pane>
+
     </el-tabs>
 
 
@@ -2655,6 +3073,7 @@ export default {
   },
   data() {
     return {
+      corpOptions:[],
       citys: [],
       images: [],
       appImages: [],
@@ -2722,6 +3141,7 @@ export default {
       form23: {},
       form24: {},
       form25: {},
+      gameListLoading: false,
       form26: {
         bloodGlucose: {
           fasting: { normal: '' },
@@ -2797,7 +3217,7 @@ export default {
       form29:{
         //是否开启拼手气红包
         enableRandomRedpacket:false,
-         rules: [
+        rules: [
           {
             minAmount: 0.01,
             maxAmount: 0.01,
@@ -2809,6 +3229,9 @@ export default {
       form31:{},
       form32:{},
       form33:{},
+      form34:{},
+      form35:{},
+      form36:{},
       storeProductScrmColumns:[],
       storeScrmColumns: [],
       photoArr: [],
@@ -2864,7 +3287,10 @@ export default {
       },
       rules21: {},
       rules25: {},
-      rules26: {}
+      rules26: {},
+      rules33: {},
+      rules34: {},
+      rules36: {},
     }
   },
   created() {
@@ -2879,12 +3305,12 @@ export default {
     this.getDicts('sys_integral_log_type').then(response => {
       this.integralLogTypeOptions = response.data
     })
-    getStoreProductColumns().then( response => {
-      this.storeProductScrmColumns = response.data
-    })
-    getStoreColumns().then( response => {
-      this.storeScrmColumns = response.data
-    })
+    // getStoreProductColumns().then( response => {
+    //   this.storeProductScrmColumns = response.data
+    // })
+    // getStoreColumns().then( response => {
+    //   this.storeScrmColumns = response.data
+    // })
   },
   watch: {
     photoArr: function(val) {
@@ -2896,7 +3322,7 @@ export default {
     appImages: function(val) {
       this.form25.images = val.join(',')
     },
-     // 深度监听 rules 数组的变化,以更新总权重
+    // 深度监听 rules 数组的变化,以更新总权重
     "form29.rules": {
       handler(val) {
         this.calculateTotalWeight();
@@ -2906,6 +3332,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) {
@@ -3056,12 +3595,12 @@ export default {
     getConfigByKey(key) {
       getConfigByKey(key).then(response => {
         if(!!response.data){
-        this.configId = response.data.configId
-        this.configKey = response.data.configKey
+          this.configId = response.data.configId
+          this.configKey = response.data.configKey
         }else{
-            this.configId = null;
-            this.configKey = key;
-          }
+          this.configId = null;
+          this.configKey = key;
+        }
         if (key == 'sys.oss.cloudStorage') {
           this.form1 = JSON.parse(response.data.configValue)
         }
@@ -3210,6 +3749,35 @@ export default {
           this.form30 = {...this.form30, ...JSON.parse(response.data.configValue)}
           }
         }
+
+        if(key=="luckyBag.config"){
+          console.log("----------"+response.data.configValue)
+          this.form36 =JSON.parse(response.data.configValue);
+        }
+        if (key == 'his.AppRedPacket') {
+          if (response.data && response.data.configValue) {
+            this.form35 = JSON.parse(response.data.configValue);
+          } else {
+            // 如果没有配置,使用默认值
+            this.form35 = {
+              isNew: '1',
+              mchId: '',
+              notifyUrl: '',
+              mchKey: '',
+              keyPath: '',
+              apiV3Key: '',
+              serialNo: '',
+              privateCertPath: '',
+              privateKeyPath: '',
+              publicKeyPath: ''
+            };
+          }
+          this.configId = response.data?.configId || null;
+          this.configKey = response.data?.configKey || 'his.AppRedPacket';
+        }
+        if(key=="im.config"){
+          this.form34 =JSON.parse(response.data.configValue);
+        }
         if(key == 'vc.config'){
            if(!!response.data){
           this.configId = response.data.configId
@@ -3524,24 +4092,48 @@ export default {
         }
       })
     },
-    submitForm32(){
-      const param = { configId: this.configId, configName : "直播源配置", configKey: this.configKey, configValue: JSON.stringify(this.form32) }
-      console.log(param)
+    submitForm33(){
+      const param = { configId: this.configId, configName : "前端配置", configKey: this.configKey, configValue: JSON.stringify(this.form33) }
       updateConfigByKey(param).then(response => {
         if (response.code === 200) {
           this.msgSuccess('修改成功')
         }
       })
     },
-    submitForm33(){
-      const param = { configId: this.configId, configName : "前端配置", configKey: this.configKey, configValue: JSON.stringify(this.form33) }
+
+    submitForm36(){
+      var param={configId:this.configId,configValue:JSON.stringify(this.form36)}
+      updateConfigByKey(param).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("修改成功");
+        }
+      });
+    },
+    submitForm34(){
+      var param={configId:this.configId,configValue:JSON.stringify(this.form34)}
+      updateConfigByKey(param).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("修改成功");
+        }
+      });
+    },
+    submitForm35(){
+      var param={configId:this.configId,configValue:JSON.stringify(this.form35)}
+      updateConfigByKey(param).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("修改成功");
+        }
+      });
+    },
+    submitForm32(){
+      const param = { configId: this.configId, configName : "直播源配置", configKey: this.configKey, configValue: JSON.stringify(this.form32) }
+      console.log(param)
       updateConfigByKey(param).then(response => {
         if (response.code === 200) {
           this.msgSuccess('修改成功')
         }
       })
     },
-
     formatColumns(){
       console.log(this.form27.pass_columns)
 
@@ -3757,7 +4349,7 @@ export default {
   /* align-items: center;
   padding: 10px;
   border-bottom: 1px solid #ebeef5; */
-   display: flex;
+  display: flex;
   /* 关键改动:添加以下两行 */
   align-items: center;    /* 垂直居中对齐 */
   justify-content: flex-start; /* 水平方向从左到右排列(默认值,可显式写出) */
@@ -3830,4 +4422,252 @@ export default {
   display: flex;
   justify-content: flex-end;
 }
+
+.app-config-form {
+  padding: 10px;
+}
+
+.config-card {
+  margin-bottom: 24px;
+  border-radius: 12px;
+  border: none;
+  box-shadow: 0 2px 12px 0 rgba(0,0,0,0.05);
+}
+
+.config-card ::v-deep .el-card__body {
+  padding: 24px;
+}
+
+/* 章节标题样式 - 图标和文字在一起 */
+.section-title {
+  display: flex;
+  align-items: center;
+  margin-bottom: 8px;
+}
+
+.title-icon {
+  width: 40px;
+  height: 40px;
+  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+  border-radius: 10px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  margin-right: 12px;
+  flex-shrink: 0;
+}
+
+.title-icon i {
+  color: #fff;
+  font-size: 20px;
+}
+
+.icon-promotion {
+  background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
+}
+
+.title-text h3 {
+  margin: 0;
+  font-size: 18px;
+  color: #303133;
+  font-weight: 600;
+  line-height: 1.4;
+}
+
+.subtitle {
+  margin: 4px 0 0 0;
+  font-size: 13px;
+  color: #909399;
+  line-height: 1.4;
+}
+
+/* 分割线 */
+.el-divider {
+  margin: 20px 0;
+  background-color: #ebeef5;
+}
+
+/* 表单项 */
+.app-config-form ::v-deep .el-form-item {
+  margin-bottom: 24px;
+}
+
+.app-config-form ::v-deep .el-form-item:last-child {
+  margin-bottom: 0;
+}
+
+.help-icon {
+  margin-left: 8px;
+  color: #c0c4cc;
+  cursor: help;
+  font-size: 16px;
+  transition: color 0.3s;
+}
+
+.help-icon:hover {
+  color: #409EFF;
+}
+
+/* 上传区域 */
+.upload-wrapper {
+  display: flex;
+  flex-direction: column;
+}
+
+.upload-tip {
+  margin-top: 8px;
+  color: #909399;
+  font-size: 12px;
+}
+
+/* 视频上传 */
+.video-upload-wrapper {
+  width: 100%;
+  max-width: 400px;
+}
+
+.video-uploader ::v-deep .el-upload {
+  width: 100%;
+}
+
+.video-uploader ::v-deep .el-upload-dragger {
+  width: 100%;
+  height: 160px;
+  background: #fafafa;
+  border: 2px dashed #dcdfe6;
+  border-radius: 8px;
+}
+
+.video-uploader ::v-deep .el-upload-dragger:hover {
+  border-color: #409EFF;
+}
+
+.preview-video {
+  width: 100%;
+  max-width: 400px;
+  max-height: 250px;
+  border-radius: 8px;
+  background: #000;
+}
+
+.video-preview {
+  position: relative;
+  display: inline-block;
+}
+
+.video-actions {
+  position: absolute;
+  top: 10px;
+  right: 10px;
+  opacity: 0;
+  transition: opacity 0.3s;
+}
+
+.video-preview:hover .video-actions {
+  opacity: 1;
+}
+
+/* 底部按钮 */
+.form-footer {
+  margin-top: 32px;
+  padding-left: 160px;
+}
+
+.form-footer .el-button {
+  min-width: 100px;
+  padding: 12px 24px;
+  border-radius: 6px;
+}
+
+/* 响应式 */
+@media screen and (max-width: 768px) {
+  .section-title {
+    margin-bottom: 16px;
+  }
+
+  .form-footer {
+    padding-left: 0;
+    text-align: center;
+  }
+
+  .config-card ::v-deep .el-card__body {
+    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>