This commit is contained in:
qijq 2025-05-16 17:46:12 +08:00
parent 5b563867fe
commit 8176c75f22
9 changed files with 32896 additions and 166 deletions

2
.gitignore vendored
View File

@ -25,7 +25,7 @@ pnpm-debug.log*
# Lock files
yarn.lock
pnpm-lock.yaml
package-lock.json
# package-lock.json
# Yarn v2 not using using Zero-Installs
.yarn/*

31868
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,109 @@
import request from '@/utils/request'
import { URL } from '@/config'
/**
* 获取APP 版本列表
* @author Seven
* @data 2025-5-5
* @param "marketId": 1, // 各大安卓 APP 市场标识1 - 小米2 - 华为3 - 腾讯应用市场4 - OPPO5 - VIVO6 - 三星100-通用包(不区分市场的包);
"keyword": "",//搜索关键字
"pageNum": 1 ,
"pageSize": 10
* @returns { }
* @see https://mall.gpxscs.cn/api/admin/app-market-update/enable-or-disable
*/
export function getShopAppVersionList(params) {
return request({
url: URL.appVersion.getShopAppVersionList,
method: 'post',
headers: {
'Content-Type': 'application/json',
},
data: params,
})
}
/**
* 添加APP包
* @author Seven
* @data 2025-5-5
* @param {
"market_id": 1, // 各大安卓 APP 市场标识1 - 小米2 - 华为3 - 腾讯应用市场4 - OPPO5 - VIVO6 - 三星100-通用包(不区分市场的包);
"package_name": "xftc.apk", // app 包名
"version_key": 2, //热更新包内部整数版本号1-10000000
"version_name": "1.0.2", //热更新包显示的版本号,用于标识不同的热更新版本,遵循一定命名规则,如 1.23.21
"download_apk_url": "https://mall.gpxscs.cn/abc.apk",// apk 包下载地址
"download_wgt_url": "https://mall.gpxscs.cn/abc.wgt", // 增量包下载地址
"description": "发布版本详细说明",
"is_force_update": 2 // 是否为强制更新1-表示强制更新2-表示非强制更新,
}
* @returns { }
* @see https://mall.gpxscs.cn/api/admin/admin/app-market-update/add/new
*/
export function addShopAppVersion(params) {
return request({
url: URL.appVersion.addShopAppVersion,
method: 'post',
headers: {
'Content-Type': 'application/json',
},
data: params,
})
}
/**
* 更新APP包
* @author Seven
* @data 2025-5-5
* @param {
"id": 2,// 自增Id
"market_id": 1, // 各大安卓 APP 市场标识1 - 小米2 - 华为3 - 腾讯应用市场4 - OPPO5 - VIVO6 - 三星100-通用包(不区分市场的包);
"package_name": "xftc.apk", // app 包名
"version_key": 2, //热更新包内部整数版本号1-10000000
"version_name": "1.0.2", //热更新包显示的版本号,用于标识不同的热更新版本,遵循一定命名规则,如 1.23.21
"download_apk_url": "https://mall.gpxscs.cn/abc.apk",// apk 包下载地址
"download_wgt_url": "https://mall.gpxscs.cn/abc.wgt", // 增量包下载地址
"description": "发布版本详细说明",
"is_force_update": 2 // 是否为强制更新1-表示强制更新2-表示非强制更新,
* }
* @returns { }
* @see https://mall.gpxscs.cn/api/admin/admin/app-market-update/modify
*/
export function updateShopAppVersion(params) {
return request({
url: URL.appVersion.updateShopAppVersion,
method: 'post',
headers: {
'Content-Type': 'application/json',
},
data: params,
})
}
/**
* 开启/关闭更新
* @author Seven
* @data 2025-5-5
* @param {
{
"id": 1, // 自增Id列表里获取
"status": 2, // 状态1-开启2-关闭
}
* }
* @returns { }
* @see https://mall.gpxscs.cn/api/admin/admin/app-market-update/enable-or-disable
*/
export function disableUpdateShopApp(params) {
return request({
url: URL.appVersion.disableUpdateShopApp,
method: 'post',
headers: {
'Content-Type': 'application/json',
},
data: params,
})
}

View File

