This commit is contained in:
全栈小学生 2024-11-22 15:08:07 +08:00
parent f77419bb60
commit 154a6b5e02
43 changed files with 1190 additions and 515 deletions

View File

@ -2330,15 +2330,15 @@
} }
}, },
"node_modules/browserslist": { "node_modules/browserslist": {
"version": "4.22.2", "version": "4.24.2",
"resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.22.2.tgz", "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.24.2.tgz",
"integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"caniuse-lite": "^1.0.30001565", "caniuse-lite": "^1.0.30001669",
"electron-to-chromium": "^1.4.601", "electron-to-chromium": "^1.5.41",
"node-releases": "^2.0.14", "node-releases": "^2.0.18",
"update-browserslist-db": "^1.0.13" "update-browserslist-db": "^1.1.1"
}, },
"bin": { "bin": {
"browserslist": "cli.js" "browserslist": "cli.js"
@ -2413,9 +2413,9 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001571", "version": "1.0.30001680",
"resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001571.tgz", "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz",
"integrity": "sha512-tYq/6MoXhdezDLFZuCO/TKboTzuQ/xR5cFdgXPfDtM7/kchBO3b4VWghE/OAi/DV7tTdhmLjZiZBZi1fA/GheQ==", "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==",
"dev": true "dev": true
}, },
"node_modules/chalk": { "node_modules/chalk": {
@ -2809,9 +2809,9 @@
} }
}, },
"node_modules/electron-to-chromium": { "node_modules/electron-to-chromium": {
"version": "1.4.616", "version": "1.5.56",
"resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.616.tgz", "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.56.tgz",
"integrity": "sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==", "integrity": "sha512-7lXb9dAvimCFdvUMTyucD4mnIndt/xhRKFAlky0CyFogdnNmdPQNoHI23msF/2V4mpTxMzgMdjK4+YRlFlRQZw==",
"dev": true "dev": true
}, },
"node_modules/element-plus": { "node_modules/element-plus": {
@ -2982,9 +2982,9 @@
} }
}, },
"node_modules/escalade": { "node_modules/escalade": {
"version": "3.1.1", "version": "3.2.0",
"resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz",
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">=6" "node": ">=6"
@ -4585,9 +4585,9 @@
"dev": true "dev": true
}, },
"node_modules/node-releases": { "node_modules/node-releases": {
"version": "2.0.14", "version": "2.0.18",
"resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz", "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.18.tgz",
"integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
"dev": true "dev": true
}, },
"node_modules/normalize-path": { "node_modules/normalize-path": {
@ -4809,9 +4809,9 @@
"dev": true "dev": true
}, },
"node_modules/picocolors": { "node_modules/picocolors": {
"version": "1.0.0", "version": "1.1.1",
"resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
}, },
"node_modules/picomatch": { "node_modules/picomatch": {
"version": "2.3.1", "version": "2.3.1",
@ -5925,13 +5925,13 @@
} }
}, },
"node_modules/update-browserslist-db": { "node_modules/update-browserslist-db": {
"version": "1.0.13", "version": "1.1.1",
"resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
"integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"escalade": "^3.1.1", "escalade": "^3.2.0",
"picocolors": "^1.0.0" "picocolors": "^1.1.0"
}, },
"bin": { "bin": {
"update-browserslist-db": "cli.js" "update-browserslist-db": "cli.js"

View File

@ -145,7 +145,7 @@ div.edui-box {
background-color: white; background-color: white;
position: relative; position: relative;
overflow: visible; overflow: visible;
z-index: 1; z-index: 1 !important;
} }
.edui-editor div { .edui-editor div {

View File

@ -5,7 +5,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getAddonLocal(params: Record<string, any>) { export function getAddonLocal(params: Record<string, any>) {
return request.get('addon/local', params, { showSuccessMessage: true }) return request.get('addon/local', params)
} }
/** /**
@ -13,7 +13,7 @@ export function getAddonLocal(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getAddonDetail(id: number) { export function getAddonDetail(id: number) {
return request.get(`addon/${id}`) return request.get(`addon/${ id }`)
} }
/** /**
@ -22,7 +22,7 @@ export function getAddonDetail(id: number) {
* @returns * @returns
*/ */
export function installAddon(params: Record<string, any>) { export function installAddon(params: Record<string, any>) {
return request.post(`addon/install/${params.addon}`, params) return request.post(`addon/install/${ params.addon }`, params)
} }
/** /**
@ -31,7 +31,7 @@ export function installAddon(params: Record<string, any>) {
* @returns * @returns
*/ */
export function cloudInstallAddon(params: Record<string, any>) { export function cloudInstallAddon(params: Record<string, any>) {
return request.post(`addon/cloudinstall/${params.addon}`, params) return request.post(`addon/cloudinstall/${ params.addon }`, params)
} }
/** /**
@ -40,7 +40,7 @@ export function cloudInstallAddon(params: Record<string, any>) {
* @returns * @returns
*/ */
export function uninstallAddon(params: Record<string, any>) { export function uninstallAddon(params: Record<string, any>) {
return request.post(`addon/uninstall/${params.addon}`, params, { showSuccessMessage: true }) return request.post(`addon/uninstall/${ params.addon }`, params, { showSuccessMessage: true })
} }
/** /**
@ -49,7 +49,7 @@ export function uninstallAddon(params: Record<string, any>) {
* @returns * @returns
*/ */
export function preInstallCheck(addon: string) { export function preInstallCheck(addon: string) {
return request.get(`addon/install/check/${addon}`) return request.get(`addon/install/check/${ addon }`)
} }
/** /**
@ -66,7 +66,7 @@ export function getAddonInstalltask() {
* @returns * @returns
*/ */
export function getAddonCloudInstallLog(addon: string) { export function getAddonCloudInstallLog(addon: string) {
return request.get(`addon/cloudinstall/${addon}`) return request.get(`addon/cloudinstall/${ addon }`)
} }
/** /**
@ -75,7 +75,7 @@ export function getAddonCloudInstallLog(addon: string) {
* @returns * @returns
*/ */
export function preUninstallCheck(addon: string) { export function preUninstallCheck(addon: string) {
return request.get(`addon/uninstall/check/${addon}`) return request.get(`addon/uninstall/check/${ addon }`)
} }
/** /**
@ -84,7 +84,7 @@ export function preUninstallCheck(addon: string) {
* @returns * @returns
*/ */
export function cancelInstall(addon: string) { export function cancelInstall(addon: string) {
return request.put(`addon/install/cancel/${addon}`, {}, { showErrorMessage: false }) return request.put(`addon/install/cancel/${ addon }`, {}, { showErrorMessage: false })
} }
export function getInstalledAddonList() { export function getInstalledAddonList() {

View File

@ -480,6 +480,22 @@ export function getCronLogList(params: any) {
return request.get(`sys/schedule/log/list`, { params }) 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 })
}
/***************************************************** 协议管理 ****************************************************/ /***************************************************** 协议管理 ****************************************************/
/** /**
@ -650,14 +666,6 @@ export function setDeveloperToken(params: Record<string, any>) {
return request.put(`sys/config/developer_token`, params, { showSuccessMessage: true }) return request.put(`sys/config/developer_token`, params, { showSuccessMessage: true })
} }
/**
*
* @returns
*/
export function getWebsiteLayout() {
return request.get('sys/web/layout')
}
/***************************************************** 报表导出 ****************************************************/ /***************************************************** 报表导出 ****************************************************/
/** /**
@ -715,4 +723,3 @@ export function deleteExport(id: number) {
export function getInstallConfig() { export function getInstallConfig() {
return request.get('sys/install/config') return request.get('sys/install/config')
} }

View File

@ -105,6 +105,9 @@
"styleSet": "风格设置", "styleSet": "风格设置",
"titleStyle": "标题样式", "titleStyle": "标题样式",
"selectStyle": "风格选择", "selectStyle": "风格选择",
"activeCubeBlockBtnText": "按钮文字",
"btnTextItalics": "斜体",
"btnTextNormal": "常规",
"styleLabel": "风格", "styleLabel": "风格",
"styleShowTips": "风格 1 2 3仅在小程序中展示", "styleShowTips": "风格 1 2 3仅在小程序中展示",
"titleContent": "标题内容", "titleContent": "标题内容",
@ -199,8 +202,17 @@
"carouselSearchShowWayStatic": "正常显示", "carouselSearchShowWayStatic": "正常显示",
"carouselSearchShowWayFixed": "滚动至顶部固定", "carouselSearchShowWayFixed": "滚动至顶部固定",
"carouselSearchFixedBgColor": "置顶背景", "carouselSearchFixedBgColor": "置顶背景",
"carouselSearchStyleSelect": "风格选择",
"carouselSearchSet": "搜索设置", "carouselSearchSet": "搜索设置",
"carouselSearchSubTitle": "副标题",
"carouselSearchSubTitleStyle": "副标题样式",
"carouselSearchPositionStyle": "定位样式",
"carouselSearchSubTitlePlaceholder": "请输入副标题内容",
"carouselSearchText": "搜索内容", "carouselSearchText": "搜索内容",
"carouselSearchTextColor": "文字颜色",
"carouselSearchBgColor": "背景颜色",
"carouselSearchBtnColor": "按钮颜色",
"carouselSearchBtnBgColor": "按钮背景色",
"carouselSearchHotWordSet": "搜索热词", "carouselSearchHotWordSet": "搜索热词",
"carouselSearchHotWordInterval": "显示时间 / 秒", "carouselSearchHotWordInterval": "显示时间 / 秒",
"carouselSearchHotWordText": "内容", "carouselSearchHotWordText": "内容",
@ -223,6 +235,7 @@
"carouselSearchSwiperInterval": "切换间隔 / 秒", "carouselSearchSwiperInterval": "切换间隔 / 秒",
"carouselSearchSwiperTips": "建议上传尺寸相同的图片推荐尺寸750*350鼠标拖拽可调整图片顺序", "carouselSearchSwiperTips": "建议上传尺寸相同的图片推荐尺寸750*350鼠标拖拽可调整图片顺序",
"carouselSearchTabStyle": "选项卡样式", "carouselSearchTabStyle": "选项卡样式",
"carouselSearchStyle": "搜索框样式",
"noColor": "常规颜色", "noColor": "常规颜色",
"selectColor": "选中颜色", "selectColor": "选中颜色",
"fixedNoColor": "下滑常规颜色", "fixedNoColor": "下滑常规颜色",
@ -232,6 +245,7 @@
"carouselSearchSwiperStyle": "轮播样式", "carouselSearchSwiperStyle": "轮播样式",
"carouselSearchSwiperIndicatorStyle1": "样式1", "carouselSearchSwiperIndicatorStyle1": "样式1",
"carouselSearchSwiperIndicatorStyle2": "样式2", "carouselSearchSwiperIndicatorStyle2": "样式2",
"carouselSearchSwiperIndicatorStyle3": "样式3",
"carouselSearchSwiperIndicatorAlign": "显示位置", "carouselSearchSwiperIndicatorAlign": "显示位置",
"alignLeft": "居左", "alignLeft": "居左",
"alignCenter": "居中", "alignCenter": "居中",
@ -257,5 +271,13 @@
"rollTopStatusBarTextColor": "滚动后标题颜色", "rollTopStatusBarTextColor": "滚动后标题颜色",
"topStatusBarSearchName": "搜索内容", "topStatusBarSearchName": "搜索内容",
"topStatusBarSearchNamePlaceholder": "请输入搜索关键词", "topStatusBarSearchNamePlaceholder": "请输入搜索关键词",
"settingTips": "点击查看如何配置" "settingTips": "点击查看如何配置",
"pictureShowBlockOne": "模块一",
"pictureShowBlockTwo": "模块二",
"subTitleTextColor": "标题颜色",
"pictureShowBgColor": "背景颜色",
"pictureShowBtnText": "按钮文字",
"pictureShowBtnColor": "文字颜色",
"pictureShowBtnBgColor": "背景颜色",
"pictureShowBlockStyle": "模块样式"
} }

View File

@ -30,7 +30,7 @@
"sex": "性别", "sex": "性别",
"wxUnionid": "微信unionid", "wxUnionid": "微信unionid",
"weappOpenid": "微信用户openid", "weappOpenid": "微信用户openid",
"wxOpenid": "微信小程openid", "wxOpenid": "微信小程openid",
"head": "会员头像", "head": "会员头像",
"username": "用户名", "username": "用户名",
"usernamePlaceholder": "请输入用户名", "usernamePlaceholder": "请输入用户名",

View File

@ -10,8 +10,10 @@
"agreement": "政策协议", "agreement": "政策协议",
"agreementTips": "注册时服务协议和隐私协议是否进行展示", "agreementTips": "注册时服务协议和隐私协议是否进行展示",
"tripartiteSetting": "第三方设置", "tripartiteSetting": "第三方设置",
"isAuthRegister": "快捷登录/注册", "isAuthRegister": "自动注册会员",
"isAuthRegisterTip": "开启之后,微信公众号、小程序等第三方平台可以自动注册会员或者快捷登录/注册会员,方便会员自动登录", "isAuthRegisterTip": "开启之后,微信公众号、小程序等第三方平台可以自动注册会员或者快捷登录/注册会员,方便会员自动登录",
"isForceAccessUserInfo": "强制获取用户信息",
"isForceAccessUserInfoTip": "开启之后,将强制获取用户头像、昵称等信息,需要用户同意后,才能注册成功",
"mobileOrUsernameNoEmpty": "普通注册方式至少需启用一种", "mobileOrUsernameNoEmpty": "普通注册方式至少需启用一种",
"loginPageSet": "界面设置", "loginPageSet": "界面设置",
"bgUrl": "背景图", "bgUrl": "背景图",

View File

@ -4,8 +4,8 @@
"isOpen": "定位开关", "isOpen": "定位开关",
"validTime": "定位有效期", "validTime": "定位有效期",
"minutes": "分钟", "minutes": "分钟",
"validTimeTips": "过期后将重新获取定位信息0为不过期", "validTimeTips": "过期后将重新获取定位信息",
"validTimePlaceholder": "请输入定位有效期", "validTimePlaceholder": "请输入定位有效期",
"validTimeFormatTips": "格式输入错误", "validTimeFormatTips": "格式输入错误",
"validTimeNotZeroTips": "定位有效期不能小于0" "validTimeNotZeroTips": "定位有效期不能小于5分钟"
} }

View File

@ -63,5 +63,7 @@
"h5Domain": "H5支付域名", "h5Domain": "H5支付域名",
"h5DomainTips": "需在微信商户号>产品中心>开发配置>支付配置 H5支付域名中添加该域名", "h5DomainTips": "需在微信商户号>产品中心>开发配置>支付配置 H5支付域名中添加该域名",
"nativeDomain": "Native支付回调链接", "nativeDomain": "Native支付回调链接",
"nativeDomainTips": "需在微信商户号>产品中心>开发配置>支付配置 Native支付回调链接中添加该链接" "nativeDomainTips": "需在微信商户号>产品中心>开发配置>支付配置 Native支付回调链接中添加该链接",
"wechatpayPublicCert": "微信支付公钥",
"wechatpayPublicCertId": "微信支付公钥ID"
} }

View File

@ -7,5 +7,11 @@
"status": "执行状态", "status": "执行状态",
"executeTime": "执行时间", "executeTime": "执行时间",
"info": "详情", "info": "详情",
"cronInfo": "日志详情" "cronInfo": "日志详情",
"batchDelete": "批量删除",
"clearAll": "清空",
"batchEmptySelectedCronLogTips": "请选择要删除的日志",
"batchDeleteTips": "确定要删除选中的日志吗?",
"clearAllTips": "确定要清空所有日志吗?",
"deleteTips": "确定要删除该条日志吗?"
} }

View File

@ -4,26 +4,33 @@
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-page-title">应用管理</span> <span class="text-page-title">应用管理</span>
</div> </div>
<div class="flex flex-wrap plug-list pb-10 plug-large" v-if="appList.length"> <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'"> <div v-for="(item, index) in appList" :key="index + 'b'" class="cursor-pointer mt-[20px] mr-4 bg-[#f7f7f7]" @click="toLink(item.key)">
<div <el-tooltip class="box-item" effect="light" placement="top">
class="relative app-item cursor-pointer px-4 mr-4 mt-[20px] bg-[#f7f7f7] border-[1px] hover:border-primary"> <template #content>
<div @click="toLink(item.key)" class="flex py-5 items-center"> <div class="max-w-[250px]">{{item.desc}}</div>
<div class="flex justify-center items-center"> </template>
<el-image class="w-[40px] h-[40px]" :src="item.icon" fit="contain"> <div class="w-[264px] flex py-[20px] px-[17px] app-item relative">
<el-image class="w-[40px] h-[40px] mr-[10px]" :src="item.icon" fit="contain">
<template #error> <template #error>
<div class="image-slot"> <div class="image-slot">
<img class="w-[50px] h-[50px]" <img class="w-[40px] h-[40px]" src="@/app/assets/images/index/app_default.png" />
src="@/app/assets/images/index/app_default.png" />
</div> </div>
</template> </template>
</el-image> </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> </div>
<div class="flex flex-col justify-between text-left w-[190px]"> <!-- <el-icon color="#666">
<p class="app-text w-[190px] text-[17px] text-[#222] pl-3">{{ item.title }}</p> <QuestionFilled />
</div> </el-icon> -->
<p class="app-text text-[12px] text-[#999]">{{item.desc}}</p>
</div> </div>
</div> </div>
</el-tooltip>
</div> </div>
</div> </div>
<div class="empty flex items-center justify-center" v-if="!appList.length"> <div class="empty flex items-center justify-center" v-if="!appList.length">

View File

@ -11,9 +11,12 @@
<ArrowRight /> <ArrowRight />
</el-icon> </el-icon>
</el-form-item> </el-form-item>
<el-form-item :label="t('title')"> <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-input v-model.trim="diyStore.editComponent.text" :placeholder="t('titlePlaceholder')" clearable maxlength="10" show-word-limit />
</el-form-item> </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')"> <el-form-item :label="t('link')">
<diy-link v-model="diyStore.editComponent.textLink"/> <diy-link v-model="diyStore.editComponent.textLink"/>
</el-form-item> </el-form-item>
@ -25,7 +28,7 @@
</el-form-item> </el-form-item>
</el-form> </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"> <div class="flex flex-wrap">
<template v-for="(item,index) in titleStyleList" :key="index"> <template v-for="(item,index) in titleStyleList" :key="index">
@ -92,7 +95,7 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('activeCubeSubTitle')" v-if="diyStore.editComponent.blockStyle.value != 'style-3'"> <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> </el-form-item>
<div v-show="diyStore.editComponent.blockStyle.value == 'style-4'"> <div v-show="diyStore.editComponent.blockStyle.value == 'style-4'">
@ -104,12 +107,13 @@
<icon name="iconfont iconmap-connect" size="20px" class="block !text-gray-400 mx-[5px]"/> <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-color-picker v-model="item.subTitle.endColor" show-alpha :predefine="diyStore.predefineColors"/>
</el-form-item> </el-form-item>
</div>
<el-form-item :label="t('activeListFrameColor')"> <el-form-item :label="t('activeListFrameColor')">
<el-color-picker v-model="item.listFrame.startColor" show-alpha :predefine="diyStore.predefineColors" /> <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]"/> <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-color-picker v-model="item.listFrame.endColor" show-alpha :predefine="diyStore.predefineColors"/>
</el-form-item> </el-form-item>
</div>
<div v-show="diyStore.editComponent.blockStyle.value != 'style-4' && diyStore.editComponent.blockStyle.value != 'style-3'"> <div v-show="diyStore.editComponent.blockStyle.value != 'style-4' && diyStore.editComponent.blockStyle.value != 'style-3'">
<el-form-item :label="t('activeCubeButton')"> <el-form-item :label="t('activeCubeButton')">
@ -143,7 +147,7 @@
<!-- 样式 --> <!-- 样式 -->
<div class="style-wrap" v-show="diyStore.editTab == 'style'"> <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> <h3 class="mb-[10px]">{{ t('titleStyle') }}</h3>
<el-form label-width="90px" class="px-[10px]"> <el-form label-width="90px" class="px-[10px]">
<el-form-item :label="t('textColor')"> <el-form-item :label="t('textColor')">
@ -175,6 +179,12 @@
<el-radio :label="'bold'">{{t('fontWeightBold')}}</el-radio> <el-radio :label="'bold'">{{t('fontWeightBold')}}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </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> </el-form>
</div> </div>
@ -264,6 +274,10 @@ const titleStyleList = reactive([
url : 'static/resource/images/diy/active_cube/title_style5.png', url : 'static/resource/images/diy/active_cube/title_style5.png',
title:'风格4', title:'风格4',
value:'style-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 = () => { const confirmTitleStyle = () => {
diyStore.editComponent.titleStyle.title = selectTitleStyle.title; diyStore.editComponent.titleStyle.title = selectTitleStyle.title;
diyStore.editComponent.titleStyle.value = selectTitleStyle.value; diyStore.editComponent.titleStyle.value = selectTitleStyle.value;
initTitleStyle(diyStore.editComponent.titleStyle.value);
showTitleDialog.value = false 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) const showListDialog = ref(false)
@ -326,9 +370,174 @@ const changeBlockStyle = (item:any) => {
const confirmBlockStyle = () => { const confirmBlockStyle = () => {
diyStore.editComponent.blockStyle.title = selectBlockStyle.title; diyStore.editComponent.blockStyle.title = selectBlockStyle.title;
diyStore.editComponent.blockStyle.value = selectBlockStyle.value; diyStore.editComponent.blockStyle.value = selectBlockStyle.value;
initBlockStyle(diyStore.editComponent.blockStyle.value);
showListDialog.value = false showListDialog.value = false
} }
const initBlockStyle = (style: any)=>{
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 = () => { const addItem = () => {
diyStore.editComponent.list.push({ diyStore.editComponent.list.push({
id: diyStore.generateRandom(), id: diyStore.generateRandom(),

View File

@ -26,9 +26,18 @@
<div class="edit-attr-item-wrap"> <div class="edit-attr-item-wrap">
<h3 class="mb-[10px]">{{ t('carouselSearchSet') }}</h3> <h3 class="mb-[10px]">{{ t('carouselSearchSet') }}</h3>
<el-form label-width="100px" class="px-[10px]"> <el-form label-width="100px" class="px-[10px]">
<div class="text-sm text-gray-400 mb-[10px]">{{ t('carouselSearchLogoTips') }}</div> <el-form-item :label="t('selectStyle')" class="flex">
<span class="text-primary flex-1 cursor-pointer" @click="showSearchStyle">{{ diyStore.editComponent.search.styleName }}</span>
<el-icon>
<ArrowRight />
</el-icon>
</el-form-item>
<el-form-item :label="t('carouselSearchSubTitle')" v-if="diyStore.editComponent.search.style == 'style-2'">
<el-input v-model.trim="diyStore.editComponent.search.subTitle.text" :placeholder="t('carouselSearchSubTitlePlaceholder')" clearable maxlength="10" show-word-limit />
</el-form-item>
<el-form-item :label="t('logo')"> <el-form-item :label="t('logo')">
<upload-image v-model="diyStore.editComponent.search.logo" :limit="1" /> <upload-image v-model="diyStore.editComponent.search.logo" :limit="1" />
<div class="text-sm text-gray-400 mb-[10px]">{{ t('carouselSearchLogoTips') }}</div>
</el-form-item> </el-form-item>
<el-form-item :label="t('carouselSearchText')"> <el-form-item :label="t('carouselSearchText')">
<div> <div>
@ -39,16 +48,34 @@
<el-form-item :label="t('link')"> <el-form-item :label="t('link')">
<diy-link v-model="diyStore.editComponent.search.link"/> <diy-link v-model="diyStore.editComponent.search.link"/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-dialog v-model="showSearchDialog" :title="t('selectStyle')" width="500px">
<div class="flex flex-wrap">
<template v-for="(item,index) in searchStyleList" :key="index">
<div :class="{ 'border-primary': selectSearchStyle.value == item.value }" @click="changeSearchStyle(item)" class="flex items-center justify-center overflow-hidden w-[200px] h-[100px] m-[6px] cursor-pointer border bg-[#eee]">
<img :src="img(item.url)" />
</div>
</template>
</div> </div>
<div class="edit-attr-item-wrap"> <template #footer>
<span class="dialog-footer">
<el-button @click="showSearchDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" @click="confirmSearchStyle">{{ t('confirm') }}</el-button>
</span>
</template>
</el-dialog>
</div>
<div class="edit-attr-item-wrap mb-[20px]">
<h3 class="mb-[10px]">{{ t('carouselSearchHotWordSet') }}</h3> <h3 class="mb-[10px]">{{ t('carouselSearchHotWordSet') }}</h3>
<el-form label-width="100px" class="px-[10px]"> <el-form label-width="100px" class="px-[10px]">
<el-form-item :label="t('carouselSearchHotWordInterval')"> <el-form-item :label="t('carouselSearchHotWordInterval')">
<el-slider v-model="diyStore.editComponent.search.hotWord.interval" show-input size="small" class="ml-[10px] horz-blank-slider" :min="1" :max="10"/> <el-slider v-model="diyStore.editComponent.search.hotWord.interval" show-input size="small" class="ml-[10px] diy-nav-slider" :min="1" :max="10"/>
</el-form-item> </el-form-item>
<p class="text-sm text-gray-400 mb-[10px]">{{ t('dragMouseAdjustOrder') }}</p> <p class="text-sm text-gray-400 mb-[10px]">{{ t('dragMouseAdjustOrder') }}</p>
@ -137,12 +164,11 @@
</el-collapse-item> </el-collapse-item>
<el-collapse-item :title="t('carouselSearchSwiperSet')" name="swiper"> <el-collapse-item :title="t('carouselSearchSwiperSet')" name="swiper">
<el-form label-width="100px" class="px-[10px]"> <el-form label-width="100px" class="px-[10px]">
<el-form-item :label="t('carouselSearchSwiperControl')"> <el-form-item :label="t('carouselSearchSwiperControl')">
<el-switch v-model="diyStore.editComponent.swiper.control" /> <el-switch v-model="diyStore.editComponent.swiper.control" />
</el-form-item> </el-form-item>
<el-form-item :label="t('carouselSearchSwiperInterval')"> <el-form-item :label="t('carouselSearchSwiperInterval')">
<el-slider v-model="diyStore.editComponent.swiper.interval" show-input size="small" class="ml-[10px] horz-blank-slider" :min="1" :max="10"/> <el-slider v-model="diyStore.editComponent.swiper.interval" show-input size="small" class="ml-[10px] diy-nav-slider" :min="1" :max="10"/>
</el-form-item> </el-form-item>
<div class="text-sm text-gray-400 mb-[10px]">{{ t('carouselSearchSwiperTips') }}</div> <div class="text-sm text-gray-400 mb-[10px]">{{ t('carouselSearchSwiperTips') }}</div>
@ -173,6 +199,46 @@
<!-- 样式 --> <!-- 样式 -->
<div class="style-wrap" v-show="diyStore.editTab == 'style'"> <div class="style-wrap" v-show="diyStore.editTab == 'style'">
<div class="edit-attr-item-wrap" v-if="diyStore.editComponent.search.style == 'style-2'">
<h3 class="mb-[10px]">{{ t('carouselSearchPositionStyle') }}</h3>
<el-form label-width="100px" class="px-[10px]">
<el-form-item :label="t('carouselSearchTextColor')">
<el-color-picker v-model="diyStore.editComponent.search.positionColor" show-alpha :predefine="diyStore.predefineColors"/>
</el-form-item>
</el-form>
</div>
<div class="edit-attr-item-wrap" v-if="diyStore.editComponent.search.style == 'style-2'">
<h3 class="mb-[10px]">{{ t('carouselSearchSubTitleStyle') }}</h3>
<el-form label-width="100px" class="px-[10px]">
<el-form-item :label="t('carouselSearchTextColor')">
<el-color-picker v-model="diyStore.editComponent.search.subTitle.textColor" show-alpha :predefine="diyStore.predefineColors"/>
</el-form-item>
<el-form-item :label="t('carouselSearchBgColor')">
<el-color-picker v-model="diyStore.editComponent.search.subTitle.startColor" :predefine="diyStore.predefineColors" show-alpha/>
<icon name="iconfont iconmap-connect" size="20px" class="block !text-gray-400 mx-[5px]"/>
<el-color-picker v-model="diyStore.editComponent.search.subTitle.endColor" :predefine="diyStore.predefineColors" show-alpha/>
</el-form-item>
</el-form>
</div>
<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"> <div class="edit-attr-item-wrap">
<h3 class="mb-[10px]">{{ t('carouselSearchTabStyle') }}</h3> <h3 class="mb-[10px]">{{ t('carouselSearchTabStyle') }}</h3>
@ -199,13 +265,14 @@
<el-radio-group v-model="diyStore.editComponent.swiper.swiperStyle"> <el-radio-group v-model="diyStore.editComponent.swiper.swiperStyle">
<el-radio label="style-1">{{ t('carouselSearchSwiperIndicatorStyle1') }}</el-radio> <el-radio label="style-1">{{ t('carouselSearchSwiperIndicatorStyle1') }}</el-radio>
<el-radio label="style-2">{{ t('carouselSearchSwiperIndicatorStyle2') }}</el-radio> <el-radio label="style-2">{{ t('carouselSearchSwiperIndicatorStyle2') }}</el-radio>
<el-radio label="style-3">{{ t('carouselSearchSwiperIndicatorStyle3') }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item :label="t('topRounded')"> <el-form-item :label="t('topRounded')">
<el-slider v-model="diyStore.editComponent.swiper.topRounded" show-input size="small" class="ml-[10px] horz-blank-slider" :max="50" /> <el-slider v-model="diyStore.editComponent.swiper.topRounded" show-input size="small" class="ml-[10px] diy-nav-slider" :max="50" />
</el-form-item> </el-form-item>
<el-form-item :label="t('bottomRounded')"> <el-form-item :label="t('bottomRounded')">
<el-slider v-model="diyStore.editComponent.swiper.bottomRounded" show-input size="small" class="ml-[10px] horz-blank-slider" :max="50" /> <el-slider v-model="diyStore.editComponent.swiper.bottomRounded" show-input size="small" class="ml-[10px] diy-nav-slider" :max="50" />
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
@ -217,6 +284,7 @@
<el-radio-group v-model="diyStore.editComponent.swiper.indicatorStyle"> <el-radio-group v-model="diyStore.editComponent.swiper.indicatorStyle">
<el-radio label="style-1">{{ t('carouselSearchSwiperIndicatorStyle1') }}</el-radio> <el-radio label="style-1">{{ t('carouselSearchSwiperIndicatorStyle1') }}</el-radio>
<el-radio label="style-2">{{ t('carouselSearchSwiperIndicatorStyle2') }}</el-radio> <el-radio label="style-2">{{ t('carouselSearchSwiperIndicatorStyle2') }}</el-radio>
<el-radio label="style-3">{{ t('carouselSearchSwiperIndicatorStyle3') }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item :label="t('carouselSearchSwiperIndicatorAlign')"> <el-form-item :label="t('carouselSearchSwiperIndicatorAlign')">
@ -280,6 +348,7 @@ diyStore.editComponent.verify = (index: number) => {
// } // }
}); });
if(diyStore.value[index].swiper.control){
diyStore.value[index].swiper.list.forEach((item: any) => { diyStore.value[index].swiper.list.forEach((item: any) => {
if(item.imageUrl == ''){ if(item.imageUrl == ''){
res.code = false res.code = false
@ -287,10 +356,51 @@ diyStore.editComponent.verify = (index: number) => {
return res return res
} }
}); });
}
return res return res
} }
/************** 搜索框样式选择-start ********************/
const selectSearchStyle = reactive({
title: diyStore.editComponent.search.styleName,
value: diyStore.editComponent.search.style
})
const showSearchDialog = ref(false)
const showSearchStyle = () => {
showSearchDialog.value = true
selectSearchStyle.title = diyStore.editComponent.search.styleName;
selectSearchStyle.value = diyStore.editComponent.search.style;
}
const changeSearchStyle = (item:any) => {
selectSearchStyle.title = item.title;
selectSearchStyle.value = item.value;
}
const confirmSearchStyle = () => {
diyStore.editComponent.search.styleName = selectSearchStyle.title;
diyStore.editComponent.search.style = selectSearchStyle.value;
showSearchDialog.value = false
}
const searchStyleList = reactive([
{
url: 'static/resource/images/diy/carousel_search/style_1.png',
title: '风格1',
value: 'style-1'
},
{
url: 'static/resource/images/diy/carousel_search/style_2.png',
title: '风格2',
value: 'style-2'
}
])
/************** 搜索框样式选择-end ********************/
diyStore.editComponent.search.hotWord.list.forEach((item: any) => { diyStore.editComponent.search.hotWord.list.forEach((item: any) => {
if (!item.id) item.id = diyStore.generateRandom() if (!item.id) item.id = diyStore.generateRandom()
}) })

View File

@ -41,7 +41,7 @@
</ul> </ul>
</el-form-item> </el-form-item>
<el-form-item :label="t('floatBtnOffset')"> <el-form-item :label="t('floatBtnOffset')">
<el-slider v-model="diyStore.editComponent.offset" show-input size="small" class="ml-[10px] horz-blank-slider" :max="100"/> <el-slider v-model="diyStore.editComponent.offset" show-input size="small" class="ml-[10px] diy-nav-slider" :max="100"/>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
@ -49,10 +49,10 @@
<h3 class="mb-[10px]">{{ t('floatBtnImageSet') }}</h3> <h3 class="mb-[10px]">{{ t('floatBtnImageSet') }}</h3>
<el-form label-width="80px" class="px-[10px]"> <el-form label-width="80px" class="px-[10px]">
<el-form-item :label="t('floatBtnImageSize')"> <el-form-item :label="t('floatBtnImageSize')">
<el-slider v-model="diyStore.editComponent.imageSize" show-input size="small" class="ml-[10px] horz-blank-slider" :min="30" :max="100"/> <el-slider v-model="diyStore.editComponent.imageSize" show-input size="small" class="ml-[10px] diy-nav-slider" :min="30" :max="100"/>
</el-form-item> </el-form-item>
<el-form-item :label="t('floatBtnAroundRadius')"> <el-form-item :label="t('floatBtnAroundRadius')">
<el-slider v-model="diyStore.editComponent.aroundRadius" show-input size="small" class="ml-[10px] graphic-nav-slider" :max="50"/> <el-slider v-model="diyStore.editComponent.aroundRadius" show-input size="small" class="ml-[10px] diy-nav-slider" :max="50"/>
</el-form-item> </el-form-item>
<div class="text-[12px] text-[#999] mb-[15px] mt-[5px]">{{t('floatBtnImageSuggest')}}</div> <div class="text-[12px] text-[#999] mb-[15px] mt-[5px]">{{t('floatBtnImageSuggest')}}</div>

View File

@ -45,7 +45,6 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</view> </view>
</el-form> </el-form>
</div> </div>
<div class="edit-attr-item-wrap"> <div class="edit-attr-item-wrap">
@ -86,10 +85,10 @@
<h3 class="mb-[10px]">{{ t('graphicNavImageSet') }}</h3> <h3 class="mb-[10px]">{{ t('graphicNavImageSet') }}</h3>
<el-form label-width="90px" class="px-[10px]"> <el-form label-width="90px" class="px-[10px]">
<el-form-item :label="t('graphicNavImageSize')"> <el-form-item :label="t('graphicNavImageSize')">
<el-slider v-model="diyStore.editComponent.imageSize" show-input size="small" class="ml-[10px] graphic-nav-slider" :min="20" :max="60"/> <el-slider v-model="diyStore.editComponent.imageSize" show-input size="small" class="ml-[10px] diy-nav-slider" :min="20" :max="60"/>
</el-form-item> </el-form-item>
<el-form-item :label="t('graphicNavAroundRadius')"> <el-form-item :label="t('graphicNavAroundRadius')">
<el-slider v-model="diyStore.editComponent.aroundRadius" show-input size="small" class="ml-[10px] graphic-nav-slider" :max="50"/> <el-slider v-model="diyStore.editComponent.aroundRadius" show-input size="small" class="ml-[10px] diy-nav-slider" :max="50"/>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
@ -97,7 +96,7 @@
<h3 class="mb-[10px]">{{ t('textSet') }}</h3> <h3 class="mb-[10px]">{{ t('textSet') }}</h3>
<el-form label-width="90px" class="px-[10px]"> <el-form label-width="90px" class="px-[10px]">
<el-form-item :label="t('textFontSize')"> <el-form-item :label="t('textFontSize')">
<el-slider v-model="diyStore.editComponent.font.size" show-input size="small" class="ml-[10px] graphic-nav-slider" :min="12" :max="16"/> <el-slider v-model="diyStore.editComponent.font.size" show-input size="small" class="ml-[10px] diy-nav-slider" :min="12" :max="16"/>
</el-form-item> </el-form-item>
<el-form-item :label="t('textFontWeight')"> <el-form-item :label="t('textFontWeight')">
<el-radio-group v-model="diyStore.editComponent.font.weight"> <el-radio-group v-model="diyStore.editComponent.font.weight">
@ -111,6 +110,31 @@
</el-form> </el-form>
</div> </div>
<div class="edit-attr-item-wrap" v-show="diyStore.editComponent.showStyle == 'pageSlide' && diyStore.editComponent.layout == 'horizontal'">
<h3 class="mb-[10px]">{{ t('carouselSearchSwiperIndicatorSet') }}</h3>
<el-form label-width="100px" class="px-[10px]">
<el-form-item :label="t('carouselSearchSwiperIndicatorStyle')">
<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')">
<el-radio-group v-model="diyStore.editComponent.swiper.indicatorAlign">
<el-radio label="left">{{ t('alignLeft') }}</el-radio>
<el-radio label="center">{{ t('alignCenter') }}</el-radio>
<el-radio label="right">{{ t('alignRight') }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="t('noColor')">
<el-color-picker v-model="diyStore.editComponent.swiper.indicatorColor" show-alpha :predefine="diyStore.predefineColors"/>
</el-form-item>
<el-form-item :label="t('selectColor')">
<el-color-picker v-model="diyStore.editComponent.swiper.indicatorActiveColor" show-alpha :predefine="diyStore.predefineColors"/>
</el-form-item>
</el-form>
</div>
<!-- 组件样式 --> <!-- 组件样式 -->
<slot name="style"></slot> <slot name="style"></slot>
@ -130,7 +154,6 @@ import useDiyStore from '@/stores/modules/diy'
const diyStore = useDiyStore() const diyStore = useDiyStore()
diyStore.editComponent.ignore = [] // diyStore.editComponent.ignore = [] //
// //
diyStore.editComponent.verify = (index: number) => { diyStore.editComponent.verify = (index: number) => {
const res = { code: true, message: '' } const res = { code: true, message: '' }
@ -221,13 +244,6 @@ defineExpose({})
</script> </script>
<style lang="scss">
.graphic-nav-slider {
.el-slider__input {
width: 100px;
}
}
</style>
<style lang="scss" scoped> <style lang="scss" scoped>
.edit-graphic-nav { .edit-graphic-nav {

View File

@ -5,7 +5,7 @@
<h3 class="mb-[10px]">{{ t('blankHeightSet') }}</h3> <h3 class="mb-[10px]">{{ t('blankHeightSet') }}</h3>
<el-form label-width="80px" class="px-[10px]"> <el-form label-width="80px" class="px-[10px]">
<el-form-item :label="t('blankHeight')"> <el-form-item :label="t('blankHeight')">
<el-slider v-model="diyStore.editComponent.height" show-input size="small" max="200" class="ml-[10px] horz-blank-slider"/> <el-slider v-model="diyStore.editComponent.height" show-input size="small" max="200" class="ml-[10px] diy-nav-slider"/>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
@ -31,11 +31,4 @@ defineExpose({})
</script> </script>
<style lang="scss">
.horz-blank-slider {
.el-slider__input {
width: 100px;
}
}
</style>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>

View File

@ -14,7 +14,7 @@
<el-color-picker v-model="diyStore.editComponent.borderColor" show-alpha :predefine="diyStore.predefineColors"/> <el-color-picker v-model="diyStore.editComponent.borderColor" show-alpha :predefine="diyStore.predefineColors"/>
</el-form-item> </el-form-item>
<el-form-item :label="t('horzLineBorderWidth')"> <el-form-item :label="t('horzLineBorderWidth')">
<el-slider v-model="diyStore.editComponent.borderWidth" show-input size="small" class="ml-[10px] horz-blank-slider" :min="1" :max="10"/> <el-slider v-model="diyStore.editComponent.borderWidth" show-input size="small" class="ml-[10px] diy-nav-slider" :min="1" :max="10"/>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
@ -40,11 +40,4 @@ defineExpose({})
</script> </script>
<style lang="scss">
.horz-blank-slider {
.el-slider__input {
width: 100px;
}
}
</style>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>

View File

@ -1,3 +1,4 @@
<template> <template>
<!-- 内容 --> <!-- 内容 -->
<div class="content-wrap" v-show="diyStore.editTab == 'content'"> <div class="content-wrap" v-show="diyStore.editTab == 'content'">
@ -12,11 +13,11 @@
</el-form-item> </el-form-item>
</el-form> </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"> <div class="flex flex-wrap">
<template v-for="(item,index) in styleList" :key="index"> <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)" /> <img :src="img(item.url)" />
</div> </div>
</template> </template>
@ -80,6 +81,16 @@ const styleList = reactive([
url: 'static/resource/images/diy/member/member_level_style3.jpg', url: 'static/resource/images/diy/member/member_level_style3.jpg',
title: '风格3', title: '风格3',
value: 'style-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'
} }
]) ])

View File

@ -11,14 +11,14 @@
</el-radio-group> </el-radio-group>
</el-form-item> </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="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')"/> <img src="@/app/assets/images/diy/notice/style_1.png" :class="['h-[28px] px-[10px] py-[5px]']" @click="changeStyle('style_1')"/>
</div> </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')"/> <img src="@/app/assets/images/diy/notice/style_2.png" class="px-[10px] py-[5px]" @click="changeStyle('style_2')"/>
</div> </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"/> <upload-image v-model="diyStore.editComponent.imageUrl" :limit="1"/>
</div> </div>
</div> </div>
@ -80,7 +80,7 @@
<h3 class="mb-[10px]">{{ t('textSet') }}</h3> <h3 class="mb-[10px]">{{ t('textSet') }}</h3>
<el-form label-width="80px" class="px-[10px]"> <el-form label-width="80px" class="px-[10px]">
<el-form-item :label="t('textFontSize')"> <el-form-item :label="t('textFontSize')">
<el-slider v-model="diyStore.editComponent.fontSize" show-input size="small" class="ml-[10px] article-slider" :min="12" :max="20"/> <el-slider v-model="diyStore.editComponent.fontSize" show-input size="small" class="ml-[10px] diy-nav-slider" :min="12" :max="20"/>
</el-form-item> </el-form-item>
<el-form-item :label="t('textFontWeight')"> <el-form-item :label="t('textFontWeight')">
<el-radio-group v-model="diyStore.editComponent.fontWeight"> <el-radio-group v-model="diyStore.editComponent.fontWeight">

View File

@ -104,7 +104,7 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item :label="t('bgHeightScale')"> <el-form-item :label="t('bgHeightScale')">
<el-slider v-model="diyStore.global.bgHeightScale" show-input size="small" class="ml-[10px] horz-blank-slider"/> <el-slider v-model="diyStore.global.bgHeightScale" show-input size="small" class="ml-[10px] diy-nav-slider"/>
</el-form-item> </el-form-item>
<div class="text-sm text-gray-400 ml-[80px] mb-[10px]">{{ t('bgHeightScaleTip') }}</div> <div class="text-sm text-gray-400 ml-[80px] mb-[10px]">{{ t('bgHeightScaleTip') }}</div>
<el-form-item :label="t('bgUrl')"> <el-form-item :label="t('bgUrl')">
@ -133,7 +133,7 @@
<h3 class="mb-[10px]">{{ t('marginSet') }}</h3> <h3 class="mb-[10px]">{{ t('marginSet') }}</h3>
<el-form label-width="115px" class="px-[10px]"> <el-form label-width="115px" class="px-[10px]">
<el-form-item :label="t('marginBoth')"> <el-form-item :label="t('marginBoth')">
<el-slider v-model="diyStore.global.template.margin.both" show-input size="small" @input="inputBoth" class="ml-[10px] horz-blank-slider"/> <el-slider v-model="diyStore.global.template.margin.both" show-input size="small" @input="inputBoth" class="ml-[10px] diy-nav-slider"/>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>

View 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] diy-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] diy-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>

View File

@ -54,13 +54,13 @@
<h3 class="mb-[10px]">{{ t('rubikCubeStyle') }}</h3> <h3 class="mb-[10px]">{{ t('rubikCubeStyle') }}</h3>
<el-form label-width="80px" class="px-[10px]"> <el-form label-width="80px" class="px-[10px]">
<el-form-item :label="t('imageGap')"> <el-form-item :label="t('imageGap')">
<el-slider v-model="diyStore.editComponent.imageGap" show-input size="small" class="ml-[10px] horz-blank-slider" :max="30"/> <el-slider v-model="diyStore.editComponent.imageGap" show-input size="small" class="ml-[10px] diy-nav-slider" :max="30"/>
</el-form-item> </el-form-item>
<el-form-item :label="t('topRounded')"> <el-form-item :label="t('topRounded')">
<el-slider v-model="diyStore.editComponent.topElementRounded" show-input size="small" class="ml-[10px] horz-blank-slider" :max="50"/> <el-slider v-model="diyStore.editComponent.topElementRounded" show-input size="small" class="ml-[10px] diy-nav-slider" :max="50"/>
</el-form-item> </el-form-item>
<el-form-item :label="t('bottomRounded')"> <el-form-item :label="t('bottomRounded')">
<el-slider v-model="diyStore.editComponent.bottomElementRounded" show-input size="small" class="ml-[10px] horz-blank-slider" :max="50"/> <el-slider v-model="diyStore.editComponent.bottomElementRounded" show-input size="small" class="ml-[10px] diy-nav-slider" :max="50"/>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>

View File

@ -37,7 +37,7 @@
<el-input v-model.trim="diyStore.editComponent.subTitle.text" :placeholder="t('subTitlePlaceholder')" clearable maxlength="30" show-word-limit /> <el-input v-model.trim="diyStore.editComponent.subTitle.text" :placeholder="t('subTitlePlaceholder')" clearable maxlength="30" show-word-limit />
</el-form-item> </el-form-item>
<el-form-item :label="t('textFontSize')"> <el-form-item :label="t('textFontSize')">
<el-slider v-model="diyStore.editComponent.subTitle.fontSize" show-input size="small" class="ml-[10px] article-slider" :min="12" :max="16" /> <el-slider v-model="diyStore.editComponent.subTitle.fontSize" show-input size="small" class="ml-[10px] diy-nav-slider" :min="12" :max="16" />
</el-form-item> </el-form-item>
<el-form-item :label="t('textColor')"> <el-form-item :label="t('textColor')">
<el-color-picker v-model="diyStore.editComponent.subTitle.color" /> <el-color-picker v-model="diyStore.editComponent.subTitle.color" />
@ -91,7 +91,7 @@
<h3 class="mb-[10px]">{{ t('titleStyle') }}</h3> <h3 class="mb-[10px]">{{ t('titleStyle') }}</h3>
<el-form label-width="80px" class="px-[10px]"> <el-form label-width="80px" class="px-[10px]">
<el-form-item :label="t('textFontSize')"> <el-form-item :label="t('textFontSize')">
<el-slider v-model="diyStore.editComponent.fontSize" show-input size="small" class="ml-[10px] article-slider" :min="12" :max="30" /> <el-slider v-model="diyStore.editComponent.fontSize" show-input size="small" class="ml-[10px] diy-nav-slider" :min="12" :max="30" />
</el-form-item> </el-form-item>
<el-form-item :label="t('textFontWeight')"> <el-form-item :label="t('textFontWeight')">
<el-radio-group v-model="diyStore.editComponent.fontWeight"> <el-radio-group v-model="diyStore.editComponent.fontWeight">

View File

@ -165,7 +165,7 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('componentBgAlpha')" v-if="diyStore.editComponent.ignore.indexOf('componentBgUrl') == -1 && diyStore.editComponent.componentBgUrl"> <el-form-item :label="t('componentBgAlpha')" v-if="diyStore.editComponent.ignore.indexOf('componentBgUrl') == -1 && diyStore.editComponent.componentBgUrl">
<el-slider v-model="diyStore.editComponent.componentBgAlpha" show-input size="small" :min="0" :max="10" class="ml-[10px] horz-blank-slider" /> <el-slider v-model="diyStore.editComponent.componentBgAlpha" show-input size="small" :min="0" :max="10" class="ml-[10px] diy-nav-slider" />
</el-form-item> </el-form-item>
<el-form-item :label="t('componentBgColor')" v-if="diyStore.editComponent.ignore.indexOf('componentBgColor') == -1"> <el-form-item :label="t('componentBgColor')" v-if="diyStore.editComponent.ignore.indexOf('componentBgColor') == -1">
@ -182,19 +182,19 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('marginTop')" v-if="diyStore.editComponent.ignore.indexOf('marginTop') == -1"> <el-form-item :label="t('marginTop')" v-if="diyStore.editComponent.ignore.indexOf('marginTop') == -1">
<el-slider v-model="diyStore.editComponent.margin.top" show-input size="small" :min="-100" class="ml-[10px] horz-blank-slider" /> <el-slider v-model="diyStore.editComponent.margin.top" show-input size="small" :min="-100" class="ml-[10px] diy-nav-slider" />
</el-form-item> </el-form-item>
<el-form-item :label="t('marginBottom')" v-if="diyStore.editComponent.ignore.indexOf('marginBottom') == -1"> <el-form-item :label="t('marginBottom')" v-if="diyStore.editComponent.ignore.indexOf('marginBottom') == -1">
<el-slider v-model="diyStore.editComponent.margin.bottom" show-input size="small" class="ml-[10px] horz-blank-slider" /> <el-slider v-model="diyStore.editComponent.margin.bottom" show-input size="small" class="ml-[10px] diy-nav-slider" />
</el-form-item> </el-form-item>
<el-form-item :label="t('marginBoth')" v-if="diyStore.editComponent.ignore.indexOf('marginBoth') == -1"> <el-form-item :label="t('marginBoth')" v-if="diyStore.editComponent.ignore.indexOf('marginBoth') == -1">
<el-slider v-model="diyStore.editComponent.margin.both" show-input size="small" class="ml-[10px] horz-blank-slider" /> <el-slider v-model="diyStore.editComponent.margin.both" show-input size="small" class="ml-[10px] diy-nav-slider" />
</el-form-item> </el-form-item>
<el-form-item :label="t('topRounded')" v-if="diyStore.editComponent.ignore.indexOf('topRounded') == -1"> <el-form-item :label="t('topRounded')" v-if="diyStore.editComponent.ignore.indexOf('topRounded') == -1">
<el-slider v-model="diyStore.editComponent.topRounded" show-input size="small" class="ml-[10px] horz-blank-slider" :max="100" /> <el-slider v-model="diyStore.editComponent.topRounded" show-input size="small" class="ml-[10px] diy-nav-slider" :max="100" />
</el-form-item> </el-form-item>
<el-form-item :label="t('bottomRounded')" v-if="diyStore.editComponent.ignore.indexOf('bottomRounded') == -1"> <el-form-item :label="t('bottomRounded')" v-if="diyStore.editComponent.ignore.indexOf('bottomRounded') == -1">
<el-slider v-model="diyStore.editComponent.bottomRounded" show-input size="small" class="ml-[10px] horz-blank-slider" :max="100" /> <el-slider v-model="diyStore.editComponent.bottomRounded" show-input size="small" class="ml-[10px] diy-nav-slider" :max="100" />
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
@ -679,6 +679,11 @@ const settingTips = () => {
} }
} }
} }
.diy-nav-slider {
.el-slider__input {
width: 100px;
}
}
</style> </style>
<style lang="scss" scoped> <style lang="scss" scoped>
.full-container { .full-container {

View File

@ -4,14 +4,14 @@
<el-form class="page-form" :model="formData" label-width="150px" ref="ruleFormRef" :rules="formRules" v-loading="loading"> <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"> <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-form-item :label="t('isUse')">
<el-switch v-model="formData.is_use" /> <el-switch v-model="formData.is_use" />
</el-form-item> </el-form-item>
<el-form-item :label="t('signPeriod')" v-if="formData.is_use"> <el-form-item :label="t('signPeriod')" v-if="formData.is_use">
<el-input-number v-model="formData.sign_period" :min="0" :precision="0" clearable class="input-width" controls-position="right" /><span class="ml-[10px]"></span> <el-input-number v-model="formData.sign_period" :min="1" :precision="0" clearable class="input-width" controls-position="right" /><span class="ml-[10px]"></span>
</el-form-item> </el-form-item>
<el-form-item :label="t('daySignAward')" prop="day_award" v-if="formData.is_use"> <el-form-item :label="t('daySignAward')" prop="day_award" v-if="formData.is_use">
@ -89,7 +89,7 @@
</el-dialog> </el-dialog>
<!-- 连签奖励 --> <!-- 连签奖励 -->
<el-dialog v-model="continueSignDialog" :title="t('continueSignTitle')" width="1000px" :destroy-on-close="true" v-if="formData.is_use"> <el-dialog v-model="continueSignDialog" :title="t('continueSignTitle')" width="1200px" :destroy-on-close="true" v-if="formData.is_use">
<sign-continue ref="continueRef" v-model="continue_award" /> <sign-continue ref="continueRef" v-model="continue_award" />
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">

View File

@ -5,7 +5,7 @@
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<h3 class="panel-title !text-sm">{{ t('admin') }}</h3> <h3 class="panel-title !text-sm">{{ t('admin') }}</h3>
<el-form-item :label="t('isCaptcha')" prop="formData.is_auth_register"> <el-form-item :label="t('isCaptcha')">
<el-switch v-model="formData.is_captcha" :active-value="1" :inactive-value="0" /> <el-switch v-model="formData.is_captcha" :active-value="1" :inactive-value="0" />
</el-form-item> </el-form-item>
<el-form-item :label="t('bgImg')"> <el-form-item :label="t('bgImg')">
@ -39,8 +39,7 @@ const loading = ref(true)
const ruleFormRef = ref<FormInstance>() const ruleFormRef = ref<FormInstance>()
const formData = reactive<Record<string, number | string>>({ const formData = reactive<Record<string, number | string>>({
is_captcha: 0, is_captcha: 0,
bg: '', bg: ''
site_bg: ''
}) })
const getFormData = async () => { const getFormData = async () => {

View File

@ -26,6 +26,18 @@
<div class="form-tip">{{ t('mchPublicCertPathTips') }}</div> <div class="form-tip">{{ t('mchPublicCertPathTips') }}</div>
</el-form-item> </el-form-item>
<el-form-item :label="t('wechatpayPublicCert')" prop="config.wechat_public_cert_path">
<div class="input-width">
<upload-file v-model="formData.config.wechat_public_cert_path" api="sys/document/wechat" />
</div>
</el-form-item>
<el-form-item :label="t('wechatpayPublicCertId')" prop="config.wechat_public_cert_id">
<div class="input-width">
<el-input v-model.trim="formData.config.wechat_public_cert_id" placeholder="" class="input-width" show-word-limit clearable />
</div>
</el-form-item>
<el-form-item :label="t('jsapiDir')" v-show="formData.channel == 'wechat' || formData.channel == 'weapp'"> <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"> <el-input :model-value="wapDomain + '/'" placeholder="Please input" class="input-width" :readonly="true" :disabled="true">
<template #append> <template #append>
@ -93,7 +105,9 @@ const initialFormData = {
mch_id: '', mch_id: '',
mch_secret_key: '', mch_secret_key: '',
mch_secret_cert: '', mch_secret_cert: '',
mch_public_cert_path: '' mch_public_cert_path: '',
wechat_public_cert_path: '',
wechat_public_cert_id: ''
}, },
channel: '', channel: '',
status: 0, status: 0,

View File

@ -0,0 +1,90 @@
<template>
<el-dialog v-model="showDialog" :title="t('messageInfo')" 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('messageKey')">
<div class="input-width"> {{ formData.name }} </div>
</el-form-item>
<el-form-item :label="t('smsType')">
<div class="input-width"> {{ formData.sms_type_name }} </div>
</el-form-item>
<!-- <el-form-item :label="t('messageData')">
<div class="input-width"> {{ formData.message_data }} </div>
</el-form-item> -->
<!-- <el-form-item :label="t('nickname')">
<div class="input-width"> {{ formData.nickname }} </div>
</el-form-item> -->
<el-form-item :label="t('receiver')">
<div class="input-width"> {{ formData.mobile }} </div>
</el-form-item>
<el-form-item :label="t('createTime')">
<div class="input-width"> {{ formData.create_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>
</template>
<script lang="ts" setup>
import { ref, reactive, computed } from 'vue'
import { t } from '@/lang'
import type { FormInstance } from 'element-plus'
const showDialog = ref(false)
const loading = ref(true)
/**
* 表单数据
*/
const initialFormData = {
create_time: 0,
message_data: '',
message_key: '',
message_type: '',
name: '',
nickname: '',
mobile: '',
sms_type_name: ''
}
const formData: Record<string, any> = reactive({ ...initialFormData })
const formRef = ref<FormInstance>()
//
const formRules = computed(() => {
return {
}
})
const setFormData = async (row: any = null) => {
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
}
defineExpose({
showDialog,
setFormData
})
</script>
<style lang="scss" scoped></style>

View File

@ -30,6 +30,11 @@
<el-switch v-model="formData.is_auth_register" :active-value="1" :inactive-value="0" /> <el-switch v-model="formData.is_auth_register" :active-value="1" :inactive-value="0" />
<div class="form-tip">{{ t('isAuthRegisterTip') }}</div> <div class="form-tip">{{ t('isAuthRegisterTip') }}</div>
</el-form-item> </el-form-item>
<el-form-item :label="t('isForceAccessUserInfo')" prop="formData.is_force_access_user_info" v-show="formData.is_auth_register == 1">
<el-switch v-model="formData.is_force_access_user_info" :active-value="1" :inactive-value="0" />
<div class="form-tip">{{ t('isForceAccessUserInfoTip') }}</div>
</el-form-item>
</el-card> </el-card>
<el-card class="box-card mt-[15px] !border-none" shadow="never"> <el-card class="box-card mt-[15px] !border-none" shadow="never">
@ -72,6 +77,7 @@ const formData:any = reactive({
is_username: 0, is_username: 0,
is_mobile: 0, is_mobile: 0,
is_auth_register: 0, is_auth_register: 0,
is_force_access_user_info: 0,
is_bind_mobile: 0, is_bind_mobile: 0,
agreement_show: 0, agreement_show: 0,
bg_url: '', bg_url: '',

View File

@ -57,7 +57,7 @@ const formRules = computed(() => {
callback(new Error(t('validTimePlaceholder'))) callback(new Error(t('validTimePlaceholder')))
} else if (isNaN(value) || !/^\d{0,10}$/.test(value)) { } else if (isNaN(value) || !/^\d{0,10}$/.test(value)) {
callback(new Error(t('validTimeFormatTips'))) callback(new Error(t('validTimeFormatTips')))
} else if (value < 0) { } else if (value < 5) {
callback(new Error(t('validTimeNotZeroTips'))) callback(new Error(t('validTimeNotZeroTips')))
} else { } else {
callback() callback()

View File

@ -9,13 +9,12 @@
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <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 :inline="true" :model="recordsTableData.searchParam" ref="searchFormRef">
<el-form-item :label="t('searchReceiver')" prop="receiver"> <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>
<el-form-item :label="t('noticeKey')" prop="key"> <el-form-item :label="t('noticeKey')" prop="key">
<el-select v-model="recordsTableData.searchParam.key" clearable :placeholder="t('noticeKeyPlaceholder')" class="input-width"> <el-select v-model="recordsTableData.searchParam.key" clearable :placeholder="t('noticeKeyPlaceholder')" class="input-width">
<el-option :label="t('selectPlaceholder')" value="" />
<el-option-group v-for="(group, gindex) in templateList" :key="gindex" :label="group.label"> <el-option-group v-for="(group, gindex) in templateList" :key="gindex" :label="group.label">
<el-option :label="item.name" :value="item.value" :disabled="item.disabled ?? false" v-for="(item, index) in group.list" :key="index" /> <el-option :label="item.name" :value="item.value" :disabled="item.disabled ?? false" v-for="(item, index) in group.list" :key="index" />
</el-option-group> </el-option-group>
@ -28,7 +27,7 @@
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadNoticeLogList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadNoticeLogList()">{{ t('search') }}</el-button>
<el-button @click="searchFormRef?.resetFields()">{{ t('reset') }}</el-button> <el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
@ -70,7 +69,7 @@
import { reactive, ref } from 'vue' import { reactive, ref } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import { getNoticeList, getSmsLog } from '@/app/api/notice' import { getNoticeList, getSmsLog } from '@/app/api/notice'
import RecordsInfo from '@/app/views/setting/components/notice-records-info.vue' import RecordsInfo from '@/app/views/setting/components/sms-records-info.vue'
import { FormInstance } from 'element-plus' import { FormInstance } from 'element-plus'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
@ -152,6 +151,12 @@ const loadNoticeLogList = (page: number = 1) => {
} }
loadNoticeLogList() loadNoticeLogList()
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
loadNoticeLogList()
}
const recordsDialog: Record<string, any> | null = ref(null) const recordsDialog: Record<string, any> | null = ref(null)
/** /**

View File

@ -52,8 +52,8 @@
<span>{{ !cronTableData.loading ? t('emptyData') : '' }}</span> <span>{{ !cronTableData.loading ? t('emptyData') : '' }}</span>
</template> </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="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"> <el-table-column :label="t('crondType')" min-width="150">
<template #default="{ row }"> <template #default="{ row }">
{{ row.crontab_content }} {{ row.crontab_content }}

View File

@ -39,10 +39,17 @@
</el-card> </el-card>
<div class="mt-[20px]"> <div class="mt-[20px]">
<el-table :data="cronTableData.data" size="large" v-loading="cronTableData.loading"> <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> <template #empty>
<span>{{ !cronTableData.loading ? t('emptyData') : '' }}</span> <span>{{ !cronTableData.loading ? t('emptyData') : '' }}</span>
</template> </template>
<el-table-column type="selection" width="55" />
<el-table-column prop="id" :label="t('id')" min-width="80" /> <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="name" :label="t('name')" min-width="150" />
<el-table-column prop="key" :label="t('key')" min-width="150" /> <el-table-column prop="key" :label="t('key')" min-width="150" />
@ -57,6 +64,7 @@
<el-table-column :label="t('operation')" align="right" fixed="right" width="130"> <el-table-column :label="t('operation')" align="right" fixed="right" width="130">
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="infoEvent(row)">{{ t('info') }}</el-button> <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> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -109,8 +117,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { reactive, ref, computed } from 'vue' import { reactive, ref, computed } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import { getCronLogList, getCronTemplate } from '@/app/api/sys' import { getCronLogList, getCronTemplate, deleteCronLog, clearCronLog } from '@/app/api/sys'
import { ElMessageBox, FormInstance } from 'element-plus' import { ElMessageBox, ElMessage, FormInstance } from 'element-plus'
import { useRouter, useRoute } from 'vue-router' import { useRouter, useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
@ -166,6 +174,10 @@ loadCronLogList()
const showDialog = ref(false) const showDialog = ref(false)
const loading = ref(true) const loading = ref(true)
const repeat = ref(false)
const deleteLoading = ref(false)
const clearLoading = ref(false)
/** /**
* 表单数据 * 表单数据
*/ */
@ -199,6 +211,134 @@ const infoEvent = (row: any) => {
showDialog.value = true 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> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>

View File

@ -55,7 +55,7 @@
</div> </div>
<div class="mb-[16px]"> <div class="mb-[16px]">
<el-form-item :label="t('diyAppletPage')"> <el-form-item :label="t('diyAppletPage')">
<el-input v-model="selectLink.page" :placeholder="t('diyAppletPagePlaceholder')" clearable maxlength="50" /> <el-input v-model="selectLink.page" :placeholder="t('diyAppletPagePlaceholder')" clearable maxlength="100" />
</el-form-item> </el-form-item>
</div> </div>
<el-form-item label=" "> <el-form-item label=" ">
@ -78,7 +78,7 @@
<div v-else class="flex flex-wrap"> <div v-else class="flex flex-wrap">
<div v-for="(item, index) in childList" :key="index" <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="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.url == selectLink.url) }"
@click="changeChildLink(item)">{{ item.title }} @click="changeChildLink(item)">{{ item.title }}
</div> </div>
</div> </div>

View File

@ -9,7 +9,7 @@
<icon name="iconfont icon24gf-playCircle" color="#fff" size="25px" @click="previewVideo()"/> <icon name="iconfont icon24gf-playCircle" color="#fff" size="25px" @click="previewVideo()"/>
</div> </div>
</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> </template>
<upload-attachment :limit="limit" type="video" @confirm="confirmSelect" v-else> <upload-attachment :limit="limit" type="video" @confirm="confirmSelect" v-else>
<div class="w-full h-full flex items-center justify-center flex-col"> <div class="w-full h-full flex items-center justify-center flex-col">

View File

@ -1,2 +1 @@
@import "addon/o2o/iconfont.css"; /* addon-iconfont.css */
@import "addon/tourism/iconfont.css";

View File

@ -1,38 +0,0 @@
@font-face {
font-family: "o2o"; /* Project id 4412516 */
src: url('//at.alicdn.com/t/c/font_4412516_cacqsbew46.woff2?t=1705720131974') format('woff2'),
url('//at.alicdn.com/t/c/font_4412516_cacqsbew46.woff?t=1705720131974') format('woff'),
url('//at.alicdn.com/t/c/font_4412516_cacqsbew46.ttf?t=1705720131974') format('truetype');
}
.o2o {
font-family: "o2o" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.o2o-icon-danhanghuadong:before {
content: "\e66f";
}
.o2o-icon-yuanjiao:before {
content: "\e6c0";
}
.o2o-icon-gl-square:before {
content: "\ea92";
}
.o2o-icon-sousuo12:before {
content: "\e699";
}
.o2o-icon-sousuo11:before {
content: "\e6d4";
}
.o2o-icon-jishi:before {
content: "\e600";
}

View File

@ -1,51 +0,0 @@
{
"id": "4412516",
"name": "上门服务",
"font_family": "o2o",
"css_prefix_text": "o2o-icon-",
"description": "",
"glyphs": [
{
"icon_id": "30621139",
"name": "单行滑动",
"font_class": "danhanghuadong",
"unicode": "e66f",
"unicode_decimal": 58991
},
{
"icon_id": "7149037",
"name": "圆角",
"font_class": "yuanjiao",
"unicode": "e6c0",
"unicode_decimal": 59072
},
{
"icon_id": "7594344",
"name": "20gl-square",
"font_class": "gl-square",
"unicode": "ea92",
"unicode_decimal": 60050
},
{
"icon_id": "10133070",
"name": "搜索",
"font_class": "sousuo12",
"unicode": "e699",
"unicode_decimal": 59033
},
{
"icon_id": "14652583",
"name": "搜索",
"font_class": "sousuo11",
"unicode": "e6d4",
"unicode_decimal": 59092
},
{
"icon_id": "6818781",
"name": "技师",
"font_class": "jishi",
"unicode": "e600",
"unicode_decimal": 58880
}
]
}

View File

@ -1,58 +0,0 @@
@font-face {
font-family: "tourism"; /* Project id 4137250 */
src: url('//at.alicdn.com/t/c/font_4137250_st1ha9l0k1e.woff2?t=1687685028672') format('woff2'),
url('//at.alicdn.com/t/c/font_4137250_st1ha9l0k1e.woff?t=1687685028672') format('woff'),
url('//at.alicdn.com/t/c/font_4137250_st1ha9l0k1e.ttf?t=1687685028672') format('truetype');
}
.tourism {
font-family: "tourism" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.tourism-icon-feiji:before {
content: "\e600";
}
.tourism-icon-lvyou:before {
content: "\e6a9";
}
.tourism-icon-lvyouchanpin:before {
content: "\e63b";
}
.tourism-icon-lvyou1:before {
content: "\e623";
}
.tourism-icon-lvyou2:before {
content: "\e601";
}
.tourism-icon-lvyou3:before {
content: "\e60c";
}
.tourism-icon-lvyoubaochedingdan:before {
content: "\e612";
}
.tourism-icon-lvyou4:before {
content: "\e653";
}
.tourism-icon-lvyou5:before {
content: "\e610";
}
.tourism-icon-lvyouguanguang:before {
content: "\e87e";
}
.tourism-icon-lvyou6:before {
content: "\e642";
}

View File

@ -1,86 +0,0 @@
{
"id": "4137250",
"name": "旅游业",
"font_family": "tourism",
"css_prefix_text": "tourism-icon-",
"description": "",
"glyphs": [
{
"icon_id": "1443",
"name": "飞机",
"font_class": "feiji",
"unicode": "e600",
"unicode_decimal": 58880
},
{
"icon_id": "446824",
"name": "旅游",
"font_class": "lvyou",
"unicode": "e6a9",
"unicode_decimal": 59049
},
{
"icon_id": "1167173",
"name": "旅游产品",
"font_class": "lvyouchanpin",
"unicode": "e63b",
"unicode_decimal": 58939
},
{
"icon_id": "1354920",
"name": "旅游",
"font_class": "lvyou1",
"unicode": "e623",
"unicode_decimal": 58915
},
{
"icon_id": "1505555",
"name": "旅游",
"font_class": "lvyou2",
"unicode": "e601",
"unicode_decimal": 58881
},
{
"icon_id": "2121726",
"name": "旅游",
"font_class": "lvyou3",
"unicode": "e60c",
"unicode_decimal": 58892
},
{
"icon_id": "2357494",
"name": "旅游包车订单",
"font_class": "lvyoubaochedingdan",
"unicode": "e612",
"unicode_decimal": 58898
},
{
"icon_id": "3944019",
"name": "旅游",
"font_class": "lvyou4",
"unicode": "e653",
"unicode_decimal": 58963
},
{
"icon_id": "4838220",
"name": "旅游",
"font_class": "lvyou5",
"unicode": "e610",
"unicode_decimal": 58896
},
{
"icon_id": "7444178",
"name": "旅游观光",
"font_class": "lvyouguanguang",
"unicode": "e87e",
"unicode_decimal": 59518
},
{
"icon_id": "9748082",
"name": "旅游",
"font_class": "lvyou6",
"unicode": "e642",
"unicode_decimal": 58946
}
]
}

View File

@ -1,8 +1,8 @@
@font-face { @font-face {
font-family: "iconfont"; /* Project id 3883393 */ font-family: "iconfont"; /* Project id 3883393 */
src: url('//at.alicdn.com/t/c/font_3883393_ikxpowvp5bs.woff2?t=1726212245389') format('woff2'), src: url('//at.alicdn.com/t/c/font_3883393_t4cbwq5qdz.woff2?t=1729077942624') format('woff2'),
url('//at.alicdn.com/t/c/font_3883393_ikxpowvp5bs.woff?t=1726212245389') format('woff'), url('//at.alicdn.com/t/c/font_3883393_t4cbwq5qdz.woff?t=1729077942624') format('woff'),
url('//at.alicdn.com/t/c/font_3883393_ikxpowvp5bs.ttf?t=1726212245389') format('truetype'); url('//at.alicdn.com/t/c/font_3883393_t4cbwq5qdz.ttf?t=1729077942624') format('truetype');
} }
.iconfont { .iconfont {
@ -13,6 +13,34 @@
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
.icona-tupianzhanbopc302:before {
content: "\e83c";
}
.icona-jingxuantuijianpc302:before {
content: "\e83d";
}
.icona-jingxuantuijianpc30-12:before {
content: "\e83e";
}
.icona-baokuantuijianpc30:before {
content: "\e836";
}
.icona-shangpintuijianpc30:before {
content: "\e839";
}
.icona-paihangbangpc30:before {
content: "\e83a";
}
.icona-xinrenzhuanxiangpc30:before {
content: "\e83b";
}
.icona-lipinkatupianpc30:before { .icona-lipinkatupianpc30:before {
content: "\e82c"; content: "\e82c";
} }
@ -1173,10 +1201,6 @@
content: "\e628"; content: "\e628";
} }
.icongouwuche1:before {
content: "\e680";
}
.icongonggao:before { .icongonggao:before {
content: "\e629"; content: "\e629";
} }
@ -2258,7 +2282,7 @@
} }
.iconwenhao:before { .iconwenhao:before {
content: "\e890"; content: "\f1e3";
} }
.iconmofang-liangzuoliangyou:before { .iconmofang-liangzuoliangyou:before {

View File

@ -1,8 +1,8 @@
@font-face { @font-face {
font-family: "nc-iconfont"; /* Project id 4567203 */ font-family: "nc-iconfont"; /* Project id 4567203 */
src: url('//at.alicdn.com/t/c/font_4567203_sxolqyse36.woff2?t=1717657005580') format('woff2'), src: url('//at.alicdn.com/t/c/font_4567203_upzww1i5qjn.woff2?t=1731549702579') format('woff2'),
url('//at.alicdn.com/t/c/font_4567203_sxolqyse36.woff?t=1717657005580') format('woff'), url('//at.alicdn.com/t/c/font_4567203_upzww1i5qjn.woff?t=1731549702579') format('woff'),
url('//at.alicdn.com/t/c/font_4567203_sxolqyse36.ttf?t=1717657005580') format('truetype'); url('//at.alicdn.com/t/c/font_4567203_upzww1i5qjn.ttf?t=1731549702579') format('truetype');
} }
.nc-iconfont { .nc-iconfont {
@ -13,6 +13,98 @@
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
.nc-icon-gouwuche1:before {
content: "\e76e";
}
.nc-icon-gouwuche:before {
content: "\e6ea";
}
.nc-icon-kabao:before {
content: "\e7ec";
}
.nc-icon-shouyeV6mm1:before {
content: "\e7e5";
}
.nc-icon-shouyeV6xx11:before {
content: "\e7bb";
}
.nc-icon-a-naozhongV6xx-36:before {
content: "\e7c4";
}
.nc-icon-a-shijianV6xx-36:before {
content: "\e7c3";
}
.nc-icon-a-yingyongzhongxinV6xx-36:before {
content: "\e7bf";
}
.nc-icon-a-bangzhuV6xx-36:before {
content: "\e7bc";
}
.nc-icon-a-riliV6xx-36:before {
content: "\e7c7";
}
.nc-icon-a-meiriqiandaoV6xx-36:before {
content: "\e7c6";
}
.nc-icon-a-yingyongliebiaoV6xx-36:before {
content: "\e7c5";
}
.nc-icon-a-shanchu-fanggai2V6xx-36:before {
content: "\e7be";
}
.nc-icon-cuohaoV6xx1:before {
content: "\e7cb";
}
.nc-icon-a-zhanghaoV6xx-36:before {
content: "\e7b9";
}
.nc-icon-a-wodeV6xx-36:before {
content: "\e7b8";
}
.nc-icon-a-shaixuan-36V6xx-36:before {
content: "\e7b3";
}
.nc-icon-lishijiluV6xx:before {
content: "\e6f6";
}
.nc-icon-paihangbangV6xx:before {
content: "\e79d";
}
.nc-icon-a-xiangshangV6xx1:before {
content: "\e799";
}
.nc-icon-a-xiangxiaV6xx1:before {
content: "\e796";
}
.nc-icon-fuzhiV6xx1:before {
content: "\e76c";
}
.nc-icon-kefuV6xx1:before {
content: "\e76a";
}
.nc-icon-huiyuandengjiV6xx1:before { .nc-icon-huiyuandengjiV6xx1:before {
content: "\e761"; content: "\e761";
} }

View File

@ -159,7 +159,7 @@ export function strByteLength(str: string = ''): number {
* @param url * @param url
*/ */
export function urlToRouteRaw(url: string) { export function urlToRouteRaw(url: string) {
const query = {} const query: any = {}
const [path, param] = url.split('?') const [path, param] = url.split('?')
param && param.split('&').forEach((str: string) => { param && param.split('&').forEach((str: string) => {
@ -204,7 +204,7 @@ export function deepClone(obj: object) {
* @param {Boolean} firstU * @param {Boolean} firstU
* @param {Number} radix * @param {Number} radix
*/ */
export function guid(len = 10, firstU = true, radix = null) { export function guid(len = 10, firstU = true, radix: any = null) {
const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('') const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
const uuid = [] const uuid = []
radix = radix || chars.length radix = radix || chars.length
@ -244,19 +244,19 @@ export function moneyFormat(money : string) : string {
/** /**
* *
*/ */
export function timeStampTurnTime(timeStamp, type = "") { export function timeStampTurnTime(timeStamp: any, type = "") {
if (timeStamp != undefined && timeStamp != "" && timeStamp > 0) { if (timeStamp != undefined && timeStamp != "" && timeStamp > 0) {
var date = new Date(); var date = new Date();
date.setTime(timeStamp * 1000); date.setTime(timeStamp * 1000);
var y = date.getFullYear(); var y: any = date.getFullYear();
var m = date.getMonth() + 1; var m: any = date.getMonth() + 1;
m = m < 10 ? ('0' + m) : m; m = m < 10 ? ('0' + m) : m;
var d = date.getDate(); var d: any = date.getDate();
d = d < 10 ? ('0' + d) : d; d = d < 10 ? ('0' + d) : d;
var h = date.getHours(); var h: any = date.getHours();
h = h < 10 ? ('0' + h) : h; h = h < 10 ? ('0' + h) : h;
var minute = date.getMinutes(); var minute: any = date.getMinutes();
var second = date.getSeconds(); var second: any = date.getSeconds();
minute = minute < 10 ? ('0' + minute) : minute; minute = minute < 10 ? ('0' + minute) : minute;
second = second < 10 ? ('0' + second) : second; second = second < 10 ? ('0' + second) : second;
if (type) { if (type) {