This commit is contained in:
全栈小学生 2024-12-04 14:07:49 +08:00
parent 971f078abc
commit ec90e6f9b2
47 changed files with 1845 additions and 1579 deletions

0
admin/src/addon/.gitignore vendored Normal file
View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 113 KiB

View File

@ -62,6 +62,8 @@
"imageUpload": "图片上传",
"imageSet": "图片设置",
"imageAdsTips": "建议上传尺寸相同的图片推荐尺寸750*350",
"imageAdsSameScreenTips": "开启沉浸式样式,请确保该图片广告组件在页面中位于最顶端;为保证体验,请不要开导航栏;沉浸式样式仅在微信小程序中生效。",
"sameScreen": "沉浸式",
"addImageAd": "添加图片",
"imageUrlTip": "请上传图片",
"imageHeight": "图片高度",

View File

@ -29,8 +29,8 @@
"detaBirth": "出生日期",
"sex": "性别",
"wxUnionid": "微信unionid",
"weappOpenid": "微信用户openid",
"wxOpenid": "微信小程序openid",
"weappOpenid": "微信小程序openid",
"wxOpenid": "微信用户openid",
"head": "会员头像",
"username": "用户名",
"usernamePlaceholder": "请输入用户名",

View File

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

View File

@ -77,7 +77,7 @@
</el-form-item>
<el-form-item :label="t('sort')">
<el-input-number v-model="formData.sort" :min="0" max="99999999" />
<el-input-number v-model="formData.sort" :min="0" max="8" />
</el-form-item>
</el-form>

View File

@ -3,7 +3,7 @@
<div class="main-container">
<el-card class="card !border-none" shadow="never">
<el-page-header :content="pageName" :icon="ArrowLeft" @back="$router.back()" />
<el-page-header :content="pageName" :icon="ArrowLeft" @back="back()" />
</el-card>
<el-form class="page-form mt-[15px]" :model="formData" label-width="150px" ref="formRef" v-loading="loading">
@ -98,6 +98,9 @@ import { useRoute, useRouter } from 'vue-router'
const route = useRoute()
const router = useRouter()
const pageName = route.meta.title
const back = () => {
router.push('/channel/aliapp')
}
const loading = ref(true)

View File