@ -4,7 +4,7 @@
:class="'top-card top-card-' + background"
shadow="hover"
>
<span style="color:#181818">{{ title }}</span>
<span style="color: #181818">{{ title }}</span>
<span style="float: right; margin-right: 4px">
<el-tag size="small" type="success">{{ t('今日') }}</el-tag>
</span>
@ -51,149 +51,149 @@
</template>
<script>
import { translateTitle as t } from '@/utils/i18n'
import _ from 'lodash'
import { translateTitle as t } from '@/utils/i18n'
import _ from 'lodash'
import MsCount from '@/components/MsCount'
import MsCard from '@/components/MsCard'
import MsCount from '@/components/MsCount'
import MsCard from '@/components/MsCard'
export default {
name: 'TopCard',
components: {
MsCount,
MsCard,
export default {
name: 'TopCard',
components: {
MsCount,
MsCard,
},
props: {
background: {
type: String,
default: 'white',
},
props: {
background: {
type: String,
default: 'white',
},
title: {
type: String,
default: '',
},
icon: {
type: String,
default: 'album-line',
},
bottomText: {
type: String,
default: '',
},
unitText: {
type: String,
default: '',
},
countConfig: {
type: Object,
default: () => {
return {
startVal: 0,
endVal: _.random(1000, 20000),
decimals: 0,
prefix: '',
suffix: '',
separator: ',',
duration: 8000,
}
},
title: {
type: String,
default: '',
},
icon: {
type: String,
default: 'album-line',
},
bottomText: {
type: String,
default: '',
},
unitText: {
type: String,
default: '',
},
countConfig: {
type: Object,
default: () => {
return {
startVal: 0,
endVal: _.random(1000, 20000),
decimals: 0,
prefix: '',
suffix: '',
separator: ',',
duration: 8000,
}
},
},
methods: {
t,
},
}
},
methods: {
t,
},
}
</script>
<style scoped>
.top-card {
position: relative;
height: 158px !important;
}
.top-card {
position: relative;
height: 158px !important;
}
.top-card p {
font-size: 28px;
.top-card p {
font-size: 28px;
display: block;
margin-block-start: 20px;
margin-block-end: 20px;
margin-inline-start: 0px;
margin-inline-end: 0px;
}
display: block;
margin-block-start: 20px;
margin-block-end: 20px;
margin-inline-start: 0px;
margin-inline-end: 0px;
}
.top-card .right-icon {
position: absolute;
top: 50%;
right: 20px;
width: 50px;
height: 50px;
line-height: 50px;
color: var(--el-color-primary);
text-align: center;
background: var(--el-color-primary-light-9);
border-radius: 50%;
transform: translateY(-50%);
}
.top-card .right-icon {
position: absolute;
top: 50%;
right: 20px;
width: 50px;
height: 50px;
line-height: 50px;
color: var(--el-color-primary);
text-align: center;
background: var(--el-color-primary-light-9);
border-radius: 50%;
transform: translateY(-50%);
}
.top-card .right-icon i {
font-size: 30px;
}
.top-card .right-icon i {
font-size: 30px;
}
.top-card .bottom {
font-size: 12px;
margin-top: 10px;
}
.top-card .bottom {
font-size: 12px;
margin-top: 10px;
}
.top-card .bottom .ri-arrow-up-line,
.top-card .bottom .ri-arrow-down-line {
width: 18px;
height: 18px;
margin: 0 3px 0 2px;
vertical-align: -3px !important;
border-radius: 50%;
transform: scale(0.8);
}
.top-card .bottom .ri-arrow-up-line,
.top-card .bottom .ri-arrow-down-line {
width: 18px;
height: 18px;
margin: 0 3px 0 2px;
vertical-align: -3px !important;
border-radius: 50%;
transform: scale(0.8);
}
.top-card .bottom .ri-arrow-up-line {
color: var(--el-color-error);
background: var(--el-color-error-light);
}
.top-card .bottom .ri-arrow-up-line {
color: var(--el-color-error);
background: var(--el-color-error-light);
}
.top-card .bottom .ri-arrow-down-line {
color: var(--el-color-success);
background: var(--el-color-success-light);
}
.top-card .bottom .ri-arrow-down-line {
color: var(--el-color-success);
background: var(--el-color-success-light);
}
.top-card .bottom span {
color: var(--el-color-success);
}
.top-card .bottom span {
color: var(--el-color-success);
}
.top-card.blue {
color: #fff;
background: var(--el-color-primary);
background: linear-gradient(
90deg,
var(--el-color-primary-light-4),
var(--el-color-primary)
);
}
.top-card.blue {
color: #fff;
background: var(--el-color-primary);
background: linear-gradient(
90deg,
var(--el-color-primary-light-4),
var(--el-color-primary)
);
}
.top-card.blue .bottom {
font-size: 12px;
}
.top-card.blue .bottom {
font-size: 12px;
}
.top-card.blue .bottom .ri-arrow-up-line {
color: #fff;
background: transparent;
}
.top-card.blue .bottom .ri-arrow-up-line {
color: #fff;
background: transparent;
}
.top-card.blue .bottom .ri-arrow-up-line {
color: var(--el-color-primary);
background: var(--el-color-primary-light-9);
transform: scale(0.8);
}
.top-card.blue .bottom .ri-arrow-up-line {
color: var(--el-color-primary);
background: var(--el-color-primary-light-9);
transform: scale(0.8);
}
.top-card.blue .bottom span {
color: #fff;
}
.top-card.blue .bottom span {
color: #fff;
}
</style>

View File

@ -1,4 +1,3 @@
/**
* @description 导出网络配置
**/
@ -22,6 +21,14 @@ let url = {
verifyCode: api_url + '/admin/shop/shop-base-config/image', // 获取登录验证码路径
testEmail: api_url + '/admin/shop/email/testEmail', // 邮件测试路径
upload: api_url + '/admin/oss/upload', // 图片 oss 路径
appVersion: {
getShopAppVersionList:
api_url + '/admin/admin/app-market-update/search/list',
addShopAppVersion: api_url + '/admin/admin/app-market-update/add/new',
updateShopAppVersion: api_url + '/admin/admin/app-market-update/modify',
disableUpdateShopApp:
api_url + '/admin/admin/app-market-update/enable-or-disable',
},
city: {
user: {
paotuier: {
@ -67,12 +74,16 @@ let url = {
},
order: {
//商家端-订单量
getOrderNumToday: api_url + '/admin/shop/analytics/order/getOrderNumToday',
getOrderNumToday:
api_url + '/admin/shop/analytics/order/getOrderNumToday',
getOrderNum: api_url + '/admin/shop/analytics/order/getOrderNum',
//商家端-使用优惠卷数量
getVoucherActiveNumToday: api_url + '/admin/shop/analytics/order/getVoucherActiveNumToday',
getVoucherActiveNum: api_url + '/admin/shop/analytics/order/getVoucherActiveNum',
getSaleOrderAmount: api_url + '/admin/shop/analytics/order/getSaleOrderAmount',
getVoucherActiveNumToday:
api_url + '/admin/shop/analytics/order/getVoucherActiveNumToday',
getVoucherActiveNum:
api_url + '/admin/shop/analytics/order/getVoucherActiveNum',
getSaleOrderAmount:
api_url + '/admin/shop/analytics/order/getSaleOrderAmount',
getOrderAmount: api_url + '/admin/shop/analytics/order/getOrderAmount',
getDashboardTimeLine:
api_url + '/admin/shop/analytics/order/getDashboardTimeLine',
@ -90,7 +101,8 @@ let url = {
},
return: {
// 商家端-退货单数
getReturnNumToday: api_url + '/admin/shop/analytics/return/getReturnNumToday',
getReturnNumToday:
api_url + '/admin/shop/analytics/return/getReturnNumToday',
getReturnNum: api_url + '/admin/shop/analytics/return/getReturnNum',
getReturnAmountTimeline:
api_url + '/admin/shop/analytics/return/getReturnAmountTimeline',
@ -415,17 +427,17 @@ let url = {
},
// 商店
shop: {
merch:{
merch: {
// 商家申请入驻信息分页列表
merchList:api_url + '/admin/shop/merch/list',
merchList: api_url + '/admin/shop/merch/list',
// 商家申请入驻信息详情
merchDetail: api_url + '/admin/shop/merch/detail',
// 审批商家申请入驻
merchApproval : api_url + '/admin/shop/merch/approval',
merchApproval: api_url + '/admin/shop/merch/approval',
// 发起合同签署
createByFile : api_url + '/admin/shop/esign/sign-flow/create-by-file',
createByFile: api_url + '/admin/shop/esign/sign-flow/create-by-file',
//查看商家签署合同
checkContractFile : api_url + '/admin/shop/esign/signed/contract/file'
checkContractFile: api_url + '/admin/shop/esign/signed/contract/file',
},
activity: {
lottery: {
@ -542,7 +554,8 @@ let url = {
base: {
doDelete: api_url + '/admin/shop/hall-purchase-order-base/delete',
getList: api_url + '/admin/shop/hall-purchase-order-base/list',
getSupplyOrderList: api_url + '/admin/shop/hall-purchase-order-base/getSupplyOrderList',
getSupplyOrderList:
api_url + '/admin/shop/hall-purchase-order-base/getSupplyOrderList',
doEdit: api_url + '/admin/shop/hall-purchase-order-base/edit',
},
},
@ -647,7 +660,8 @@ let url = {
doEdit:
api_url + '/admin/shop/shop-base-product-category-mobile/edit',
editState:
api_url + '/admin/shop/shop-base-product-category-mobile/editState',
api_url +
'/admin/shop/shop-base-product-category-mobile/editState',
doDelete:
api_url + '/admin/shop/shop-base-product-category-mobile/delete',
},
@ -922,7 +936,8 @@ let url = {
doCodeCreate:
api_url + '/admin/shop/shop-store-activity-code/createCode',
getCodeList: api_url + '/admin/shop/shop-store-activity-code/list',
exportFile: api_url + '/admin/shop/shop-store-activity-code/exportFile',
exportFile:
api_url + '/admin/shop/shop-store-activity-code/exportFile',
doCodeDelete: api_url + '/admin/shop/shop-store-activity-code/delete',
getListsLotteryItems:
api_url + '/admin/shop/shop-store-activity-base/listsLotteryItems',
@ -1019,12 +1034,14 @@ let url = {
del: api_url + '/admin/shop/shop-store-product-tag/del',
},
},
printer:{
printer: {
//总后台-获取小票机品牌列表
getReceiptMachineList:api_url + '/admin/shop/store/printer/model/page',
addReceiptMachine:api_url + '/admin/shop/store/printer/model/add/new',
delectReceiptMachine : api_url + '/admin/shop/store/printer/model/delete',
updateReceiptMachine : api_url + '/admin/shop/store/printer/model/update',
getReceiptMachineList: api_url + '/admin/shop/store/printer/model/page',
addReceiptMachine: api_url + '/admin/shop/store/printer/model/add/new',
delectReceiptMachine:
api_url + '/admin/shop/store/printer/model/delete',
updateReceiptMachine:
api_url + '/admin/shop/store/printer/model/update',
//商家端-获取打印机列表
getPrinterList: api_url + '/admin/shop/store/printer/page',
//商家端-获取打印机详情
@ -1032,22 +1049,25 @@ let url = {
//商家端-获取打印机品牌下拉列表
getPrinterModelList: api_url + '/admin/shop/store/printer/model/list',
//商家端-获取打印机区域列表
getPrinterflagList: api_url + '/admin/shop/store/printer/region/list',
addPrinter:api_url + '/admin/shop/store/printer/add/new',
getPrinterflagList: api_url + '/admin/shop/store/printer/region/list',
addPrinter: api_url + '/admin/shop/store/printer/add/new',
delectPrinter: api_url + '/admin/shop/store/printer/delete',
//商家端-更新打印机信息
updatePrinterInfo: api_url + '/admin/shop/store/printer/update',
//商家端-更新打印机状态
updatePrnterStatus: api_url + '/admin/shop/store/printer/status/update',
//商家端-测试打印
testPrinter:api_url + '/admin/shop/store/printer/print/order'
testPrinter: api_url + '/admin/shop/store/printer/print/order',
},
sameCityTransport: {
getSameCityTransport:
api_url + '/admin/shop/store/same-city-transport/detail',
saveSameCityTransport:
api_url + '/admin/shop/store/same-city-transport/save',
delectArea:
api_url + '/admin/shop/store/same-city-transport/delete/area',
getSFTypeList: api_url + '/admin/shop/shop-store-base/business/list',
},
sameCityTransport:{
getSameCityTransport: api_url + '/admin/shop/store/same-city-transport/detail',
saveSameCityTransport: api_url + '/admin/shop/store/same-city-transport/save',
delectArea:api_url + '/admin/shop/store/same-city-transport/delete/area',
getSFTypeList:api_url + '/admin/shop/shop-store-base/business/list'
}
},
user: {
delivery: {
@ -1158,7 +1178,8 @@ let url = {
api_url + '/admin/shop/shop-order-return/exportFileByIds',
doForceRefund: api_url + '/admin/shop/shop-order-return/doForceRefund',
editRefund: api_url + '/admin/shop/shop-order-return/editRefund',
transferToSupplier: api_url + '/admin/shop/shop-order-return/transferToSupplier',
transferToSupplier:
api_url + '/admin/shop/shop-order-return/transferToSupplier',
doUpdateReturns:
api_url + '/admin/shop/shop-order-return/doUpdateReturns',
item: {
@ -1343,9 +1364,7 @@ let url = {
getList: api_url + '/admin/admin/admin-log-error/list',
},
},
printer:{
}
printer: {},
},
order: {
add: api_url + '/order/add',

View File

@ -125,6 +125,30 @@
</div>
</el-card>
</el-col>
<el-col :span="12">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>隐私协议</span>
</div>
<div>
<vab-quill
ref="vab-quill"
v-model="form.joininPrivacyAgreement"
:min-height="400"
:options="options"
/>
</div>
<div>
<el-button
icon="el-icon-s-tools"
type="primary"
@click="handleEdit('joininPrivacyAgreement')"
>
{{ __('修改') }}
</el-button>
</div>
</el-card>
</el-col>
</el-row>
</div>
</template>
@ -145,6 +169,7 @@
joinin_condition: '',
joinin_cooperation_details: '',
joinin_expenses_details: '',
joininPrivacyAgreement:''
},
options: {
@ -182,17 +207,20 @@
__,
async fetchData() {
const { data } = await getList()
this.form = {
joinin_investment_direction: data.joinin_investment_direction,
joinin_standard: data.joinin_standard,
joinin_condition: data.joinin_condition,
joinin_cooperation_details: data.joinin_cooperation_details,
joinin_expenses_details: data.joinin_expenses_details,
joininPrivacyAgreement : data.joininPrivacyAgreement
}
},
async handleEdit(key) {
const obj = {}
obj[key] = this.form[key]
const { msg, status } = await doEdit({
param: JSON.stringify(obj),
})

View File

@ -1114,7 +1114,9 @@ export default {
if (data != null) {
this.pram = data
//
this.data.wait_shipping_num = data.order.wait_shipping_num
// 退
this.data.review_num = data.return.review_num
//

View File

@ -238,9 +238,9 @@ export default {
})
},
changeCode() {
window.open(
`https://mal1.gpxscs.cn/admin/#/login?loginInfo=JsoN.parse(J.stringify(res.data))`
)
// window.open(
// `https://mal1.gpxscs.cn/admin/#/login?loginInfo=JsoN.parse(J.stringify(res.data))`
// )
// this.codeUrl = `https://www.oschina.net/action/user/captcha?timestamp=${new Date().getTime()}`
this.verify_token = new Date().getTime()

View File

@ -1,20 +1,724 @@
<template>
<div class="appVersion-container">这是商家版APP</div>
<div class="appVersion-container">
<div class="head">
<div class="head-add-btn">
<el-button
icon="el-icon-plus"
type="primary"
size="medium"
@click="handleShowDialog"
>
添加安卓包
</el-button>
</div>
<div class="head-content">
<span class="name">APP包市场</span>
<el-select
v-model="selectId"
placeholder="请选择APP市场"
@change="handerSelectMarketId"
class="select-content"
>
<el-option
:label="item.label"
:value="item.key"
v-for="(item, index) of options"
:key="index"
></el-option>
</el-select>
<span class="name">安卓包名称</span>
<el-input
placeholder="请输入安卓包名称"
suffix-icon="el-icon-search"
v-model="appName"
size="medium"
class="input-with-select"
></el-input>
<el-button type="primary" size="medium" @click="handleSearch">
搜索
</el-button>
<el-button size="medium" @click="handleClear">清除条件</el-button>
</div>
</div>
<el-table
:data="tableData"
:height="tableConfig.height"
style="width: 100%"
:stripe="true"
>
<el-table-column
align="center"
v-for="(item, index) in tabColumn"
:key="index"
:prop="item.prop"
:label="item.label"
:width="item.width"
>
<template #default="{ row, $index }">
<div class="" v-if="item.label == '操作'">
<el-button
type="text"
size="small"
@click="handleEdit(row, $index)"
>
编辑
</el-button>
</div>
<div v-else-if="item.label == '所属市场'">
{{ formatAppShopName(row) }}
</div>
<div v-else-if="item.label == '开启状态'">
<el-switch
v-model="row.status"
active-color="#13ce66"
inactive-color="#ff4949"
:active-value="1"
:inactive-value="2"
@change="handerDisableUpdateShopApp($event, row)"
></el-switch>
</div>
<div v-else-if="item.label == '是否强制更新'">
<el-switch
v-model="row.is_force_update"
active-color="#13ce66"
inactive-color="#ff4949"
:active-value="1"
:inactive-value="2"
@change="handerIsUpdateShopApp($event, row)"
></el-switch>
</div>
<div v-else-if="item.label == '序号'">
{{ $index + 1 }}
</div>
<div v-else>
{{ row[item.prop] }}
</div>
</template>
</el-table-column>
</el-table>
<el-dialog
class="receipt-machine-dialog"
:title="dialogTitle"
:top="'10vh'"
:width="'900px'"
:visible.sync="showDialog"
:before-close="handleCloseDialog"
>
<el-form
ref="formDialog"
class="form-dialog"
:model="formDialog"
:rules="formDialogRules"
label-width="160px"
>
<el-form-item label="APP市场" prop="market_id">
<el-select v-model="formDialog.market_id" placeholder="请选择APP市场">
<el-option
:label="item.label"
:value="item.key"
v-for="(item, index) of options"
:key="index"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="APP包名" prop="package_name">
<el-input
v-model="formDialog.package_name"
placeholder="例如:com.xiaofa.shopAdmin.apk"
></el-input>
</el-form-item>
<el-form-item label="应用版本号" prop="version_key">
<el-input
v-model="formDialog.version_key"
placeholder="热更新包内部整数版本号1-10000000"
></el-input>
</el-form-item>
<el-form-item label="应用版本号名称" prop="version_name">
<el-input
v-model="formDialog.version_name"
placeholder="命名规则1.23.21"
></el-input>
</el-form-item>
<el-form-item label="apk 包下载地址" prop="download_apk_url">
<div class="form-item-flex">
<el-input
v-model="formDialog.download_apk_url"
placeholder="apk下载的地址"
></el-input>
<el-upload
class="upload"
ref="upload"
:action="uploadUrl"
:on-preview="handlePreview"
:on-success="handleAKPUpLoadSuccess"
:data="uploadParams"
:before-upload="checkAPKname"
>
<el-button slot="trigger" size="small" type="primary">
上传
</el-button>
</el-upload>
</div>
</el-form-item>
<el-form-item label="wgt 包下载地址" prop="download_wgt_url">
<div class="form-item-flex">
<el-input
v-model="formDialog.download_wgt_url"
placeholder="wgt 包下载地址"
></el-input>
<el-upload
class="upload"
ref="upload"
:action="uploadUrl"
:on-preview="handlePreview"
:on-success="handleWGTUpLoadSuccess"
:data="uploadParams"
:before-upload="checkWGTname"
>
<el-button slot="trigger" size="small" type="primary">
上传
</el-button>
</el-upload>
</div>
</el-form-item>
<el-form-item label="发布版本详细说明" prop="description">
<vab-quill
ref="vab-quill"
v-model="formDialog.description"
:min-height="300"
:options="vbOptions"
/>
</el-form-item>
<el-form-item label="升级包开启状态" prop="is_force_update">
<el-switch
v-model="formDialog.status"
active-color="#13ce66"
inactive-color="#ff4949"
:active-value="1"
:inactive-value="2"
@change="handerDisableUpdateShopApp($event)"
></el-switch>
</el-form-item>
<el-form-item label="是否强制更新" prop="is_force_update">
<el-switch
v-model="formDialog.is_force_update"
active-color="#13ce66"
inactive-color="#ff4949"
:active-value="1"
:inactive-value="2"
@change="handerIsUpdateShopApp($event)"
></el-switch>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button size="medium" @click="handleCloseDialog"> </el-button>
<el-button size="medium" type="primary" @click="handleSubmitForm">
</el-button>
</span>
</el-dialog>
<el-pagination
background
:current-page="params.pageNum"
:layout="layout"
:page-size="params.pageSize"
:total="total"
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
/>
</div>
</template>
<script>
import {
getShopAppVersionList,
addShopAppVersion,
updateShopAppVersion,
disableUpdateShopApp,
} from '@/api/appVersion/appVersion'
import VabQuill from '@/extra/VabQuill'
import { URL } from '@/config'
import { mapGetters } from 'vuex'
import { getToken } from '@/utils/token'
export default {
name: 'appVersion',
components: {},
data() {
return {}
components: {
VabQuill,
},
data() {
return {
uploadParams: {
authorization: '',
},
uploadUrl: URL.action, //
showDialog: false,
isEdit: false,
dialogTitle: '添加APP包',
formDialog: {
id: '',
market_id: '',
package_name: '',
version_key: '',
version_name: '',
download_apk_url: '',
download_wgt_url: '',
description: '',
is_force_update: '',
status: '',
},
vbOptions: {
theme: 'snow',
bounds: document.body,
debug: 'warn',
modules: {
toolbar: {
container: [
['bold', 'italic', 'underline', 'strike'],
[{ header: [1, 2, 3, 4, 5, 6, false] }],
[{ size: ['small', false, 'large', 'huge'] }],
[{ color: [] }, { background: [] }],
['blockquote', 'code-block'],
[{ list: 'ordered' }, { list: 'bullet' }],
[{ script: 'sub' }, { script: 'super' }],
[{ indent: '-1' }, { indent: '+1' }],
[{ align: [] }],
[{ direction: 'rtl' }],
[{ font: [] }],
['clean'],
['link', 'image', 'vab-upload-image'],
],
},
},
placeholder: '',
readOnly: false,
},
formDialogRules: {
market_id: [
{ required: true, message: '请选择APP市场', trigger: 'change' },
],
package_name: [
{ required: true, message: '请输入APP包名', trigger: 'blur' },
],
version_key: [
{
required: true,
message: '请输入应用版本号',
trigger: 'blur',
},
],
version_name: [
{ required: true, message: '请输入应用版本号名称', trigger: 'blur' },
],
download_apk_url: [
{ required: true, message: '请先上传apk 包', trigger: 'blur' },
],
description: [
{
required: true,
message: '请输入发布版本详细说明',
trigger: 'blur',
},
],
},
tableConfig: {
height: window.innerHeight - 220 - 150,
},
layout: 'total, sizes, prev, pager, next, jumper',
total: 0,
params: {
marketId: '',
keyword: '',
pageNum: 1,
pageSize: 20,
},
selectId: 1,
appName: null,
options: [
{
key: 1,
label: '小米',
},
{
key: 2,
label: '华为',
},
{
key: 3,
label: '腾讯',
},
{
key: 4,
label: 'OPPO',
},
{
key: 5,
label: 'VIVO',
},
{
key: 6,
label: '三星',
},
{
key: 100,
label: '通用(不区分市场)',
},
],
tabColumn: [
{
prop: 'index',
label: '序号',
width: '51',
},
{
prop: 'market_id',
label: '所属市场',
},
{
prop: 'package_name',
label: 'APP包名字',
},
{
prop: 'version_key',
label: '应用版本号',
},
{
prop: 'version_name',
label: '应用版本号名称',
},
{
prop: 'created_at',
label: '创建时间',
},
{
prop: 'updated_at',
label: '更新时间',
},
{
prop: 'updateStatus',
label: '开启状态',
},
{
prop: 'isUpdateAdd',
label: '是否强制更新',
},
{
prop: 'operation',
label: '操作',
},
],
tableData: [
{
market_id: 100, // APP 1 - 2 - 3 - 4 - OPPO5 - VIVO6 - 100-
package_name: 'xftc', // app
version_key: 2, //1-10000000
version_name: '1.0.2', // 1.23.21
download_apk_url: 'https://mall.gpxscs.cn/abc.apk', // apk
download_wgt_url: 'https://mall.gpxscs.cn/abc.apk', //
file_ext: 'apk', // apk, wgt
release_time: '2025-03-17 00:00:01',
description: '发布版本详细说明',
is_force_update: 2, // 1-2-
package_size: 12332, // 便
md5_checksum: '3650d648bfc19993f4408e4158b9782b', // apk md5
status: 1,
created_by: '0',
updated_by: '0',
created_at: '2025-03-17 21:40:42',
updated_at: '2025-03-17 21:58:42',
},
],
}
},
computed: {
...mapGetters({
token: 'user/token',
}),
},
created() {
this.uploadParams.authorization = getToken()
this.getShopAppVersionList()
},
methods: {
handleShowDialog() {
this.showDialog = true
},
async getShopAppVersionList() {
this.params.marketId = this.selectId
let res = await getShopAppVersionList(this.params)
if (res && res.status == 200) {
this.tableData = res.data.items
}
},
handleEdit(row) {
this.showDialog = true
this.isEdit = true
this.formDialog = row
},
handleSubmitForm() {
this.$refs['formDialog'].validate(async (valid) => {
if (valid) {
let res = this.isEdit
? await updateShopAppVersion(this.formDialog)
: await addShopAppVersion(this.formDialog)
if (res && res.status == 200) {
this.$message({
type: 'success',
message: this.isEdit ? '修改成功' : '添加成功!',
})
this.showDialog = false
this.isEdit = false
this.getShopAppVersionList()
} else {
this.$message({
type: 'error',
message: res.msg,
})
}
}
})
},
handleCloseDialog() {
this.showDialog = false
if (this.isEdit) {
this.formDialog = {
market_id: '',
package_name: '',
version_key: '',
version_name: '',
download_apk_url: '',
download_wgt_url: '',
description: '',
is_force_update: '',
}
this.isEdit = false
}
this.$refs['formDialog'].resetFields()
},
handleClear() {
this.appName = ''
this.params = {
keyword: '',
marketId: '',
pageNum: 1,
pageSize: 20,
}
this.selectId = 1
this.getShopAppVersionList()
},
handleSearch() {
this.params.keyword = this.appName
this.getShopAppVersionList()
},
handleCurrentChange(pageNum) {
this.params.pageNum = pageNum
this.getReceiptMachineList()
},
handleSizeChange() {
this.params.pageSize = pageSize
this.getReceiptMachineList()
},
handlePreview(e) {},
checkWGTname(file) {
const isWGT = file.name.endsWith('.wgt')
if (!isWGT) {
this.$message.error('请上传WGT后缀的热更新包')
}
return isWGT
},
checkAPKname(file) {
const isAPK = file.type === 'application/vnd.android.package-archive'
if (!isAPK) {
this.$message.error('请上传APK后缀的安卓包')
}
return isAPK
},
handleAKPUpLoadSuccess(e) {
if (e && e.status == 200) {
this.formDialog.download_apk_url = e.data.media_url
}
},
handleWGTUpLoadSuccess(e) {
if (e && e.status == 200) {
this.formDialog.download_wgt_url = e.data.media_url
}
},
formatAppShopName(row) {
var name = ''
if (row) {
this.options.forEach((item) => {
if (row.market_id == item.key) {
name = item.label
}
})
}
return name
},
handerSelectMarketId(e) {
this.selectId = e
},
async handerIsUpdateShopApp(e, row) {
this.formDialog = row
this.formDialog.is_force_update = e
if (row) {
let res = await updateShopAppVersion(this.formDialog)
if (res && res.status == 200) {
this.$message({
type: 'success',
message: '状态修改成功!',
})
this.getShopAppVersionList()
}
}
},
handerDisableUpdateShopApp(e, row) {
let params = {
id: row ? row.id : this.formDialog.id,
status: e,
}
this.$confirm(`您确认${e == 1 ? '开启' : '关闭'}升级包?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(async () => {
let res = await disableUpdateShopApp(params)
if (res && res.status == 200) {
this.$message({
type: 'success',
message: '状态修改成功!',
})
this.getShopAppVersionList()
} else {
this.$message({
type: 'error',
message: res.msg,
})
}
})
.catch(() => {
this.$message({
type: 'info',
message: '已取消删除',
})
})
},
},
created() {},
methods: {},
}
</script>
<style lang="scss">
.appVersion-container {
padding: 0 20px !important;
.head {
display: flex;
justify-content: space-between;
align-items: center;
box-shadow: inset 0 -1px 0 #efefef;
.head-add-btn {
}
.head-content {
display: flex;
align-items: center;
text-align: center;
margin: 20px 0;
.name {
font-weight: bold;
}
.input-with-select {
margin: 0 10px;
width: 270px;
}
}
}
.select-content {
margin-right: 20px;
}
.receipt-machine-dialog {
.el-dialog {
border: 0;
border-radius: 6px;
background-clip: padding-box;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.el-dialog__header {
padding: 12px 20px;
border-bottom: 1px solid #f2f2f2;
.el-dialog__title {
font-size: 16px;
color: rgba(0, 0, 0, 0.8);
font-weight: 600;
}
.el-dialog__headerbtn {
top: 12px;
}
}
.el-input {
width: 63%;
}
.el-select {
.el-input {
width: 100%;
}
}
.el-dialog__body {
padding: 40px 20px;
font-size: 12px;
line-height: 1.5;
color: #666;
min-height: 108px;
overflow-y: auto;
max-height: 920px;
overflow: auto;
.form-dialog {
min-height: 150px;
}
.el-input__inner {
height: 38px;
width: 410px;
}
}
.el-dialog__footer {
border-top: 1px solid #f2f2f2;
padding: 10px;
}
.el-form-item__label {
padding: 0 24px 0 0px;
}
.form-item-flex {
display: flex;
}
}
}
</style>