mirror of
https://gitee.com/niucloud-team/niucloud.git
synced 2025-12-13 18:12:49 +00:00
update
This commit is contained in:
parent
e492f37467
commit
8cc61e4d6e
@ -12,7 +12,7 @@ export function getAddonLocal(params: Record<string, any>) {
|
||||
* 插件详情
|
||||
* @returns
|
||||
*/
|
||||
export function getAddonDetial(id: number) {
|
||||
export function getAddonDetail(id: number) {
|
||||
return request.get(`addon/${ id }`)
|
||||
}
|
||||
|
||||
|
||||
@ -479,6 +479,42 @@ export function deleteCron(id: string) {
|
||||
return request.delete(`sys/schedule/${ id }`, { showSuccessMessage: true })
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行任务
|
||||
* @returns
|
||||
*/
|
||||
export function doCron(params: Record<string, any>) {
|
||||
return request.put(`sys/schedule/do/${ params.id }`, params, {
|
||||
showErrorMessage: true,
|
||||
showSuccessMessage: true
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取任务日志列表
|
||||
* @returns
|
||||
*/
|
||||
export function getCronLogList(params: any) {
|
||||
return request.get(`sys/schedule/log/list`, { params })
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除任务日志
|
||||
* @returns
|
||||
*/
|
||||
export function deleteCronLog(params: Record<string, any>) {
|
||||
return request.put(`sys/schedule/log/delete`, params, { showSuccessMessage: true })
|
||||
}
|
||||
|
||||
/**
|
||||
* 清空任务日志
|
||||
* @returns
|
||||
*/
|
||||
export function clearCronLog(params: Record<string, any>) {
|
||||
return request.put(`sys/schedule/log/clear`, params, { showSuccessMessage: true })
|
||||
}
|
||||
|
||||
/***************************************************** 协议管理 ****************************************************/
|
||||
|
||||
/**
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
<span>{{saveInfo.username}}</span>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('realName')">
|
||||
<el-input v-model="saveInfo.real_name" :placeholder="t('realNamePlaceholder')" clearable class="input-width" />
|
||||
<el-input v-model.trim="saveInfo.real_name" :placeholder="t('realNamePlaceholder')" clearable class="input-width" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
|
||||
@ -86,6 +86,7 @@
|
||||
"graphicNavShowStyle": "展示风格",
|
||||
"graphicNavStyleFixed": "固定显示",
|
||||
"graphicNavStyleSingleSlide": "单行滑动",
|
||||
"graphicNavStyleMultiLine": "多行滑动",
|
||||
"graphicNavStylePageSlide": "分页滑动",
|
||||
"graphicNavRowCount": "每行数量",
|
||||
"graphicNavPageCount": "显示方式",
|
||||
@ -104,6 +105,9 @@
|
||||
"styleSet": "风格设置",
|
||||
"titleStyle": "标题样式",
|
||||
"selectStyle": "风格选择",
|
||||
"activeCubeBlockBtnText": "按钮文字",
|
||||
"btnTextItalics": "斜体",
|
||||
"btnTextNormal": "常规",
|
||||
"styleLabel": "风格",
|
||||
"styleShowTips": "风格 1 2 3,仅在小程序中展示",
|
||||
"titleContent": "标题内容",
|
||||
@ -200,6 +204,10 @@
|
||||
"carouselSearchFixedBgColor": "置顶背景",
|
||||
"carouselSearchSet": "搜索设置",
|
||||
"carouselSearchText": "搜索内容",
|
||||
"carouselSearchTextColor": "文字颜色",
|
||||
"carouselSearchBgColor": "背景颜色",
|
||||
"carouselSearchBtnColor": "按钮颜色",
|
||||
"carouselSearchBtnBgColor": "按钮背景色",
|
||||
"carouselSearchHotWordSet": "搜索热词",
|
||||
"carouselSearchHotWordInterval": "显示时间 / 秒",
|
||||
"carouselSearchHotWordText": "内容",
|
||||
@ -222,6 +230,7 @@
|
||||
"carouselSearchSwiperInterval": "切换间隔 / 秒",
|
||||
"carouselSearchSwiperTips": "建议上传尺寸相同的图片,推荐尺寸750*350;鼠标拖拽可调整图片顺序",
|
||||
"carouselSearchTabStyle": "选项卡样式",
|
||||
"carouselSearchStyle": "搜索框样式",
|
||||
"noColor": "常规颜色",
|
||||
"selectColor": "选中颜色",
|
||||
"fixedNoColor": "下滑常规颜色",
|
||||
@ -231,6 +240,7 @@
|
||||
"carouselSearchSwiperStyle": "轮播样式",
|
||||
"carouselSearchSwiperIndicatorStyle1": "样式1",
|
||||
"carouselSearchSwiperIndicatorStyle2": "样式2",
|
||||
"carouselSearchSwiperIndicatorStyle3": "样式3",
|
||||
"carouselSearchSwiperIndicatorAlign": "显示位置",
|
||||
"alignLeft": "居左",
|
||||
"alignCenter": "居中",
|
||||
@ -256,5 +266,13 @@
|
||||
"rollTopStatusBarTextColor": "滚动后标题颜色",
|
||||
"topStatusBarSearchName": "搜索内容",
|
||||
"topStatusBarSearchNamePlaceholder": "请输入搜索关键词",
|
||||
"settingTips": "点击查看如何配置"
|
||||
"settingTips": "点击查看如何配置",
|
||||
"pictureShowBlockOne": "模块一",
|
||||
"pictureShowBlockTwo": "模块二",
|
||||
"subTitleTextColor": "标题颜色",
|
||||
"pictureShowBgColor": "背景颜色",
|
||||
"pictureShowBtnText": "按钮文字",
|
||||
"pictureShowBtnColor": "文字颜色",
|
||||
"pictureShowBtnBgColor": "背景颜色",
|
||||
"pictureShowBlockStyle": "模块样式"
|
||||
}
|
||||
|
||||
@ -6,5 +6,11 @@
|
||||
"createTime": "申请时间",
|
||||
"refundNoPlaceholder": "请输入退款编号",
|
||||
"startDate": "开始时间",
|
||||
"endDate": "结束时间"
|
||||
"endDate": "结束时间",
|
||||
"outTradeNo": "交易流水号",
|
||||
"refundTypeName": "退款方式",
|
||||
"statusName": "退款状态",
|
||||
"transfer": "转账",
|
||||
"transferType": "转账方式",
|
||||
"voucher": "凭证"
|
||||
}
|
||||
|
||||
@ -6,13 +6,11 @@
|
||||
"createTime":"注册时间",
|
||||
"lastVisitTime":"最后访问时间",
|
||||
"addMember":"添加会员",
|
||||
"updateMember":"编辑会员",
|
||||
"nickNamePlaceholder":"请输入会员昵称",
|
||||
"mobilePlaceholder":"请输入手机号",
|
||||
"channelPlaceholder":"请选择注册类型",
|
||||
"memberNoPlaceholder":"请选择会员编号",
|
||||
"memberDeleteTips" : "确定要删除该会员吗?",
|
||||
"detail": "详情",
|
||||
"edit": "编辑",
|
||||
"memberDelete":"删除",
|
||||
"adjust":"调整",
|
||||
@ -32,7 +30,7 @@
|
||||
"sex": "性别",
|
||||
"wxUnionid": "微信unionid",
|
||||
"weappOpenid": "微信用户openid",
|
||||
"wxOpenid": "微信小程openid",
|
||||
"wxOpenid": "微信小程序openid",
|
||||
"head": "会员头像",
|
||||
"username": "用户名",
|
||||
"usernamePlaceholder": "请输入用户名",
|
||||
@ -44,12 +42,41 @@
|
||||
"mobileHint": "请输入正确的手机号!",
|
||||
"memberLabelTag": "标签",
|
||||
"setLabel": "标签",
|
||||
"notAvailable": "暂无",
|
||||
"memberLabelPlaceholder": "请选择会员标签",
|
||||
"memberInfo":"会员信息",
|
||||
"memberInfoPlaceholder":"请输入会员编号/昵称/手机号",
|
||||
"lock": "锁定",
|
||||
"normal": "正常",
|
||||
"memberLevel": "会员等级",
|
||||
"memberLevelPlaceholder": "请选择会员等级"
|
||||
"memberLevelPlaceholder": "请选择会员等级",
|
||||
"adjustType":"调整类型",
|
||||
"adjustReduceBalance":"减少余额",
|
||||
"adjustAddBalance":"增加余额",
|
||||
"adjustReducePoint":"减少积分",
|
||||
"adjustAddPoint":"增加积分",
|
||||
"adjustBalance":"调整余额",
|
||||
"currBalance":"当前余额",
|
||||
"currPoint":"当前积分",
|
||||
"adjustPlaceholder":"请输入调整数量",
|
||||
"memoPlaceholder":"请输入备注",
|
||||
"adjustBalancePlaceholder":"请输入调整余额",
|
||||
"adjustPointPlaceholder":"请输入调整积分",
|
||||
"adjustBalanceMaxAccountMessage":"调整后余额需大于0",
|
||||
"adjustPointMaxAccountMessage":"调整后积分需大于0",
|
||||
"birthday": "出生日期",
|
||||
"birthdayTip": "请输入出生日期",
|
||||
"headimg": "会员头像",
|
||||
"updateMember": "编辑会员信息",
|
||||
"notAvailable":"暂无",
|
||||
"girlSex":"女",
|
||||
"manSex":"男",
|
||||
"secrecySex":"保密",
|
||||
"detail":"详情",
|
||||
"accumulative":"累计",
|
||||
"money":"可提现余额",
|
||||
"commission":"佣金",
|
||||
"memberNull":"未读取到会员详情信息",
|
||||
"memberLevelUpdate": "修改等级至",
|
||||
"memberLevelUpdateTips": "该操作只会修改会员等级不会发放等级礼包"
|
||||
|
||||
}
|
||||
|
||||
@ -57,5 +57,11 @@
|
||||
"collectionNamePlaceholder": "请输入收款账户名称",
|
||||
"collectionBankPlaceholder": "请输入收款银行",
|
||||
"collectionAccountPlaceholder": "请输入收款账号",
|
||||
"collectionDescPlaceholder": "请输入转账说明"
|
||||
"collectionDescPlaceholder": "请输入转账说明",
|
||||
"jsapiDir": "JSAPI支付授权目录",
|
||||
"jsapiDirTips": "需在微信商户号>产品中心>开发配置>支付配置 支付授权目录中添加该链接",
|
||||
"h5Domain": "H5支付域名",
|
||||
"h5DomainTips": "需在微信商户号>产品中心>开发配置>支付配置 H5支付域名中添加该域名",
|
||||
"nativeDomain": "Native支付回调链接",
|
||||
"nativeDomainTips": "需在微信商户号>产品中心>开发配置>支付配置 Native支付回调链接中添加该链接"
|
||||
}
|
||||
|
||||
@ -26,5 +26,6 @@
|
||||
"monthPlaceholder": "请输入站点创建有效期限",
|
||||
"numCannotLtZero": "站点创建数量不能小于0",
|
||||
"monthCannotLtZero": "站点创建有效期不能小于0",
|
||||
"createSiteTimeLimitDeleteTips": "确认要删除吗?"
|
||||
"createSiteTimeLimitDeleteTips": "确认要删除吗?",
|
||||
"siteEmpty": "站点不存在"
|
||||
}
|
||||
|
||||
@ -29,5 +29,7 @@
|
||||
"addCron": "添加任务",
|
||||
"cronTimeTips": "任务周期时间不能为空",
|
||||
"cronTipsOne": "启动计划任务方式:",
|
||||
"cronTipsTwo": "1、使用命令启动:php think workerman 如果更改了任务周期、状态、删除任务等操作后,需要重新启动下 php think workerman 确保生效"
|
||||
"cronTipsTwo": "1、使用命令启动:php think workerman 如果更改了任务周期、状态、删除任务等操作后,需要重新启动下 php think workerman 确保生效",
|
||||
"doOne": "执行一次",
|
||||
"cronLog": "执行日志"
|
||||
}
|
||||
|
||||
17
admin/src/app/lang/zh-cn/tools.schedule_log.json
Normal file
17
admin/src/app/lang/zh-cn/tools.schedule_log.json
Normal file
@ -0,0 +1,17 @@
|
||||
{
|
||||
"id": "日志编号",
|
||||
"name": "任务名称",
|
||||
"key": "key",
|
||||
"class": "调用目标字符串",
|
||||
"executeResult": "日志信息",
|
||||
"status": "执行状态",
|
||||
"executeTime": "执行时间",
|
||||
"info": "详情",
|
||||
"cronInfo": "日志详情",
|
||||
"batchDelete": "批量删除",
|
||||
"clearAll": "清空",
|
||||
"batchEmptySelectedCronLogTips": "请选择要删除的日志",
|
||||
"batchDeleteTips": "确定要删除选中的日志吗?",
|
||||
"clearAllTips": "确定要清空所有日志吗?",
|
||||
"deleteTips": "确定要删除该条日志吗?"
|
||||
}
|
||||
@ -8,21 +8,31 @@
|
||||
</div>
|
||||
|
||||
<div class="flex flex-wrap plug-list pb-10 plug-large" v-if="appList.length">
|
||||
<div v-for="(item, index) in appList" :key="index + 'b'" class="app-item relative cursor-pointer mt-[20px] mr-4 bg-[#f7f7f7] w-[264px] flex py-[20px] px-[17px]" @click="toLink(item.key)">
|
||||
<el-image class="w-[40px] h-[40px] mr-[10px]" :src="img(item.icon)" fit="contain">
|
||||
<template #error>
|
||||
<div class="image-slot">
|
||||
<img class="w-[40px] h-[40px]" src="@/app/assets/images/index/app_default.png" />
|
||||
</div>
|
||||
<div v-for="(item, index) in appList" :key="index + 'b'" class="cursor-pointer mt-[20px] mr-4 bg-[#f7f7f7]" @click="toLink(item.key)">
|
||||
<el-tooltip class="box-item" effect="light" placement="top">
|
||||
<template #content>
|
||||
<div class="max-w-[250px]">{{item.desc}}</div>
|
||||
</template>
|
||||
</el-image>
|
||||
<div class="flex flex-col justify-between w-[180px]">
|
||||
<div class="text-[14px] flex items-center">
|
||||
<span class="app-text max-w-[170px]">{{ item.title }}</span>
|
||||
<span class="iconfont iconxiaochengxu2 text-[#00b240] ml-[4px] !text-[14px]"></span>
|
||||
<div class="w-[264px] flex py-[20px] px-[17px] app-item relative">
|
||||
<el-image class="w-[40px] h-[40px] mr-[10px]" :src="img(item.icon)" fit="contain">
|
||||
<template #error>
|
||||
<div class="image-slot">
|
||||
<img class="w-[40px] h-[40px]" src="@/app/assets/images/index/app_default.png" />
|
||||
</div>
|
||||
</template>
|
||||
</el-image>
|
||||
<div class="flex flex-col justify-between w-[180px]">
|
||||
<div class="text-[14px] flex items-center">
|
||||
<span class="app-text max-w-[170px]">{{ item.title }}</span>
|
||||
<span class="iconfont iconxiaochengxu2 text-[#00b240] ml-[4px] !text-[14px]"></span>
|
||||
</div>
|
||||
<!-- <el-icon color="#666">
|
||||
<QuestionFilled />
|
||||
</el-icon> -->
|
||||
<p class="app-text text-[12px] text-[#999]">{{item.desc}}</p>
|
||||
</div>
|
||||
</div>
|
||||
<p class="app-text text-[12px] text-[#999]">{{item.desc}}</p>
|
||||
</div>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@ -32,15 +32,15 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('routePath')" prop="router_path" v-show="formData.menu_type == 1">
|
||||
<el-input v-model="formData.router_path" :placeholder="t('routePathPlaceholder')" class="input-width" />
|
||||
<el-input v-model.trim="formData.router_path" :placeholder="t('routePathPlaceholder')" class="input-width" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('viewPath')" prop="view_path" v-show="formData.menu_type == 1">
|
||||
<el-input v-model="formData.view_path" :placeholder="t('viewPathPlaceholder')" class="input-width" />
|
||||
<el-input v-model.trim="formData.view_path" :placeholder="t('viewPathPlaceholder')" class="input-width" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('authId')" prop="api_url" v-show="formData.menu_type != 0">
|
||||
<el-input v-model="formData.api_url" :placeholder="t('authIdPlaceholder')" class="input-width">
|
||||
<el-input v-model.trim="formData.api_url" :placeholder="t('authIdPlaceholder')" class="input-width">
|
||||
<template #append>
|
||||
<el-select class="w-[90px] border-none" v-model="formData.methods">
|
||||
<el-option label="POST" value="post" />
|
||||
@ -73,7 +73,7 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('menuShortName')">
|
||||
<el-input v-model="formData.menu_short_name" :placeholder="t('menuShortNamePlaceholder')" class="input-width" />
|
||||
<el-input v-model.trim="formData.menu_short_name" :placeholder="t('menuShortNamePlaceholder')" class="input-width" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('sort')">
|
||||
|
||||
@ -10,14 +10,14 @@
|
||||
<div class="flex justify-between items-center mt-[20px]">
|
||||
<el-form :inline="true" :model="sysUserLogTableData.searchParam" ref="searchFormRef">
|
||||
<el-form-item :label="t('ip')" prop="ip">
|
||||
<el-input v-model="sysUserLogTableData.searchParam.ip" :placeholder="t('ipPlaceholder')" />
|
||||
<el-input v-model.trim="sysUserLogTableData.searchParam.ip" :placeholder="t('ipPlaceholder')" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('username')" prop="username">
|
||||
<el-input v-model="sysUserLogTableData.searchParam.username" :placeholder="t('usernamePlaceholder')" />
|
||||
<el-input v-model.trim="sysUserLogTableData.searchParam.username" :placeholder="t('usernamePlaceholder')" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('url')" prop="url">
|
||||
<el-input v-model="sysUserLogTableData.searchParam.url" :placeholder="t('urlPlaceholder')" />
|
||||
<el-input v-model.trim="sysUserLogTableData.searchParam.url" :placeholder="t('urlPlaceholder')" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item>
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
<div class="flex justify-between items-center mt-[20px]">
|
||||
<el-form :inline="true" :model="roleTableData.searchParam" ref="searchFormRef">
|
||||
<el-form-item :label="t('roleName')" prop="search">
|
||||
<el-input v-model="roleTableData.searchParam.search" class="w-[240px]" :placeholder="t('roleNamePlaceholder')" />
|
||||
<el-input v-model.trim="roleTableData.searchParam.search" class="w-[240px]" :placeholder="t('roleNamePlaceholder')" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="loadRoleList()">{{ t('search') }}</el-button>
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
<div class="flex justify-between items-center mt-[20px]">
|
||||
<el-form :inline="true" :model="userTableData.searchParam" ref="searchFormRef">
|
||||
<el-form-item :label="t('accountNumber')" prop="search">
|
||||
<el-input v-model="userTableData.searchParam.search" class="input-width" :placeholder="t('accountNumberPlaceholder')" />
|
||||
<el-input v-model.trim="userTableData.searchParam.search" class="input-width" :placeholder="t('accountNumberPlaceholder')" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="loadUserList()">{{ t('search') }}</el-button>
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
<h3 class="panel-title !text-sm">{{ t('aliappSet') }}</h3>
|
||||
|
||||
<el-form-item :label="t('aliappName')">
|
||||
<el-input v-model="formData.name" :placeholder="t('aliappNamePlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.name" :placeholder="t('aliappNamePlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('aliappQrcode')">
|
||||
@ -24,11 +24,11 @@
|
||||
<h3 class="panel-title !text-sm">{{ t('aliappDevelopInfo') }}</h3>
|
||||
|
||||
<el-form-item :label="t('aliappOriginal')">
|
||||
<el-input v-model="formData.private_key" :placeholder="t('aliappOriginalPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.private_key" :placeholder="t('aliappOriginalPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('aliappAppid')">
|
||||
<el-input v-model="formData.app_id" :placeholder="t('appidPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.app_id" :placeholder="t('appidPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('countersignType')">
|
||||
@ -61,7 +61,7 @@
|
||||
<h3 class="panel-title !text-sm">{{ t('theServerSetting') }}</h3>
|
||||
|
||||
<el-form-item label="AESKey">
|
||||
<el-input v-model="formData.aes_key" :placeholder="t('AESKeyPlaceholder')" class="input-width" show-word-limit clearable />
|
||||
<el-input v-model.trim="formData.aes_key" :placeholder="t('AESKeyPlaceholder')" class="input-width" show-word-limit clearable />
|
||||
</el-form-item>
|
||||
</el-card>
|
||||
|
||||
|
||||
@ -55,13 +55,13 @@
|
||||
<el-dialog v-model="dialogVisible" :title="t('codeDownTwoDesc')" width="30%" :before-close="handleClose">
|
||||
<el-form ref="ruleFormRef" :model="form" label-width="120px">
|
||||
<el-form-item prop="code" :label="t('code')">
|
||||
<el-input v-model="form.code" :placeholder="t('codePlaceholder')" onkeyup="this.value = this.value.replace(/[^\d\.]/g,'');" />
|
||||
<el-input v-model.trim="form.code" :placeholder="t('codePlaceholder')" onkeyup="this.value = this.value.replace(/[^\d\.]/g,'');" />
|
||||
</el-form-item>
|
||||
<el-form-item prop="path" :label="t('path')">
|
||||
<upload-file v-model="form.path" :api="'weapp/upload'" :accept="'.zip'" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('content')">
|
||||
<el-input type="textarea" v-model="form.content" :placeholder="t('contentPlaceholder')" />
|
||||
<el-input type="textarea" v-model.trim="form.content" :placeholder="t('contentPlaceholder')" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
<el-form :model="buttonData" label-width="140px" ref="formRef" :rules="formRules" class="page-form mt-[30px]">
|
||||
|
||||
<el-form-item :label="t('menuName')" prop="name">
|
||||
<el-input v-model="buttonData.name" :placeholder="t('menuNamePlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="buttonData.name" :placeholder="t('menuNamePlaceholder')" class="input-width" clearable />
|
||||
<div class="form-tip">{{ buttonData.sub_button ? t('menuNameTips') : t('subMenuNameTips') }}</div>
|
||||
</el-form-item>
|
||||
|
||||
@ -17,15 +17,15 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('webpageUrl')" prop="url">
|
||||
<el-input v-model="buttonData.url" :placeholder="t('webpageUrlPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="buttonData.url" :placeholder="t('webpageUrlPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('weappAppid')" prop="appid" v-show="buttonData.type == 'miniprogram'">
|
||||
<el-input v-model="buttonData.appid" :placeholder="t('weappAppidPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="buttonData.appid" :placeholder="t('weappAppidPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('weappPage')" prop="pagepath" v-show="buttonData.type == 'miniprogram'">
|
||||
<el-input v-model="buttonData.pagepath" :placeholder="t('weappPagePlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="buttonData.pagepath" :placeholder="t('weappPagePlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
|
||||
</template>
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
<div class="py-[20px] px-[30px] h-[350px]">
|
||||
<div v-if="formData.msgtype == 'text'">
|
||||
<el-input
|
||||
v-model="formData.text.content" :rows="5" type="textarea" placeholder="" maxlength="600" :show-word-limit="true"
|
||||
v-model.trim="formData.text.content" :rows="5" type="textarea" placeholder="" maxlength="600" :show-word-limit="true"
|
||||
resize="none"
|
||||
input-style="box-shadow: none;height:300px"
|
||||
/>
|
||||
@ -94,14 +94,14 @@
|
||||
<div v-if="formData.msgtype == 'miniprogrampage'">
|
||||
<el-form :model="formData.miniprogrampage" label-width="140px" class="page-form" ref="formRef" :rules="formRules">
|
||||
<el-form-item label="小程序APPID" prop="appid">
|
||||
<el-input v-model="formData.miniprogrampage.appid" class="input-width"/>
|
||||
<el-input v-model.trim="formData.miniprogrampage.appid" class="input-width"/>
|
||||
<div class="form-tip">小程序需已经与公众号关联</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="小程序卡片标题" prop="title">
|
||||
<el-input v-model="formData.miniprogrampage.title" class="input-width"/>
|
||||
<el-input v-model.trim="formData.miniprogrampage.title" class="input-width"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="小程序的页面路径" prop="pagepath">
|
||||
<el-input v-model="formData.miniprogrampage.pagepath" class="input-width"/>
|
||||
<el-input v-model.trim="formData.miniprogrampage.pagepath" class="input-width"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="小程序卡片图片" prop="thumb_media_url">
|
||||
<upload-image :limit="1" width="100px" height="100px" v-model="formData.miniprogrampage.thumb_media_url" v-if="formData.miniprogrampage.thumb_media_url"/>
|
||||
|
||||
@ -27,13 +27,13 @@
|
||||
<el-dialog v-model="dialogVisible" :title="type != 'edit' ? t('addDictData') : t('editDictData')" width="480" class="diy-dialog-wrap" :destroy-on-close="true">
|
||||
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form">
|
||||
<el-form-item :label="t('name')">
|
||||
<el-input v-model="name" disabled class="input-width" />
|
||||
<el-input v-model.trim="name" disabled class="input-width" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('dataName')" prop="name">
|
||||
<el-input v-model="formData.name" clearable :placeholder="t('dataNamePlaceholder')" class="input-width" />
|
||||
<el-input v-model.trim="formData.name" clearable :placeholder="t('dataNamePlaceholder')" class="input-width" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('dataValue')" prop="value">
|
||||
<el-input v-model="formData.value" clearable :placeholder="t('dataValuePlaceholder')" class="input-width" />
|
||||
<el-input v-model.trim="formData.value" clearable :placeholder="t('dataValuePlaceholder')" class="input-width" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('sort')" prop="sort">
|
||||
<div>
|
||||
@ -42,7 +42,7 @@
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('memo')">
|
||||
<el-input v-model="formData.memo" type="textarea" clearable :placeholder="t('momePlaceholder')" class="input-width" />
|
||||
<el-input v-model.trim="formData.memo" type="textarea" clearable :placeholder="t('momePlaceholder')" class="input-width" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
<p class="form-tip">{{ t('keyFormatTips') }}</p>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('memo')">
|
||||
<el-input v-model="formData.memo" type="textarea" clearable :placeholder="t('memoPlaceholder')" class="input-width" />
|
||||
<el-input v-model.trim="formData.memo" type="textarea" clearable :placeholder="t('memoPlaceholder')" class="input-width" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
|
||||
@ -13,10 +13,10 @@
|
||||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
|
||||
<el-form :inline="true" :model="dictTable.searchParam" ref="searchFormRef">
|
||||
<el-form-item :label="t('name')" prop="name">
|
||||
<el-input v-model="dictTable.searchParam.name" :placeholder="t('namePlaceholder')" />
|
||||
<el-input v-model.trim="dictTable.searchParam.name" :placeholder="t('namePlaceholder')" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('key')" prop="key">
|
||||
<el-input v-model="dictTable.searchParam.key" :placeholder="t('keyPlaceholder')" />
|
||||
<el-input v-model.trim="dictTable.searchParam.key" :placeholder="t('keyPlaceholder')" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item>
|
||||
|
||||
@ -11,21 +11,24 @@
|
||||
<ArrowRight />
|
||||
</el-icon>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('title')">
|
||||
<el-input v-model.trim="diyStore.editComponent.text" :placeholder="t('titlePlaceholder')" clearable maxlength="10" show-word-limit />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('link')">
|
||||
<diy-link v-model="diyStore.editComponent.textLink"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('subTitle')">
|
||||
<el-input v-model.trim="diyStore.editComponent.subTitle.text" :placeholder="t('subTitlePlaceholder')" clearable maxlength="8" show-word-limit />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('link')">
|
||||
<diy-link v-model="diyStore.editComponent.subTitle.link"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('title')" v-if="diyStore.editComponent && diyStore.editComponent.titleStyle && diyStore.editComponent.titleStyle.value != 'style-5'">
|
||||
<el-input v-model.trim="diyStore.editComponent.text" :placeholder="t('titlePlaceholder')" clearable maxlength="10" show-word-limit />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('image')" v-else>
|
||||
<upload-image v-model="diyStore.editComponent.textImg" :limit="1"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('link')">
|
||||
<diy-link v-model="diyStore.editComponent.textLink"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('subTitle')">
|
||||
<el-input v-model.trim="diyStore.editComponent.subTitle.text" :placeholder="t('subTitlePlaceholder')" clearable maxlength="8" show-word-limit />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('link')">
|
||||
<diy-link v-model="diyStore.editComponent.subTitle.link"/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-dialog v-model="showTitleDialog" :title="t('selectStyle')" width="500px">
|
||||
<el-dialog v-model="showTitleDialog" :title="t('selectStyle')" width="460px">
|
||||
|
||||
<div class="flex flex-wrap">
|
||||
<template v-for="(item,index) in titleStyleList" :key="index">
|
||||
@ -92,7 +95,7 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('activeCubeSubTitle')" v-if="diyStore.editComponent.blockStyle.value != 'style-3'">
|
||||
<el-input v-model.trim="item.subTitle.text" :placeholder="t('activeCubeSubTitlePlaceholder')" clearable :maxlength="(diyStore.editComponent.blockStyle.value != 'style-4' ? '6' : '4')" show-word-limit/>
|
||||
<el-input v-model.trim="item.subTitle.text" :placeholder="t('activeCubeSubTitlePlaceholder')" clearable maxlength="6" show-word-limit/>
|
||||
</el-form-item>
|
||||
|
||||
<div v-show="diyStore.editComponent.blockStyle.value == 'style-4'">
|
||||
@ -104,13 +107,14 @@
|
||||
<icon name="iconfont iconmap-connect" size="20px" class="block !text-gray-400 mx-[5px]"/>
|
||||
<el-color-picker v-model="item.subTitle.endColor" show-alpha :predefine="diyStore.predefineColors"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('activeListFrameColor')">
|
||||
<el-color-picker v-model="item.listFrame.startColor" show-alpha :predefine="diyStore.predefineColors" />
|
||||
<icon name="iconfont iconmap-connect" size="20px" class="block !text-gray-400 mx-[5px]"/>
|
||||
<el-color-picker v-model="item.listFrame.endColor" show-alpha :predefine="diyStore.predefineColors"/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
|
||||
<el-form-item :label="t('activeListFrameColor')">
|
||||
<el-color-picker v-model="item.listFrame.startColor" show-alpha :predefine="diyStore.predefineColors" />
|
||||
<icon name="iconfont iconmap-connect" size="20px" class="block !text-gray-400 mx-[5px]"/>
|
||||
<el-color-picker v-model="item.listFrame.endColor" show-alpha :predefine="diyStore.predefineColors"/>
|
||||
</el-form-item>
|
||||
|
||||
<div v-show="diyStore.editComponent.blockStyle.value != 'style-4' && diyStore.editComponent.blockStyle.value != 'style-3'">
|
||||
<el-form-item :label="t('activeCubeButton')">
|
||||
<el-input v-model.trim="item.moreTitle.text" :placeholder="t('activeCubeButtonPlaceholder')" clearable maxlength="3" show-word-limit/>
|
||||
@ -143,7 +147,7 @@
|
||||
<!-- 样式 -->
|
||||
<div class="style-wrap" v-show="diyStore.editTab == 'style'">
|
||||
|
||||
<div class="edit-attr-item-wrap">
|
||||
<div class="edit-attr-item-wrap" v-if="selectTitleStyle.value != 'style-5'">
|
||||
<h3 class="mb-[10px]">{{ t('titleStyle') }}</h3>
|
||||
<el-form label-width="90px" class="px-[10px]">
|
||||
<el-form-item :label="t('textColor')">
|
||||
@ -175,6 +179,12 @@
|
||||
<el-radio :label="'bold'">{{t('fontWeightBold')}}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('activeCubeBlockBtnText')" class="flex">
|
||||
<el-radio-group v-model="diyStore.editComponent.blockStyle.btnText">
|
||||
<el-radio :label="'normal'">{{t('btnTextNormal')}}</el-radio>
|
||||
<el-radio :label="'italics'">{{t('btnTextItalics')}}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
|
||||
@ -264,6 +274,10 @@ const titleStyleList = reactive([
|
||||
url : 'static/resource/images/diy/active_cube/title_style5.png',
|
||||
title:'风格4',
|
||||
value:'style-4'
|
||||
},{
|
||||
url : 'static/resource/images/diy/active_cube/title_style6.png',
|
||||
title:'风格5',
|
||||
value:'style-5'
|
||||
}
|
||||
])
|
||||
|
||||
@ -280,9 +294,39 @@ const changeTitleStyle = (item:any) => {
|
||||
const confirmTitleStyle = () => {
|
||||
diyStore.editComponent.titleStyle.title = selectTitleStyle.title;
|
||||
diyStore.editComponent.titleStyle.value = selectTitleStyle.value;
|
||||
initTitleStyle(diyStore.editComponent.titleStyle.value);
|
||||
showTitleDialog.value = false
|
||||
}
|
||||
|
||||
const initTitleStyle = (style)=>{
|
||||
if(diyStore.editComponent.titleStyle.value == 'style-1'){
|
||||
diyStore.editComponent.titleColor = "#F91700";
|
||||
diyStore.editComponent.subTitle.textColor = "#FFFFFF";
|
||||
diyStore.editComponent.subTitle.startColor = "#FB792F";
|
||||
diyStore.editComponent.subTitle.endColor = "#F91700";
|
||||
}else if(diyStore.editComponent.titleStyle.value == 'style-2'){
|
||||
diyStore.editComponent.titleColor = "#F91700";
|
||||
diyStore.editComponent.subTitle.textColor = "#FFFFFF";
|
||||
diyStore.editComponent.subTitle.startColor = "#FB792F";
|
||||
diyStore.editComponent.subTitle.endColor = "#F91700";
|
||||
}else if(diyStore.editComponent.titleStyle.value == 'style-3'){
|
||||
diyStore.editComponent.titleColor = "#F91700";
|
||||
diyStore.editComponent.subTitle.textColor = "#FFFFFF";
|
||||
diyStore.editComponent.subTitle.startColor = "#FB792F";
|
||||
diyStore.editComponent.subTitle.endColor = "#F91700";
|
||||
}else if(diyStore.editComponent.titleStyle.value == 'style-4'){
|
||||
diyStore.editComponent.titleColor = "#FFFFFF";
|
||||
diyStore.editComponent.subTitle.textColor = "#333333";
|
||||
diyStore.editComponent.subTitle.startColor = "#FFFFFF";
|
||||
diyStore.editComponent.subTitle.endColor = "#FFFFFF";
|
||||
}else if(diyStore.editComponent.titleStyle.value == 'style-5'){
|
||||
diyStore.editComponent.titleColor = "";
|
||||
diyStore.editComponent.subTitle.textColor = "#999999";
|
||||
diyStore.editComponent.subTitle.startColor = "#FFFFFF";
|
||||
diyStore.editComponent.subTitle.endColor = "#FFFFFF";
|
||||
}
|
||||
}
|
||||
|
||||
// 板块风格样式
|
||||
const showListDialog = ref(false)
|
||||
|
||||
@ -326,9 +370,175 @@ const changeBlockStyle = (item:any) => {
|
||||
const confirmBlockStyle = () => {
|
||||
diyStore.editComponent.blockStyle.title = selectBlockStyle.title;
|
||||
diyStore.editComponent.blockStyle.value = selectBlockStyle.value;
|
||||
initBlockStyle(diyStore.editComponent.blockStyle.value);
|
||||
showListDialog.value = false
|
||||
}
|
||||
|
||||
const initBlockStyle = (style)=>{
|
||||
// diyStore.editComponent.
|
||||
if(style == 'style-1'){
|
||||
diyStore.editComponent.blockStyle.fontWeight = "normal";
|
||||
diyStore.editComponent.blockStyle.btnText = "normal";
|
||||
|
||||
diyStore.editComponent.list[0].title.textColor = "#303133";
|
||||
diyStore.editComponent.list[0].subTitle.textColor = "#999999";
|
||||
diyStore.editComponent.list[0].subTitle.startColor = "";
|
||||
diyStore.editComponent.list[0].subTitle.endColor = "";
|
||||
diyStore.editComponent.list[0].moreTitle.startColor = "#FEA715";
|
||||
diyStore.editComponent.list[0].moreTitle.endColor = "#FE1E00";
|
||||
diyStore.editComponent.list[0].listFrame.startColor = "#FFFAF5";
|
||||
diyStore.editComponent.list[0].listFrame.endColor = "#FFFFFF";
|
||||
|
||||
diyStore.editComponent.list[1].title.textColor = "#303133";
|
||||
diyStore.editComponent.list[1].subTitle.textColor = "#999999";
|
||||
diyStore.editComponent.list[1].subTitle.startColor = "";
|
||||
diyStore.editComponent.list[1].subTitle.endColor = "";
|
||||
diyStore.editComponent.list[1].moreTitle.startColor = "#FFBF50";
|
||||
diyStore.editComponent.list[1].moreTitle.endColor = "#FF9E03";
|
||||
diyStore.editComponent.list[1].listFrame.startColor = "#FFFAF5";
|
||||
diyStore.editComponent.list[1].listFrame.endColor = "#FFFFFF";
|
||||
|
||||
diyStore.editComponent.list[2].title.textColor = "#303133";
|
||||
diyStore.editComponent.list[2].subTitle.textColor = "#999999";
|
||||
diyStore.editComponent.list[2].subTitle.startColor = "";
|
||||
diyStore.editComponent.list[2].subTitle.endColor = "";
|
||||
diyStore.editComponent.list[2].moreTitle.startColor = "#A2E792";
|
||||
diyStore.editComponent.list[2].moreTitle.endColor = "#49CD2D";
|
||||
diyStore.editComponent.list[2].listFrame.startColor = "#FFFAF5";
|
||||
diyStore.editComponent.list[2].listFrame.endColor = "#FFFFFF";
|
||||
|
||||
diyStore.editComponent.list[3].title.textColor = "#303133";
|
||||
diyStore.editComponent.list[3].subTitle.textColor = "#999999";
|
||||
diyStore.editComponent.list[3].subTitle.startColor = "";
|
||||
diyStore.editComponent.list[3].subTitle.endColor = "";
|
||||
diyStore.editComponent.list[3].moreTitle.startColor = "#4AC1FF";
|
||||
diyStore.editComponent.list[3].moreTitle.endColor = "#1D7CFF";
|
||||
diyStore.editComponent.list[3].listFrame.startColor = "#FFFAF5";
|
||||
diyStore.editComponent.list[3].listFrame.endColor = "#FFFFFF";
|
||||
|
||||
}else if(style == 'style-2'){
|
||||
diyStore.editComponent.blockStyle.fontWeight = "normal";
|
||||
diyStore.editComponent.blockStyle.btnText = "normal";
|
||||
|
||||
diyStore.editComponent.blockStyle.fontWeight = "bold";
|
||||
diyStore.editComponent.blockStyle.btnText = "italics";
|
||||
|
||||
diyStore.editComponent.list[0].title.textColor = "#303133";
|
||||
diyStore.editComponent.list[0].subTitle.textColor = "#999999";
|
||||
diyStore.editComponent.list[0].subTitle.startColor = "";
|
||||
diyStore.editComponent.list[0].subTitle.endColor = "";
|
||||
diyStore.editComponent.list[0].moreTitle.startColor = "#FFC051";
|
||||
diyStore.editComponent.list[0].moreTitle.endColor = "#FF9C00";
|
||||
diyStore.editComponent.list[0].listFrame.startColor = "#FFF1DB";
|
||||
diyStore.editComponent.list[0].listFrame.endColor = "#FFFBF4";
|
||||
|
||||
diyStore.editComponent.list[1].title.textColor = "#303133";
|
||||
diyStore.editComponent.list[1].subTitle.textColor = "#999999";
|
||||
diyStore.editComponent.list[1].subTitle.startColor = "";
|
||||
diyStore.editComponent.list[1].subTitle.endColor = "";
|
||||
diyStore.editComponent.list[1].moreTitle.startColor = "#A4E894";
|
||||
diyStore.editComponent.list[1].moreTitle.endColor = "#45CC2A";
|
||||
diyStore.editComponent.list[1].listFrame.startColor = "#E6F6E2";
|
||||
diyStore.editComponent.list[1].listFrame.endColor = "#F5FDF3";
|
||||
|
||||
diyStore.editComponent.list[2].title.textColor = "#303133";
|
||||
diyStore.editComponent.list[2].subTitle.textColor = "#999999";
|
||||
diyStore.editComponent.list[2].subTitle.startColor = "";
|
||||
diyStore.editComponent.list[2].subTitle.endColor = "";
|
||||
diyStore.editComponent.list[2].moreTitle.startColor = "#4BC2FF";
|
||||
diyStore.editComponent.list[2].moreTitle.endColor = "#1F7DFF";
|
||||
diyStore.editComponent.list[2].listFrame.startColor = "#E2F6FF";
|
||||
diyStore.editComponent.list[2].listFrame.endColor = "#F2FAFF";
|
||||
|
||||
diyStore.editComponent.list[3].title.textColor = "#303133";
|
||||
diyStore.editComponent.list[3].subTitle.textColor = "#999999";
|
||||
diyStore.editComponent.list[3].subTitle.startColor = "";
|
||||
diyStore.editComponent.list[3].subTitle.endColor = "";
|
||||
diyStore.editComponent.list[3].moreTitle.startColor = "#FB792F";
|
||||
diyStore.editComponent.list[3].moreTitle.endColor = "#F91700";
|
||||
diyStore.editComponent.list[3].listFrame.startColor = "#FFEAEA";
|
||||
diyStore.editComponent.list[3].listFrame.endColor = "#FFFCFB";
|
||||
}else if(style == 'style-3'){
|
||||
diyStore.editComponent.blockStyle.fontWeight = "normal";
|
||||
diyStore.editComponent.blockStyle.btnText = "normal";
|
||||
|
||||
diyStore.editComponent.list[0].title.textColor = "#FF1128";
|
||||
diyStore.editComponent.list[0].subTitle.textColor = "";
|
||||
diyStore.editComponent.list[0].subTitle.startColor = "";
|
||||
diyStore.editComponent.list[0].subTitle.endColor = "";
|
||||
diyStore.editComponent.list[0].moreTitle.startColor = "";
|
||||
diyStore.editComponent.list[0].moreTitle.endColor = "";
|
||||
diyStore.editComponent.list[0].listFrame.startColor = "";
|
||||
diyStore.editComponent.list[0].listFrame.endColor = "";
|
||||
|
||||
diyStore.editComponent.list[1].title.textColor = "#303133";
|
||||
diyStore.editComponent.list[1].subTitle.textColor = "";
|
||||
diyStore.editComponent.list[1].subTitle.startColor = "";
|
||||
diyStore.editComponent.list[1].subTitle.endColor = "";
|
||||
diyStore.editComponent.list[1].moreTitle.startColor = "";
|
||||
diyStore.editComponent.list[1].moreTitle.endColor = "";
|
||||
diyStore.editComponent.list[1].listFrame.startColor = "";
|
||||
diyStore.editComponent.list[1].listFrame.endColor = "";
|
||||
|
||||
diyStore.editComponent.list[2].title.textColor = "#303133";
|
||||
diyStore.editComponent.list[2].subTitle.textColor = "";
|
||||
diyStore.editComponent.list[2].subTitle.startColor = "";
|
||||
diyStore.editComponent.list[2].subTitle.endColor = "";
|
||||
diyStore.editComponent.list[2].moreTitle.startColor = "";
|
||||
diyStore.editComponent.list[2].moreTitle.endColor = "";
|
||||
diyStore.editComponent.list[2].listFrame.startColor = "";
|
||||
diyStore.editComponent.list[2].listFrame.endColor = "";
|
||||
|
||||
diyStore.editComponent.list[3].title.textColor = "#303133";
|
||||
diyStore.editComponent.list[3].subTitle.textColor = "";
|
||||
diyStore.editComponent.list[3].subTitle.startColor = "";
|
||||
diyStore.editComponent.list[3].subTitle.endColor = "";
|
||||
diyStore.editComponent.list[3].moreTitle.startColor = "";
|
||||
diyStore.editComponent.list[3].moreTitle.endColor = "";
|
||||
diyStore.editComponent.list[3].listFrame.startColor = "";
|
||||
diyStore.editComponent.list[3].listFrame.endColor = "";
|
||||
}else if(style == 'style-4'){
|
||||
diyStore.editComponent.blockStyle.fontWeight = "bold";
|
||||
diyStore.editComponent.blockStyle.btnText = "normal";
|
||||
|
||||
diyStore.editComponent.list[0].title.textColor = "#303133";
|
||||
diyStore.editComponent.list[0].subTitle.textColor = "#ED6E00";
|
||||
diyStore.editComponent.list[0].subTitle.startColor = "#FFE4D9";
|
||||
diyStore.editComponent.list[0].subTitle.endColor = "#FFE4D9";
|
||||
diyStore.editComponent.list[0].moreTitle.startColor = "";
|
||||
diyStore.editComponent.list[0].moreTitle.endColor = "";
|
||||
diyStore.editComponent.list[0].listFrame.startColor = "#FFAD4D";
|
||||
diyStore.editComponent.list[0].listFrame.endColor = "#F93D02";
|
||||
|
||||
diyStore.editComponent.list[1].title.textColor = "#303133";
|
||||
diyStore.editComponent.list[1].subTitle.textColor = "#2E59E9";
|
||||
diyStore.editComponent.list[1].subTitle.startColor = "#CAD7F8";
|
||||
diyStore.editComponent.list[1].subTitle.endColor = "#CAD7F8";
|
||||
diyStore.editComponent.list[1].moreTitle.startColor = "";
|
||||
diyStore.editComponent.list[1].moreTitle.endColor = "";
|
||||
diyStore.editComponent.list[1].listFrame.startColor = "#7CA7F4";
|
||||
diyStore.editComponent.list[1].listFrame.endColor = "#2B56E9";
|
||||
|
||||
diyStore.editComponent.list[2].title.textColor = "#303133";
|
||||
diyStore.editComponent.list[2].subTitle.textColor = "#F62F55";
|
||||
diyStore.editComponent.list[2].subTitle.startColor = "#FCD6D9";
|
||||
diyStore.editComponent.list[2].subTitle.endColor = "#FCD6D9";
|
||||
diyStore.editComponent.list[2].moreTitle.startColor = "";
|
||||
diyStore.editComponent.list[2].moreTitle.endColor = "";
|
||||
diyStore.editComponent.list[2].listFrame.startColor = "#FF7F48";
|
||||
diyStore.editComponent.list[2].listFrame.endColor = "#EE335B";
|
||||
|
||||
diyStore.editComponent.list[3].title.textColor = "#303133";
|
||||
diyStore.editComponent.list[3].subTitle.textColor = "#139B3C";
|
||||
diyStore.editComponent.list[3].subTitle.startColor = "#D3F1DA";
|
||||
diyStore.editComponent.list[3].subTitle.endColor = "#D3F1DA";
|
||||
diyStore.editComponent.list[3].moreTitle.startColor = "";
|
||||
diyStore.editComponent.list[3].moreTitle.endColor = "";
|
||||
diyStore.editComponent.list[3].listFrame.startColor = "#90D48C";
|
||||
diyStore.editComponent.list[3].listFrame.endColor = "#299F4F";
|
||||
}
|
||||
}
|
||||
|
||||
const addItem = () => {
|
||||
diyStore.editComponent.list.push({
|
||||
id: diyStore.generateRandom(),
|
||||
|
||||
@ -89,7 +89,7 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('dataSources')">
|
||||
<el-input v-model="item.diy_title" :placeholder="t('selectDiyPagePlaceholder')" readonly class="select-diy-page-input" @click="diyPageShowDialogOpen(index)">
|
||||
<el-input v-model.trim="item.diy_title" :placeholder="t('selectDiyPagePlaceholder')" readonly class="select-diy-page-input" @click="diyPageShowDialogOpen(index)">
|
||||
<template #suffix>
|
||||
<div @click.stop="tabClear(index)">
|
||||
<el-icon v-if="item.diy_title">
|
||||
@ -137,7 +137,6 @@
|
||||
</el-collapse-item>
|
||||
<el-collapse-item :title="t('carouselSearchSwiperSet')" name="swiper">
|
||||
<el-form label-width="100px" class="px-[10px]">
|
||||
|
||||
<el-form-item :label="t('carouselSearchSwiperControl')">
|
||||
<el-switch v-model="diyStore.editComponent.swiper.control" />
|
||||
</el-form-item>
|
||||
@ -173,6 +172,23 @@
|
||||
|
||||
<!-- 样式 -->
|
||||
<div class="style-wrap" v-show="diyStore.editTab == 'style'">
|
||||
<div class="edit-attr-item-wrap">
|
||||
<h3 class="mb-[10px]">{{ t('carouselSearchStyle') }}</h3>
|
||||
<el-form label-width="100px" class="px-[10px]">
|
||||
<el-form-item :label="t('carouselSearchTextColor')">
|
||||
<el-color-picker v-model="diyStore.editComponent.search.color" show-alpha :predefine="diyStore.predefineColors"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('carouselSearchBgColor')">
|
||||
<el-color-picker v-model="diyStore.editComponent.search.bgColor" show-alpha :predefine="diyStore.predefineColors"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('carouselSearchBtnColor')">
|
||||
<el-color-picker v-model="diyStore.editComponent.search.btnColor" show-alpha :predefine="diyStore.predefineColors"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('carouselSearchBtnBgColor')">
|
||||
<el-color-picker v-model="diyStore.editComponent.search.btnBgColor" show-alpha :predefine="diyStore.predefineColors"/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
|
||||
<div class="edit-attr-item-wrap">
|
||||
<h3 class="mb-[10px]">{{ t('carouselSearchTabStyle') }}</h3>
|
||||
@ -199,6 +215,7 @@
|
||||
<el-radio-group v-model="diyStore.editComponent.swiper.swiperStyle">
|
||||
<el-radio label="style-1">{{ t('carouselSearchSwiperIndicatorStyle1') }}</el-radio>
|
||||
<el-radio label="style-2">{{ t('carouselSearchSwiperIndicatorStyle2') }}</el-radio>
|
||||
<el-radio label="style-3">{{ t('carouselSearchSwiperIndicatorStyle3') }}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('topRounded')">
|
||||
@ -217,6 +234,7 @@
|
||||
<el-radio-group v-model="diyStore.editComponent.swiper.indicatorStyle">
|
||||
<el-radio label="style-1">{{ t('carouselSearchSwiperIndicatorStyle1') }}</el-radio>
|
||||
<el-radio label="style-2">{{ t('carouselSearchSwiperIndicatorStyle2') }}</el-radio>
|
||||
<el-radio label="style-3">{{ t('carouselSearchSwiperIndicatorStyle3') }}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('carouselSearchSwiperIndicatorAlign')">
|
||||
@ -280,13 +298,15 @@ diyStore.editComponent.verify = (index: number) => {
|
||||
// }
|
||||
});
|
||||
|
||||
diyStore.value[index].swiper.list.forEach((item: any) => {
|
||||
if(item.imageUrl == ''){
|
||||
res.code = false
|
||||
res.message = t('imageUrlTip')
|
||||
return res
|
||||
}
|
||||
});
|
||||
if(diyStore.value[index].swiper.control){
|
||||
diyStore.value[index].swiper.list.forEach((item: any) => {
|
||||
if(item.imageUrl == ''){
|
||||
res.code = false
|
||||
res.message = t('imageUrlTip')
|
||||
return res
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
@ -32,7 +32,7 @@
|
||||
<el-form-item :label="t('graphicNavShowStyle')">
|
||||
<el-radio-group v-model="diyStore.editComponent.showStyle" @change="changeShowStyle">
|
||||
<el-radio :label="'fixed'">{{t('graphicNavStyleFixed')}}</el-radio>
|
||||
<el-radio :label="'singleSlide'">{{t('graphicNavStyleSingleSlide')}}</el-radio>
|
||||
<el-radio :label="'singleSlide'">{{diyStore.editComponent.pageCount == 2 ? t('graphicNavStyleMultiLine') : t('graphicNavStyleSingleSlide')}}</el-radio>
|
||||
<el-radio :label="'pageSlide'">{{t('graphicNavStylePageSlide')}}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
<template>
|
||||
<!-- 内容 -->
|
||||
<div class="content-wrap" v-show="diyStore.editTab == 'content'">
|
||||
@ -12,11 +13,11 @@
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-dialog v-model="showDialog" :title="t('selectStyle')" width="500px">
|
||||
<el-dialog v-model="showDialog" :title="t('selectStyle')" width="660px">
|
||||
|
||||
<div class="flex flex-wrap">
|
||||
<template v-for="(item,index) in styleList" :key="index">
|
||||
<div :class="{ 'border-primary': selectStyle.value == item.value }" @click="changeStyle(item)" class="flex items-center justify-center overflow-hidden w-[200px] h-[100px] mr-[12px] cursor-pointer border bg-gray-50">
|
||||
<div :class="{ 'border-primary': selectStyle.value == item.value, '!mr-[0]': [(index+1)%3] == 0 }" @click="changeStyle(item)" class="flex my-[5px] items-center justify-center overflow-hidden w-[200px] h-[100px] mr-[12px] cursor-pointer border bg-gray-50">
|
||||
<img :src="img(item.url)" />
|
||||
</div>
|
||||
</template>
|
||||
@ -80,6 +81,16 @@ const styleList = reactive([
|
||||
url: 'static/resource/images/diy/member/member_level_style3.jpg',
|
||||
title: '风格3',
|
||||
value: 'style-3'
|
||||
},
|
||||
{
|
||||
url: 'static/resource/images/diy/member/member_level_style4.png',
|
||||
title: '风格4',
|
||||
value: 'style-4'
|
||||
},
|
||||
{
|
||||
url: 'static/resource/images/diy/member/member_level_style5.png',
|
||||
title: '风格5',
|
||||
value: 'style-5'
|
||||
}
|
||||
])
|
||||
|
||||
|
||||
@ -11,14 +11,14 @@
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<div class="flex items-center flex-wrap py-[8px] px-[10px] bg-[#f4f3f7] rounded mb-[18px] mx-[18px]" v-show="diyStore.editComponent.noticeType == 'img'">
|
||||
<div :class="['mr-[10px] rounded cursor-pointer', {'border-[1px] border-solid border-[var(--el-color-primary)]': diyStore.editComponent.systemUrl == 'style_1' && diyStore.editComponent.imgType == 'system'}]">
|
||||
<div :class="['mr-[10px] rounded cursor-pointer border-[1px] border-solid', {'border-[var(--el-color-primary)]': diyStore.editComponent.systemUrl == 'style_1' && diyStore.editComponent.imgType == 'system'}]">
|
||||
<img src="@/app/assets/images/diy/notice/style_1.png" :class="['h-[28px] px-[10px] py-[5px]']" @click="changeStyle('style_1')"/>
|
||||
</div>
|
||||
|
||||
<div :class="['mr-[10px] rounded cursor-pointer w-[100px]', {'border-[1px] border-solid border-[var(--el-color-primary)]': diyStore.editComponent.systemUrl == 'style_2' && diyStore.editComponent.imgType == 'system'}]">
|
||||
<div :class="['mr-[10px] rounded cursor-pointer w-[100px] border-[1px] border-solid', {'border-[var(--el-color-primary)]': diyStore.editComponent.systemUrl == 'style_2' && diyStore.editComponent.imgType == 'system'}]">
|
||||
<img src="@/app/assets/images/diy/notice/style_2.png" class="px-[10px] py-[5px]" @click="changeStyle('style_2')"/>
|
||||
</div>
|
||||
<div @click.stop="diyStore.editComponent.imgType = 'diy'" :class="['mr-[10px] rounded cursor-pointer diy-upload-img', {'border-[1px] border-solid border-[var(--el-color-primary)]': (diyStore.editComponent.imageUrl && diyStore.editComponent.imgType == 'diy') }]">
|
||||
<div @click.stop="diyStore.editComponent.imgType = 'diy'" :class="['mr-[10px] rounded cursor-pointer diy-upload-img border-[1px] border-solid', {'border-[var(--el-color-primary)]': (diyStore.editComponent.imageUrl && diyStore.editComponent.imgType == 'diy') }]">
|
||||
<upload-image v-model="diyStore.editComponent.imageUrl" :limit="1"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
156
admin/src/app/views/diy/components/edit-picture-show.vue
Normal file
156
admin/src/app/views/diy/components/edit-picture-show.vue
Normal file
@ -0,0 +1,156 @@
|
||||
<template>
|
||||
<!-- 内容 -->
|
||||
<div class="content-wrap" v-show="diyStore.editTab == 'content'">
|
||||
|
||||
<div class="edit-attr-item-wrap">
|
||||
<h3 class="mb-[10px]">{{ t('pictureShowBlockOne') }}</h3>
|
||||
<el-form label-width="80px" class="px-[10px]">
|
||||
<el-form-item :label="t('image')">
|
||||
<upload-image v-model="diyStore.editComponent.moduleOne.head.textImg" :limit="1"/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('subTitle')">
|
||||
<el-input v-model.trim="diyStore.editComponent.moduleOne.head.subText" :placeholder="t('subTitlePlaceholder')" clearable maxlength="8" show-word-limit />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('subTitleTextColor')">
|
||||
<el-color-picker v-model="diyStore.editComponent.moduleOne.head.subTextColor" show-alpha />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('pictureShowBgColor')">
|
||||
<el-color-picker v-model="diyStore.editComponent.moduleOne.listFrame.startColor" show-alpha />
|
||||
<icon name="iconfont iconmap-connect" size="20px" class="block !text-gray-400 mx-[5px]"/>
|
||||
<el-color-picker v-model="diyStore.editComponent.moduleOne.listFrame.endColor" show-alpha />
|
||||
</el-form-item>
|
||||
|
||||
<div v-for="(item,index) in diyStore.editComponent.moduleOne.list" :key="item.id" class="item-wrap p-[10px] pb-0 relative border border-dashed border-gray-300 mb-[16px]">
|
||||
<el-form-item :label="t('image')">
|
||||
<upload-image v-model="item.imageUrl" :limit="1"/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('pictureShowBtnText')">
|
||||
<el-input v-model.trim="item.btnTitle.text" :placeholder="t('activeCubeTitlePlaceholder')" clearable maxlength="4" show-word-limit/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('pictureShowBtnColor')">
|
||||
<el-color-picker v-model="item.btnTitle.color" show-alpha />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('pictureShowBtnBgColor')">
|
||||
<el-color-picker v-model="item.btnTitle.startColor" show-alpha />
|
||||
<icon name="iconfont iconmap-connect" size="20px" class="block !text-gray-400 mx-[5px]"/>
|
||||
<el-color-picker v-model="item.btnTitle.endColor" show-alpha />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('link')">
|
||||
<diy-link v-model="item.link"/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</el-form>
|
||||
</div>
|
||||
|
||||
<div class="edit-attr-item-wrap">
|
||||
<h3 class="mb-[10px]">{{ t('pictureShowBlockTwo') }}</h3>
|
||||
<el-form label-width="90px" class="px-[10px]">
|
||||
<el-form-item :label="t('image')">
|
||||
<upload-image v-model="diyStore.editComponent.moduleTwo.head.textImg" :limit="1"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('subTitle')">
|
||||
<el-input v-model.trim="diyStore.editComponent.moduleTwo.head.subText" :placeholder="t('subTitlePlaceholder')" clearable maxlength="8" show-word-limit />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('subTitleTextColor')">
|
||||
<el-color-picker v-model="diyStore.editComponent.moduleTwo.head.subTextColor" show-alpha />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('pictureShowBgColor')">
|
||||
<el-color-picker v-model="diyStore.editComponent.moduleTwo.listFrame.startColor" show-alpha />
|
||||
<icon name="iconfont iconmap-connect" size="20px" class="block !text-gray-400 mx-[5px]"/>
|
||||
<el-color-picker v-model="diyStore.editComponent.moduleTwo.listFrame.endColor" show-alpha />
|
||||
</el-form-item>
|
||||
|
||||
<div v-for="(item,index) in diyStore.editComponent.moduleTwo.list" :key="item.id" class="item-wrap p-[10px] pb-0 relative border border-dashed border-gray-300 mb-[16px]">
|
||||
<el-form-item :label="t('image')">
|
||||
<upload-image v-model="item.imageUrl" :limit="1"/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('pictureShowBtnText')">
|
||||
<el-input v-model.trim="item.btnTitle.text" :placeholder="t('activeCubeTitlePlaceholder')" clearable maxlength="4" show-word-limit/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('pictureShowBtnColor')">
|
||||
<el-color-picker v-model="item.btnTitle.color" show-alpha />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('pictureShowBtnBgColor')">
|
||||
<el-color-picker v-model="item.btnTitle.startColor" show-alpha />
|
||||
<icon name="iconfont iconmap-connect" size="20px" class="block !text-gray-400 mx-[5px]"/>
|
||||
<el-color-picker v-model="item.btnTitle.endColor" show-alpha />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('link')">
|
||||
<diy-link v-model="item.link"/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
|
||||
</el-form>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- 样式 -->
|
||||
<div class="style-wrap" v-show="diyStore.editTab == 'style'">
|
||||
<div class="edit-attr-item-wrap">
|
||||
<h3 class="mb-[10px]">{{ t('pictureShowBlockStyle') }}</h3>
|
||||
<el-form label-width="90px" class="px-[10px]">
|
||||
<el-form-item :label="t('topRounded')">
|
||||
<el-slider v-model="diyStore.editComponent.moduleRounded.topRounded" show-input size="small" class="ml-[10px] graphic-nav-slider" :max="100"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('bottomRounded')">
|
||||
<el-slider v-model="diyStore.editComponent.moduleRounded.bottomRounded" show-input size="small" class="ml-[10px] graphic-nav-slider" :max="100"/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
|
||||
<!-- 组件样式 -->
|
||||
<slot name="style"></slot>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { t } from '@/lang'
|
||||
import useDiyStore from '@/stores/modules/diy'
|
||||
import { img } from '@/utils/common'
|
||||
import { ref, reactive } from 'vue'
|
||||
|
||||
const diyStore = useDiyStore()
|
||||
diyStore.editComponent.ignore = [] // 忽略公共属性
|
||||
|
||||
// 组件验证
|
||||
diyStore.editComponent.verify = (index: number) => {
|
||||
const res = { code: true, message: '' }
|
||||
diyStore.value[index].moduleOne.list.forEach((item: any) => {
|
||||
if (item.imageUrl === '') {
|
||||
res.code = false
|
||||
res.message = t('imageUrlTip')
|
||||
return res
|
||||
}
|
||||
})
|
||||
|
||||
diyStore.value[index].moduleTwo.list.forEach((item: any) => {
|
||||
if (item.imageUrl === '') {
|
||||
res.code = false
|
||||
res.message = t('imageUrlTip')
|
||||
return res
|
||||
}
|
||||
})
|
||||
return res
|
||||
}
|
||||
|
||||
defineExpose({})
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
@ -109,7 +109,7 @@
|
||||
<div class="font-bold text-xl mb-[40px]">{{ t('developTitle') }}</div>
|
||||
<div class="mb-[20px] flex flex-col">
|
||||
<text class="mb-[10px]">{{ t('wapDomain') }}</text>
|
||||
<el-input v-model="wapDomain" :placeholder="t('wapDomainPlaceholder')" clearable />
|
||||
<el-input v-model.trim="wapDomain" :placeholder="t('wapDomainPlaceholder')" clearable />
|
||||
</div>
|
||||
<el-button type="primary" @click="saveWapDomain">{{ t('confirm') }}</el-button>
|
||||
<el-button type="primary" @click="settingTips()" plain>{{ t('settingTips') }}</el-button>
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
<div class="font-bold text-xl mb-[40px]">{{ t('developTitle') }}</div>
|
||||
<div class="mb-[20px] flex flex-col">
|
||||
<text class="mb-[10px]">{{ t('wapDomain') }}</text>
|
||||
<el-input v-model="wapDomain" :placeholder="t('wapDomainPlaceholder')" clearable />
|
||||
<el-input v-model.trim="wapDomain" :placeholder="t('wapDomainPlaceholder')" clearable />
|
||||
</div>
|
||||
<div class="flex">
|
||||
<el-button type="primary" @click="saveDomain()">{{ t('confirm') }}</el-button>
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
|
||||
<el-form :inline="true" :model="diyPageTableData.searchParam" ref="searchFormDiyPageRef">
|
||||
<el-form-item :label="t('title')" prop="title">
|
||||
<el-input v-model="diyPageTableData.searchParam.title" :placeholder="t('titlePlaceholder')" />
|
||||
<el-input v-model.trim="diyPageTableData.searchParam.title" :placeholder="t('titlePlaceholder')" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('forAddon')" prop="addon_name">
|
||||
<el-select v-model="diyPageTableData.searchParam.addon_name" :placeholder="t('forAddonPlaceholder')" @change="handleSelectAddonChange">
|
||||
@ -74,7 +74,7 @@
|
||||
|
||||
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules">
|
||||
<el-form-item :label="t('title')" prop="title">
|
||||
<el-input v-model="formData.title" :placeholder="t('titlePlaceholder')" clearable maxlength="12" show-word-limit class="w-full" />
|
||||
<el-input v-model.trim="formData.title" :placeholder="t('titlePlaceholder')" clearable maxlength="12" show-word-limit class="w-full" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('typeName')" prop="type">
|
||||
<el-select v-model="formData.type" :placeholder="t('pageTypePlaceholder')" class="!w-full">
|
||||
@ -102,10 +102,10 @@
|
||||
<span>{{ sharePage }}</span>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('shareTitle')" prop="title">
|
||||
<el-input v-model="shareFormData[tabShareType].title" :placeholder="t('shareTitlePlaceholder')" clearable maxlength="30" show-word-limit />
|
||||
<el-input v-model.trim="shareFormData[tabShareType].title" :placeholder="t('shareTitlePlaceholder')" clearable maxlength="30" show-word-limit />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('shareDesc')" prop="desc" v-if="tabShareType == 'wechat'">
|
||||
<el-input v-model="shareFormData[tabShareType].desc" :placeholder="t('shareDescPlaceholder')" type="textarea" rows="4" clearable maxlength="100" show-word-limit />
|
||||
<el-input v-model.trim="shareFormData[tabShareType].desc" :placeholder="t('shareDescPlaceholder')" type="textarea" rows="4" clearable maxlength="100" show-word-limit />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('shareImageUrl')" prop="url">
|
||||
<upload-image v-model="shareFormData[tabShareType].url" :limit="1" />
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
<div class="font-bold text-xl mb-[40px]">{{ t('developTitle') }}</div>
|
||||
<div class="mb-[20px] flex flex-col">
|
||||
<text class="mb-[10px]">{{ t('wapDomain') }}</text>
|
||||
<el-input v-model="wapDomain" :placeholder="t('wapDomainPlaceholder')" clearable />
|
||||
<el-input v-model.trim="wapDomain" :placeholder="t('wapDomainPlaceholder')" clearable />
|
||||
</div>
|
||||
<div class="flex">
|
||||
<el-button type="primary" @click="saveDomain()">{{ t('confirm') }}</el-button>
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
|
||||
<el-form :inline="true" :model="diyRouteTableData.searchParam" ref="searchFormDiyRouteRef">
|
||||
<el-form-item :label="t('title')" prop="title">
|
||||
<el-input v-model="diyRouteTableData.searchParam.title" :placeholder="t('titlePlaceholder')" />
|
||||
<el-input v-model.trim="diyRouteTableData.searchParam.title" :placeholder="t('titlePlaceholder')" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('forAddon')" prop="addon_name">
|
||||
<el-select v-model="diyRouteTableData.searchParam.addon_name" :placeholder="t('forAddonPlaceholder')">
|
||||
@ -70,10 +70,10 @@
|
||||
<span>{{ sharePage }}</span>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('shareTitle')" prop="title">
|
||||
<el-input v-model="shareFormData[tabShareType].title" :placeholder="t('shareTitlePlaceholder')" clearable maxlength="30" show-word-limit />
|
||||
<el-input v-model.trim="shareFormData[tabShareType].title" :placeholder="t('shareTitlePlaceholder')" clearable maxlength="30" show-word-limit />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('shareDesc')" prop="desc" v-if="tabShareType == 'wechat'">
|
||||
<el-input v-model="shareFormData[tabShareType].desc" :placeholder="t('shareDescPlaceholder')" type="textarea" rows="4" clearable maxlength="100" show-word-limit />
|
||||
<el-input v-model.trim="shareFormData[tabShareType].desc" :placeholder="t('shareDescPlaceholder')" type="textarea" rows="4" clearable maxlength="100" show-word-limit />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('shareImageUrl')" prop="url">
|
||||
<upload-image v-model="shareFormData[tabShareType].url" :limit="1" />
|
||||
|
||||
@ -45,7 +45,7 @@
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('navTitleOne')">
|
||||
<el-input class="!w-[215px]" v-model="item.text" :placeholder="t('titleContent')" maxlength="5" show-word-limit />
|
||||
<el-input class="!w-[215px]" v-model.trim="item.text" :placeholder="t('titleContent')" maxlength="5" show-word-limit />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('navLinkOne')">
|
||||
<diy-link v-model="item.link" @confirm="diyLinkFn" />
|
||||
@ -69,21 +69,21 @@
|
||||
<el-form-item :label="t('textColor')">
|
||||
<div class="flex align-center">
|
||||
<el-color-picker v-model="diyBottomData.value.textColor" />
|
||||
<el-input class="ml-[10px]" v-model="diyBottomData.value.textColor" disabled />
|
||||
<el-input class="ml-[10px]" v-model.trim="diyBottomData.value.textColor" disabled />
|
||||
<el-button class="ml-[10px]" type="primary" @click="diyBottomData.value.textColor = '#333333'">{{ t('reset') }}</el-button>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('textSelectColor')">
|
||||
<div class="flex align-center">
|
||||
<el-color-picker v-model="diyBottomData.value.textHoverColor" />
|
||||
<el-input class="ml-[10px]" v-model="diyBottomData.value.textHoverColor" disabled />
|
||||
<el-input class="ml-[10px]" v-model.trim="diyBottomData.value.textHoverColor" disabled />
|
||||
<el-button class="ml-[10px]" type="primary" @click="diyBottomData.value.textHoverColor = '#333333'">{{ t('reset') }}</el-button>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('backgroundColor')">
|
||||
<div class="flex align-center">
|
||||
<el-color-picker v-model="diyBottomData.value.backgroundColor" />
|
||||
<el-input class="ml-[10px]" v-model="diyBottomData.value.backgroundColor" disabled />
|
||||
<el-input class="ml-[10px]" v-model.trim="diyBottomData.value.backgroundColor" disabled />
|
||||
<el-button class="ml-[10px]" type="primary" @click="diyBottomData.value.backgroundColor = '#FFFFFF'">{{ t('reset') }}</el-button>
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
@ -51,7 +51,7 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('tradeNo')" prop="trade_no">
|
||||
<el-input v-model="siteAccountLogTable.searchParam.trade_no" :placeholder="t('tradeNoPlaceholder')" />
|
||||
<el-input v-model.trim="siteAccountLogTable.searchParam.trade_no" :placeholder="t('tradeNoPlaceholder')" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('createTime')" prop="create_time">
|
||||
<el-date-picker v-model="siteAccountLogTable.searchParam.create_time" type="datetimerange"
|
||||
|
||||
@ -40,12 +40,12 @@
|
||||
:end-placeholder="t('endDate')" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('cashOutNumber')" prop="cash_out_no">
|
||||
<el-input v-model="orderTableData.searchParam.cash_out_no" class="w-[240px]"
|
||||
<el-input v-model.trim="orderTableData.searchParam.cash_out_no" class="w-[240px]"
|
||||
:placeholder="t('cashOutNumberPlaceholder')" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('memberInfo')" prop="keyword">
|
||||
<el-input v-model="orderTableData.searchParam.keyword" class="w-[240px]"
|
||||
<el-input v-model.trim="orderTableData.searchParam.keyword" class="w-[240px]"
|
||||
:placeholder="t('memberInfoPlaceholder')" />
|
||||
</el-form-item>
|
||||
|
||||
@ -196,7 +196,7 @@
|
||||
<el-dialog v-model="auditShowDialog" :title="t('rejectionAudit')" width="500px" :destroy-on-close="true">
|
||||
<el-form :model="auditFailure" label-width="90px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
|
||||
<el-form-item :label="t('reasonsRefusal')" prop="label_name">
|
||||
<el-input v-model="auditFailure.refuse_reason" clearable maxlength="200" :show-word-limit="true" :placeholder="t('reasonsRefusalPlaceholder')" :rows="4" class="input-width" type="textarea" />
|
||||
<el-input v-model.trim="auditFailure.refuse_reason" clearable maxlength="200" :show-word-limit="true" :placeholder="t('reasonsRefusalPlaceholder')" :rows="4" class="input-width" type="textarea" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
|
||||
158
admin/src/app/views/finance/components/refund-detail.vue
Normal file
158
admin/src/app/views/finance/components/refund-detail.vue
Normal file
@ -0,0 +1,158 @@
|
||||
<template>
|
||||
<el-drawer v-model="showDialog" title="退款详情" direction="rtl" :before-close="handleClose" class="member-detail-drawer">
|
||||
<div class="main-container" v-loading="loading">
|
||||
<div class="relative" v-if="formData">
|
||||
<div class="flex mb-[20px] justify-between text-[15px]">
|
||||
<span>{{ t('refundMoney') }}:<span>¥{{ formData.money }}</span></span>
|
||||
<span>{{ t('refundNo') }}:<span>{{ formData.refund_no }}</span></span>
|
||||
</div>
|
||||
|
||||
<el-table :data="refundList" size="large">
|
||||
<el-table-column prop="out_trade_no" :label="t('outTradeNo')" min-width="200" />
|
||||
<el-table-column prop="create_time" :label="t('createTime')" min-width="160" />
|
||||
<el-table-column prop="refund_type_name" :label="t('refundTypeName')" min-width="120" />
|
||||
<el-table-column :label="t('refundMoney')" min-width="120">
|
||||
<template #default="{ row }">
|
||||
<span>¥{{ row.money }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="status_name" :label="t('statusName')" min-width="120" />
|
||||
<el-table-column :label="t('operation')" fixed="right" align="right" min-width="120">
|
||||
<template #default="{ row }">
|
||||
<el-button type="primary" v-if="row.status == 'wait'" link @click="transferEvent(row)">{{ t('transfer') }}</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
|
||||
<el-dialog v-model="transferDialog" :title="title" width="500px" class="diy-dialog-wrap" :destroy-on-close="true">
|
||||
<el-form :model="transferFormData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
|
||||
<el-form-item :label="t('transferType')">
|
||||
<el-radio-group v-model="transferFormData.refund_type">
|
||||
<el-radio :label="item.value" v-for="(item, index) in refundTypeData" :key="index">{{ item.name }}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('refundMoney')">
|
||||
<span>{{ transferFormData.refund_money }}</span>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('voucher')" v-if="transferFormData.refund_type == 'offline'">
|
||||
<upload-image v-model="transferFormData.voucher" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="transferDialog = false">{{ t('cancel') }}</el-button>
|
||||
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{ t('confirm') }}</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</el-drawer>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { reactive, ref, computed } from 'vue'
|
||||
import { t } from '@/lang'
|
||||
import { getPayRefundInfo, getRefundType, getRefundTransfer } from '@/app/api/pay'
|
||||
import { FormInstance, ElMessage } from 'element-plus'
|
||||
import { useRouter, useRoute } from 'vue-router'
|
||||
import { img, filterNumber } from '@/utils/common'
|
||||
import useAppStore from '@/stores/modules/app'
|
||||
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
let popTitle: string = '退款详情';
|
||||
|
||||
const showDialog = ref(false)
|
||||
const loading = ref(false)
|
||||
let refundNo = '';
|
||||
|
||||
const refundList = ref([])
|
||||
const formData: Record<string, any> = ref(null)
|
||||
|
||||
|
||||
const handleClose = (done: () => void) => {
|
||||
showDialog.value = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 表单数据
|
||||
*/
|
||||
const formRef = ref<FormInstance>()
|
||||
|
||||
const setFormData = async (row: any = null) => {
|
||||
refundNo = row.no;
|
||||
getRefundListInfo(refundNo)
|
||||
}
|
||||
|
||||
const getRefundListInfo = async (no) => {
|
||||
loading.value = true
|
||||
formData.value = null
|
||||
await getPayRefundInfo(no).then(({ data }) => {
|
||||
formData.value = data
|
||||
refundList.value.push(data)
|
||||
})
|
||||
loading.value = false
|
||||
}
|
||||
|
||||
const refundTypeData = ref([])
|
||||
getRefundType().then((data) => {
|
||||
Object.keys(data.data).forEach((key: string) => {
|
||||
refundTypeData.value.push({ value: key, name: data.data[key] })
|
||||
})
|
||||
})
|
||||
|
||||
const transferDialog = ref(false)
|
||||
const transferEvent = (data:any) => {
|
||||
transferDialog.value = true
|
||||
transferFormData.refund_no = data.refund_no
|
||||
transferFormData.refund_money = data.money
|
||||
}
|
||||
|
||||
const initialFormData = {
|
||||
refund_no: '',
|
||||
refund_type: 'back',
|
||||
voucher: '',
|
||||
refund_money: 0.00
|
||||
}
|
||||
const transferFormData: Record<string, any> = reactive({ ...initialFormData })
|
||||
|
||||
// 表单验证规则
|
||||
const formRules = computed(() => {
|
||||
return {
|
||||
label_name: [
|
||||
{ required: true, message: t('labelNamePlaceholder'), trigger: 'blur' }
|
||||
]
|
||||
}
|
||||
})
|
||||
|
||||
const confirm = async (formEl: FormInstance | undefined) => {
|
||||
if (loading.value || !formEl) return
|
||||
|
||||
await formEl.validate(async (valid) => {
|
||||
if (valid) {
|
||||
loading.value = true
|
||||
const data = transferFormData
|
||||
getRefundTransfer(data).then(res => {
|
||||
loading.value = false
|
||||
transferDialog.value = false
|
||||
refundList.value = []
|
||||
getRefundListInfo(refundNo)
|
||||
}).catch(() => {
|
||||
transferDialog.value = false
|
||||
loading.value = false
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
defineExpose({
|
||||
showDialog,
|
||||
setFormData
|
||||
})
|
||||
</script>
|
||||
<style lang="scss">
|
||||
.member-detail-drawer{
|
||||
width: 1000px !important;
|
||||
}
|
||||
</style>
|
||||
@ -9,7 +9,7 @@
|
||||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
|
||||
<el-form :inline="true" :model="payListTable.searchParam" ref="searchFormRef">
|
||||
<el-form-item :label="t('outTradeNo')" prop="trade_no">
|
||||
<el-input v-model="payListTable.searchParam.out_trade_no" :placeholder="t('outTradeNoPlaceholder')" />
|
||||
<el-input v-model.trim="payListTable.searchParam.out_trade_no" :placeholder="t('outTradeNoPlaceholder')" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('createTime')" prop="create_time">
|
||||
<el-date-picker v-model="payListTable.searchParam.create_time" type="datetimerange"
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
|
||||
<el-form :inline="true" :model="payRefundTable.searchParam" ref="searchFormRef">
|
||||
<el-form-item :label="t('refundNo')" prop="refund_no">
|
||||
<el-input v-model="payRefundTable.searchParam.refund_no" :placeholder="t('refundNoPlaceholder')" />
|
||||
<el-input v-model.trim="payRefundTable.searchParam.refund_no" :placeholder="t('refundNoPlaceholder')" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('createTime')" prop="create_time">
|
||||
<el-date-picker v-model="payRefundTable.searchParam.create_time" type="datetimerange"
|
||||
@ -49,6 +49,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
<refund-detail ref="refundDetailDialog"></refund-detail>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -58,6 +59,7 @@ import { t } from '@/lang'
|
||||
import { getPayRefundPages } from '@/app/api/pay'
|
||||
import { useRouter, useRoute } from 'vue-router'
|
||||
import type { FormInstance } from 'element-plus'
|
||||
import refundDetail from '@/app/views/finance/components/refund-detail.vue'
|
||||
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
@ -97,9 +99,11 @@ const loadPayRefundList = (page: number = 1) => {
|
||||
})
|
||||
}
|
||||
loadPayRefundList()
|
||||
|
||||
const infoEvent = (data:any) => {
|
||||
router.push('/finance/refund/detail?refund_no=' + data.refund_no)
|
||||
const refundDetailDialog: Record<string, any> | null = ref(null)
|
||||
const infoEvent = (res:any) => {
|
||||
let data = {no: res.refund_no};
|
||||
refundDetailDialog.value.setFormData(data);
|
||||
refundDetailDialog.value.showDialog = true;
|
||||
}
|
||||
|
||||
const resetForm = (formEl: FormInstance | undefined) => {
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
<span>{{ saveInfo.username }}</span>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('realName')">
|
||||
<el-input v-model="saveInfo.real_name" :placeholder="t('realNamePlaceholder')" clearable class="input-width" />
|
||||
<el-input v-model.trim="saveInfo.real_name" :placeholder="t('realNamePlaceholder')" clearable class="input-width" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="flex justify-center mt-[50px]">
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
<span :class="['px-[10px] cursor-pointer h-[35px] leading-[35px] inline-block', {'text-[var(--el-color-primary)]': params.app == item.key}]" @click="cutAppFn(item.key)" v-for="(item,index) in addonList" :key="index">{{item.title}}</span>
|
||||
</el-scrollbar>
|
||||
</div>
|
||||
<el-input v-model="params.keywords" class="!w-[300px] !h-[34px]" placeholder="请输入要搜索的站点名称/编号" @keyup.enter.native="getHomeSiteFn()">
|
||||
<el-input v-model.trim="params.keywords" class="!w-[300px] !h-[34px]" placeholder="请输入要搜索的站点名称/编号" @keyup.enter.native="getHomeSiteFn()">
|
||||
<template #suffix>
|
||||
<el-icon @click.stop="getHomeSiteFn()" class="cursor-pointer">
|
||||
<Search />
|
||||
@ -80,7 +80,7 @@
|
||||
<div class="w-[420px] h-[34px] ml-[10px]">
|
||||
<el-form :model="createSiteData.formData" ref="formRef" :rules="formRules">
|
||||
<el-form-item prop="username">
|
||||
<el-input class="create-site-name" v-model="createSiteData.formData.site_name" maxlength="20" placeholder="请输入站点名称" autocomplete="off"></el-input>
|
||||
<el-input class="create-site-name" v-model.trim="createSiteData.formData.site_name" maxlength="20" placeholder="请输入站点名称" autocomplete="off"></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
<div class="font-bold text-xl mb-[40px]">{{ t('developTitle') }}</div>
|
||||
<div class="mb-[20px] flex flex-col">
|
||||
<text class="mb-[10px]">{{ t('wapDomain') }}</text>
|
||||
<el-input v-model="wapDomain" :placeholder="t('wapDomainPlaceholder')" clearable />
|
||||
<el-input v-model.trim="wapDomain" :placeholder="t('wapDomainPlaceholder')" clearable />
|
||||
</div>
|
||||
<el-button type="primary" @click="save">{{ t('confirm') }}</el-button>
|
||||
</div>
|
||||
|
||||
@ -31,7 +31,7 @@
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<el-table v-if="localList[activeName].length&&!authLoading" :data="info[activeName]" size="large" class="pt-[5px]">
|
||||
<el-table v-if="localList[activeName].length&&!loading" :data="info[activeName]" size="large" class="pt-[5px]">
|
||||
<el-table-column :label="t('appName')" align="left" width="320">
|
||||
<template #default="{ row }">
|
||||
<div class="flex items-center cursor-pointer" @click = "handleTips">
|
||||
@ -97,11 +97,11 @@
|
||||
<el-button class="!text-[13px]" v-if="!row.is_download" :loading="downloading == row.key" :disabled="downloading != ''" type="primary" link @click.stop="downEvent(row)">
|
||||
<span>{{ t('down') }}</span>
|
||||
</el-button>
|
||||
<el-button class="!text-[13px]" type="primary" link @click="getAddonDetialFn(row)">{{ t('detail') }}</el-button>
|
||||
<el-button class="!text-[13px]" type="primary" link @click="getAddonDetailFn(row)">{{ t('detail') }}</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div class="data-loading" v-if="authLoading || !localList[activeName].length">
|
||||
<div class="data-loading" v-if="loading || !localList[activeName].length">
|
||||
<el-table :data="[]" size="large" class="pt-[5px]">
|
||||
<el-table-column :label="t('appName')" align="left" width="320"></el-table-column>
|
||||
<el-table-column align="left" min-width="120"></el-table-column>
|
||||
@ -111,7 +111,7 @@
|
||||
<el-table-column :label="t('operation')" fixed="right" align="right" width="150"></el-table-column>
|
||||
<template #empty><span></span></template>
|
||||
</el-table>
|
||||
<div class="h-[100px]" v-loading="authLoading" v-if="authLoading">
|
||||
<div class="h-[100px]" v-loading="loading" v-if="loading">
|
||||
</div>
|
||||
</div>
|
||||
<el-empty class="mx-auto overview-empty" v-if="!localList.installed.length && !loading && activeName == 'installed'&&!authLoading">
|
||||
@ -827,7 +827,7 @@ const installShowDialogClose = (done: () => {}) => {
|
||||
// 插件详情
|
||||
const appStoreShowDialog = ref(false)
|
||||
const appStoreInfo = ref<AnyObject>({})
|
||||
const getAddonDetialFn = (data: AnyObject) => {
|
||||
const getAddonDetailFn = (data: AnyObject) => {
|
||||
appStoreShowDialog.value = true
|
||||
appStoreInfo.value = data
|
||||
}
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
<h3 class="text-center text-2xl font-bold mb-[26px]">{{ t('platform') }}</h3>
|
||||
<el-form :model="form" ref="formRef" :rules="formRules">
|
||||
<el-form-item prop="username">
|
||||
<el-input v-model="form.username" :placeholder="t('userPlaceholder')" autocomplete="off" @keyup.enter="handleLogin(formRef)" class="h-[40px] input-with-select">
|
||||
<el-input v-model.trim="form.username" :placeholder="t('userPlaceholder')" autocomplete="off" @keyup.enter="handleLogin(formRef)" class="h-[40px] input-with-select">
|
||||
<template #prepend>
|
||||
<icon name="element User" />
|
||||
</template>
|
||||
@ -22,7 +22,7 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item prop="password">
|
||||
<el-input v-model="form.password" :placeholder="t('passwordPlaceholder')" type="password"
|
||||
<el-input v-model.trim="form.password" :placeholder="t('passwordPlaceholder')" type="password"
|
||||
autocomplete="new-password"
|
||||
@keyup.enter="handleLogin(formRef)" :show-password="true"
|
||||
class="h-[40px] input-with-select">
|
||||
@ -55,7 +55,7 @@
|
||||
<h3 class="text-3xl mb-[30px]">{{ t('siteLogin') }}</h3>
|
||||
<el-form :model="form" ref="formRef" :rules="formRules">
|
||||
<el-form-item prop="username">
|
||||
<el-input v-model="form.username" @keyup.enter="handleLogin(formRef)" autocomplete="off" class="w-50 m-1 h-[40px]" :placeholder="t('userPlaceholder')">
|
||||
<el-input v-model.trim="form.username" @keyup.enter="handleLogin(formRef)" autocomplete="off" class="w-50 m-1 h-[40px]" :placeholder="t('userPlaceholder')">
|
||||
<template #prefix>
|
||||
<icon name="element User" />
|
||||
</template>
|
||||
@ -63,7 +63,7 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item prop="password">
|
||||
<el-input type="password" v-model="form.password" @keyup.enter="handleLogin(formRef)" autocomplete="new-password" :show-password="true" class="w-50 m-1 h-[40px]" :placeholder="t('passwordPlaceholder')">
|
||||
<el-input type="password" v-model.trim="form.password" @keyup.enter="handleLogin(formRef)" autocomplete="new-password" :show-password="true" class="w-50 m-1 h-[40px]" :placeholder="t('passwordPlaceholder')">
|
||||
<template #prefix>
|
||||
<icon name="element Lock" />
|
||||
</template>
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
<template>
|
||||
<el-form :model="formData" :rules="formRules" class="page-form" ref="formRef">
|
||||
<el-form-item :label="t('continueSign')" prop="continue_sign">
|
||||
<el-input class="input-width" v-model.trim="formData.continue_sign" :maxlength="5" clearable /><span class="ml-[10px]">{{ t('day') }}</span>
|
||||
<el-input class="input-width" v-model.trim="formData.continue_sign" :maxlength="5" clearable />
|
||||
<span class="ml-[10px]">{{ t('day') }}</span>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('continueSign')" >
|
||||
<div class="flex-1">
|
||||
@ -15,7 +16,7 @@
|
||||
<el-radio class="mb-[15px]" v-model="formData.receive_limit" :label="1" @change="radioChange($event, 1)">{{ t('noLimit') }}</el-radio>
|
||||
<div class="flex">
|
||||
<el-radio class="!mr-[15px]" v-model="formData.receive_limit" :label="2" @change="radioChange($event, 2)">{{ t('everyOneLimit') }}</el-radio>
|
||||
<el-input class="input-width" v-model="formData.receive_num" :maxlength="5" clearable /><span class="ml-[10px]">{{ t('time') }}</span>
|
||||
<el-input class="input-width" v-model.trim="formData.receive_num" :maxlength="5" clearable /><span class="ml-[10px]">{{ t('time') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
168
admin/src/app/views/marketing/components/verify-detail.vue
Normal file
168
admin/src/app/views/marketing/components/verify-detail.vue
Normal file
@ -0,0 +1,168 @@
|
||||
<template>
|
||||
<el-drawer v-model="showDialog" title="核销记录详情" direction="rtl" :before-close="handleClose" class="member-detail-drawer">
|
||||
<div class="main-container" v-loading="loading">
|
||||
<el-tabs v-model="activeName" class="pb-[10px]" @tab-change="handleClick">
|
||||
<el-tab-pane label="核销信息" name="verifyInfo" />
|
||||
<el-tab-pane label="商品信息" name="goodsInfo" />
|
||||
</el-tabs>
|
||||
<div v-if="activeName == 'verifyInfo'">
|
||||
<div class="text-[14px] min-w-[110px] border-solid border-l-[3px] border-[var(--el-color-primary)] pl-[5px]">核销信息</div>
|
||||
<el-row>
|
||||
<el-col :span="8">
|
||||
<div class="flex items-center mt-[15px]">
|
||||
<span class="text-[14px] w-[130px] text-right mr-[20px]">{{ t('核销类型') }}</span>
|
||||
<span class="text-[14px] text-[#666666]">
|
||||
{{ verifyData.type_name }}
|
||||
</span>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="flex items-center mt-[15px]">
|
||||
<span class="text-[14px] w-[130px] text-right mr-[20px]">{{ t('核销状态') }}</span>
|
||||
<span class="text-[14px] text-[#666666]">
|
||||
已核销
|
||||
</span>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="flex items-center mt-[15px]">
|
||||
<span class="text-[14px] w-[130px] text-right mr-[20px]">{{ t('核销人员') }}</span>
|
||||
<span class="text-[14px] text-[#666666]">
|
||||
{{ verifyData.member ? verifyData.member.nickname : '--' }}
|
||||
</span>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="flex items-center mt-[15px]">
|
||||
<span class="text-[14px] w-[130px] text-right mr-[20px]">{{ t('核销时间') }}</span>
|
||||
<span class="text-[14px] text-[#666666]">
|
||||
{{verifyData.create_time}}
|
||||
</span>
|
||||
</div>
|
||||
</el-col>
|
||||
|
||||
<template v-for="(item,index) in verifyContentData.fixed">
|
||||
<el-col :span="8">
|
||||
<div class="flex items-center mt-[15px]" v-if="item.title">
|
||||
<span class="text-[14px] w-[130px] text-right mr-[20px]">{{ item.title }}</span>
|
||||
<span class="text-[14px] text-[#666666]">
|
||||
{{ item.value }}
|
||||
</span>
|
||||
</div>
|
||||
</el-col>
|
||||
</template>
|
||||
<template v-for="(item,index) in verifyData.verify_info">
|
||||
<el-col :span="8" v-for="(val,key) in item">
|
||||
<div class="flex items-center mt-[15px]" v-if="val.name">
|
||||
<span class="text-[14px] w-[130px] text-right mr-[20px]">{{ val.name }}</span>
|
||||
<span class="text-[14px] text-[#666666]">
|
||||
{{ val.value }}
|
||||
</span>
|
||||
</div>
|
||||
</el-col>
|
||||
</template>
|
||||
</el-row>
|
||||
<template v-for="(item,index) in verifyContentData.diy">
|
||||
<div class="text-[14px] min-w-[110px] border-solid border-l-[3px] border-[var(--el-color-primary)] pl-[5px] mt-[20px]">{{item.title}}</div>
|
||||
<el-row>
|
||||
<el-col :span="8" v-for="(subItem,subIndex) in item.list" :key="subIndex">
|
||||
<div class="flex items-center mt-[15px]">
|
||||
<span class="text-[14px] w-[130px] text-right mr-[20px]">{{ subItem.title }}</span>
|
||||
<span class="text-[14px] text-[#666666]">
|
||||
{{ subItem.value }}
|
||||
</span>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</template>
|
||||
</div>
|
||||
<div v-if="activeName == 'goodsInfo'">
|
||||
<el-table :data="verifyGoodsList" size="large">
|
||||
<el-table-column :label="t('商品名称')" align="left" width="300">
|
||||
<template #default="{ row }">
|
||||
<div class="flex">
|
||||
<div class="flex items-center shrink-0">
|
||||
<img class="w-[50px] h-[50px] mr-[10px]" :src="img(row.cover)" />
|
||||
</div>
|
||||
<div class="flex flex-col">
|
||||
<p class="multi-hidden text-[14px]">{{ row.name }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="num" :label="t('数量')" min-width="50" align="right" />
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
</el-drawer>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { reactive, ref, computed } from 'vue'
|
||||
import { t } from '@/lang'
|
||||
import { getVerifyDetail } from '@/app/api/verify'
|
||||
import { FormInstance, ElMessage } from 'element-plus'
|
||||
import { ArrowLeft } from '@element-plus/icons-vue'
|
||||
import { useRouter, useRoute } from 'vue-router'
|
||||
import { img, filterNumber } from '@/utils/common'
|
||||
import useAppStore from '@/stores/modules/app'
|
||||
|
||||
const showDialog = ref(false)
|
||||
const loading = ref(true)
|
||||
const router = useRouter()
|
||||
|
||||
const appStore = useAppStore()
|
||||
const activeName = ref('verifyInfo')
|
||||
const formData:Record<string, any> = ref({})
|
||||
|
||||
const handleClick = (data:string) => {
|
||||
activeName.value = data
|
||||
}
|
||||
|
||||
const handleClose = (done: () => void) => {
|
||||
showDialog.value = false;
|
||||
}
|
||||
|
||||
// 获取核销信息
|
||||
let code: any = ''
|
||||
const verifyData: any = ref({})
|
||||
const verifyContentData: any = ref({})
|
||||
const verifyGoodsList: any = ref([])
|
||||
|
||||
const getVerifyDetailFn = async () => {
|
||||
loading.value = true
|
||||
if (code) {
|
||||
const data = await (await getVerifyDetail(code)).data
|
||||
if (!data || Object.keys(data).length == 0) {
|
||||
ElMessage.error(t('memberNull'))
|
||||
setTimeout(() => {
|
||||
router.go(-1)
|
||||
}, 2000)
|
||||
return false
|
||||
}
|
||||
verifyData.value = data
|
||||
verifyContentData.value = data.value.content || {}
|
||||
verifyGoodsList.value = data.value.list || []
|
||||
loading.value = false
|
||||
} else {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
const setFormData = async (row: any = null) => {
|
||||
console.log("setFormData",row);
|
||||
code = row.code;
|
||||
getVerifyDetailFn();
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
showDialog,
|
||||
setFormData
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.member-detail-drawer{
|
||||
width: 1000px !important;
|
||||
}
|
||||
</style>
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
<el-form class="page-form" :model="formData" label-width="150px" ref="ruleFormRef" :rules="formRules" v-loading="loading">
|
||||
<el-card class="box-card !border-none" shadow="never">
|
||||
<h3 class="panel-title !text-sm">{{ t('signRule') }}</h3>
|
||||
<h3 class="text-page-title">{{ t('signRule') }}</h3>
|
||||
|
||||
<el-form-item :label="t('isUse')">
|
||||
<el-switch v-model="formData.is_use" />
|
||||
@ -70,7 +70,7 @@
|
||||
|
||||
<el-form-item :label="t('ruleExplain')" prop="rule_explain" v-if="formData.is_use">
|
||||
<div class="flex">
|
||||
<el-input v-model="formData.rule_explain" :placeholder="t('ruleExplainTip')" type="textarea" maxlength="500" show-word-limit rows="5" class="textarea-width" clearable />
|
||||
<el-input v-model.trim="formData.rule_explain" :placeholder="t('ruleExplainTip')" type="textarea" maxlength="500" show-word-limit rows="5" class="textarea-width" clearable />
|
||||
<el-button class="ml-[20px]" type="primary" @click="defaultExplainEvent()" plain>{{ t('useDefaultExplain') }}</el-button>
|
||||
</div>
|
||||
</el-form-item>
|
||||
@ -78,7 +78,7 @@
|
||||
</el-form>
|
||||
|
||||
<!-- 日签奖励 -->
|
||||
<el-dialog v-model="daySignDialog" :title="t('daySignTitle')" width="1200px" :destroy-on-close="true" v-if="formData.is_use">
|
||||
<el-dialog v-model="daySignDialog" :title="t('daySignTitle')" width="1000px" :destroy-on-close="true" v-if="formData.is_use">
|
||||
<sign-day ref="benefitsRef" v-model="formData.day_award" />
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
@ -89,7 +89,7 @@
|
||||
</el-dialog>
|
||||
|
||||
<!-- 连签奖励 -->
|
||||
<el-dialog v-model="continueSignDialog" :title="t('continueSignTitle')" width="800px" :destroy-on-close="true" v-if="formData.is_use">
|
||||
<el-dialog v-model="continueSignDialog" :title="t('continueSignTitle')" width="1000px" :destroy-on-close="true" v-if="formData.is_use">
|
||||
<sign-continue ref="continueRef" v-model="continue_award" />
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
|
||||
<el-form :inline="true" :model="memberSignListTableData.searchParam" ref="searchFormRef">
|
||||
<el-form-item :label="t('memberInfo')" prop="keywords">
|
||||
<el-input v-model="memberSignListTableData.searchParam.keywords" class="w-[240px]" :placeholder="t('memberInfoPlaceholder')" />
|
||||
<el-input v-model.trim="memberSignListTableData.searchParam.keywords" class="w-[240px]" :placeholder="t('memberInfoPlaceholder')" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('createTime')" prop="create_time">
|
||||
<el-date-picker v-model="memberSignListTableData.searchParam.create_time" type="datetimerange" value-format="YYYY-MM-DD HH:mm:ss" :start-placeholder="t('startDate')" :end-placeholder="t('endDate')" />
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
<el-card class="box-card mt-[10px] !border-none table-search-wrap" shadow="never">
|
||||
<el-form :inline="true" :model="recordTable.searchParam" ref="searchFormRef">
|
||||
<el-form-item :label="t('verifyCode')" prop="code">
|
||||
<el-input v-model="recordTable.searchParam.code" :placeholder="t('verifyCodePlaceholder')" />
|
||||
<el-input v-model.trim="recordTable.searchParam.code" :placeholder="t('verifyCodePlaceholder')" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('verifyType')" prop="type">
|
||||
<el-select v-model="recordTable.searchParam.type" clearable :placeholder="t('verifyTypePlaceholder')" class="input-width">
|
||||
@ -64,6 +64,8 @@
|
||||
@size-change="loadRecordList()" @current-change="loadRecordList" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<verify-detail ref="verifyDetailDialog" />
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
@ -74,6 +76,7 @@ import { t } from '@/lang'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import { FormInstance } from 'element-plus'
|
||||
import { getVerifyRecord, getVerifyTypeList, getVerifierSelect } from '@/app/api/verify'
|
||||
import verifyDetail from '@/app/views/marketing/components/verify-detail.vue'
|
||||
import { img } from '@/utils/common'
|
||||
|
||||
const route = useRoute()
|
||||
@ -147,8 +150,10 @@ const resetForm = (formEl: FormInstance | undefined) => {
|
||||
}
|
||||
|
||||
// 详情
|
||||
let verifyDetailDialog: Record<string, any> | null = ref(null)
|
||||
const detailEvent = (data: any) => {
|
||||
router.push(`/marketing/verify/detail?code=${data.code}`)
|
||||
verifyDetailDialog.value.setFormData({code: data.code})
|
||||
verifyDetailDialog.value.showDialog = true
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
@ -46,7 +46,7 @@
|
||||
<el-form :inline="true" :model="memberAccountLogTableData.searchParam" ref="searchFormRef">
|
||||
|
||||
<el-form-item :label="t('memberInfo')" prop="keywords">
|
||||
<el-input v-model="memberAccountLogTableData.searchParam.keywords" class="w-[240px]" :placeholder="t('memberInfoPlaceholder')" />
|
||||
<el-input v-model.trim="memberAccountLogTableData.searchParam.keywords" class="w-[240px]" :placeholder="t('memberInfoPlaceholder')" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('balanceType')" prop="balance_type">
|
||||
|
||||
@ -55,7 +55,7 @@
|
||||
<el-card class="box-card !border-none mb-[10px] table-search-wrap" shadow="never">
|
||||
<el-form :inline="true" :model="memberAccountLogTableData.searchParam" ref="searchFormRef">
|
||||
<el-form-item :label="t('memberInfo')" prop="keywords">
|
||||
<el-input v-model="memberAccountLogTableData.searchParam.keywords" class="w-[240px]" :placeholder="t('memberInfoPlaceholder')" />
|
||||
<el-input v-model.trim="memberAccountLogTableData.searchParam.keywords" class="w-[240px]" :placeholder="t('memberInfoPlaceholder')" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('fromType')" prop="from_type">
|
||||
<el-select v-model="memberAccountLogTableData.searchParam.from_type" clearable :placeholder="t('fromTypePlaceholder')" class="input-width">
|
||||
|
||||
@ -3,22 +3,22 @@
|
||||
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
|
||||
|
||||
<el-form-item :label="t('memberNo')" prop="member_no">
|
||||
<el-input v-model="formData.member_no" clearable maxlength="20" :placeholder="t('memberNoPlaceholder')" class="input-width" />
|
||||
<el-input v-model.trim="formData.member_no" clearable maxlength="20" :placeholder="t('memberNoPlaceholder')" class="input-width" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('mobile')" prop="mobile">
|
||||
<el-input v-model="formData.mobile" clearable :placeholder="t('mobilePlaceholder')" @keyup="filterNumber($event)" class="input-width" />
|
||||
<el-input v-model.trim="formData.mobile" clearable :placeholder="t('mobilePlaceholder')" @keyup="filterNumber($event)" class="input-width" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('nickname')">
|
||||
<el-input v-model="formData.nickname" clearable :placeholder="t('nickNamePlaceholder')" class="input-width" maxlength="10" show-word-limit :readonly="nickname_name_input" @click="nickname_name_input = false" @blur="nickname_name_input = true" />
|
||||
<el-input v-model.trim="formData.nickname" clearable :placeholder="t('nickNamePlaceholder')" class="input-width" maxlength="10" show-word-limit :readonly="nickname_name_input" @click="nickname_name_input = false" @blur="nickname_name_input = true" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('password')" prop="password">
|
||||
<el-input v-model="formData.password" type="password" :placeholder="t('passwordPlaceholder')" clearable class="input-width" :show-password="true" :readonly="password_input" @click="password_input = false" @blur="password_input = true" />
|
||||
<el-input v-model.trim="formData.password" type="password" :placeholder="t('passwordPlaceholder')" clearable class="input-width" :show-password="true" :readonly="password_input" @click="password_input = false" @blur="password_input = true" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('passwordCopy')" prop="password_copy">
|
||||
<el-input v-model="formData.password_copy" type="password" :placeholder="t('passwordPlaceholder')" clearable class="input-width" :show-password="true" :readonly="password_copy_input" @click="password_copy_input = false" @blur="password_copy_input = true" />
|
||||
<el-input v-model.trim="formData.password_copy" type="password" :placeholder="t('passwordPlaceholder')" clearable class="input-width" :show-password="true" :readonly="password_copy_input" @click="password_copy_input = false" @blur="password_copy_input = true" />
|
||||
</el-form-item>
|
||||
|
||||
</el-form>
|
||||
|
||||
406
admin/src/app/views/member/components/detail-member.vue
Normal file
406
admin/src/app/views/member/components/detail-member.vue
Normal file
@ -0,0 +1,406 @@
|
||||
<template>
|
||||
<el-drawer v-model="showDialog" :title="popTitle" direction="rtl" :before-close="handleClose" class="member-detail-drawer">
|
||||
<div class="main-container" v-loading="loading">
|
||||
<div class="bg-page py-[20px] pr-[30px] relative flex">
|
||||
<div class="member-info w-[250px]">
|
||||
<div class="flex items-center">
|
||||
<div class="text-[14px] min-w-[110px] text-right mr-[20px]">{{ t('headimg') }}</div>
|
||||
<div class="flex items-end text-[14px]">
|
||||
<div class="w-[50px] h-[50px] flex items-center justify-center">
|
||||
<img class="max-w-[50px] max-h-[50px] inline-block" v-if="formData.headimg" :src="img(formData.headimg)" alt="">
|
||||
<img class="max-w-[50px] max-h-[50px] inline-block rounded-full" v-else src="@/app/assets/images/member_head.png" alt="">
|
||||
</div>
|
||||
<el-icon @click="editMemberInfo('headimg')" class="-bottom-[2px] -right-[4px] cursor-pointer">
|
||||
<EditPen color="#273CE2" />
|
||||
</el-icon>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-center mt-[20px]">
|
||||
<span class="text-[14px] min-w-[110px] text-right mr-[20px]">UID</span>
|
||||
<span class="member-info-item text-[14px] text-[#666666] font-bold w-[150px]">
|
||||
{{ formData.member_no || t('notAvailable') }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-1 justify-between">
|
||||
<div class="statistic-card">
|
||||
<el-statistic :value="formData.point">
|
||||
<template #title>
|
||||
<div style="display: inline-flex; align-items: center">
|
||||
<span class="text-[14px]">
|
||||
{{ t('point') }}
|
||||
</span>
|
||||
<el-tooltip effect="dark" :content="t('adjust')" placement="top">
|
||||
<el-icon @click="adjustPoint(formData)" class="ml-2 cursor-pointer" :size="12">
|
||||
<EditPen color="#273CE2" />
|
||||
</el-icon>
|
||||
</el-tooltip>
|
||||
<el-tooltip effect="dark" :content="t('detail')" placement="top">
|
||||
<el-icon @click="infoPoint(formData)" class="ml-2 cursor-pointer" :size="12">
|
||||
<View />
|
||||
</el-icon>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</template>
|
||||
</el-statistic>
|
||||
<div class="statistic-footer">
|
||||
<div class="footer-item text-[14px] text-secondary">
|
||||
<span>{{ t('accumulative') }}</span>
|
||||
<span class="green ml-1">
|
||||
{{ formData.point_get }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="statistic-card">
|
||||
<el-statistic :value="formData.balance">
|
||||
<template #title>
|
||||
<div style="display: inline-flex; align-items: center">
|
||||
<span class="text-[14px]">
|
||||
{{ t('balance') }}
|
||||
</span>
|
||||
<el-tooltip effect="dark" :content="t('adjust')" placement="top">
|
||||
<el-icon @click="adjustBalance(formData)" class="ml-2 cursor-pointer" :size="12">
|
||||
<EditPen color="#273CE2" />
|
||||
</el-icon>
|
||||
</el-tooltip>
|
||||
<el-tooltip effect="dark" :content="t('detail')" placement="top">
|
||||
<el-icon @click="infoBalance(formData)" class="ml-2 cursor-pointer" :size="12">
|
||||
<View />
|
||||
</el-icon>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</template>
|
||||
</el-statistic>
|
||||
<div class="statistic-footer">
|
||||
<div class="footer-item text-[14px] text-secondary">
|
||||
<span>{{ t('accumulative') }}</span>
|
||||
<span class="red ml-1">
|
||||
{{ formData.balance_get }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="statistic-card">
|
||||
<el-statistic :value="formData.growth">
|
||||
<template #title>
|
||||
<div style="display: inline-flex; align-items: center">
|
||||
<span class="text-[14px]">
|
||||
{{ t('growth') }}
|
||||
</span>
|
||||
<el-tooltip effect="dark" :content="t('detail')" placement="top">
|
||||
<el-icon @click="infoGrowth(formData)" class="ml-2 cursor-pointer" :size="12">
|
||||
<View />
|
||||
</el-icon>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</template>
|
||||
</el-statistic>
|
||||
</div>
|
||||
<div class="statistic-card">
|
||||
<el-statistic :value="formData.money" title="New transactions today">
|
||||
<template #title>
|
||||
<div style="display: inline-flex; align-items: center">
|
||||
<span class="text-[14px]">
|
||||
{{ t("money") }}
|
||||
</span>
|
||||
<el-tooltip effect="dark" :content="t('detail')" placement="top">
|
||||
<el-icon @click="infoBalance(formData)" class="ml-2 cursor-pointer" :size="12">
|
||||
<View />
|
||||
</el-icon>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</template>
|
||||
</el-statistic>
|
||||
<div class="statistic-footer">
|
||||
<div class="footer-item text-[14px] text-secondary">
|
||||
<span>{{ t('accumulative') }}</span>
|
||||
<span class="green ml-1">
|
||||
{{ formData.money_get }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="statistic-card">
|
||||
<el-statistic :value="formData.commission" title="New transactions today">
|
||||
<template #title>
|
||||
<div style="display: inline-flex; align-items: center ">
|
||||
<span class="text-[14px]">
|
||||
{{ t("commission") }}
|
||||
</span>
|
||||
<el-tooltip effect="dark" :content="t('detail')" placement="top">
|
||||
<el-icon @click="infoCommission(formData)" class="ml-2 cursor-pointer" :size="12">
|
||||
<View />
|
||||
</el-icon>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</template>
|
||||
</el-statistic>
|
||||
<div class="statistic-footer">
|
||||
<div class="footer-item text-[14px] text-secondary">
|
||||
<span>{{ t('accumulative') }}</span>
|
||||
<span class="green ml-1">
|
||||
{{ formData.commission_get }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-wrap mt-[20px]">
|
||||
<div class="flex items-center w-[33.3%] mt-[15px]">
|
||||
<span class="text-[14px] w-[130px] text-right flex-shrink-0 mr-[20px]">{{ t('urserName') }}</span>
|
||||
<span class="text-[14px] text-[#666666]">
|
||||
{{ formData.username || t('notAvailable') }}
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex mt-[15px] w-[33.3%] break-all leading-[21px]">
|
||||
<span class="text-[14px] w-[130px] text-right flex-shrink-0 mr-[20px]">{{ t('nickname') }}</span>
|
||||
<span class="text-[14px] text-[#666666]">
|
||||
{{ formData.nickname || t('notAvailable') }}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="flex mt-[15px] w-[33.3%] break-all leading-[21px]">
|
||||
<span class="text-[14px] w-[130px] text-right flex-shrink-0 mr-[20px]">{{ t('mobile') }}</span>
|
||||
<span class="text-[14px] text-[#666666]">
|
||||
{{ formData.mobile || t('notAvailable') }}
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex mt-[15px] w-[33.3%] break-all leading-[21px]">
|
||||
<span class="text-[14px] w-[130px] text-right flex-shrink-0 mr-[20px]">{{ t('memberLevel') }}</span>
|
||||
<span class="text-[14px] text-[#666666]">
|
||||
{{ formData.member_level_name || t('notAvailable') }}<el-icon @click="editMemberInfo('member_level')" class="-bottom-[2px] -right-[4px] cursor-pointer">
|
||||
<EditPen color="#273CE2" />
|
||||
</el-icon>
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex mt-[15px] w-[33.3%] break-all leading-[21px]">
|
||||
<span class="text-[14px] w-[130px] text-right flex-shrink-0 mr-[20px]">{{ t('memberLabel') }}</span>
|
||||
<span class="text-[14px] text-[#666666]">
|
||||
{{ formData.member_label_name&&formData.member_label_name.toString() || t('notAvailable') }}<el-icon @click="editMemberInfo('member_label')" class="-bottom-[2px] -right-[4px] cursor-pointer">
|
||||
<EditPen color="#273CE2" />
|
||||
</el-icon>
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex mt-[15px] w-[33.3%] break-all leading-[21px]">
|
||||
<span class="text-[14px] w-[130px] text-right flex-shrink-0 mr-[20px]">{{ t('birthday') }}</span>
|
||||
<span class="text-[14px] text-[#666666]">
|
||||
{{ formData.birthday || t('notAvailable') }}<el-icon @click="editMemberInfo('birthday')" class="-bottom-[2px] -right-[4px] cursor-pointer">
|
||||
<EditPen color="#273CE2" />
|
||||
</el-icon>
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex mt-[15px] w-[33.3%] break-all leading-[21px]">
|
||||
<span class="text-[14px] w-[130px] text-right flex-shrink-0 mr-[20px]">{{ t('sex') }}</span>
|
||||
<span class="text-[14px] text-[#666666]">
|
||||
{{ formData.sex == 1 && t('manSex') || formData.sex == 2 && t('girlSex') || t('secrecySex') }}<el-icon @click="editMemberInfo('sex')" class="-bottom-[2px] -right-[4px] cursor-pointer">
|
||||
<EditPen color="#273CE2" />
|
||||
</el-icon>
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex mt-[15px] w-[33.3%] break-all leading-[21px]">
|
||||
<span class="text-[14px] w-[130px] text-right flex-shrink-0 mr-[20px]">{{ t('wxUnionid') }}</span>
|
||||
<span class="text-[14px] text-[#666666]">
|
||||
{{ formData.wx_unionid || t('notAvailable') }}
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex mt-[15px] w-[33.3%] break-all leading-[21px]">
|
||||
<span class="text-[14px] w-[130px] text-right flex-shrink-0 mr-[20px]">{{ t('weappOpenid') }}</span>
|
||||
<span class="text-[14px] text-[#666666]">
|
||||
{{ formData.weapp_openid || t('notAvailable') }}
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex mt-[15px] w-[33.3%] break-all leading-[21px]">
|
||||
<span class="text-[14px] w-[130px] text-right flex-shrink-0 mr-[20px]">{{ t('wxOpenid') }}</span>
|
||||
<span class="text-[14px] text-[#666666]">
|
||||
{{ formData.wx_openid || t('notAvailable') }}
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex mt-[15px] w-[33.3%] break-all leading-[21px]">
|
||||
<span class="text-[14px] w-[130px] text-right flex-shrink-0 mr-[20px]">{{ t('registeredSource') }}</span>
|
||||
<span class="text-[14px] text-[#666666]">
|
||||
{{ formData.register_channel_name || t('notAvailable') }}
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex mt-[15px] w-[33.3%] break-all leading-[21px]">
|
||||
<span class="text-[14px] w-[130px] text-right flex-shrink-0 mr-[20px]">{{ t('createTime') }}</span>
|
||||
<span class="text-[14px] text-[#666666]">
|
||||
{{ formData.create_time || t('notAvailable') }}
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex mt-[15px] w-[33.3%] break-all leading-[21px]">
|
||||
<span class="text-[14px] w-[130px] text-right flex-shrink-0 mr-[20px]">{{ t('lastVisitTime') }}</span>
|
||||
<span class="text-[14px] text-[#666666]">
|
||||
{{ formData.last_visit_time || t('notAvailable') }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<point-edit ref="pointDialog" @complete="getMemberInfoFn" />
|
||||
<balance-edit ref="balanceDialog" @complete="getMemberInfoFn" />
|
||||
<edit-member ref="editMemberDialog" @complete="getMemberInfoFn()" />
|
||||
</el-drawer>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { reactive, ref, computed } from 'vue'
|
||||
import { t } from '@/lang'
|
||||
import { addMember, getMemberList, getMemberNo, getMemberInfo } from '@/app/api/member'
|
||||
import { FormInstance, ElMessage } from 'element-plus'
|
||||
import { ArrowLeft } from '@element-plus/icons-vue'
|
||||
import { useRouter, useRoute } from 'vue-router'
|
||||
import { img, filterNumber } from '@/utils/common'
|
||||
import PointEdit from '@/app/views/member/components/member-point-edit.vue'
|
||||
import BalanceEdit from '@/app/views/member/components/member-balance-edit.vue'
|
||||
import EditMember from '@/app/views/member/components/edit-member.vue'
|
||||
import useAppStore from '@/stores/modules/app'
|
||||
|
||||
const showDialog = ref(false)
|
||||
const loading = ref(false)
|
||||
const repeat = ref(false)
|
||||
let popTitle: string = '会员详情'
|
||||
let memberNo: string = ''
|
||||
let id = '';
|
||||
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const emit = defineEmits(['load'])
|
||||
|
||||
const nickname_name_input = ref(true)
|
||||
const password_input = ref(true)
|
||||
const password_copy_input = ref(true)
|
||||
|
||||
const handleClose = (done: () => void) => {
|
||||
showDialog.value = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 表单数据
|
||||
*/
|
||||
const initialFormData = {
|
||||
member_id: '',
|
||||
nickname: '',
|
||||
member_no: '',
|
||||
init_member_no: '',
|
||||
mobile: '',
|
||||
password: '',
|
||||
password_copy: ''
|
||||
}
|
||||
const formData: Record<string, any> = reactive({ ...initialFormData })
|
||||
|
||||
const formRef = ref<FormInstance>()
|
||||
|
||||
const pointDialog: Record<string, any> | null = ref(null)
|
||||
const balanceDialog: Record<string, any> | null = ref(null)
|
||||
const editMemberDialog: Record<string, any> | null = ref(null)
|
||||
|
||||
/**
|
||||
* 修改会员信息
|
||||
*/
|
||||
const editMemberInfo = (type: any) => {
|
||||
const data = ref({
|
||||
type,
|
||||
id,
|
||||
data: formData
|
||||
})
|
||||
editMemberDialog.value.setDialogType(data.value)
|
||||
editMemberDialog.value.showDialog = true
|
||||
}
|
||||
|
||||
/**
|
||||
* 调整积分
|
||||
*/
|
||||
const adjustPoint = (data: any) => {
|
||||
pointDialog.value.setFormData(data)
|
||||
pointDialog.value.showDialog = true
|
||||
}
|
||||
|
||||
/**
|
||||
* 调整余额
|
||||
*/
|
||||
const adjustBalance = (data: any) => {
|
||||
balanceDialog.value.setFormData(data)
|
||||
balanceDialog.value.showDialog = true
|
||||
}
|
||||
|
||||
/**
|
||||
* 积分详情
|
||||
*/
|
||||
const infoPoint = () => {
|
||||
router.push(`/member/point?id=${id}`)
|
||||
}
|
||||
|
||||
/**
|
||||
* 余额详情
|
||||
*/
|
||||
const infoBalance = () => {
|
||||
router.push(`/member/balance?id=${id}`)
|
||||
}
|
||||
|
||||
/**
|
||||
* 成长值明细
|
||||
*/
|
||||
const infoGrowth = () => {
|
||||
router.push(`/member/growth?id=${id}`)
|
||||
}
|
||||
|
||||
/**
|
||||
* 佣金详情
|
||||
*/
|
||||
const infoCommission = () => {
|
||||
router.push(`/member/commission?id=${id}`)
|
||||
}
|
||||
|
||||
const getMemberInfoFn = async (bool=false) => {
|
||||
loading.value = true
|
||||
if (id) {
|
||||
const data = await (await getMemberInfo(id)).data
|
||||
if (!data || Object.keys(data).length == 0) {
|
||||
ElMessage.error(t('memberNull'))
|
||||
setTimeout(() => {
|
||||
router.go(-1)
|
||||
}, 2000)
|
||||
return false
|
||||
}
|
||||
|
||||
Object.keys(data).forEach((item) => {
|
||||
formData[item] = data[item]
|
||||
})
|
||||
|
||||
if (formData?.member_label_array && Object.keys(formData.member_label_array)?.length) {
|
||||
formData.member_label = Object.values(formData.member_label_array).map((item: any, index) => {
|
||||
return item.label_id
|
||||
})
|
||||
|
||||
formData.member_label_name = Object.values(formData.member_label_array).map((item: any, index) => {
|
||||
return item.label_name
|
||||
})
|
||||
}
|
||||
loading.value = false
|
||||
} else {
|
||||
loading.value = false
|
||||
}
|
||||
if(!bool){
|
||||
emit('load');
|
||||
}
|
||||
}
|
||||
|
||||
const setFormData = async (row: any = null) => {
|
||||
id = row.id;
|
||||
Object.assign(formData, initialFormData)
|
||||
getMemberInfoFn(true);
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
showDialog,
|
||||
setFormData
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.member-detail-drawer{
|
||||
width: 1000px !important;
|
||||
}
|
||||
</style>
|
||||
@ -6,7 +6,7 @@
|
||||
<upload-image v-model="saveData.headimg" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('nickname')" v-if="type == 'nickname'">
|
||||
<el-input v-model="saveData.nickname" clearable :placeholder="t('nickNamePlaceholder')" class="input-width" />
|
||||
<el-input v-model.trim="saveData.nickname" clearable :placeholder="t('nickNamePlaceholder')" class="input-width" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('birthday')" v-if="type == 'birthday'">
|
||||
<el-date-picker v-model="saveData.birthday" value-format="YYYY-MM-DD" type="date" :placeholder="t('birthdayTip')" />
|
||||
|
||||
@ -18,7 +18,7 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('memo')" prop="memo">
|
||||
<el-input v-model="formData.memo" type="textarea" rows="4" clearable :placeholder="t('memoPlaceholder')" class="input-width"/>
|
||||
<el-input v-model.trim="formData.memo" type="textarea" rows="4" clearable :placeholder="t('memoPlaceholder')" class="input-width"/>
|
||||
</el-form-item>
|
||||
|
||||
</el-form>
|
||||
|
||||
@ -18,7 +18,7 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('memo')" prop="memo">
|
||||
<el-input v-model="formData.memo" type="textarea" rows="4" clearable :placeholder="t('memoPlaceholder')" class="input-width"/>
|
||||
<el-input v-model.trim="formData.memo" type="textarea" rows="4" clearable :placeholder="t('memoPlaceholder')" class="input-width"/>
|
||||
</el-form-item>
|
||||
|
||||
</el-form>
|
||||
|
||||
@ -93,7 +93,7 @@ import { useRouter, useRoute } from 'vue-router'
|
||||
const route = useRoute()
|
||||
const pageName = route.meta.title
|
||||
|
||||
const memberId: number = parseInt(route.query.id || 0)
|
||||
const member_id: number = parseInt(route.query.id || 0)
|
||||
|
||||
const memberAccountLogTableData = reactive({
|
||||
page: 1,
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
<el-card class="box-card !border-none my-[20px] table-search-wrap" shadow="never">
|
||||
<el-form :inline="true" :model="memberTableData.searchParam" ref="searchFormRef">
|
||||
<el-form-item :label="t('memberInfo')" prop="keyword">
|
||||
<el-input v-model="memberTableData.searchParam.keyword" class="w-[240px]" :placeholder="t('memberInfoPlaceholder')" />
|
||||
<el-input v-model.trim="memberTableData.searchParam.keyword" class="w-[240px]" :placeholder="t('memberInfoPlaceholder')" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('registerChannel')" prop="register_channel">
|
||||
@ -56,8 +56,10 @@
|
||||
<el-table-column prop="nickname" :show-overflow-tooltip="true" :label="t('memberInfo')" min-width="170">
|
||||
<template #default="{ row }">
|
||||
<div class="flex items-center">
|
||||
<img class="w-[50px] h-[50px] mr-[10px]" v-if="row.headimg" :src="img(row.headimg)" alt="">
|
||||
<img class="w-[50px] h-[50px] mr-[10px] rounded-full" v-else src="@/app/assets/images/member_head.png" alt="">
|
||||
<div class="mr-[10px] rounded-full w-[50px] h-[50px] flex items-center justify-center">
|
||||
<img class="max-w-[50px] max-h-[50px]" v-if="row.headimg" :src="img(row.headimg)" alt="">
|
||||
<img class="max-w-[50px] max-h-[50px]" v-else src="@/app/assets/images/member_head.png" alt="">
|
||||
</div>
|
||||
<div class="flex flex flex-col">
|
||||
<span>{{ row.nickname || '' }}</span>
|
||||
</div>
|
||||
@ -122,6 +124,7 @@
|
||||
<add-member ref="addMemberDialog" @complete="loadMemberList()" />
|
||||
<edit-member ref="editMemberDialog" @complete="loadMemberList()" />
|
||||
<export-sure ref="exportSureDialog" :show="flag" type="member" :searchParam="memberTableData.searchParam" @close="handleClose" />
|
||||
<detail-member ref="detailMemberDialog" @load="loadMemberList()"></detail-member>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
@ -134,6 +137,7 @@ import { getRegisterChannelType, getMemberList, getMemberLabelAll, editMemberSta
|
||||
import { ElMessageBox, FormInstance } from 'element-plus'
|
||||
import { useRouter, useRoute } from 'vue-router'
|
||||
import AddMember from '@/app/views/member/components/add-member.vue'
|
||||
import detailMember from '@/app/views/member/components/detail-member.vue'
|
||||
import EditMember from '@/app/views/member/components/edit-member.vue'
|
||||
|
||||
const route = useRoute()
|
||||
@ -204,6 +208,7 @@ loadMemberList()
|
||||
const router = useRouter()
|
||||
const addMemberDialog: Record<string, any> | null = ref(null)
|
||||
const editMemberDialog: Record<string, any> | null = ref(null)
|
||||
const detailMemberDialog: Record<string, any> | null = ref(null)
|
||||
|
||||
/**
|
||||
* 设置标签
|
||||
@ -254,8 +259,10 @@ const editEvent = (data: any) => { }
|
||||
/**
|
||||
* 会员详情
|
||||
*/
|
||||
const detailEvent = (data: any) => {
|
||||
router.push(`/member/detail?id=${data.member_id}`)
|
||||
const detailEvent = (res: any) => {
|
||||
let data = {id: res.member_id};
|
||||
detailMemberDialog.value.setFormData(data);
|
||||
detailMemberDialog.value.showDialog = true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
<el-card class="box-card !border-none mb-[10px] table-search-wrap" shadow="never">
|
||||
<el-form :inline="true" :model="memberAccountLogTableData.searchParam" ref="searchFormRef">
|
||||
<el-form-item :label="t('memberInfo')" prop="keywords">
|
||||
<el-input v-model="memberAccountLogTableData.searchParam.keywords" class="w-[240px]" :placeholder="t('memberInfoPlaceholder')" />
|
||||
<el-input v-model.trim="memberAccountLogTableData.searchParam.keywords" class="w-[240px]" :placeholder="t('memberInfoPlaceholder')" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('fromType')" prop="from_type">
|
||||
<el-select v-model="memberAccountLogTableData.searchParam.from_type" clearable :placeholder="t('fromTypePlaceholder')" class="input-width">
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
|
||||
<el-form :inline="true" :model="posterTableData.searchParam" ref="searchFormDiyPosterRef">
|
||||
<el-form-item :label="t('posterName')" prop="name">
|
||||
<el-input v-model="posterTableData.searchParam.name" :placeholder="t('posterNamePlaceholder')" />
|
||||
<el-input v-model.trim="posterTableData.searchParam.name" :placeholder="t('posterNamePlaceholder')" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('posterType')" prop="type">
|
||||
<el-select v-model="posterTableData.searchParam.type" :placeholder="t('posterTypePlaceholder')">
|
||||
@ -70,7 +70,7 @@
|
||||
|
||||
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules">
|
||||
<el-form-item :label="t('posterName')" prop="name">
|
||||
<el-input v-model="formData.name" :placeholder="t('posterNamePlaceholder')" clearable maxlength="12" show-word-limit class="w-full" />
|
||||
<el-input v-model.trim="formData.name" :placeholder="t('posterNamePlaceholder')" clearable maxlength="12" show-word-limit class="w-full" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('posterType')" prop="type">
|
||||
<el-select v-model="formData.type" :placeholder="t('posterTypePlaceholder')" class="!w-full">
|
||||
|
||||
@ -17,7 +17,7 @@
|
||||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
|
||||
<el-form :inline="true" :model="printerTemplateTable.searchParam" ref="searchFormRef">
|
||||
<el-form-item :label="t('templateName')" prop="template_name">
|
||||
<el-input v-model="printerTemplateTable.searchParam.template_name" :placeholder="t('templateNamePlaceholder')" />
|
||||
<el-input v-model.trim="printerTemplateTable.searchParam.template_name" :placeholder="t('templateNamePlaceholder')" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('templateType')" prop="template_type">
|
||||
<el-select v-model="printerTemplateTable.searchParam.template_type" :placeholder="t('templateTypePlaceholder')" clearable>
|
||||
|
||||
@ -15,11 +15,11 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('cashWithdrawalAmount')" v-if="formData.is_open" prop="min">
|
||||
<el-input v-model="formData.min" @keyup="filterDigit($event)" class="input-width" :placeholder="t('cashWithdrawalAmountPlaceholder')" />
|
||||
<el-input v-model.trim="formData.min" @keyup="filterDigit($event)" class="input-width" :placeholder="t('cashWithdrawalAmountPlaceholder')" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('commissionRatio')" v-if="formData.is_open" prop="rate">
|
||||
<el-input v-model="formData.rate" @keyup="filterDigit($event)" class="input-width" :placeholder="t('commissionRatioPlaceholder')" />
|
||||
<el-input v-model.trim="formData.rate" @keyup="filterDigit($event)" class="input-width" :placeholder="t('commissionRatioPlaceholder')" />
|
||||
<span class="ml-2">%</span>
|
||||
</el-form-item>
|
||||
|
||||
|
||||
@ -17,7 +17,7 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('smsId')" prop="sms_id">
|
||||
<el-input v-model="formData.sms_id" :placeholder="t('smsIdPlaceholder')" class="input-width" show-word-limit clearable />
|
||||
<el-input v-model.trim="formData.sms_id" :placeholder="t('smsIdPlaceholder')" class="input-width" show-word-limit clearable />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('smsContent')">
|
||||
|
||||
@ -21,7 +21,7 @@
|
||||
</el-form-item>
|
||||
|
||||
<!-- <el-form-item :label="t('first')" prop="first">-->
|
||||
<!-- <el-input v-model="formData.wechat_first" :placeholder="t('firstPlaceholder')" class="input-width" show-word-limit clearable />-->
|
||||
<!-- <el-input v-model.trim="formData.wechat_first" :placeholder="t('firstPlaceholder')" class="input-width" show-word-limit clearable />-->
|
||||
<!-- </el-form-item>-->
|
||||
|
||||
<el-form-item :label="t('content')">
|
||||
@ -31,7 +31,7 @@
|
||||
</el-form-item>
|
||||
|
||||
<!-- <el-form-item :label="t('remark')" prop="remark">-->
|
||||
<!-- <el-input v-model="formData.wechat_remark" :placeholder="t('remarkPlaceholder')" class="input-width" show-word-limit clearable />-->
|
||||
<!-- <el-input v-model.trim="formData.wechat_remark" :placeholder="t('remarkPlaceholder')" class="input-width" show-word-limit clearable />-->
|
||||
<!-- </el-form-item>-->
|
||||
|
||||
</el-form>
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
<div class="form-tip">{{ t('appIdTips') }}</div>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('appSecretCert')" prop="config.app_secret_cert">
|
||||
<el-input v-model="formData.config.app_secret_cert" :placeholder="t('appSecretCertPlaceholder')" class="input-width" type="textarea" rows="4" clearable />
|
||||
<el-input v-model.trim="formData.config.app_secret_cert" :placeholder="t('appSecretCertPlaceholder')" class="input-width" type="textarea" rows="4" clearable />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('appPublicCertPath')" prop="config.app_public_cert_path">
|
||||
|
||||
@ -3,19 +3,19 @@
|
||||
<el-form :model="formData" label-width="110px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
|
||||
|
||||
<el-form-item :label="t('collectionName')" prop="config.collection_name">
|
||||
<el-input v-model="formData.config.collection_name" :placeholder="t('collectionNamePlaceholder')" class="input-width" show-word-limit clearable />
|
||||
<el-input v-model.trim="formData.config.collection_name" :placeholder="t('collectionNamePlaceholder')" class="input-width" show-word-limit clearable />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('collectionBank')" prop="config.collection_bank">
|
||||
<el-input v-model="formData.config.collection_bank" :placeholder="t('collectionBankPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.config.collection_bank" :placeholder="t('collectionBankPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('collectionAccount')" prop="config.collection_account">
|
||||
<el-input v-model="formData.config.collection_account" :placeholder="t('collectionAccountPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.config.collection_account" :placeholder="t('collectionAccountPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('collectionDesc')" prop="config.collection_desc">
|
||||
<el-input v-model="formData.config.collection_desc" :placeholder="t('collectionDescPlaceholder')" class="input-width" type="textarea" rows="4" clearable />
|
||||
<el-input v-model.trim="formData.config.collection_desc" :placeholder="t('collectionDescPlaceholder')" class="input-width" type="textarea" rows="4" clearable />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<el-dialog v-model="showDialog" :title="t('updateWechat')" width="500px" :destroy-on-close="true">
|
||||
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
|
||||
<el-form :model="formData" label-width="140px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
|
||||
|
||||
<el-form-item :label="t('mchId')" prop="config.mch_id">
|
||||
<el-input v-model.trim="formData.config.mch_id" :placeholder="t('mchIdPlaceholder')" class="input-width" maxlength="32" show-word-limit clearable />
|
||||
@ -26,6 +26,35 @@
|
||||
<div class="form-tip">{{ t('mchPublicCertPathTips') }}</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('jsapiDir')" v-show="formData.channel == 'wechat' || formData.channel == 'weapp'">
|
||||
<el-input :model-value="wapDomain + '/'" placeholder="Please input" class="input-width" :readonly="true" :disabled="true">
|
||||
<template #append>
|
||||
<div class="cursor-pointer" @click="copyEvent(wapDomain + '/')">{{ t('copy') }}
|
||||
</div>
|
||||
</template>
|
||||
</el-input>
|
||||
<div class="form-tip !leading-normal">{{ t('jsapiDirTips') }}</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('h5Domain')" v-show="formData.channel == 'h5'">
|
||||
<el-input :model-value="wapDomain.replace('http://', '').replace('https://', '')" placeholder="Please input" class="input-width" :readonly="true" :disabled="true">
|
||||
<template #append>
|
||||
<div class="cursor-pointer" @click="copyEvent(wapDomain.replace('http://', '').replace('https://', ''))">{{ t('copy') }}
|
||||
</div>
|
||||
</template>
|
||||
</el-input>
|
||||
<div class="form-tip !leading-normal">{{ t('h5DomainTips') }}</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('nativeDomain')" v-show="formData.channel == 'pc'">
|
||||
<el-input :model-value="serviceDomain" placeholder="Please input" class="input-width" :readonly="true" :disabled="true">
|
||||
<template #append>
|
||||
<div class="cursor-pointer" @click="copyEvent(serviceDomain)">{{ t('copy') }}
|
||||
</div>
|
||||
</template>
|
||||
</el-input>
|
||||
<div class="form-tip !leading-normal">{{ t('nativeDomainTips') }}</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
@ -38,13 +67,22 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { ref, reactive, computed } from 'vue'
|
||||
import { ref, reactive, computed, watch } from 'vue'
|
||||
import { t } from '@/lang'
|
||||
import type { FormInstance } from 'element-plus'
|
||||
import { FormInstance, ElMessage } from 'element-plus'
|
||||
import Test from '@/utils/test'
|
||||
import { getUrl } from '@/app/api/sys'
|
||||
import { useClipboard } from '@vueuse/core'
|
||||
|
||||
const showDialog = ref(false)
|
||||
const loading = ref(true)
|
||||
const wapDomain = ref('')
|
||||
const serviceDomain = ref('')
|
||||
|
||||
getUrl().then((res: any) => {
|
||||
wapDomain.value = res.data.wap_domain
|
||||
serviceDomain.value = res.data.service_domain
|
||||
})
|
||||
|
||||
/**
|
||||
* 表单数据
|
||||
@ -118,6 +156,30 @@ const enableVerify = () => {
|
||||
return verify
|
||||
}
|
||||
|
||||
/**
|
||||
* 复制
|
||||
*/
|
||||
const { copy, isSupported, copied } = useClipboard()
|
||||
const copyEvent = (text: string) => {
|
||||
if (!isSupported.value) {
|
||||
ElMessage({
|
||||
message: t('notSupportCopy'),
|
||||
type: 'warning'
|
||||
})
|
||||
return
|
||||
}
|
||||
copy(text)
|
||||
}
|
||||
|
||||
watch(copied, () => {
|
||||
if (copied.value) {
|
||||
ElMessage({
|
||||
message: t('copySuccess'),
|
||||
type: 'success'
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
defineExpose({
|
||||
showDialog,
|
||||
setFormData,
|
||||
|
||||
@ -9,25 +9,25 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('aliBucket')" prop="bucket">
|
||||
<el-input v-model="formData.bucket" :placeholder="t('aliBucketPlaceholder')" class="input-width" show-word-limit clearable />
|
||||
<el-input v-model.trim="formData.bucket" :placeholder="t('aliBucketPlaceholder')" class="input-width" show-word-limit clearable />
|
||||
<div class="form-tip">{{ t('aliBucketTips') }}</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('aliAccessKey')" prop="access_key">
|
||||
<el-input v-model="formData.access_key" :placeholder="t('aliAccessKeyPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.access_key" :placeholder="t('aliAccessKeyPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('aliSecretKey')" prop="secret_key">
|
||||
<el-input v-model="formData.secret_key" :placeholder="t('aliSecretKeyPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.secret_key" :placeholder="t('aliSecretKeyPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('aliEndpoint')" prop="endpoint">
|
||||
<el-input v-model="formData.endpoint" :placeholder="t('aliEndpointPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.endpoint" :placeholder="t('aliEndpointPlaceholder')" class="input-width" clearable />
|
||||
<div class="form-tip">{{ t('aliEndpointTips') }}</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('domain')" prop="domain">
|
||||
<el-input v-model="formData.domain" :placeholder="t('domainPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.domain" :placeholder="t('domainPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
|
||||
</el-form>
|
||||
|
||||
@ -9,20 +9,20 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('qiniuBucket')" prop="bucket">
|
||||
<el-input v-model="formData.bucket" :placeholder="t('qiniuBucketPlaceholder')" class="input-width" show-word-limit clearable />
|
||||
<el-input v-model.trim="formData.bucket" :placeholder="t('qiniuBucketPlaceholder')" class="input-width" show-word-limit clearable />
|
||||
<div class="form-tip">{{ t('qiniuBucketTips') }}</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('qiniuAccessKey')" prop="access_key">
|
||||
<el-input v-model="formData.access_key" :placeholder="t('qiniuAccessKeyPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.access_key" :placeholder="t('qiniuAccessKeyPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('qiniuSecretKey')" prop="secret_key">
|
||||
<el-input v-model="formData.secret_key" :placeholder="t('qiniuSecretKeyPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.secret_key" :placeholder="t('qiniuSecretKeyPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('domain')" prop="domain">
|
||||
<el-input v-model="formData.domain" :placeholder="t('domainPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.domain" :placeholder="t('domainPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
|
||||
</el-form>
|
||||
|
||||
@ -9,24 +9,24 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('tencentBucket')" prop="bucket">
|
||||
<el-input v-model="formData.bucket" :placeholder="t('tencentBucketPlaceholder')" class="input-width" show-word-limit clearable />
|
||||
<el-input v-model.trim="formData.bucket" :placeholder="t('tencentBucketPlaceholder')" class="input-width" show-word-limit clearable />
|
||||
<div class="form-tip">{{ t('tencentBucketTips') }}</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('tencentAccessKey')" prop="access_key">
|
||||
<el-input v-model="formData.access_key" :placeholder="t('tencentAccessKeyPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.access_key" :placeholder="t('tencentAccessKeyPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('tencentSecretKey')" prop="secret_key">
|
||||
<el-input v-model="formData.secret_key" :placeholder="t('tencentSecretKeyPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.secret_key" :placeholder="t('tencentSecretKeyPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('region')" prop="region">
|
||||
<el-input v-model="formData.region" :placeholder="t('regionPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.region" :placeholder="t('regionPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('domain')" prop="domain">
|
||||
<el-input v-model="formData.domain" :placeholder="t('domainPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.domain" :placeholder="t('domainPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
|
||||
</el-form>
|
||||
|
||||
@ -9,13 +9,13 @@
|
||||
<upload-image v-model="formData.logo" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('companyName')" prop="company_name">
|
||||
<el-input v-model="formData.company_name" :placeholder="t('companyNamePlaceholder')" class="input-width" clearable maxlength="30"/>
|
||||
<el-input v-model.trim="formData.company_name" :placeholder="t('companyNamePlaceholder')" class="input-width" clearable maxlength="30"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('copyrightLink')" >
|
||||
<el-input v-model="formData.copyright_link" :placeholder="t('copyrightLinkPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.copyright_link" :placeholder="t('copyrightLinkPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('copyrightDesc')" >
|
||||
<el-input v-model="formData.copyright_desc" type="textarea" rows="4" clearable :placeholder="t('copyrightDescPlaceholder')" class="input-width" maxlength="150" />
|
||||
<el-input v-model.trim="formData.copyright_desc" type="textarea" rows="4" clearable :placeholder="t('copyrightDescPlaceholder')" class="input-width" maxlength="150" />
|
||||
</el-form-item>
|
||||
</el-card>
|
||||
|
||||
@ -23,16 +23,16 @@
|
||||
<h3 class="panel-title !text-sm">{{ t('putOnRecordEdit') }}</h3>
|
||||
|
||||
<el-form-item :label="t('icp')" prop="icp">
|
||||
<el-input v-model="formData.icp" :placeholder="t('icpPlaceholder')" class="input-width" clearable maxlength="20"/>
|
||||
<el-input v-model.trim="formData.icp" :placeholder="t('icpPlaceholder')" class="input-width" clearable maxlength="20"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('govRecord')" >
|
||||
<el-input v-model="formData.gov_record" :placeholder="t('govRecordPlaceholder')" class="input-width" clearable maxlength="50"/>
|
||||
<el-input v-model.trim="formData.gov_record" :placeholder="t('govRecordPlaceholder')" class="input-width" clearable maxlength="50"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('govUrl')" >
|
||||
<el-input v-model="formData.gov_url" :placeholder="t('govUrlPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.gov_url" :placeholder="t('govUrlPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('marketSupervisionUrl')" >
|
||||
<el-input v-model="formData.market_supervision_url" rows="4" clearable :placeholder="t('marketSupervisionUrlPlaceholder')" class="input-width" />
|
||||
<el-input v-model.trim="formData.market_supervision_url" rows="4" clearable :placeholder="t('marketSupervisionUrlPlaceholder')" class="input-width" />
|
||||
</el-form-item>
|
||||
</el-card>
|
||||
</el-form>
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
<el-form-item label="" prop="token">
|
||||
<div>
|
||||
<el-input v-model="formData.token" :placeholder="t('tokenPlaceholder')" class="input-width" clearable maxlength="30"/>
|
||||
<el-input v-model.trim="formData.token" :placeholder="t('tokenPlaceholder')" class="input-width" clearable maxlength="30"/>
|
||||
</div>
|
||||
<div class="text-[14px] text-[#a9a9a9] leading-tight mt-[10px]">{{ t('tokenTips') }}</div>
|
||||
</el-form-item>
|
||||
|
||||
@ -41,7 +41,7 @@
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('desc')">
|
||||
<el-input v-model="formData.desc" :placeholder="t('descPlaceholder')" class="input-width" clearable maxlength="20" show-word-limit />
|
||||
<el-input v-model.trim="formData.desc" :placeholder="t('descPlaceholder')" class="input-width" clearable maxlength="20" show-word-limit />
|
||||
</el-form-item>
|
||||
|
||||
</el-card>
|
||||
|
||||
@ -38,11 +38,11 @@ import { t } from '@/lang'
|
||||
import { setMap, getMap } from '@/app/api/sys'
|
||||
import { FormInstance } from 'element-plus'
|
||||
|
||||
const loading = ref(false)
|
||||
const loading = ref(true)
|
||||
const formRef = ref<FormInstance>()
|
||||
const formData = reactive({
|
||||
key: '',
|
||||
is_open: 1,
|
||||
is_open: 0,
|
||||
valid_time: 0
|
||||
})
|
||||
|
||||
@ -69,8 +69,12 @@ const formRules = computed(() => {
|
||||
});
|
||||
|
||||
const setFormData = async () => {
|
||||
loading.value = true
|
||||
const service_data = await (await getMap()).data
|
||||
formData.key = service_data.key
|
||||
formData.is_open = service_data.is_open
|
||||
formData.valid_time = service_data.valid_time
|
||||
loading.value = false
|
||||
}
|
||||
setFormData()
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
<h3 class="panel-title !text-sm">{{ t('memberNoRule') }}</h3>
|
||||
|
||||
<el-form-item :label="t('prefix')" prop="prefix">
|
||||
<el-input v-model="formData.prefix" :placeholder="t('prefixPlaceholder')" class="input-width" clearable maxlength="20" @change="getMemberNo(ruleFormRef)"/>
|
||||
<el-input v-model.trim="formData.prefix" :placeholder="t('prefixPlaceholder')" class="input-width" clearable maxlength="20" @change="getMemberNo(ruleFormRef)"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('length')" prop="length">
|
||||
<el-input v-model.trim="formData.length" :placeholder="t('lengthPlaceholder')" class="input-width" clearable @keyup="filterNumber($event)" @change="getMemberNo(ruleFormRef)" @blur="formData.length = $event.target.value"/>
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
|
||||
<el-form :inline="true" :model="recordsTableData.searchParam" ref="searchFormRef">
|
||||
<el-form-item :label="t('searchReceiver')" prop="receiver">
|
||||
<el-input v-model="recordsTableData.searchParam.receiver" :placeholder="t('receiverPlaceholder')" />
|
||||
<el-input v-model.trim="recordsTableData.searchParam.receiver" :placeholder="t('receiverPlaceholder')" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('noticeKey')" prop="key">
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
|
||||
<el-form :inline="true" :model="recordsTableData.searchParam" ref="searchFormRef">
|
||||
<el-form-item :label="t('searchReceiver')" prop="mobile">
|
||||
<el-input v-model="recordsTableData.searchParam.mobile" :placeholder="t('receiverPlaceholder')" />
|
||||
<el-input v-model.trim="recordsTableData.searchParam.mobile" :placeholder="t('receiverPlaceholder')" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('noticeKey')" prop="key">
|
||||
|
||||
@ -21,20 +21,20 @@
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('keywords')">
|
||||
<el-input v-model="formData.keywords" :placeholder="t('keywordsPlaceholder')" class="input-width" clearable maxlength="20" show-word-limit />
|
||||
<el-input v-model.trim="formData.keywords" :placeholder="t('keywordsPlaceholder')" class="input-width" clearable maxlength="20" show-word-limit />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('desc')">
|
||||
<el-input v-model="formData.desc" type="textarea" :rows="4" clearable :placeholder="t('descPlaceholder')" class="input-width" maxlength="100" show-word-limit />
|
||||
<el-input v-model.trim="formData.desc" type="textarea" :rows="4" clearable :placeholder="t('descPlaceholder')" class="input-width" maxlength="100" show-word-limit />
|
||||
</el-form-item>
|
||||
</el-card>
|
||||
|
||||
<el-card class="box-card mt-[15px] !border-none" shadow="never" v-show="appType == 'site'">
|
||||
<h3 class="panel-title !text-sm">{{ t('frontEndInfo') }}</h3>
|
||||
<el-form-item :label="t('frontEndName')">
|
||||
<el-input v-model="formData.front_end_name" :placeholder="t('frontEndNamePlaceholder')" class="input-width" clearable maxlength="20" show-word-limit />
|
||||
<el-input v-model.trim="formData.front_end_name" :placeholder="t('frontEndNamePlaceholder')" class="input-width" clearable maxlength="20" show-word-limit />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('phone')">
|
||||
<el-input v-model="formData.phone" :placeholder="t('phonePlaceholder')" class="input-width" clearable maxlength="20" show-word-limit />
|
||||
<el-input v-model.trim="formData.phone" :placeholder="t('phonePlaceholder')" class="input-width" clearable maxlength="20" show-word-limit />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('logo')">
|
||||
<upload-image v-model="formData.front_end_logo" />
|
||||
@ -48,7 +48,7 @@
|
||||
<h3 class="panel-title !text-sm">{{ t('serviceInformation') }}</h3>
|
||||
|
||||
<el-form-item :label="t('contactsTel')">
|
||||
<el-input v-model="formData.tel" :placeholder="t('contactsTelPlaceholder')" class="input-width" clearable maxlength="20" show-word-limit />
|
||||
<el-input v-model.trim="formData.tel" :placeholder="t('contactsTelPlaceholder')" class="input-width" clearable maxlength="20" show-word-limit />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('wechatCode')">
|
||||
<upload-image v-model="formData.wechat_code" />
|
||||
|
||||
@ -17,11 +17,11 @@
|
||||
<h3 class="panel-title !text-sm">{{t('wechatpay')}}</h3>
|
||||
|
||||
<el-form-item :label="t('mchId')" prop="wechatpay_config.mch_id">
|
||||
<el-input v-model="formData.wechatpay_config.mch_id" :placeholder="t('mchIdPlaceholder')" class="input-width" maxlength="32" show-word-limit clearable />
|
||||
<el-input v-model.trim="formData.wechatpay_config.mch_id" :placeholder="t('mchIdPlaceholder')" class="input-width" maxlength="32" show-word-limit clearable />
|
||||
<div class="form-tip">{{ t('mchIdTips') }}</div>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('mchSecretKey')" prop="wechatpay_config.mch_secret_key">
|
||||
<el-input v-model="formData.wechatpay_config.mch_secret_key" :placeholder="t('mchSecretKeyPlaceholder')" class="input-width" maxlength="32" show-word-limit clearable />
|
||||
<el-input v-model.trim="formData.wechatpay_config.mch_secret_key" :placeholder="t('mchSecretKeyPlaceholder')" class="input-width" maxlength="32" show-word-limit clearable />
|
||||
<div class="form-tip">{{ t('mchSecretKeyTips') }}</div>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('mchSecretCert')" prop="wechatpay_config.mch_secret_cert">
|
||||
@ -42,11 +42,11 @@
|
||||
<h3 class="panel-title !text-sm">{{t('alipay')}}</h3>
|
||||
|
||||
<el-form-item :label="t('appId')" prop="alipay_config.app_id">
|
||||
<el-input v-model="formData.alipay_config.app_id" :placeholder="t('appIdPlaceholder')" class="input-width" maxlength="32" show-word-limit clearable />
|
||||
<el-input v-model.trim="formData.alipay_config.app_id" :placeholder="t('appIdPlaceholder')" class="input-width" maxlength="32" show-word-limit clearable />
|
||||
<div class="form-tip">{{ t('appIdTips') }}</div>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('appSecretCert')" prop="alipay_config.app_secret_cert">
|
||||
<el-input v-model="formData.alipay_config.app_secret_cert" :placeholder="t('appSecretCertPlaceholder')" class="input-width" type="textarea" rows="4" clearable />
|
||||
<el-input v-model.trim="formData.alipay_config.app_secret_cert" :placeholder="t('appSecretCertPlaceholder')" class="input-width" type="textarea" rows="4" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('appPublicCertPath')" prop="alipay_config.app_public_cert_path">
|
||||
<div class="input-width">
|
||||
|
||||
@ -36,13 +36,13 @@
|
||||
<el-dialog v-model="showDialog" :title="t('editVersion')" width="550px" :destroy-on-close="true">
|
||||
<el-form :model="formData" label-width="110px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
|
||||
<el-form-item :label="t('version')" prop="version">
|
||||
<el-input v-model="formData.version" :placeholder="t('versionPlaceholder')" class="input-width" />
|
||||
<el-input v-model.trim="formData.version" :placeholder="t('versionPlaceholder')" class="input-width" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('file')" prop="path">
|
||||
<upload-file v-model="formData.path" class="input-width" api="applet/upload" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('desc')">
|
||||
<el-input type="textarea" v-model="formData.desc" class="input-width" clearable></el-input>
|
||||
<el-input type="textarea" v-model.trim="formData.desc" class="input-width" clearable></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
|
||||
@ -8,12 +8,12 @@
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('createSiteNum')" prop="num">
|
||||
<div>
|
||||
<el-input v-model.number="formData.num" class="!w-[150px]"/>
|
||||
<el-input v-model.number.trim="formData.num" class="!w-[150px]"/>
|
||||
<p class="text-[12px] text-[#a9a9a9] leading-normal mt-[5px]" v-if="formData.group_id">{{ t('createdSiteNum') }}:{{ props.siteGroup[formData.group_id].site_num }}</p>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('createSiteTimeLimit')" prop="month">
|
||||
<el-input v-model.number="formData.month" class="!w-[150px]">
|
||||
<el-input v-model.number.trim="formData.month" class="!w-[150px]">
|
||||
<template #append>
|
||||
{{ t('month') }}
|
||||
</template>
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
<el-form :model="formData" label-width="100px" ref="formRef" :rules="formRules" class="page-form" autocomplete="off" v-loading="loading">
|
||||
<div v-if="formData.site_id == 0">
|
||||
<el-form-item :label="t('siteName')" prop="site_name">
|
||||
<el-input v-model="formData.site_name" maxlength="20" clearable :placeholder="t('siteNamePlaceholder')" class="input-width" />
|
||||
<el-input v-model.trim="formData.site_name" maxlength="20" clearable :placeholder="t('siteNamePlaceholder')" class="input-width" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('groupId')" prop="group_id">
|
||||
@ -12,7 +12,7 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item :label="t('realName')" prop="real_name" v-if="!formData.site_id && !loading">
|
||||
<el-input v-model="formData.real_name" clearable :placeholder="t('realNamePlaceholder')" class="input-width" />
|
||||
<el-input v-model.trim="formData.real_name" clearable :placeholder="t('realNamePlaceholder')" class="input-width" />
|
||||
</el-form-item> -->
|
||||
<el-form-item :label="t('manager')" prop="uid">
|
||||
<el-select v-model="formData.uid" :placeholder="t('managerPlaceholder')" class="input-width" filterable>
|
||||
@ -38,15 +38,15 @@
|
||||
|
||||
<div v-show="formData.uid === 0">
|
||||
<el-form-item :label="t('username')" prop="username">
|
||||
<el-input v-model="formData.username" clearable :placeholder="t('usernamePlaceholder')" class="input-width" :readonly="user_name_input" @click="inputClick('user_name_input')" @blur="user_name_input = true" />
|
||||
<el-input v-model.trim="formData.username" clearable :placeholder="t('usernamePlaceholder')" class="input-width" :readonly="user_name_input" @click="inputClick('user_name_input')" @blur="user_name_input = true" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('password')" prop="password">
|
||||
<el-input v-model="formData.password" clearable :placeholder="t('passwordPlaceholder')" class="input-width" :show-password="true" type="password" :readonly="password_input" @click="inputClick('password_input')" @blur="password_input = true" />
|
||||
<el-input v-model.trim="formData.password" clearable :placeholder="t('passwordPlaceholder')" class="input-width" :show-password="true" type="password" :readonly="password_input" @click="inputClick('password_input')" @blur="password_input = true" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('confirmPassword')" prop="confirm_password">
|
||||
<el-input v-model="formData.confirm_password" :placeholder="t('confirmPasswordPlaceholder')" type="password" :show-password="true" clearable class="input-width" :readonly="confirm_password_input" @click="inputClick('confirm_password_input')" @blur="confirm_password_input = true" />
|
||||
<el-input v-model.trim="formData.confirm_password" :placeholder="t('confirmPasswordPlaceholder')" type="password" :show-password="true" clearable class="input-width" :readonly="confirm_password_input" @click="inputClick('confirm_password_input')" @blur="confirm_password_input = true" />
|
||||
</el-form-item>
|
||||
</div>
|
||||
</div>
|
||||
@ -63,7 +63,7 @@
|
||||
</div>
|
||||
|
||||
<el-form-item :label="t('siteDomain')" prop="site_domain">
|
||||
<el-input v-model="formData.site_domain" clearable :placeholder="t('siteDomainPlaceholder')" class="input-width" />
|
||||
<el-input v-model.trim="formData.site_domain" clearable :placeholder="t('siteDomainPlaceholder')" class="input-width" />
|
||||
<div>
|
||||
<p class="text-[12px] text-[#a9a9a9] leading-normal mt-[5px]">{{ t('siteDomainTips') }}</p>
|
||||
<p class="text-[12px] text-[#a9a9a9] leading-normal mt-[5px]">{{ t('siteDomainTipsTwo') }}</p>
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
<div class="max-h-[60vh]">
|
||||
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" autocomplete="off" v-loading="loading">
|
||||
<el-form-item :label="t('username')" prop="username">
|
||||
<el-input v-model="formData.username" clearable :placeholder="t('usernamePlaceholder')" class="input-width" :readonly="formData.uid" :disabled="formData.uid" @click="realnameInput = false" @blur="realnameInput = true" />
|
||||
<el-input v-model.trim="formData.username" clearable :placeholder="t('usernamePlaceholder')" class="input-width" :readonly="formData.uid" :disabled="formData.uid" @click="realnameInput = false" @blur="realnameInput = true" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('headImg')">
|
||||
@ -16,11 +16,11 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('password')" prop="password">
|
||||
<el-input v-model="formData.password" clearable :placeholder="t('passwordPlaceholder')" class="input-width" :show-password="true" type="password" :readonly="passwordInput" @click="passwordInput = false" @blur="passwordInput = true" />
|
||||
<el-input v-model.trim="formData.password" clearable :placeholder="t('passwordPlaceholder')" class="input-width" :show-password="true" type="password" :readonly="passwordInput" @click="passwordInput = false" @blur="passwordInput = true" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('confirmPassword')" prop="confirm_password">
|
||||
<el-input v-model="formData.confirm_password" :placeholder="t('confirmPasswordPlaceholder')" type="password" :show-password="true" clearable class="input-width" :readonly="confirmPasswordInput" @click="confirmPasswordInput = false" @blur="confirmPasswordInput = true" />
|
||||
<el-input v-model.trim="formData.confirm_password" :placeholder="t('confirmPasswordPlaceholder')" type="password" :show-password="true" clearable class="input-width" :readonly="confirmPasswordInput" @click="confirmPasswordInput = false" @blur="confirmPasswordInput = true" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('userCreateSiteLimit')" v-if="!formData.uid && Object.keys(siteGroup).length" prop="create_site_limit">
|
||||
@ -40,13 +40,13 @@
|
||||
</el-table-column>
|
||||
<el-table-column :label="t('createSiteNum')">
|
||||
<template #default="{ $index }">
|
||||
<el-input v-model.number="formData.create_site_limit[$index].num">
|
||||
<el-input v-model.number.trim="formData.create_site_limit[$index].num">
|
||||
</el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column :label="t('siteMonth')">
|
||||
<template #default="{ $index }">
|
||||
<el-input v-model.number="formData.create_site_limit[$index].month">
|
||||
<el-input v-model.number.trim="formData.create_site_limit[$index].month">
|
||||
<template #append>{{ t('month') }}</template>
|
||||
</el-input>
|
||||
</template>
|
||||
@ -164,6 +164,16 @@ const setFormData = (uid: number = 0) => {
|
||||
showDialog.value = true
|
||||
})
|
||||
} else {
|
||||
formData.value = {
|
||||
uid: 0,
|
||||
username: '',
|
||||
password: '',
|
||||
head_img: '',
|
||||
real_name: '',
|
||||
confirm_password: '',
|
||||
create_site_limit: [],
|
||||
group_ids: []
|
||||
}
|
||||
loading.value = false
|
||||
showDialog.value = true
|
||||
}
|
||||
|
||||
@ -13,7 +13,7 @@
|
||||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
|
||||
<el-form :inline="true" :model="siteGroupTableData.searchParam" ref="searchFormRef">
|
||||
<el-form-item :label="t('groupName')" prop="keywords">
|
||||
<el-input v-model="siteGroupTableData.searchParam.keywords" :placeholder="t('groupNamePlaceholder')" />
|
||||
<el-input v-model.trim="siteGroupTableData.searchParam.keywords" :placeholder="t('groupNamePlaceholder')" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item>
|
||||
|
||||
@ -9,10 +9,10 @@
|
||||
<el-card class="box-card mt-[15px] !border-none" shadow="never">
|
||||
<el-form :model="formData" label-width="110px" ref="formRef" :rules="formRules" class="page-form">
|
||||
<el-form-item :label="t('groupName')" prop="group_name">
|
||||
<el-input v-model="formData.group_name" :placeholder="t('groupNamePlaceholder')" clearable :disabled="formData.uid" class="input-width" maxlength="20" :show-word-limit="true" />
|
||||
<el-input v-model.trim="formData.group_name" :placeholder="t('groupNamePlaceholder')" clearable :disabled="formData.uid" class="input-width" maxlength="20" :show-word-limit="true" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('groupDesc')" prop="group_desc">
|
||||
<el-input v-model="formData.group_desc" type="textarea" rows="4" clearable :placeholder="t('groupDescPlaceholder')" class="input-width" maxlength="100" />
|
||||
<el-input v-model.trim="formData.group_desc" type="textarea" rows="4" clearable :placeholder="t('groupDescPlaceholder')" class="input-width" maxlength="100" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('mainApp')" prop="app">
|
||||
<div class="text-gray-400" v-if="!appList.length">{{ t('appListEmpty') }}</div>
|
||||
|
||||
@ -18,11 +18,11 @@
|
||||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
|
||||
<el-form :inline="true" :model="siteTableData.searchParam" ref="searchFormRef">
|
||||
<el-form-item :label="t('siteInfo')" prop="keywords">
|
||||
<el-input v-model="siteTableData.searchParam.keywords" :placeholder="t('siteNamePlaceholder')" />
|
||||
<el-input v-model.trim="siteTableData.searchParam.keywords" :placeholder="t('siteNamePlaceholder')" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('siteDomain')" prop="site_domain">
|
||||
<el-input v-model="siteTableData.searchParam.site_domain" :placeholder="t('siteDomainPlaceholder')" />
|
||||
<el-input v-model.trim="siteTableData.searchParam.site_domain" :placeholder="t('siteDomainPlaceholder')" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('app')" prop="app_id">
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
|
||||
<el-form :inline="true" :model="userTableData.searchParam" ref="searchFormRef">
|
||||
<el-form-item :label="t('userName')" prop="username">
|
||||
<el-input v-model="userTableData.searchParam.username" :placeholder="t('userNamePlaceholder')" />
|
||||
<el-input v-model.trim="userTableData.searchParam.username" :placeholder="t('userNamePlaceholder')" />
|
||||
</el-form-item>
|
||||
<!-- <el-form-item :label="t('createTime')" prop="create_time">
|
||||
<el-date-picker v-model="userTableData.searchParam.create_time" type="datetimerange"
|
||||
|
||||
@ -66,19 +66,24 @@
|
||||
</el-table-column>
|
||||
<el-table-column :label="t('status')" min-width="80" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-tag class="ml-2" type="success" v-if="row.status == 1">{{ row.site_status_name }}</el-tag>
|
||||
<el-tag class="ml-2" type="error" v-else-if="row.status == 3">
|
||||
{{ row.site_status_name }}
|
||||
</el-tag>
|
||||
<template v-if="row.site_status_name">
|
||||
<el-tag class="ml-2" type="success" v-if="row.site_status == 1">{{ row.site_status_name }}</el-tag>
|
||||
<el-tag class="ml-2" type="error" v-else-if="row.site_status == 3">
|
||||
{{ row.site_status_name }}
|
||||
</el-tag>
|
||||
<el-tag class="ml-2" type="error" v-else>
|
||||
{{ row.site_status_name }}
|
||||
</el-tag>
|
||||
</template>
|
||||
<el-tag class="ml-2" type="error" v-else>
|
||||
{{ row.site_status_name }}
|
||||
{{ t('siteEmpty') }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="expire_time" :label="t('expireTime')" />
|
||||
<el-table-column :label="t('operation')" align="right" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button type="primary" link @click="siteInfo(row)">{{ t('info') }}</el-button>
|
||||
<el-button type="primary" link @click="siteInfo(row)" v-if="row.site_status_name">{{ t('info') }}</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
@ -18,7 +18,7 @@
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('key')" prop="key">
|
||||
<div>
|
||||
<el-input v-model="form.key" clearable :disabled="route.query.key" :placeholder="t('keyPlaceholder')" class="input-width mr-[15px]" />
|
||||
<el-input v-model.trim="form.key" clearable :disabled="route.query.key" :placeholder="t('keyPlaceholder')" class="input-width mr-[15px]" />
|
||||
<el-button v-if="!route.query.key" type="primary" :disabled="form.key == ''" @click="getAddonDevelopCheckFn(form.key)">官方市场标识检测</el-button>
|
||||
<p class="text-[12px] text-[#a9a9a9] leading-normal mt-[5px]">{{ t('keyPlaceholder1') }}</p>
|
||||
<p class="text-[12px] text-[#a9a9a9] leading-normal">{{ t('keyPlaceholder2') }}</p>
|
||||
@ -28,14 +28,14 @@
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('desc')" prop="desc">
|
||||
<el-input type="textarea" v-model="form.desc" clearable :placeholder="t('descPlaceholder')" class="input-width" />
|
||||
<el-input type="textarea" v-model.trim="form.desc" clearable :placeholder="t('descPlaceholder')" class="input-width" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('author')" prop="author">
|
||||
<el-input v-model.trim="form.author" clearable :placeholder="t('authorPlaceholder')" class="input-width" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('version')" prop="version">
|
||||
<div>
|
||||
<el-input v-model="form.version" clearable :placeholder="t('versionPlaceholder')" class="input-width" onkeyup="this.value = this.value.replace(/[^\d\.]/g,'');" />
|
||||
<el-input v-model.trim="form.version" clearable :placeholder="t('versionPlaceholder')" class="input-width" onkeyup="this.value = this.value.replace(/[^\d\.]/g,'');" />
|
||||
<p class="text-[12px] text-[#a9a9a9] leading-normal mt-[5px]">{{ t('versionPlaceholder1') }}</p>
|
||||
</div>
|
||||
</el-form-item>
|
||||
@ -70,7 +70,7 @@
|
||||
</el-form-item>
|
||||
</template>
|
||||
<!-- <el-form-item v-if="form.type != 'app'" :label="t('supportApp')" prop="support_app">
|
||||
<el-input v-model="form.support_app" clearable :placeholder="t('supportAppPlaceholder')"
|
||||
<el-input v-model.trim="form.support_app" clearable :placeholder="t('supportAppPlaceholder')"
|
||||
class="input-width" />
|
||||
</el-form-item> -->
|
||||
</el-form>
|
||||
|
||||
@ -88,7 +88,7 @@
|
||||
<div class="flex justify-between">
|
||||
<el-form :inline="true" :model="params" ref="searchFormRef">
|
||||
<el-form-item :label="t('title')" prop="search">
|
||||
<el-input v-model="params.search" :placeholder="t('titlePlaceholder')" />
|
||||
<el-input v-model.trim="params.search" :placeholder="t('titlePlaceholder')" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="getAddonDevelopFn">{{ t('search') }}</el-button>
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
|
||||
<el-table-column align="right" min-width="150">
|
||||
<template #header>
|
||||
<el-input v-model="search" size="small" :placeholder="t('searchPlaceholder')" />
|
||||
<el-input v-model.trim="search" size="small" :placeholder="t('searchPlaceholder')" />
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<el-button size="small" type="primary" @click="confirm(scope.row)">{{ t('addBtn') }}</el-button>
|
||||
|
||||
@ -205,19 +205,19 @@
|
||||
:render-after-expand="false" />
|
||||
</el-form-item>
|
||||
<!-- <el-form-item :label="t('controller')">
|
||||
<el-input v-model="controller" disabled class="input-width" />
|
||||
<el-input v-model.trim="controller" disabled class="input-width" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('dataModel')">
|
||||
<el-input v-model="dataModel" disabled class="input-width" />
|
||||
<el-input v-model.trim="dataModel" disabled class="input-width" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('validator')">
|
||||
<el-input v-model="validator" disabled class="input-width" />
|
||||
<el-input v-model.trim="validator" disabled class="input-width" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('webView')">
|
||||
<el-input v-model="webView" disabled class="input-width" />
|
||||
<el-input v-model.trim="webView" disabled class="input-width" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('routerView')">
|
||||
<el-input v-model="routerView" disabled class="input-width" />
|
||||
<el-input v-model.trim="routerView" disabled class="input-width" />
|
||||
</el-form-item> -->
|
||||
</el-form>
|
||||
</el-tab-pane>
|
||||
|
||||
@ -85,7 +85,7 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('tableName')" prop="table_name">
|
||||
<el-input v-model="codeTableData.searchParam.table_name" :placeholder="t('tableNamePlaceholder')" />
|
||||
<el-input v-model.trim="codeTableData.searchParam.table_name" :placeholder="t('tableNamePlaceholder')" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="loadGenerateTableList()">{{ t('search') }}</el-button>
|
||||
|
||||
@ -51,19 +51,32 @@
|
||||
<template #empty>
|
||||
<span>{{ !cronTableData.loading ? t('emptyData') : '' }}</span>
|
||||
</template>
|
||||
|
||||
<el-table-column prop="name" :label="t('title')" min-width="150" />
|
||||
|
||||
<el-table-column prop="key" :label="t('key')" min-width="150" />
|
||||
<el-table-column prop="name" :label="t('title')" min-width="150" />
|
||||
<el-table-column :label="t('crondType')" min-width="150">
|
||||
<template #default="{ row }">
|
||||
{{ row.crontab_content }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="status_name" :label="t('openStatus')" min-width="100" />
|
||||
<el-table-column :label="t('operation')" align="right" fixed="right" width="130">
|
||||
<el-table-column :label="t('operation')" align="right" fixed="right" width="180">
|
||||
<template #default="{ row }">
|
||||
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
|
||||
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
|
||||
<div class="flex items-center">
|
||||
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
|
||||
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
|
||||
<el-dropdown class="ml-[12px]">
|
||||
<span class="el-dropdown-link text-primary">
|
||||
{{ t('more') }}
|
||||
</span>
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item @click="doEvent(row)">{{ t('doOne') }}</el-dropdown-item>
|
||||
<el-dropdown-item @click="toLogList(row.id)">{{ t('cronLog') }}</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</template>
|
||||
</el-dropdown>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@ -92,13 +105,13 @@
|
||||
<el-select v-model="formData.time.week" class="ml-2 w-[120px]" v-if="formData.time.type == 'week'">
|
||||
<el-option v-for="(item, index) in week_list" :key="index" :label="item" :value="index" />
|
||||
</el-select>
|
||||
<el-input v-model="formData.time.day" class="ml-2 w-[120px]" v-if="['month', 'day'].indexOf(formData.time.type) != -1">
|
||||
<el-input v-model.trim="formData.time.day" class="ml-2 w-[120px]" v-if="['month', 'day'].indexOf(formData.time.type) != -1">
|
||||
<template #append>{{ t('day') }}</template>
|
||||
</el-input>
|
||||
<el-input v-model="formData.time.hour" class="ml-2 w-[120px]" v-if="['month', 'day', 'hour', 'week'].indexOf(formData.time.type) != -1">
|
||||
<el-input v-model.trim="formData.time.hour" class="ml-2 w-[120px]" v-if="['month', 'day', 'hour', 'week'].indexOf(formData.time.type) != -1">
|
||||
<template #append>{{ t('hour') }}</template>
|
||||
</el-input>
|
||||
<el-input v-model="formData.time.min" class="ml-2 w-[120px]" v-if="['month', 'day', 'hour', 'week', 'min'].indexOf(formData.time.type) != -1">
|
||||
<el-input v-model.trim="formData.time.min" class="ml-2 w-[120px]" v-if="['month', 'day', 'hour', 'week', 'min'].indexOf(formData.time.type) != -1">
|
||||
<template #append>{{ t('min') }}</template>
|
||||
</el-input>
|
||||
</div>
|
||||
@ -132,7 +145,8 @@ import {
|
||||
getWeek,
|
||||
addCron,
|
||||
editCron,
|
||||
deleteCron
|
||||
deleteCron,
|
||||
doCron
|
||||
} from '@/app/api/sys'
|
||||
import { ElMessageBox, FormInstance } from 'element-plus'
|
||||
import { useRouter, useRoute } from 'vue-router'
|
||||
@ -293,6 +307,20 @@ const deleteEvent = (id: number) => {
|
||||
})
|
||||
}
|
||||
|
||||
const doEvent = (row: any) => {
|
||||
ElMessageBox.confirm(t(`确认要立即执行一次"${row.name}"任务吗?`), t('warning'),
|
||||
{
|
||||
confirmButtonText: t('confirm'),
|
||||
cancelButtonText: t('cancel'),
|
||||
type: 'warning'
|
||||
}
|
||||
).then(() => {
|
||||
doCron({id: row.id}).then((res) => {
|
||||
}).catch(() => {
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
const cronDialog: Record<string, any> | null = ref(null)
|
||||
/**
|
||||
* 查看任务
|
||||
@ -303,6 +331,10 @@ const infoEvent = (data: any) => {
|
||||
cronDialog.value.showDialog = true
|
||||
}
|
||||
|
||||
const toLogList = (id: number) => {
|
||||
router.push({ path: '/tools/schedule_log', query: { id: id } })
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped></style>
|
||||
|
||||
344
admin/src/app/views/tools/schedule_log.vue
Normal file
344
admin/src/app/views/tools/schedule_log.vue
Normal file
@ -0,0 +1,344 @@
|
||||
<template>
|
||||
<div class="main-container">
|
||||
|
||||
<el-card class="card !border-none" shadow="never">
|
||||
<el-page-header :icon="ArrowLeft" @back="$router.back()">
|
||||
<template #content>
|
||||
<span class="text-large font-600 mr-3">{{ pageName }}</span>
|
||||
</template>
|
||||
</el-page-header>
|
||||
</el-card>
|
||||
|
||||
<el-card class="box-card !border-none" shadow="never">
|
||||
|
||||
<el-card class="box-card !border-none mb-[10px] table-search-wrap" shadow="never">
|
||||
<div class="flex justify-between">
|
||||
<el-form :inline="true" :model="cronTableData.searchParam" ref="searchFormRef">
|
||||
<el-form-item :label="t('name')" prop="key">
|
||||
<el-select v-model="cronTableData.searchParam.key" placeholder="全部" filterable remote clearable>
|
||||
<el-option label="全部" value="all" />
|
||||
<el-option v-for="item in templateList" :key="item.key" :label="item.name" :value="item.key" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('status')" prop="status">
|
||||
<el-select v-model="cronTableData.searchParam.status" placeholder="全部" filterable remote clearable>
|
||||
<el-option label="全部" value="all" />
|
||||
<el-option label="成功" value="success" />
|
||||
<el-option label="失败" value="error" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('executeTime')" prop="execute_time">
|
||||
<el-date-picker v-model="cronTableData.searchParam.execute_time" type="datetimerange" value-format="YYYY-MM-DD HH:mm:ss" :start-placeholder="t('startDate')" :end-placeholder="t('endDate')" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="loadCronLogList()">{{ t('search') }}</el-button>
|
||||
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
</el-card>
|
||||
|
||||
<div class="mt-[20px]">
|
||||
<div class="mb-[10px] flex items-center">
|
||||
<el-checkbox v-model="toggleCheckbox" size="large" class="px-[14px]" @change="toggleChange" :indeterminate="isIndeterminate" />
|
||||
<el-button @click="batchDelete" size="small" :loading="deleteLoading">{{ t('batchDelete') }}</el-button>
|
||||
<el-button @click="clearAll" size="small" :loading="clearLoading">{{ t('clearAll') }}</el-button>
|
||||
</div>
|
||||
|
||||
<el-table :data="cronTableData.data" size="large" v-loading="cronTableData.loading" ref="cronLogListTableRef" @selection-change="handleSelectionChange">
|
||||
<template #empty>
|
||||
<span>{{ !cronTableData.loading ? t('emptyData') : '' }}</span>
|
||||
</template>
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column prop="id" :label="t('id')" min-width="80" />
|
||||
<el-table-column prop="name" :label="t('name')" min-width="150" />
|
||||
<el-table-column prop="key" :label="t('key')" min-width="150" />
|
||||
<el-table-column prop="class" :label="t('class')" min-width="150" />
|
||||
<el-table-column :label="t('executeResult')" min-width="150">
|
||||
<template #default="{ row }">
|
||||
{{ row.execute_result }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="status_name" :label="t('status')" min-width="100" />
|
||||
<el-table-column prop="execute_time" :label="t('executeTime')" min-width="100" />
|
||||
<el-table-column :label="t('operation')" align="right" fixed="right" width="130">
|
||||
<template #default="{ row }">
|
||||
<el-button type="primary" link @click="infoEvent(row)">{{ t('info') }}</el-button>
|
||||
<el-button type="primary" link @click="delEvent(row)">{{ t('delete') }}</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div class="mt-[16px] flex justify-end">
|
||||
<el-pagination v-model:current-page="cronTableData.page" v-model:page-size="cronTableData.limit"
|
||||
layout="total, sizes, prev, pager, next, jumper" :total="cronTableData.total"
|
||||
@size-change="loadCronLogList()" @current-change="loadCronLogList" />
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
|
||||
<el-dialog v-model="showDialog" :title="t('cronInfo')" width="550px" :destroy-on-close="true">
|
||||
<el-form :model="formData" label-width="110px" ref="formRef" class="page-form" v-loading="loading">
|
||||
|
||||
<el-form-item :label="t('name')" >
|
||||
<div class="input-width"> {{ formData.name }} </div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('key')" >
|
||||
<div class="input-width"> {{ formData.key }} </div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('class')" >
|
||||
<div class="input-width"> {{ formData.class }} </div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('executeResult')" >
|
||||
<div class="input-width"> {{ formData.execute_result }} </div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('status')" >
|
||||
<div class="input-width"> {{ formData.status_name }} </div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item :label="t('executeTime')" >
|
||||
<div class="input-width"> {{ formData.execute_time }} </div>
|
||||
</el-form-item>
|
||||
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button type="primary" @click="showDialog = false">{{ t('confirm') }}</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { reactive, ref, computed } from 'vue'
|
||||
import { t } from '@/lang'
|
||||
import { getCronLogList, getCronTemplate, deleteCronLog, clearCronLog } from '@/app/api/sys'
|
||||
import { ElMessageBox, ElMessage, FormInstance } from 'element-plus'
|
||||
import { useRouter, useRoute } from 'vue-router'
|
||||
|
||||
const route = useRoute()
|
||||
const pageName = route.meta.title
|
||||
|
||||
const cronTableData = reactive({
|
||||
page: 1,
|
||||
limit: 10,
|
||||
total: 0,
|
||||
loading: true,
|
||||
data: [],
|
||||
searchParam: {
|
||||
schedule_id: route.query.id,
|
||||
key: '',
|
||||
status: 'all',
|
||||
execute_time: []
|
||||
}
|
||||
})
|
||||
const templateList = ref([])
|
||||
const searchFormRef = ref<FormInstance>()
|
||||
|
||||
const resetForm = (formEl: FormInstance | undefined) => {
|
||||
if (!formEl) return
|
||||
formEl.resetFields()
|
||||
loadCronLogList()
|
||||
}
|
||||
|
||||
const setTypeList = async () => {
|
||||
templateList.value = await (await getCronTemplate()).data
|
||||
}
|
||||
setTypeList()
|
||||
|
||||
/**
|
||||
* 获取日志列表
|
||||
*/
|
||||
const loadCronLogList = (page: number = 1) => {
|
||||
cronTableData.loading = true
|
||||
cronTableData.page = page
|
||||
|
||||
getCronLogList({
|
||||
page: cronTableData.page,
|
||||
limit: cronTableData.limit,
|
||||
...cronTableData.searchParam
|
||||
}).then(res => {
|
||||
cronTableData.loading = false
|
||||
cronTableData.data = res.data.data
|
||||
cronTableData.total = res.data.total
|
||||
}).catch(() => {
|
||||
cronTableData.loading = false
|
||||
})
|
||||
}
|
||||
loadCronLogList()
|
||||
|
||||
const showDialog = ref(false)
|
||||
const loading = ref(true)
|
||||
const repeat = ref(false)
|
||||
const deleteLoading = ref(false)
|
||||
const clearLoading = ref(false)
|
||||
|
||||
/**
|
||||
* 表单数据
|
||||
*/
|
||||
const initialFormData = {
|
||||
id: '',
|
||||
name: '',
|
||||
key: '',
|
||||
execute_result: '',
|
||||
status_name: '',
|
||||
class: '',
|
||||
job: '',
|
||||
execute_time: ''
|
||||
}
|
||||
const formData: Record<string, any> = reactive({ ...initialFormData })
|
||||
|
||||
/**
|
||||
* 查看日志详情
|
||||
* @param row
|
||||
*/
|
||||
const infoEvent = (row: any) => {
|
||||
loading.value = true
|
||||
Object.assign(formData, initialFormData)
|
||||
|
||||
if (row) {
|
||||
Object.keys(formData).forEach((key: string) => {
|
||||
if (row[key] != undefined) formData[key] = row[key]
|
||||
})
|
||||
}
|
||||
|
||||
loading.value = false
|
||||
showDialog.value = true
|
||||
}
|
||||
|
||||
// 删除日志
|
||||
const delEvent = (data: any) => {
|
||||
ElMessageBox.confirm(t('deleteTips'), t('warning'),
|
||||
{
|
||||
confirmButtonText: t('confirm'),
|
||||
cancelButtonText: t('cancel'),
|
||||
type: 'warning'
|
||||
}
|
||||
).then(() => {
|
||||
if (repeat.value) return
|
||||
repeat.value = true
|
||||
|
||||
deleteCronLog({
|
||||
ids: data.id
|
||||
}).then((res: any) => {
|
||||
if (res.code == 1) {
|
||||
loadCronLogList()
|
||||
}
|
||||
repeat.value = false
|
||||
}).catch(() => {
|
||||
repeat.value = false
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// 批量复选框
|
||||
const toggleCheckbox = ref()
|
||||
|
||||
// 复选框中间状态
|
||||
const isIndeterminate = ref(false)
|
||||
|
||||
// 监听批量复选框事件
|
||||
const toggleChange = (value: any) => {
|
||||
isIndeterminate.value = false
|
||||
cronLogListTableRef.value.toggleAllSelection()
|
||||
}
|
||||
|
||||
const cronLogListTableRef = ref()
|
||||
|
||||
// 选中数据
|
||||
const multipleSelection: any = ref([])
|
||||
|
||||
// 监听表格单行选中
|
||||
const handleSelectionChange = (val: []) => {
|
||||
multipleSelection.value = val
|
||||
|
||||
toggleCheckbox.value = false
|
||||
if (multipleSelection.value.length > 0 && multipleSelection.value.length < cronTableData.data.length) {
|
||||
isIndeterminate.value = true
|
||||
} else {
|
||||
isIndeterminate.value = false
|
||||
}
|
||||
|
||||
if (multipleSelection.value.length == cronTableData.data.length && cronTableData.data.length && multipleSelection.value.length) {
|
||||
toggleCheckbox.value = true
|
||||
}
|
||||
}
|
||||
|
||||
// 批量删除
|
||||
const batchDelete = () => {
|
||||
if (multipleSelection.value.length == 0) {
|
||||
ElMessage({
|
||||
type: 'warning',
|
||||
message: `${t('batchEmptySelectedCronLogTips')}`
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
ElMessageBox.confirm(t('batchDeleteTips'), t('warning'),
|
||||
{
|
||||
confirmButtonText: t('confirm'),
|
||||
cancelButtonText: t('cancel'),
|
||||
type: 'warning'
|
||||
}
|
||||
).then(() => {
|
||||
if (repeat.value) return
|
||||
repeat.value = true
|
||||
deleteLoading.value = true
|
||||
|
||||
const ids: any = []
|
||||
multipleSelection.value.forEach((item: any) => {
|
||||
ids.push(item.id)
|
||||
})
|
||||
|
||||
deleteCronLog({
|
||||
ids: ids
|
||||
}).then(() => {
|
||||
loadCronLogList()
|
||||
toggleCheckbox.value = false
|
||||
repeat.value = false
|
||||
deleteLoading.value = false
|
||||
}).catch(() => {
|
||||
repeat.value = false
|
||||
deleteLoading.value = false
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// 清空日志
|
||||
const clearAll = () => {
|
||||
|
||||
ElMessageBox.confirm(t('clearAllTips'), t('warning'),
|
||||
{
|
||||
confirmButtonText: t('confirm'),
|
||||
cancelButtonText: t('cancel'),
|
||||
type: 'warning'
|
||||
}
|
||||
).then(() => {
|
||||
if (repeat.value) return
|
||||
repeat.value = true
|
||||
clearLoading.value = true
|
||||
|
||||
const schedule_id = route.query.id ?? ''
|
||||
|
||||
clearCronLog({
|
||||
schedule_id: schedule_id
|
||||
}).then(() => {
|
||||
loadCronLogList()
|
||||
toggleCheckbox.value = false
|
||||
repeat.value = false
|
||||
clearLoading.value = false
|
||||
}).catch(() => {
|
||||
repeat.value = false
|
||||
clearLoading.value = false
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped></style>
|
||||
@ -5,10 +5,10 @@
|
||||
<h3 class="panel-title !text-sm">{{ t('oplatformSetting') }}</h3>
|
||||
|
||||
<el-form-item label="APPID" prop="app_id">
|
||||
<el-input v-model="formData.app_id" :placeholder="t('appidPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.app_id" :placeholder="t('appidPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="APPSECRET" prop="app_secret">
|
||||
<el-input v-model="formData.app_secret" :placeholder="t('appSecretPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.app_secret" :placeholder="t('appSecretPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
</el-card>
|
||||
|
||||
@ -16,7 +16,7 @@
|
||||
<h3 class="panel-title !text-sm">{{ t('messagesReceiving') }}</h3>
|
||||
|
||||
<el-form-item :label="t('empowerReceiveUrl')">
|
||||
<el-input v-model="staticInfo.auth_serve_url" placeholder="Please input" class="!w-[500px]" :readonly="true">
|
||||
<el-input v-model.trim="staticInfo.auth_serve_url" placeholder="Please input" class="!w-[500px]" :readonly="true">
|
||||
<template #append>
|
||||
<div class="cursor-pointer" @click="copyEvent(staticInfo.auth_serve_url)">{{ t('copy') }}
|
||||
</div>
|
||||
@ -24,7 +24,7 @@
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('messageReceiveUrl')">
|
||||
<el-input v-model="staticInfo.message_serve_url" placeholder="Please input" class="!w-[500px]" :readonly="true">
|
||||
<el-input v-model.trim="staticInfo.message_serve_url" placeholder="Please input" class="!w-[500px]" :readonly="true">
|
||||
<template #append>
|
||||
<div class="cursor-pointer" @click="copyEvent(staticInfo.message_serve_url)">{{ t('copy') }}
|
||||
</div>
|
||||
@ -32,10 +32,10 @@
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('messageValidationToken')" prop="token">
|
||||
<el-input v-model="formData.token" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.token" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('messageDecryptKey')" prop="aes_key">
|
||||
<el-input v-model="formData.aes_key" class="input-width">
|
||||
<el-input v-model.trim="formData.aes_key" class="input-width">
|
||||
<template #append>
|
||||
<div class="cursor-pointer" @click="copyEvent(formData.aes_key)">{{ t('copy') }}</div>
|
||||
</template>
|
||||
@ -48,14 +48,14 @@
|
||||
<h3 class="panel-title !text-sm">{{ t('domainSetting') }}</h3>
|
||||
|
||||
<el-form-item :label="t('empowerStartDomain')">
|
||||
<el-input v-model="staticInfo.auth_launch_domain" placeholder="Please input" class="input-width" :readonly="true">
|
||||
<el-input v-model.trim="staticInfo.auth_launch_domain" placeholder="Please input" class="input-width" :readonly="true">
|
||||
<template #append>
|
||||
<div class="cursor-pointer" @click="copyEvent(staticInfo.auth_launch_domain)">{{ t('copy') }}</div>
|
||||
</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('wechatDomain')">
|
||||
<el-input v-model="staticInfo.wechat_auth_domain" placeholder="Please input" class="input-width" :readonly="true">
|
||||
<el-input v-model.trim="staticInfo.wechat_auth_domain" placeholder="Please input" class="input-width" :readonly="true">
|
||||
<template #append>
|
||||
<div class="cursor-pointer" @click="copyEvent(staticInfo.wechat_auth_domain)">{{ t('copy') }}</div>
|
||||
</template>
|
||||
@ -67,7 +67,7 @@
|
||||
<h3 class="panel-title !text-sm">{{ t('developerWeappUpload') }}</h3>
|
||||
|
||||
<el-form-item :label="t('developAppid')" prop="develop_app_id">
|
||||
<el-input v-model="formData.develop_app_id" :placeholder="t('developAppidPlaceholder')" class="input-width" clearable />
|
||||
<el-input v-model.trim="formData.develop_app_id" :placeholder="t('developAppidPlaceholder')" class="input-width" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('uploadKey')" prop="develop_upload_private_key">
|
||||
<div class="input-width">
|
||||
|
||||
@ -78,7 +78,7 @@
|
||||
<div v-else class="flex flex-wrap">
|
||||
<div v-for="(item, index) in childList" :key="index"
|
||||
class="border border-br rounded-[3px] mr-[10px] mb-[10px] px-4 h-[32px] leading-[32px] cursor-pointer hover:bg-primary-light-9 px-[10px] hover:text-primary"
|
||||
:class="[item.name == selectLink.name ? 'border-primary text-primary' : '']"
|
||||
:class="{ 'border-primary text-primary': (parentLinkName != 'DIY_PAGE' && item.name == selectLink.name) || (parentLinkName == 'DIY_PAGE' && item.name == selectLink.name && item.url == selectLink.url) }"
|
||||
@click="changeChildLink(item)">{{ item.title }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -261,7 +261,6 @@ const attachmentParam = reactive({
|
||||
* 查询分组
|
||||
*/
|
||||
const getAttachmentCategoryList = debounce(() => {
|
||||
// todo js实现
|
||||
|
||||
const getFn = prop.type == 'icon' ? getIconCategoryList : attachmentCategoryList
|
||||
getFn({
|
||||
@ -361,7 +360,7 @@ const deleteAttachmentCategory = (index: number) => {
|
||||
}
|
||||
|
||||
const uploadRef = ref<Record<string, any> | null>(null)
|
||||
|
||||
const time = ref<any>(null)
|
||||
// 上传文件
|
||||
const upload = computed(() => {
|
||||
const headers: Record<string, any> = {}
|
||||
@ -381,8 +380,18 @@ const upload = computed(() => {
|
||||
getAttachmentList()
|
||||
uploadRef.value?.handleRemove(uploadFile)
|
||||
} else {
|
||||
uploadFile.status = 'fail'
|
||||
showElMessage({ message: response.msg, type: 'error' })
|
||||
if(time.value==null) {
|
||||
time.value = setTimeout(() => {
|
||||
uploadFile.status = 'fail'
|
||||
showElMessage({ message: response.msg, type: 'error' })
|
||||
clearTimeout(time.value)
|
||||
time.value=null
|
||||
},500)
|
||||
|
||||
}else{
|
||||
clearTimeout(time.value)
|
||||
time.value=null
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -21,7 +21,7 @@
|
||||
</template>
|
||||
<template v-else>
|
||||
<div class="flex flex-wrap" ref="imgListRef">
|
||||
<div class="rounded cursor-pointer overflow-hidden relative border border-solid border-color image-wrap mr-[10px]" :style="style" v-for="(item, index) in images.data" :key="item">
|
||||
<div class="rounded cursor-pointer overflow-hidden relative border border-solid border-color image-wrap mr-[10px] mb-[10px]" :style="style" v-for="(item, index) in images.data" :key="item+index">
|
||||
<div class="w-full h-full relative">
|
||||
<div class="w-full h-full flex items-center justify-center">
|
||||
<el-image :src="img(item)" fit="contain"></el-image>
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
<icon name="iconfont icon24gf-playCircle" color="#fff" size="25px" @click="previewVideo()"/>
|
||||
</div>
|
||||
</div>
|
||||
<icon name="element CircleCloseFilled" color="#bbb" size="18px" @click="removeVideo" class="absolute z-[2] top-[-9px] right-[-9px]"/>
|
||||
<icon name="element CircleCloseFilled" color="#bbb" size="18px" @click="removeVideo" class="!absolute z-[2] top-[-9px] right-[-9px]"/>
|
||||
</template>
|
||||
<upload-attachment :limit="limit" type="video" @confirm="confirmSelect" v-else>
|
||||
<div class="w-full h-full flex items-center justify-center flex-col">
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user