@ -3,7 +3,7 @@
<div class="main-container">
<el-card class="card !border-none" shadow="never">
<el-page-header :content="pageName" :icon="ArrowLeft" @back="$router.back()" />
<el-page-header :content="pageName" :icon="ArrowLeft" @back="back()" />
</el-card>
<el-card class="box-card mt-[15px] !border-none" shadow="never">
@ -99,6 +99,9 @@ import { useRoute, useRouter } from 'vue-router'
const route = useRoute()
const router = useRouter()
const back = () => {
router.push('/channel/aliapp')
}
const pageName = route.meta.title
const loading = ref(true)
const formData = reactive<Record<string, string>>({

View File

@ -3,7 +3,7 @@
<div class="main-container">
<el-card class="card !border-none" shadow="never">
<el-page-header :content="pageName" :icon="ArrowLeft" @back="$router.back()" />
<el-page-header :content="pageName" :icon="ArrowLeft" @back="back()" />
</el-card>
<el-form class="page-form mt-[15px]" :model="formData" label-width="170px" ref="formRef" :rules="formRules" v-loading="loading">
@ -139,7 +139,9 @@ import { useRoute, useRouter } from 'vue-router'
const route = useRoute()
const router = useRouter()
const pageName = route.meta.title
const back = () => {
router.push('/channel/weapp')
}
const loading = ref(true)
const formData = reactive<Record<string, any>>({

View File

@ -3,7 +3,7 @@
<div class="main-container">
<el-card class="card !border-none" shadow="never">
<el-page-header :content="pageName" :icon="ArrowLeft" @back="$router.back()" />
<el-page-header :content="pageName" :icon="ArrowLeft" @back="back()" />
</el-card>
<el-card class="box-card mt-[15px] !border-none" shadow="never">
@ -63,7 +63,9 @@ import { useRoute, useRouter } from 'vue-router'
const route = useRoute()
const router = useRouter()
const pageName = route.meta.title
const back = () => {
router.push('/channel/weapp')
}
const linkEvent = () => {
window.open('https://mp.weixin.qq.com/', '_blank')
}

View File

@ -3,7 +3,7 @@
<div class="main-container">
<el-card class="card !border-none" shadow="never">
<el-page-header :content="pageName" :icon="ArrowLeft" @back="$router.back()" />
<el-page-header :content="pageName" :icon="ArrowLeft" @back="back()" />
</el-card>
<el-form class="page-form mt-[15px]" :model="formData" label-width="150px" ref="formRef" :rules="formRules" v-loading="loading">
@ -129,7 +129,9 @@ import { useRoute, useRouter } from 'vue-router'
const route = useRoute()
const router = useRouter()
const pageName = route.meta.title
const back = () => {
router.push('/channel/wechat')
}
const loading = ref(true)
const formData = reactive<Record<string, any>>({

View File

@ -3,7 +3,7 @@
<div class="main-container">
<el-card class="card !border-none" shadow="never">
<el-page-header :content="pageName" :icon="ArrowLeft" @back="$router.back()" />
<el-page-header :content="pageName" :icon="ArrowLeft" @back="back()" />
</el-card>
<el-card class="box-card mt-[15px] pt-[20px] !border-none" shadow="never">
@ -60,6 +60,9 @@ import { useRouter, useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title
const router = useRouter()
const back = () => {
router.push('/channel/wechat')
}
const loading = ref(true)
const formData = reactive<Record<string, string>>({
wechat_name: '',

View File

@ -3,7 +3,7 @@
<div class="main-container">
<el-card class="card !border-none" shadow="never">
<el-page-header :content="pageName" :icon="ArrowLeft" @back="$router.back()" />
<el-page-header :content="pageName" :icon="ArrowLeft" @back="back()" />
</el-card>
<el-form class="page-form mt-[15px]" :model="formData" label-width="150px" ref="formRef" :rules="formRules" v-loading="loading">
@ -92,6 +92,10 @@ import NewsCard from '@/app/views/channel/wechat/components/news-card.vue'
const route = useRoute()
const router = useRouter()
const pageName = route.meta.title
const back = () => {
router.push('/channel/wechat/reply')
}
const showDialog = ref(false)
const formData: any = reactive({

View File

@ -185,6 +185,12 @@
<el-radio :label="'italics'">{{t('btnTextItalics')}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="t('topRounded')">
<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 :label="t('bottomRounded')">
<el-slider v-model="diyStore.editComponent.bottomElementRounded" show-input size="small" class="ml-[10px] diy-nav-slider" :max="50" />
</el-form-item>
</el-form>
</div>

View File

@ -94,7 +94,7 @@ import { img } from '@/utils/common'
import { range } from 'lodash-es'
const diyStore = useDiyStore()
diyStore.editComponent.ignore = ['pageBgColor','marginTop','marginBottom','marginBoth'] //
diyStore.editComponent.ignore = ['pageBgColor','marginTop','marginBottom','marginBoth','componentBgUrl'] //
//
diyStore.editComponent.verify = (index: number) => {
@ -222,5 +222,5 @@ defineExpose({})
</script>
<style lang="scss" scoped>
</style>
</style>

View File

@ -38,7 +38,7 @@ import useDiyStore from '@/stores/modules/diy'
import { img } from '@/utils/common'
const diyStore = useDiyStore()
diyStore.editComponent.ignore = [] //
diyStore.editComponent.ignore = ['componentBgUrl'] //
//
diyStore.editComponent.verify = (index: number) => {

View File

@ -4,6 +4,11 @@
<div class="edit-attr-item-wrap">
<h3 class="mb-[10px]">{{ t('imageSet') }}</h3>
<el-form label-width="80px" class="px-[10px]">
<el-form-item :label="t('sameScreen')" v-if="diyStore.currentIndex == 0">
<el-switch v-model="diyStore.editComponent.isSameScreen" />
<div class="text-sm text-gray-400 leading-[1.4]">{{ t('imageAdsSameScreenTips') }}</div>
</el-form-item>
<el-form-item :label="t('imageHeight')" class="display-block">
<el-input v-model.trim="diyStore.editComponent.imageHeight" :placeholder="t('imageHeightPlaceholder')" clearable maxlength="10" @blur="blurImageHeight">
@ -52,7 +57,7 @@ import { range } from 'lodash-es'
import useDiyStore from '@/stores/modules/diy'
const diyStore = useDiyStore()
diyStore.editComponent.ignore = [] //
diyStore.editComponent.ignore = ['componentBgUrl'] //
//
diyStore.editComponent.verify = (index: number) => {

View File

@ -102,9 +102,31 @@ const changeStyle = (item:any) => {
const confirmStyle = () => {
diyStore.editComponent.styleName = selectStyle.title;
diyStore.editComponent.style = selectStyle.value;
initStyle(diyStore.editComponent.style);
showDialog.value = false
}
const initStyle = (style: any) => {
if (style == 'style-1') {
diyStore.editComponent.bottomRounded = 0;
diyStore.editComponent.topRounded = 12;
} else if (style == 'style-2') {
diyStore.editComponent.bottomRounded = 0;
diyStore.editComponent.topRounded = 12;
} else if (style == 'style-3') {
diyStore.editComponent.bottomRounded = 12;
diyStore.editComponent.topRounded = 12;
} else if (style == 'style-4') {
diyStore.editComponent.bottomRounded = 12;
diyStore.editComponent.topRounded = 12;
} else if (style == 'style-5') {
diyStore.editComponent.bottomRounded = 12;
diyStore.editComponent.topRounded = 12;
}
}
defineExpose({})
</script>

View File

@ -8,7 +8,7 @@
<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>
@ -125,7 +125,7 @@ import { img } from '@/utils/common'
import { ref, reactive } from 'vue'
const diyStore = useDiyStore()
diyStore.editComponent.ignore = [] //
diyStore.editComponent.ignore = ['componentBgUrl'] //
//
diyStore.editComponent.verify = (index: number) => {

View File

@ -129,6 +129,7 @@ import { t } from '@/lang'
import { getApps,getDiyPageList, deleteDiyPage, getDiyTemplate, editDiyPageShare, setUseDiyPage } from '@/app/api/diy'
import { ElMessageBox, FormInstance } from 'element-plus'
import { useRoute, useRouter } from 'vue-router'
import { setTablePageStorage,getTablePageStorage } from "@/utils/common";
const route = useRoute()
const router = useRouter()
@ -234,12 +235,13 @@ const loadDiyPageList = (page: number = 1) => {
diyPageTableData.loading = false
diyPageTableData.data = res.data.data
diyPageTableData.total = res.data.total
setTablePageStorage(diyPageTableData.page, diyPageTableData.limit, diyPageTableData.searchParam);
}).catch(() => {
diyPageTableData.loading = false
})
}
loadDiyPageList()
loadDiyPageList(getTablePageStorage(diyPageTableData.searchParam).page);
//
const editEvent = (data: any) => {

View File

@ -1,7 +1,7 @@
<template>
<div class="main-container">
<el-card class="card !border-none" shadow="never">
<el-page-header :content="pageName" :icon="ArrowLeft" @back="$router.back()" />
<el-page-header :content="pageName" :icon="ArrowLeft" @back="back()" />
</el-card>
<el-card class="box-card mt-[15px] !border-none" shadow="never" v-loading="loading">

View File

@ -89,6 +89,7 @@ const setFormData = async (row: any = null) => {
const getRefundListInfo = async (no) => {
loading.value = true
formData.value = null
refundList.value = [];
await getPayRefundInfo(no).then(({ data }) => {
formData.value = data
refundList.value.push(data)

View File

@ -3,7 +3,7 @@
<div class="main-container">
<el-card class="card !border-none" shadow="never">
<el-page-header :content="pageName" :icon="ArrowLeft" @back="$router.back()" />
<el-page-header :content="pageName" :icon="ArrowLeft" @back="back()" />
</el-card>
<el-card class="box-card mt-[15px] !border-none relative" shadow="never" v-if="formData">
@ -66,6 +66,9 @@ import { ArrowLeft } from '@element-plus/icons-vue'
const route = useRoute()
const router = useRouter()
const pageName = route.meta.title
const back = () => {
router.push('/finance/refund')
}
const refundNo: any = route.query.refund_no
const loading = ref(true)

View File

@ -2,7 +2,7 @@
<el-container :class="['w-full h-screen bg-page flex flex-col', { 'login-wrap': loginType == 'admin' }, { 'site-login-wrap': loginType == 'site' }]">
<!-- 平台端登录 -->
<el-main class="login-main items-center justify-center flex-1 h-0" v-if="loginType == 'admin'">
<div class="flex rounded-2xl overflow-hidden">
<div class="flex rounded-2xl shadow overflow-hidden">
<div class="login-main-left w-[450px] flex flex-wrap justify-center">
<template v-if="loginConfig">
<el-image v-if="loginConfig.bg&&!imgLoading" class="w-[450px] h-[400px]" :src="img(loginConfig.bg)" fit="cover" />
@ -10,32 +10,19 @@
</template>
</div>
<div class="login flex flex-col w-[400px] h-[400px] p-[40px]">
<h3 class="text-center text-lg font-bold mb-[10px]">{{ webSite.site_name || t('siteTitle') }}</h3>
<h3 class="text-center text-2xl font-bold mb-[26px]">{{ t('platform') }}</h3>
<el-form :model="form" ref="formRef" :rules="formRules">
<h3 class="text-center text-2xl mb-[26px]">{{ webSite.site_name || t('siteTitle') }}{{ t('platform') }}</h3>
<el-form :model="form" ref="formRef" :rules="formRules" class="mt-[30px]">
<el-form-item prop="username">
<el-input v-model.trim="form.username" :placeholder="t('userPlaceholder')" autocomplete="off" @keyup.enter="handleLogin(formRef)" class="h-[40px] input-with-select">
<template #prepend>
<icon name="element User" />
</template>
</el-input>
<el-input v-model.trim="form.username" :placeholder="t('userPlaceholder')" autocomplete="off" @keyup.enter="handleLogin(formRef)" class="h-[40px]"></el-input>
</el-form-item>
<el-form-item prop="password">
<el-input v-model.trim="form.password" :placeholder="t('passwordPlaceholder')" type="password"
autocomplete="new-password"
@keyup.enter="handleLogin(formRef)" :show-password="true"
class="h-[40px] input-with-select">
<template #prepend>
<icon name="element Lock" />
</template>
</el-input>
<el-form-item prop="password" class="mt-[30px]">
<el-input v-model.trim="form.password" :placeholder="t('passwordPlaceholder')" type="password" autocomplete="new-password" @keyup.enter="handleLogin(formRef)" :show-password="true" class="h-[40px]"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" class="mt-[30px] h-[40px] w-full" @click="handleLogin(formRef)" :loading="loading">{{ loading ? t('logging') : t('login') }}</el-button>
<el-button type="primary" class="mt-[30px] !h-[40px] w-full" @click="handleLogin(formRef)" :loading="loading">{{ loading ? t('logging') : t('login') }}</el-button>
</el-form-item>
</el-form>
</div>
</div>
@ -43,69 +30,57 @@
<!-- 站点端登录 -->
<el-main class="login-main w-full login-site-main items-center h-screen justify-evenly bg-[#F8FAFF]" v-else-if="!imgLoading && loginType == 'site'">
<div class="flex rounded-2xl overflow-hidden h-screen w-full relative">
<div class="flex overflow-hidden h-screen w-full relative">
<template v-if="loginConfig">
<img v-if="loginConfig.site_bg&&!imgLoading" class="hidden h-[100%] lg:block" :src="img(loginConfig.site_bg)" />
<img v-else class="hidden h-[100%] lg:block" src="@/app/assets/images/site_login_bg.png" />
<img v-else class="hidden h-[100%] lg:block" src="@/app/assets/images/login/site_login_bg.png" />
</template>
<div class="w-[100%] bg-[#F8FAFF] flex flex-col absolute right-0 top-0 h-screen lg:w-[60%]">
<div class="w-[100%] lg:w-[60%] h-screen flex flex-col absolute right-0 top-0 bg-[#F8FAFF]">
<div class="flex justify-center items-center flex-1 h-0">
<div class="site-login-item w-[45%] py-[30px] relative rounded-[13px] max-w-[350px] bg-[#fff]">
<div class="w-[80%] mx-auto">
<h3 class="text-3xl mb-[30px]">{{ t('siteLogin') }}</h3>
<el-form :model="form" ref="formRef" :rules="formRules">
<el-form-item prop="username">
<el-input v-model.trim="form.username" @keyup.enter="handleLogin(formRef)" autocomplete="off" class="w-50 m-1 h-[40px]" :placeholder="t('userPlaceholder')">
<template #prefix>
<icon name="element User" />
</template>
</el-input>
</el-form-item>
<div class="site-login-item w-[400px] h-[380px] p-[40px] rounded-2xl shadow bg-[#fff]">
<h3 class="text-3xl mb-[30px]">{{ t('siteLogin') }}</h3>
<el-form :model="form" ref="formRef" :rules="formRules">
<el-form-item prop="username">
<el-input v-model.trim="form.username" @keyup.enter="handleLogin(formRef)" autocomplete="off" class="h-[40px]" :placeholder="t('userPlaceholder')"></el-input>
</el-form-item>
<el-form-item prop="password">
<el-input type="password" v-model.trim="form.password" @keyup.enter="handleLogin(formRef)" autocomplete="new-password" :show-password="true" class="w-50 m-1 h-[40px]" :placeholder="t('passwordPlaceholder')">
<template #prefix>
<icon name="element Lock" />
</template>
</el-input>
</el-form-item>
<el-form-item prop="password" class="mt-[30px]">
<el-input type="password" v-model.trim="form.password" @keyup.enter="handleLogin(formRef)" autocomplete="new-password" :show-password="true" class="h-[40px]" :placeholder="t('passwordPlaceholder')"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" class="mt-[30px] h-[40px] w-full" @click="handleLogin(formRef)" :loading="loading">{{ loading ? t('logging') : t('login') }}</el-button>
</el-form-item>
</el-form>
</div>
<el-form-item>
<el-button type="primary" class="mt-[30px] !h-[40px] w-full" @click="handleLogin(formRef)" :loading="loading">{{ loading ? t('logging') : t('login') }}</el-button>
</el-form-item>
</el-form>
</div>
</div>
<div class="flex items-center justify-center mt-[20px] text-[#999] text-sm pb-8 " v-if="copyright">
<a :href="copyright.gov_url" v-if="copyright.gov_record" class="flex" target="_blank">
<img src="@/app/assets/images/gov_icon.png" alt="" class="h-[20px] mr-1">
<span class="mr-3">公安备案号:{{ copyright.gov_record }}</span>
</a>
<a href="https://beian.miit.gov.cn/" target="_blank" v-if="copyright.icp">
<span class="mr-3">备案号:{{ copyright.icp }}</span>
</a>
<div class="flex items-center justify-center mt-[20px] pb-[20px] text-sm text-[#999]" v-if="copyright">
<a :href="copyright.copyright_link" target="_blank">
<span class="mr-3" v-if="copyright.copyright_desc">{{ copyright.copyright_desc }}</span>
<span class="mr-3" v-if="copyright.company_name">{{ copyright.company_name }}</span>
<span class="mr-3" v-if="copyright.copyright_desc">©{{ copyright.copyright_desc }}</span>
</a>
<a href="https://beian.miit.gov.cn/" v-if="copyright.icp" target="_blank">
<span class="mr-3">{{ copyright.icp }}</span>
</a>
<a :href="copyright.gov_url" v-if="copyright.gov_record" target="_blank">
<span class="mr-3">{{ copyright.gov_record }}</span>
</a>
</div>
</div>
</div>
</el-main>
<div class="flex items-center justify-center mt-[20px] text-[#999] text-sm pb-8" v-if="copyright && loginType == 'admin'">
<a :href="copyright.gov_url" v-if="copyright.gov_record" class="flex" target="_blank">
<img src="@/app/assets/images/gov_icon.png" alt="" class="h-[20px] mr-1">
<span class="mr-3">公安备案号:{{ copyright.gov_record }}</span>
</a>
<a href="https://beian.miit.gov.cn/" target="_blank" v-if="copyright.icp">
<span class="mr-3">备案号:{{ copyright.icp }}</span>
</a>
<div class="flex items-center justify-center mt-[20px] pb-[20px] text-sm text-[#999]" v-if="copyright && loginType == 'admin'">
<a :href="copyright.copyright_link" target="_blank">
<span class="mr-3" v-if="copyright.copyright_desc">{{ copyright.copyright_desc }}</span>
<span class="mr-3" v-if="copyright.company_name">{{ copyright.company_name }}</span>
<span class="mr-3" v-if="copyright.copyright_desc">©{{ copyright.copyright_desc }}</span>
</a>
<a href="https://beian.miit.gov.cn/" v-if="copyright.icp" target="_blank">
<span class="mr-3">{{ copyright.icp }}</span>
</a>
<a :href="copyright.gov_url" v-if="copyright.gov_record" target="_blank">
<span class="mr-3">{{ copyright.gov_record }}</span>
</a>
</div>
@ -216,37 +191,16 @@ const loginFn = (data = {}) => {
padding: 0 !important;
}
.site-warp {
background-image: url("@/app/assets/images/login/site_bg.png");
background-color: #fff;
background-repeat: no-repeat;
background-size: 100% 100%;
}
.site-login-wrap {
// background-image: url('@/app/assets/images/back_login.jpg');
// background-repeat: no-repeat;
// background-size: cover;
}
.input-with-select .el-input-group__prepend {
background-color: var(--el-fill-color-blank);
padding: 0 15px;
}
.login-main {
display: flex !important;
}
.login {
background: var(--el-bg-color);
}
.login {
background: var(--el-bg-color);
}
.admin_name {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
-o-text-overflow: ellipsis;
.el-form-item__error {
top : 45px;
}
}
@media only screen and (max-width: 750px) {

View File

@ -3,7 +3,7 @@
<div class="main-container" v-loading="loading">
<el-card class="card !border-none" shadow="never">
<el-page-header :content="pageName" :icon="ArrowLeft" @back="$router.back()" />
<el-page-header :content="pageName" :icon="ArrowLeft" @back="back()" />
</el-card>
<el-card class="box-card mt-[15px] !border-none" shadow="never">
@ -101,6 +101,9 @@ import useAppStore from '@/stores/modules/app'
const route = useRoute()
const router = useRouter()
const pageName = route.meta.title
const back = () => {
router.push('/marketing/verify')
}
const appStore = useAppStore()
const loading = ref(true)

View File

@ -8,7 +8,7 @@
<el-input v-model.trim="formData.memo" type="textarea" rows="4" clearable :placeholder="t('memoPlaceholder')" class="input-width" maxlength="200" show-word-limit />
</el-form-item>
<el-form-item :label="t('sort')" prop="sort">
<el-input v-model.trim="formData.sort" clearable maxlength="6" show-word-limit :placeholder="t('sortPlaceholder')" class="input-width" @keyup="filterNumber($event)" />
<el-input v-model.trim="formData.sort" clearable maxlength="8" show-word-limit :placeholder="t('sortPlaceholder')" class="input-width" @keyup="filterNumber($event)" />
</el-form-item>
</el-form>

View File

@ -73,6 +73,7 @@ import { t } from '@/lang'
import { getMemberLevelPageList, deleteMemberLevel } from '@/app/api/member'
import { ElMessageBox, FormInstance } from 'element-plus'
import { useRoute, useRouter } from 'vue-router'
import { setTablePageStorage,getTablePageStorage } from "@/utils/common";
const route = useRoute()
const router = useRouter()
@ -112,11 +113,12 @@ const loadMemberLevelList = (page: number = 1) => {
memberLevelTableData.loading = false
memberLevelTableData.data = res.data.data
memberLevelTableData.total = res.data.total
setTablePageStorage(memberLevelTableData.page, memberLevelTableData.limit, memberLevelTableData.searchParam);
}).catch(() => {
memberLevelTableData.loading = false
})
}
loadMemberLevelList()
loadMemberLevelList(getTablePageStorage(memberLevelTableData.searchParam).page);
/**
* 添加会员标签

View File

@ -3,7 +3,7 @@
<div class="main-container">
<el-card class="card !border-none" shadow="never">
<el-page-header :content="pageName" :icon="ArrowLeft" @back="$router.back()" />
<el-page-header :content="pageName" :icon="ArrowLeft" @back="back()" />
</el-card>
<el-card class="box-card mt-[15px] !border-none" shadow="never" v-loading="loading">
@ -28,12 +28,12 @@
<h3 class="panel-title !text-sm">{{ t('levelBenefits') }}</h3>
<div class="pl-[100px]">
<member-benefits ref="benefitsRef" v-model="formData.level_benefits"/>
<member-benefits v-if="!loading" ref="benefitsRef" v-model="formData.level_benefits"/>
</div>
<h3 class="panel-title !text-sm">{{ t('levelGift') }}</h3>
<div class="pl-[100px]">
<member-gift ref="giftRef" v-model="formData.level_gifts"/>
<member-gift v-if="!loading" ref="giftRef" v-model="formData.level_gifts"/>
</div>
</el-card>
@ -61,6 +61,10 @@ const route = useRoute()
const router = useRouter()
const pageName = route.meta.title
const back = () => {
router.push('/member/level')
}
const benefitsRef = ref(null)
const giftRef = ref(null)
const loading = ref(true)

View File

@ -104,7 +104,7 @@ import { t } from '@/lang'
import { ElMessageBox, FormInstance } from 'element-plus'
import { useRoute, useRouter } from 'vue-router'
import { getPosterPageList,getPosterType,modifyPosterStatus,modifyPosterDefault,deletePoster,getPreviewPoster } from '@/app/api/poster'
import { img } from '@/utils/common'
import { img,setTablePageStorage,getTablePageStorage } from '@/utils/common'
const router = useRouter()
const route = useRoute()
@ -192,12 +192,13 @@ const loadPosterPageList = (page: number = 1) => {
posterTableData.loading = false
posterTableData.data = res.data.data
posterTableData.total = res.data.total
setTablePageStorage(posterTableData.page, posterTableData.limit, posterTableData.searchParam);
}).catch(() => {
posterTableData.loading = false
})
}
loadPosterPageList()
loadPosterPageList(getTablePageStorage(posterTableData.searchParam).page);
//
const editEvent = (data: any) => {

View File

@ -2,7 +2,7 @@
<div class="main-container">
<el-card class="card !border-none" shadow="never">
<el-page-header :content="pageName" :icon="ArrowLeft" @back="$router.back()" />
<el-page-header :content="pageName" :icon="ArrowLeft" @back="back()" />
</el-card>
<el-card class="box-card mt-[15px] !border-none" shadow="never" v-loading="loading">

View File

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

View File

@ -3,7 +3,7 @@
<div class="main-container" v-loading="loading">
<el-card class="card !border-none" shadow="never">
<el-page-header :content="pageName" :icon="ArrowLeft" @back="$router.back()" />
<el-page-header :content="pageName" :icon="ArrowLeft" @back="back()" />
</el-card>
<el-card class="box-card mt-[15px] !border-none" shadow="never">

View File

@ -3,7 +3,7 @@
<div class="main-container" v-loading="loading">
<el-card class="card !border-none" shadow="never">
<el-page-header :icon="ArrowLeft" @back="$router.back()">
<el-page-header :icon="ArrowLeft" @back="back()">
<template #content>
<span class="text-large font-600 mr-3">{{ pageName }}</span>
</template>

View File

@ -3,7 +3,7 @@
<div class="main-container" v-loading="loading">
<el-card class="card !border-none" shadow="never">
<el-page-header :content="pageName" :icon="ArrowLeft" @back="$router.back()" />
<el-page-header :content="pageName" :icon="ArrowLeft" @back="back()" />
</el-card>
<el-card class="box-card mt-[15px] !border-none" shadow="never">
@ -137,6 +137,10 @@ import { ElMessageBox } from 'element-plus'
const route = useRoute()
const router = useRouter()
const pageName = route.meta.title
const back = () => {
router.push('/admin/site/user')
}
const uid: number = parseInt(route.query.uid || 0)
const loading = ref(true)
const detail = ref({})

View File

@ -2,7 +2,7 @@
<div class="main-container" v-loading="loading">
<el-card class="card !border-none" shadow="never">
<el-page-header :content="pageName" :icon="ArrowLeft" @back="$router.back()" />
<el-page-header :content="pageName" :icon="ArrowLeft" @back="back()" />
</el-card>
<el-card class="box-card mt-[15px] !border-none" shadow="never">
@ -97,6 +97,10 @@ import { useRouter, useRoute } from 'vue-router'
const route = useRoute()
const router = useRouter()
const pageName = route.meta.title
const back = () => {
router.push('/tools/addon')
}
const form = ref({
title: '',
icon: '',

View File

@ -2,7 +2,7 @@
<div class="main-container" v-loading="loading">
<el-card class="card !border-none" shadow="never">
<el-page-header :content="pageName" :icon="ArrowLeft" @back="$router.back()" />
<el-page-header :content="pageName" :icon="ArrowLeft" @back="back()" />
</el-card>
<el-card class="box-card mt-[15px] !border-none" shadow="never">

View File

@ -2,7 +2,7 @@
<div class="main-container">
<el-card class="card !border-none" shadow="never">
<el-page-header :icon="ArrowLeft" @back="$router.back()">
<el-page-header :icon="ArrowLeft" @back="back()">
<template #content>
<span class="text-large font-600 mr-3">{{ pageName }}</span>
</template>
@ -122,7 +122,11 @@ import { ElMessageBox, ElMessage, FormInstance } from 'element-plus'
import { useRouter, useRoute } from 'vue-router'
const route = useRoute()
const router = useRouter()
const pageName = route.meta.title
const back = () => {
router.push('/tools/schedule')
}
const cronTableData = reactive({
page: 1,

View File

@ -1,7 +1,7 @@
<template>
<el-container :class="['h-full px-[10px]',{'layout-header border-b border-color': !dark}]" >
<el-row class="w-100 h-full w-full">
<el-col :span="12">
<el-col :span="10">
<div class="left-panel h-full flex items-center">
<!-- 左侧菜单折叠 -->
<!-- <div class="navbar-item flex items-center h-full cursor-pointer" @click="toggleMenuCollapse">
@ -20,8 +20,30 @@
</div>
</div>
</el-col>
<el-col :span="12">
<el-col :span="14">
<div class="right-panel h-full flex items-center justify-end">
<div class="flex items-center flex-shrink-0 hidden-xs-only">
<el-dropdown trigger="hover" :hide-on-click="false" popper-class="site-info-wrap" class="mr-[8px]">
<!-- 状态 -->
<div class="mx-[8px] bg-[#f6f6f6] border-[1px] border-solid border-[#eee] rounded-[4px] px-[9px] py-[6px] flex items-center">
<span class="mr-[6px] text-[12px] !text-[#333]">{{siteInfo.site_name}}</span>
<span class="!text-[10px] text-[#f56c6c]" :class="{'!text-[#67c23a]': siteInfo.status == 1, '!text-[#f56c6c]': siteInfo.status == 3}">{{ siteInfo.status_name }}</span>
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>
<!-- 站点id -->
<div class="text-[14px]">站点编号{{siteInfo.site_id}}</div>
</el-dropdown-item>
<el-dropdown-item>
<!-- 到期时间 -->
<div v-if="siteInfo.expire_time == 0" class="text-[14px]">到期时间永久</div>
<div v-else class="text-[14px]">到期时间{{ siteInfo.expire_time }}</div>
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
<!-- 预览 只有站点时展示-->
<i class="iconfont iconicon_huojian1 cursor-pointer px-[8px]" :title="t('visitWap')" @click="toPreview"></i>
<i class="iconfont iconlingdang-xianxing cursor-pointer px-[8px]" :title="t('newInfo')" v-if="appType == 'site'"></i>
@ -65,8 +87,9 @@ import layoutSetting from './layout-setting.vue'
import userInfo from './user-info.vue'
import { useFullscreen } from '@vueuse/core'
import useSystemStore from '@/stores/modules/system'
import useUserStore from '@/stores/modules/user'
import useAppStore from '@/stores/modules/app'
import { useRoute,useRouter } from 'vue-router'
import { useRoute, useRouter } from 'vue-router'
import { t } from '@/lang'
import storage from '@/utils/storage'
@ -78,6 +101,11 @@ const route = useRoute()
const router = useRouter()
const screenWidth = ref(window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth)
const userStore = useUserStore()
const siteInfo:any = computed(() => {
return userStore.siteInfo
})
const dark = computed(() => {
return systemStore.dark
})
@ -154,7 +182,7 @@ const toPreview = () => {
const url = router.resolve({
path: '/preview/wap',
query: {
page:'/'
page: '/'
}
})
window.open(url.href)
@ -182,5 +210,10 @@ const toPreview = () => {
background-color: var(--el-color-primary);
}
}
:deep(.el-dropdown-menu__item) {
&:focus {
background-color: transparent !important;
color: #333 !important;
}
}
</style>

View File

@ -1,7 +1,7 @@
<template>
<el-container :class="['h-full px-[10px]',{'layout-header border-b border-color': !dark}]" >
<el-row class="w-100 h-full w-full">
<el-col :span="12">
<el-col :span="10">
<div class="left-panel h-full flex items-center">
<!-- 左侧菜单折叠 -->
<div class="hidden-sm-and-up navbar-item flex items-center h-full cursor-pointer" @click="toggleMenuCollapse">
@ -20,8 +20,30 @@
</div>
</div>
</el-col>
<el-col :span="12">
<el-col :span="14">
<div class="right-panel h-full flex items-center justify-end">
<div class="flex items-center flex-shrink-0 hidden-xs-only">
<el-dropdown trigger="hover" :hide-on-click="false" popper-class="site-info-wrap" class="mr-[8px]">
<!-- 状态 -->
<div class="mx-[8px] bg-[#f6f6f6] border-[1px] border-solid border-[#eee] rounded-[4px] px-[9px] py-[6px] flex items-center">
<span class="mr-[6px] text-[12px] !text-[#333]">{{siteInfo.site_name}}</span>
<span class="!text-[10px] text-[#f56c6c]" :class="{'!text-[#67c23a]': siteInfo.status == 1, '!text-[#f56c6c]': siteInfo.status == 3}">{{ siteInfo.status_name }}</span>
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>
<!-- 站点id -->
<div class="text-[14px]">站点编号{{siteInfo.site_id}}</div>
</el-dropdown-item>
<el-dropdown-item>
<!-- 到期时间 -->
<div v-if="siteInfo.expire_time == 0" class="text-[14px]">到期时间永久</div>
<div v-else class="text-[14px]">到期时间{{ siteInfo.expire_time }}</div>
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
<!-- 预览 只有站点时展示-->
<i class="iconfont iconicon_huojian1 cursor-pointer px-[8px]" :title="t('visitWap')" @click="toPreview"></i>
<i class="iconfont iconlingdang-xianxing cursor-pointer px-[8px]" :title="t('newInfo')" v-if="appType == 'site'"></i>
@ -65,8 +87,9 @@ import layoutSetting from './layout-setting.vue'
import userInfo from './user-info.vue'
import { useFullscreen } from '@vueuse/core'
import useSystemStore from '@/stores/modules/system'
import useUserStore from '@/stores/modules/user'
import useAppStore from '@/stores/modules/app'
import { useRoute,useRouter } from 'vue-router'
import { useRoute, useRouter } from 'vue-router'
import { t } from '@/lang'
import storage from '@/utils/storage'
@ -78,6 +101,11 @@ const route = useRoute()
const router = useRouter()
const screenWidth = ref(window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth)
const userStore = useUserStore()
const siteInfo:any = computed(() => {
return userStore.siteInfo
})
const dark = computed(() => {
return systemStore.dark
})
@ -182,5 +210,11 @@ const toPreview = () => {
background-color: var(--el-color-primary);
}
}
:deep(.el-dropdown-menu__item) {
&:focus {
background-color: transparent !important;
color: #333 !important;
}
}
</style>

View File

@ -1,7 +1,7 @@
<template>
<el-container :class="['h-full px-[10px]',{'layout-header border-b border-color': !dark}]" >
<el-row class="w-100 h-full w-full">
<el-col :span="12">
<el-col :span="10">
<div class="left-panel h-full flex items-center">
<!-- 左侧菜单折叠 -->
<div class="hidden-sm-and-up navbar-item flex items-center h-full cursor-pointer" @click="toggleMenuCollapse">
@ -20,8 +20,30 @@
</div>
</div>
</el-col>
<el-col :span="12">
<el-col :span="14">
<div class="right-panel h-full flex items-center justify-end">
<div class="flex items-center flex-shrink-0 hidden-xs-only">
<el-dropdown trigger="hover" :hide-on-click="false" popper-class="site-info-wrap" class="mr-[8px]">
<!-- 状态 -->
<div class="mx-[8px] bg-[#f6f6f6] border-[1px] border-solid border-[#eee] rounded-[4px] px-[9px] py-[6px] flex items-center">
<span class="mr-[6px] text-[12px] !text-[#333]">{{siteInfo.site_name}}</span>
<span class="!text-[10px] text-[#f56c6c]" :class="{'!text-[#67c23a]': siteInfo.status == 1, '!text-[#f56c6c]': siteInfo.status == 3}">{{ siteInfo.status_name }}</span>
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>
<!-- 站点id -->
<div class="text-[14px]">站点编号{{siteInfo.site_id}}</div>
</el-dropdown-item>
<el-dropdown-item>
<!-- 到期时间 -->
<div v-if="siteInfo.expire_time == 0" class="text-[14px]">到期时间永久</div>
<div v-else class="text-[14px]">到期时间{{ siteInfo.expire_time }}</div>
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
<!-- 预览 只有站点时展示-->
<i class="iconfont iconicon_huojian1 cursor-pointer px-[8px]" :title="t('visitWap')" @click="toPreview"></i>
<i class="iconfont iconlingdang-xianxing cursor-pointer px-[8px]" :title="t('newInfo')" v-if="appType == 'site'"></i>
@ -65,8 +87,9 @@ import layoutSetting from './layout-setting.vue'
import userInfo from './user-info.vue'
import { useFullscreen } from '@vueuse/core'
import useSystemStore from '@/stores/modules/system'
import useUserStore from '@/stores/modules/user'
import useAppStore from '@/stores/modules/app'
import { useRoute,useRouter } from 'vue-router'
import { useRoute, useRouter } from 'vue-router'
import { t } from '@/lang'
import storage from '@/utils/storage'
@ -78,6 +101,11 @@ const route = useRoute()
const router = useRouter()
const screenWidth = ref(window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth)
const userStore = useUserStore()
const siteInfo:any = computed(() => {
return userStore.siteInfo
})
const dark = computed(() => {
return systemStore.dark
})
@ -181,5 +209,10 @@ const toPreview = () => {
background-color: var(--el-color-primary);
}
}
:deep(.el-dropdown-menu__item) {
&:focus {
background-color: transparent !important;
color: #333 !important;
}
}
</style>

View File

@ -1,7 +1,7 @@
<template>
<el-container :class="['h-full px-[10px]',{'layout-header border-b border-color': !dark}]" >
<el-row class="w-100 h-full w-full">
<el-col :span="12">
<el-col :span="10">
<div class="left-panel h-full flex items-center">
<!-- 左侧菜单折叠 -->
<!-- <div class="navbar-item flex items-center h-full cursor-pointer" @click="toggleMenuCollapse">
@ -20,8 +20,30 @@
</div>
</div>
</el-col>
<el-col :span="12">
<el-col :span="14">
<div class="right-panel h-full flex items-center justify-end">
<div class="flex items-center flex-shrink-0 hidden-xs-only">
<el-dropdown trigger="hover" :hide-on-click="false" popper-class="site-info-wrap" class="mr-[8px]">
<!-- 状态 -->
<div class="mx-[8px] bg-[#f6f6f6] border-[1px] border-solid border-[#eee] rounded-[4px] px-[9px] py-[6px] flex items-center">
<span class="mr-[6px] text-[12px] !text-[#333]">{{siteInfo.site_name}}</span>
<span class="!text-[10px] text-[#f56c6c]" :class="{'!text-[#67c23a]': siteInfo.status == 1, '!text-[#f56c6c]': siteInfo.status == 3}">{{ siteInfo.status_name }}</span>
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>
<!-- 站点id -->
<div class="text-[14px]">站点编号{{siteInfo.site_id}}</div>
</el-dropdown-item>
<el-dropdown-item>
<!-- 到期时间 -->
<div v-if="siteInfo.expire_time == 0" class="text-[14px]">到期时间永久</div>
<div v-else class="text-[14px]">到期时间{{ siteInfo.expire_time }}</div>
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
<!-- 预览 只有站点时展示-->
<i class="iconfont iconicon_huojian1 cursor-pointer px-[8px]" :title="t('visitWap')" @click="toPreview"></i>
<i class="iconfont iconlingdang-xianxing cursor-pointer px-[8px]" :title="t('newInfo')" v-if="appType == 'site'"></i>
@ -65,8 +87,9 @@ import layoutSetting from './layout-setting.vue'
import userInfo from './user-info.vue'
import { useFullscreen } from '@vueuse/core'
import useSystemStore from '@/stores/modules/system'
import useUserStore from '@/stores/modules/user'
import useAppStore from '@/stores/modules/app'
import { useRoute,useRouter } from 'vue-router'
import { useRoute, useRouter } from 'vue-router'
import { t } from '@/lang'
import storage from '@/utils/storage'
@ -78,6 +101,11 @@ const route = useRoute()
const router = useRouter()
const screenWidth = ref(window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth)
const userStore = useUserStore()
const siteInfo:any = computed(() => {
return userStore.siteInfo
})
const dark = computed(() => {
return systemStore.dark
})
@ -181,5 +209,10 @@ const toPreview = () => {
background-color: var(--el-color-primary);
}
}
:deep(.el-dropdown-menu__item) {
&:focus {
background-color: transparent !important;
color: #333 !important;
}
}
</style>

View File

@ -1,8 +1,8 @@
@font-face {
font-family: "iconfont"; /* Project id 3883393 */
src: url('//at.alicdn.com/t/c/font_3883393_t4cbwq5qdz.woff2?t=1729077942624') format('woff2'),
url('//at.alicdn.com/t/c/font_3883393_t4cbwq5qdz.woff?t=1729077942624') format('woff'),
url('//at.alicdn.com/t/c/font_3883393_t4cbwq5qdz.ttf?t=1729077942624') format('truetype');
src: url('//at.alicdn.com/t/c/font_3883393_xso0134odj.woff2?t=1732777083024') format('woff2'),
url('//at.alicdn.com/t/c/font_3883393_xso0134odj.woff?t=1732777083024') format('woff'),
url('//at.alicdn.com/t/c/font_3883393_xso0134odj.ttf?t=1732777083024') format('truetype');
}
.iconfont {
@ -13,6 +13,18 @@
-moz-osx-font-smoothing: grayscale;
}
.iconshujutongji:before {
content: "\e835";
}
.iconshangpinguanli1:before {
content: "\e837";
}
.icondingdanguanli:before {
content: "\e838";
}
.icona-tupianzhanbopc302:before {
content: "\e83c";
}

File diff suppressed because it is too large Load Diff

View File

@ -40,7 +40,7 @@ export function setThemeColor(color: string, mode: string = 'light'): void {
}
Object.keys(colors[mode]).forEach((key) => {
useCssVar('--el-color-primary' + '-' + key, null).value = colorFunction.convert(`color(${color} ${colors[mode][key]})`)
useCssVar('--el-color-primary' + '-' + key, null).value = colorFunction.convert(`color(${ color } ${ colors[mode][key] })`)
})
}
@ -48,7 +48,9 @@ export function setThemeColor(color: string, mode: string = 'light'): void {
* 访
*/
export function getAppType() {
const path = location.pathname.split('/').filter((val) => { return val })
const path = location.pathname.split('/').filter((val) => {
return val
})
if (!path.length) {
return 'admin'
@ -125,7 +127,7 @@ export function isUrl(str: string): boolean {
* @returns
*/
export function img(path: string): string {
return isUrl(path) ? path : `${import.meta.env.VITE_IMG_DOMAIN || location.origin}/${path}`
return isUrl(path) ? path : `${ import.meta.env.VITE_IMG_DOMAIN || location.origin }/${ path }`
}
/**
@ -133,7 +135,7 @@ export function img(path: string): string {
* @param path
* @returns
*/
export function assetImg (path: string) {
export function assetImg(path: string) {
return new URL('@/', import.meta.url) + path
}
@ -228,16 +230,16 @@ export function guid(len = 10, firstU = true, radix: any = null) {
// 移除第一个字符,并用u替代,因为第一个字符为数值时,该guuid不能用作id或者class
if (firstU) {
uuid.shift()
return `u${uuid.join('')}`
return `u${ uuid.join('') }`
}
return uuid.join('')
}
/**
*
*/
export function moneyFormat(money : string) : string {
return isNaN(parseFloat(money)) ? money : parseFloat(money).toFixed(2)
*
*/
export function moneyFormat(money: string): string {
return isNaN(parseFloat(money)) ? money : parseFloat(money).toFixed(2)
}
@ -245,65 +247,65 @@ export function moneyFormat(money : string) : string {
*
*/
export function timeStampTurnTime(timeStamp: any, type = "") {
if (timeStamp != undefined && timeStamp != "" && timeStamp > 0) {
var date = new Date();
date.setTime(timeStamp * 1000);
var y: any = date.getFullYear();
var m: any = date.getMonth() + 1;
m = m < 10 ? ('0' + m) : m;
var d: any = date.getDate();
d = d < 10 ? ('0' + d) : d;
var h: any = date.getHours();
h = h < 10 ? ('0' + h) : h;
var minute: any = date.getMinutes();
var second: any = date.getSeconds();
minute = minute < 10 ? ('0' + minute) : minute;
second = second < 10 ? ('0' + second) : second;
if (type) {
if (type == 'yearMonthDay') {
return y + '年' + m + '月' + d + '日';
}
return y + '-' + m + '-' + d;
} else {
return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second;
}
if (timeStamp != undefined && timeStamp != "" && timeStamp > 0) {
var date = new Date();
date.setTime(timeStamp * 1000);
var y: any = date.getFullYear();
var m: any = date.getMonth() + 1;
m = m < 10 ? ('0' + m) : m;
var d: any = date.getDate();
d = d < 10 ? ('0' + d) : d;
var h: any = date.getHours();
h = h < 10 ? ('0' + h) : h;
var minute: any = date.getMinutes();
var second: any = date.getSeconds();
minute = minute < 10 ? ('0' + minute) : minute;
second = second < 10 ? ('0' + second) : second;
if (type) {
if (type == 'yearMonthDay') {
return y + '年' + m + '月' + d + '日';
}
return y + '-' + m + '-' + d;
} else {
return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second;
}
} else {
return "";
}
} else {
return "";
}
}
/**
* ()
* @param event
*/
export function filterDigit(event:any){
event.target.value = event.target.value.replace(/[^\d\.]/g,'');
event.target.value = event.target.value.replace(/^\./g,'');
event.target.value = event.target.value.replace(/\.{2,}/g,'.');
export function filterDigit(event: any) {
event.target.value = event.target.value.replace(/[^\d\.]/g, '');
event.target.value = event.target.value.replace(/^\./g, '');
event.target.value = event.target.value.replace(/\.{2,}/g, '.');
// 限制最多两位小数
const decimalParts = event.target.value.split('.');
if (decimalParts.length > 1 && decimalParts[1].length > 2) {
// 如果有小数部分且超过两位,则截取前两位
event.target.value = `${decimalParts[0]}.${decimalParts[1].slice(0, 2)}`;
event.target.value = `${ decimalParts[0] }.${ decimalParts[1].slice(0, 2) }`;
}
}
/**
*
* @param event
* @param event
*/
export function filterNumber(event:any){
event.target.value = event.target.value.replace(/[^\d]/g,'');
export function filterNumber(event: any) {
event.target.value = event.target.value.replace(/[^\d]/g, '');
}
/**
*
* @param event
* @param event
*/
export function filterSpecial(event:any){
export function filterSpecial(event: any) {
event.target.value = event.target.value.replace(/[^\u4e00-\u9fa5a-zA-Z0-9]/g, '')
event.target.value = event.target.value.replace(/[`~!@#$%^&*()_\-+=<>?:"{}|,.\/;'\\[\]·~@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、]/g,'')
event.target.value = event.target.value.replace(/[`~!@#$%^&*()_\-+=<>?:"{}|,.\/;'\\[\]·~@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、]/g, '')
}
export function importIconFontCss() {
@ -348,4 +350,48 @@ export function getIcon() {
// }
// console.log('modules', modules)
// // const addonModulesFiles = import.meta.glob('@/addon/**/assets/icon/*.json', { eager: true })
}
}
/**
*
* @param page
* @param limit
* @param where
*/
export function setTablePageStorage(page: any = 1, limit: any = 10, where: any = {}) {
var data = storage.get('tablePageStorage');
if (!data) {
data = {};
}
var key = location.pathname + JSON.stringify(where);
data[key] = {
page,
limit
};
var MAX_COUNT = 5; // 最多存储 5 个页面的分页缓存,超出则删除最开始的第一个页面
if (Object.keys(data).length > MAX_COUNT) {
delete data[Object.keys(data)[0]];
}
storage.set({ key: 'tablePageStorage', data });
}
/**
*
* @param where
*/
export function getTablePageStorage(where: any = {}) {
var data = storage.get('tablePageStorage');
var key = location.pathname + JSON.stringify(where);
if (!data || !data[key]) {
data = {
page: 1,
limit: 10
};
} else {
data = data[key];
}
return data;
}