Quellcode durchsuchen

渠道应用管理修改为用户新增,后台出包

marxjaw vor 4 Monaten
Ursprung
Commit
96558e134d
2 geänderte Dateien mit 43 neuen und 472 gelöschten Zeilen
  1. 8 0
      src/api/formworkErection.js
  2. 35 472
      src/views/main/outBagModule/appAdmin.vue

+ 8 - 0
src/api/formworkErection.js

@@ -8,6 +8,14 @@ export function appList(data) {
         data
     })
 }
+// 查询加盟商应用列表
+export function issuedApps(params) {
+    return request({
+        url: '/agent-service/app/getIssuedAppList',
+        method: 'get',
+        params
+    })
+}
 //应用新增或修改
 export function saveOrUpdate(data) {
     return request({

+ 35 - 472
src/views/main/outBagModule/appAdmin.vue

@@ -9,38 +9,8 @@
       <Table @getTableData="changeTableData" v-model:page="page" ref="table" :data="tableData"
         @selection-change="handleSelectionChange">
         <el-table-column prop="appId" label="应用ID" width="140" />
-        <el-table-column prop="appName" label="应用名称" width="100" />
-        <el-table-column prop="appKey" label="应用秘钥"  width="120">
-          <template #default="scope">
-            <label>{{ scope.row.showKey ? scope.row.appKey : "******" }}</label>
-            <span style="margin-left: 15px">
-              <el-icon v-if="scope.row.showKey" @click="() => { scope.row.showKey = !scope.row.showKey }">
-                <View />
-              </el-icon>
-              <el-icon v-if="!scope.row.showKey" @click="() => { scope.row.showKey = !scope.row.showKey }">
-                <Hide />
-              </el-icon>
-            </span>
-            <span style="margin-left: 5px">
-              <el-icon v-copy="scope.row.appKey">
-                <CopyDocument />
-              </el-icon>
-            </span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="channelName" label="广告平台名称" width="160">
-          <template #default="scope">
-            <el-tag
-              style="margin-left: 5px;"
-              v-for="item in scope.row.channelName?.split(',')"
-              :key="item"
-              :type="item"
-              effect="dark"
-            >
-              {{ item }}
-            </el-tag>
-          </template>
-        </el-table-column>
+        <el-table-column prop="appName" label="应用名称" width="140" />
+        <el-table-column prop="superiorName" label="所属应用" width="120" />
         <el-table-column prop="ditchName" label="渠道名称" width="140">
           <template #default="scope">
             <el-tag
@@ -52,7 +22,6 @@
             </el-tag>
           </template>
         </el-table-column>
-        <el-table-column prop="networkAppName" label="关联渠道应用" width="120" />
         <el-table-column prop="nickName" label="所属用户" width="100" />
         <el-table-column prop="appType" label="应用类型" width="100">
           <template #default="scope">
@@ -61,24 +30,15 @@
         </el-table-column>
         <el-table-column prop="apkUrl" label="下载链接"  width="120">
           <template #default="scope">
-            <a :href="scope.row.apkUrl" target="_blank">{{ scope.row.appName }}.apk</a>
+            <a v-if="scope.row.apkUrl" :href="scope.row.apkUrl" target="_blank">{{ scope.row.appName }}.apk</a>
           </template>
         </el-table-column>
         <el-table-column prop="qrCode" min-width="130" label="二维码">
           <template #default="scope">
-            <el-image style="width: 100px; height: 100px;" :z-index="99999" :src="scope.row.qrCode" fit="fill"
+            <el-image v-if="scope.row.qrCode" style="width: 100px; height: 100px;" :z-index="99999" :src="scope.row.qrCode" fit="fill"
               :preview-src-list="[scope.row.qrCode]" preview-teleported="true" />
           </template>
         </el-table-column>
-        <el-table-column prop="request" label="广告源请求数"  width="120" />
-        <el-table-column prop="fillrate" label="广告源填充率"  width="120" />
-        <el-table-column prop="impression" label="展示数" />
-        <el-table-column prop="click" label="点击数" />
-        <el-table-column prop="ecpm" label="ECPM" />
-        <el-table-column prop="revenue" label="收益" />
-        <el-table-column prop="impression_api" label="广告平台展示数"  width="130" />
-        <el-table-column prop="click_api" label="广告平台点击数"  width="130" />
-        <el-table-column prop="ecpm_api" label="广告平台ECPM"  width="130" />
         <el-table-column prop="updateTips" label="更新提示"  width="100" />
         <el-table-column prop="enabled" label="是否启用"  width="100">
           <template #default="scope">
@@ -88,10 +48,6 @@
         <el-table-column label="操作" width="150" fixed="right">
           <template #default="scope">
             <div class="button">
-              <el-button class="button-item" type="primary" style="margin-bottom: 5px"
-                @click="openChannelLayer(scope.row)">
-                关联平台
-              </el-button>
               <el-button class="button-item" type="primary" style="margin-bottom: 5px" @click="edit(scope.row)">
                 编辑
               </el-button>
@@ -105,206 +61,51 @@
         </el-table-column>
       </Table>
     </div>
-
-    <Layer :layer="channelLayer" @confirm="channelSubmit" @close="channelLayer.show = false">
-      <el-radio-group style="width: 100%;" v-model="selectedChannelId" @change="handleRadioChange">
-        <Table style="width: 100%;" @getTableData="getChanelData" v-model:page="channelPage" ref="channelTable"
-          :data="channelData">
-          <el-table-column width="60">
-            <template #default="{ row }">
-              <el-radio :label="row.channelId">&nbsp;</el-radio>
-            </template>
-          </el-table-column>
-          <el-table-column prop="channelId" label="平台ID" />
-          <el-table-column prop="channelName" label="平台名称" />
-          <el-table-column prop="loginType" label="登录类型">
-            <template #default="{ row }">
-              {{ getDictionaryName("login_type", row.loginType) }}
-            </template>
-          </el-table-column>
-          <el-table-column prop="channelAccount" label="平台账号" />
-          <el-table-column prop="channelPwd" label="平台密码" />
-          <el-table-column prop="channelStatus" label="平台状态">
-            <template #default="{ row }">
-              {{ getDictionaryName("channel_status", row.channelStatus) }}
-            </template>
-          </el-table-column>
-        </Table>
-      </el-radio-group>
-    </Layer>
-
     <!-- 操作弹窗 -->
     <Layer :layer="layer" @confirm="submit(ruleForm)" @close="layer.show = false">
       <el-form :model="formEdit" :rules="rules" ref="ruleForm" label-width="130px" style="margin-right: 30px">
-        <el-form-item label="出包渠道" required prop="ditchData">
-          <el-select v-model="formEdit.ditchData">
-            <el-option v-for="item in ditchListData" :key="item.ditchId" :value="item.ditchName" :label="item.ditchName" />
-          </el-select>
-        </el-form-item>
         <el-row :gutter="5">
-          <el-col :span="10" v-if="formEdit.appId">
-            <el-form-item label="应用ID" required prop="appId">
-              <el-input v-model="formEdit.appId" disabled placeholder="请输入" clearable />
-            </el-form-item>
-          </el-col>
-          <el-col :span="2" v-if="formEdit.appId"></el-col>
           <el-col :span="10">
             <el-form-item label="应用名称:" required prop="appName">
               <el-input v-model="formEdit.appName" placeholder="请输入" clearable />
             </el-form-item>
           </el-col>
-        </el-row>
-        <el-row :gutter="5">
+          <el-col :span="2"></el-col>
           <el-col :span="10">
-            <el-form-item label="应用类型" required prop="appType">
-              <el-select v-model="formEdit.appType" @change="getPrimaryCategoriesData">
+            <el-form-item label="应用类型:" prop="appType">
+              <el-select v-model="formEdit.appType">
                 <el-option :value="1" label="Android" />
                 <el-option :value="2" label="IOS" />
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="2"></el-col>
-          <el-col :span="10">
-            <el-form-item label="是否上架" required prop="store_on_sale">
-              <el-select v-model="formEdit.store_on_sale">
-                <el-option :value="1" label="否" />
-                <el-option :value="2" label="是" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="5" v-if="formEdit.store_on_sale === 2">
-          <el-col :span="10">
-            <el-form-item label="上架商店" prop="store_type">
-              <el-select v-model="formEdit.store_type" placeholder="请选择上架应用商店">
-                <el-option :value="1" label="App Store" />
-                <el-option :value="2" label="Google Play" />
-                <el-option :value="3" label="华为商店" />
-                <el-option :value="4" label="小米应用商店" />
-                <el-option :value="5" label="OPPO商店" />
-                <el-option :value="6" label="vivo商店" />
-                <el-option :value="7" label="应用宝" />
-                <el-option :value="8" label="TapTap" />
-                <el-option :value="9" label="Amazon应用商店" />
-                <el-option :value="10" label="三星应用商店" />
-                <el-option :value="11" label="小米海外应用商店" />
-                <el-option :value="12" label="华为海外应用市场" />
-                <el-option :value="13" label="Roku" />
-                <el-option :value="14" label="Samsung Smart TV" />
-                <el-option :value="15" label="Microsoft" />
-                <el-option :value="16" label="LG Smart TV" />
-                <el-option :value="17" label="Vizio" />
-                <el-option :value="99" label="其他" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="2"></el-col>
-          <el-col :span="10">
-            <el-form-item label="商店链接" prop="store_url">
-              <el-input v-model="formEdit.store_url" placeholder="请输入上架商店链接" clearable />
-            </el-form-item>
-          </el-col>
         </el-row>
         <el-row :gutter="5">
           <el-col :span="10">
-            <el-form-item label="应用域名" prop="domain">
-              <el-input v-model="formEdit.domain" placeholder="请输入应用域名" clearable />
-            </el-form-item>
-          </el-col>
-          <el-col :span="2"></el-col>
-          <el-col :span="10">
-            <el-form-item label="应用包名" prop="package_name">
-              <el-input v-model="formEdit.package_name" placeholder="请输入应用包名" clearable />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="5">
-          <el-col :span="10">
-            <el-form-item label="一级分类" required prop="category">
-              <el-select :disabled="primaryCategoriesData.length === 0" v-model="formEdit.category"
-                placeholder="请选择上架应用商店" @change="getSecondaryCategoriesData">
-                <el-option v-for="(item, index) in primaryCategoriesData" :key="item" :value="item" :label="item" />
+            <el-form-item label="出包渠道:" required prop="ditchId">
+              <el-select v-model="formEdit.ditchId">
+                <el-option v-for="item in ditchListData" :key="item.ditchId" :value="item.ditchId" :label="item.ditchName" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="2"></el-col>
           <el-col :span="10">
-            <el-form-item label="二级分类" required prop="sub_category">
-              <el-select :disabled="secondaryCategoriesData.length === 0" v-model="formEdit.sub_category"
-                placeholder="请选择上架应用商店">
-                <el-option v-for="(item, index) in secondaryCategoriesData" :key="item" :value="item" :label="item" />
+            <el-form-item label="所属应用:" required prop="superiorId">
+              <el-select v-model="formEdit.superiorId">
+                <el-option v-for="item in issuedAppData" :key="item.appId" :value="item.appId" :label="item.appName" />
               </el-select>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="5">
           <el-col :span="10">
-            <el-form-item label="屏幕方向" prop="screen_orientation">
-              <el-select v-model="formEdit.screen_orientation" placeholder="请选择屏幕方向">
-                <el-option :value="1" label="竖屏" />
-                <el-option :value="2" label="横屏" />
-                <el-option :value="3" label="所有" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="2"></el-col>
-          <el-col :span="10">
-            <el-form-item label="版本号" required prop="versionCode">
-              <el-input v-model="formEdit.versionCode" placeholder="请输入版本号" clearable />
+            <el-form-item label="版本号:" prop="versionCode">
+              <el-input v-model="formEdit.versionCode" placeholder="请输入" clearable />
             </el-form-item>
           </el-col>
         </el-row>
-        <el-row :gutter="5">
-          <el-col :span="10">
-            <el-form-item label="遵守美国COPPA" prop="coppa">
-              <el-switch v-model="formEdit.coppa" :active-value="2" :inactive-value="1" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="2"></el-col>
-          <el-col :span="10">
-            <el-form-item label="遵守美国CCPA" required prop="ccpa">
-              <el-switch v-model="formEdit.ccpa" :active-value="2" :inactive-value="1" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="5">
-          <el-col :span="10">
-            <el-form-item label="二维码图片:" required prop="qrCode">
-              <el-upload class="avatar-uploader" accept="image/jpg,image/jpeg,image/png,image/webp" action="#"
-                :show-file-list="false" :before-upload="beforeAvatarUpload" :http-request="selfUpload">
-                <el-image v-if="formEdit.qrCode" style="width: 100px; height: 100px" :src="formEdit.qrCode" fit="fill"
-                   />
-                <el-icon v-else class="avatar-uploader-icon">
-                  <Plus />
-                </el-icon>
-                <template #tip>
-                  <div class="el-upload__tip">
-                    仅支持上传 jpg / png / webp 图片格式
-                  </div>
-                </template>
-              </el-upload>
-            </el-form-item>
-          </el-col>
-          <el-col :span="2"></el-col>
-          <el-col :span="10">
-            <el-form-item label="APP安装包:" required prop="apkUrl">
-              <el-upload class="upload-demo" :before-upload="beforeUpload" :http-request="customUpload"
-                :show-file-list="false">
-                <el-button type="primary">点击上传</el-button>
-                <template #tip>
-                  <div class="el-upload__tip">
-                    仅支持上传 Android (.apk/.aab) 或 iOS (.ipa) 安装包
-                  </div>
-                </template>
-              </el-upload>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <!--  <el-form-item label="apk应用包地址:" required prop="apkUrl">
-          <el-input v-model="formEdit.apkUrl" placeholder="请输入" clearable/>
-        </el-form-item> -->
-        <el-form-item label="更新提示:" required prop="updateTips">
-          <el-input v-model="formEdit.updateTips" placeholder="请输入" clearable />
+        <el-form-item label="更新提示:" prop="updateTips">
+          <el-input v-model="formEdit.updateTips" type="textarea" placeholder="请输入" clearable />
         </el-form-item>
       </el-form>
     </Layer>
@@ -312,28 +113,20 @@
 </template>
 <script setup>
 import { onBeforeMount, ref, reactive } from "vue";
-import QRCode from 'qrcode' //生成二维码
-import { ElMessage,ElLoading } from "element-plus";
+import { ElMessage } from "element-plus";
 import { useGetDictList } from "@/hooks/useGetDictList.js";
 import {
-  channelAddOne,
-  channelDeleteOne,
-  channelUpdateOne,
   appList,
   saveOrUpdate,
-  delApp, channelList, getSecondaryCategories, getPrimaryCategories, relativeChannel, relativeChannelList
+  delApp, issuedApps
 } from "@/api/formworkErection.js";
-import { attachFile, attachImage } from '@/api/common.js'
 import { ditchList } from '@/api/outBagModule.js'
 import From from "@/components/from/index.vue";
 import Table from "@/components/table/index.vue";
 import Layer from "@/components/layer/index.vue";
-import { CopyDocument, Hide, View, Plus, UploadFilled } from "@element-plus/icons-vue";
-import vCopy from '@/directive/copy'
 
 const { loadDictData, getDictionaryName } = useGetDictList();
 const tableData = ref([]);
-const channelData = ref([]);
 
 // 分页参数, 供table使用
 const page = reactive({
@@ -342,13 +135,6 @@ const page = reactive({
   total: 0,
 });
 
-
-const channelPage = reactive({
-  pageNum: 1,
-  pageSize: 20,
-  total: 0,
-});
-
 const formSearch = ref({
   appName: null,
   channelName: null,
@@ -363,7 +149,7 @@ onBeforeMount(() => {
   settingData();
   getList();
   getDitchList();
-  getChannelList()
+  getIssuedAppList()
 });
 
 
@@ -406,31 +192,6 @@ const settingData = () => {
     ];
   });
 };
-
-// 获取广告平台
-const channelListData = ref([])
-const getChannelList = async() => {
-  let res = await channelList({
-    page: 1,
-    limit: 999,
-  })
-
-  channelListData.value.push({
-    label: '全部',
-    value: null,
-  })
-
-  res.data.forEach((item,index) => {
-    let options = {
-      label: item.channelName,
-      value: item.channelName,
-    }
-    channelListData.value.push(options)
-  })
-
-  dynamicFormItems.value[1].options = channelListData.value
-}
-
 // 获取出包渠道
 const ditchListData = ref([])
 const getDitchList = async() => {
@@ -440,9 +201,14 @@ const getDitchList = async() => {
   })
   ditchListData.value = res.data
 }
+const issuedAppData = ref([])
+const getIssuedAppList = async ()=>{
+  let res = await issuedApps({})
+  issuedAppData.value = res.data
+}
 
-function findByDitchName(name) {
-  return ditchListData.value.find(item => item.ditchName === name)
+function findByDitchName(ditchId) {
+  return ditchListData.value.find(item => item.ditchId === ditchId)
 }
 
 // 分页数据
@@ -490,29 +256,6 @@ const handleSelectionChange = (val) => {
   context.emit("selection-change", val);
 };
 
-// 关联平台
-const selectedChannelId = ref(null)
-const selectRow = ref({})
-
-function handleRadioChange(val) {
-  console.log('选中平台ID', val)
-  selectRow.value = channelData.value.find(item => item.channelId === val) || null
-  console.log(selectRow.value)
-}
-
-const selectedRow = ref(null); // 存储选中的行
-
-// 选中行的方法
-const selectRowClick = (row) => {
-  // 如果点击已选中的行,则取消选中;否则选中新行
-  selectedRow.value = selectedRow.value === row ? null : row;
-};
-
-// 行点击事件(点击行任意位置选中)
-const handleRowClick = (row) => {
-  selectRow(row);
-};
-
 // 弹窗
 const layer = ref({
   show: false,
@@ -521,55 +264,18 @@ const layer = ref({
   width: "60vw",
   edit: false,
 });
-
-const channelLayer = ref({
-  show: false,
-  title: "关联平台",
-  showButton: true,
-  width: "50vw",
-  edit: false,
-});
-
-const channelSubmit = async () => {
-  console.log('关联平台', selectRow.value)
-  // selectRow.value.appId = channelAppId.value
-
-  // 目前只支持单个关联
-  await relativeChannel({ ...selectRow.value, appId: channelAppId.value }).then((res) => {
-    ElMessage.success('关联成功')
-    channelLayer.value.show = false;
-    getList();
-  })
-}
-
 const formEdit = ref({
-  ditchData: null, //渠道数据
   ditchId: null, //渠道ID
   ditchName: '',//渠道名称
-  store_on_sale: "",
-  store_type: null,
-  store_url: "",
   category: "",
   sub_category: "",
-  screen_orientation: "",
   versionCode: "",
   updateTips: "",
-  apiSecret: "", //请求密令
-  channelAccount: "", //广告平台账号
-  channelId: "", //广告平台ID
-  channelName: "", //广告平台名称
-  channelPwd: "", //广告平台密码
-  channelStatus: 0, //广告平台状态
-  loginType: 0, //登录类型 1-账号密码 2-微信
-  remark: "", //备注
   appId: "",
-  apiKey: "", //请求秘钥
   appName: "",
-  coppa: 0,
-  ccpa: 0,
   qrCode: "",
   apkUrl: "",
-  package_name: "",
+  superiorId: '',
 });
 
 const edit = (row) => {
@@ -578,14 +284,7 @@ const edit = (row) => {
     layer.value.title = "编辑APP";
     layer.value.edit = true;
     formEdit.value = row;
-    formEdit.value.store_on_sale = row.storeOnSale;
-    formEdit.value.store_type = row.storeType;
-    formEdit.value.package_name = row.packageName;
-    formEdit.value.store_url = row.storeUrl;
-    formEdit.value.sub_category = row.subCategory;
-    formEdit.value.screen_orientation = row.screenOrientation;
-    // formEdit.value.ditchData = findByDitchName(row.ditchName)
-    formEdit.value.ditchData = row.ditchName
+    formEdit.value.ditchId = Number(row.ditchId)
   } else {
     layer.value.title = "新增APP";
     layer.value.edit = false;
@@ -594,52 +293,24 @@ const edit = (row) => {
   layer.value.show = true;
 };
 
-const channelAppId = ref('')
-const openChannelLayer = async (row) => {
-  if (row) {
-    selectedChannelId.value = null
-    channelAppId.value = row.appId
-    let res =await relativeChannelList({appId: row.appId,page:channelPage.pageNum,limit:channelPage.pageSize})
-    channelData.value = res.data;
-    channelPage.total = res.pageMeta.total;
-    channelLayer.value.show = true;
-  }
-
-}
-
 const ruleForm = ref(null);
 
 const rules = reactive({
-  ditchData: [
+  ditchId: [
     { required: true, message: "请选择出包渠道", trigger: "change" },
   ],
+  superiorId: [
+    { required: true, message: "请选择所属应用", trigger: "change" },
+  ],
   appName: [
     { required: true, message: "请输入应用名称", trigger: "blur" },
   ],
   appType: [
     { required: true, message: "请输入应用类型", trigger: "blur" },
   ],
-  store_on_sale: [
-    { required: true, message: "请选择是否上架", trigger: "change" },
-  ],
-  category: [
-    { required: true, message: "请选择一级分类", trigger: "change" },
-  ],
-  sub_category: [
-    { required: true, message: "请选择二级分类", trigger: "change" },
-  ],
   versionCode: [
     { required: true, message: "请输入版本号", trigger: "blur" },
   ],
-  qrCode: [
-    { required: true, message: "请上传二维码图片", trigger: "change" },
-  ],
-  apkUrl: [
-    { required: true, message: "请上传APP安装包", trigger: "change" },
-  ],
-  updateTips: [
-    { required: true, message: "请输入更新提示", trigger: "blur" },
-  ],
 });
 
 const submit = async (formEl) => {
@@ -650,10 +321,8 @@ const submit = async (formEl) => {
     }
 
     if (valid) {
-      formEdit.value.ditchData = findByDitchName(formEdit.value.ditchData)
-      formEdit.value.ditchId = formEdit.value.ditchData.ditchId
-      formEdit.value.ditchName = formEdit.value.ditchData.ditchName
-      delete formEdit.value.ditchData
+      let item = findByDitchName(formEdit.value.ditchId)
+      formEdit.value.ditchName = item.ditchName
       // 提交内容
       if (layer.value.edit) {
         //api修改需要uuid
@@ -687,112 +356,6 @@ const removeApp = async (row) => {
   });
 };
 
-// 获取指定平台下的一级分类
-const primaryCategoriesData = ref([])
-const getPrimaryCategoriesData = async () => {
-  formEdit.value.category = null
-  secondaryCategoriesData.value = []
-  let res = await getPrimaryCategories({
-    platform: formEdit.value.appTyp === 1 ? 'Android' : 'IOS'
-  })
-  primaryCategoriesData.value = res.data
-}
-
-// 获取指定平台下的一级分类下的二级分类
-const secondaryCategoriesData = ref([])
-const getSecondaryCategoriesData = async () => {
-  secondaryCategoriesData.value = []
-  if (formEdit.value.appType && formEdit.value.category) {
-    let res = await getSecondaryCategories({
-      platform: formEdit.value.appTyp === 1 ? 'Android' : 'IOS',
-      primaryCategory: formEdit.value.category
-    })
-    secondaryCategoriesData.value = res.data
-  }
-}
-
-const loading = ref(null)
-// 加载信息
-const openFullScreen = (loadText) => {
-    loading.value = ElLoading.service({
-        lock: true,
-        text: loadText,
-        background: 'rgba(0, 0, 0, 0.7)',
-    })
-}
-
-const closeFullScreen = () => {
-    loading.value.close()
-}
-
-// 上传二维码图片
-const beforeAvatarUpload = (rawFile) => {
-  let fileType = ["image/jpeg", "image/png", "image/webp"];
-  if (!fileType.includes(rawFile.type)) {
-    ElMessage.error("请上传图片格式为jpg/png/webp!");
-    return false;
-  } else if (rawFile.size / 1024 / 1024 > 2) {
-    ElMessage.error(`图片大小不能超过 2MB!`);
-    return false;
-  }
-  return true;
-}
-
-const selfUpload = async (param) => {
-  const file = param.file
-  const formData = new FormData()
-  formData.append('file', file)
-  openFullScreen('图片上传中')
-  try {
-    const res = await attachImage(formData)
-    formEdit.value.qrCode = res.data.url
-    ElMessage.success('图片上传成功')
-  } catch (err) {
-    ElMessage.error('图片上传失败')
-    console.error(err)
-  } finally {
-    closeFullScreen()
-  }
-};
-
-// 上传APP安装包
-// 自定义上传逻辑
-const customUpload = async (param) => {
-  const file = param.file
-  const formData = new FormData()
-  formData.append('file', file)
-  openFullScreen('APP上传中')
-  try {
-    const res = await attachFile(formData)
-    formEdit.value.apkUrl = res.data.url
-    console.log(res, res.data.url)
-    ElMessage.success('上传成功')
-    // 生成二维码
-    QRCode.toDataURL(res.data.url).then(res => {
-      formEdit.value.qrCode = res
-      ElMessage.success('二维码生成成功!')
-    })
-  } catch (err) {
-    ElMessage.error('APP上传失败')
-    console.error(err)
-  } finally {
-    closeFullScreen()
-  }
-}
-
-// 上传前校验文件类型
-const beforeUpload = (file) => {
-  const fileExt = file.name.split('.').pop().toLowerCase()
-  const validExts = ['apk', 'aab', 'ipa']
-
-  if (!validExts.includes(fileExt)) {
-    ElMessage.error('只允许上传 .apk、.aab 或 .ipa 文件')
-    return false
-  }
-
-  return true
-}
-
 </script>
 
 <style scoped lang="scss">