更新admin

This commit is contained in:
全栈小学生 2023-07-01 16:14:49 +08:00
parent 0b2fbd075b
commit 509de0cd05
141 changed files with 3142 additions and 1775 deletions

View File

@ -2,15 +2,15 @@ import request from '@/utils/request'
/**
*
* @returns
* @returns
*/
export function getAddonLocal(params: Record<string, any>) {
return request.get('addon/local', params, { showSuccessMessage: true })
return request.get('addon/local', params, {showSuccessMessage: true})
}
/**
*
* @returns
* @returns
*/
export function getAddonDetial(id: number) {
return request.get(`addon/${id}`)
@ -27,27 +27,27 @@ export function installAddon(params: Record<string, any>) {
/**
*
* @param params
* @param params
* @returns
*/
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})
}
/**
*
* @param addon
* @returns
* @param addon
* @returns
*/
export function preInstallCheck(addon: string) {
return request.get(`addon/install/check/${addon}`, { timeout: 30 * 1000 })
return request.get(`addon/install/check/${addon}`, {timeout: 30 * 1000})
}
/**
*
* @param addon
* @param key
* @returns
* @param addon
* @param key
* @returns
*/
export function getAddonInstallTaskState(addon: string, key: string) {
return request.get(`addon/install/${addon}/status/${key}`)
@ -55,8 +55,7 @@ export function getAddonInstallTaskState(addon: string, key: string) {
/**
*
* @param params
* @returns
* @param addon
*/
export function executeInstall(addon: string) {
return request.post(`addon/install/execute/${addon}`, {})

View File

@ -2,7 +2,7 @@ import request from '@/utils/request'
/**
*
* @returns
* @returns
*/
export function getAliappConfig() {
return request.get('aliapp/config')
@ -10,16 +10,16 @@ export function getAliappConfig() {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function setAliappConfig(params: Record<string, any>) {
return request.put('aliapp/config', params, { showSuccessMessage: true })
return request.put('aliapp/config', params, {showSuccessMessage: true})
}
/**
*
* @returns
* @returns
*/
export function getAliappStatic() {
return request.get('aliapp/static')

View File

@ -8,7 +8,7 @@ import request from '@/utils/request'
* @returns
*/
export function getArticleList(params: Record<string, any>) {
return request.get(`article/article`, { params })
return request.get(`article/article`, {params})
}
/**
@ -26,17 +26,15 @@ export function getArticleInfo(id: number) {
* @returns
*/
export function addArticle(params: Record<string, any>) {
return request.post('article/article', params, { showSuccessMessage: true })
return request.post('article/article', params, {showSuccessMessage: true})
}
/**
*
* @param id
* @param params
* @returns
*/
export function editArticle(params: Record<string, any>) {
return request.put(`article/article/${params.id}`, params, { showSuccessMessage: true })
return request.put(`article/article/${params.id}`, params, {showSuccessMessage: true})
}
/**
@ -45,24 +43,25 @@ export function editArticle(params: Record<string, any>) {
* @returns
*/
export function deleteArticle(id: number) {
return request.delete(`article/article/${id}`, { showSuccessMessage: true })
return request.delete(`article/article/${id}`, {showSuccessMessage: true})
}
/***************************************************** 文章分类管理 ****************************************************/
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getArticleCategoryList(params: Record<string, any>) {
return request.get(`article/category`, { params })
return request.get(`article/category`, {params})
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getArticleCategoryAll(params: Record<string, any>) {
return request.get(`article/category/all`, params)
@ -70,8 +69,7 @@ export function getArticleCategoryAll(params: Record<string, any>) {
/**
*
* @param id id
* @returns
* @param category_id
*/
export function getArticleCategoryInfo(category_id: number) {
return request.get(`article/category/${category_id}`);
@ -79,27 +77,26 @@ export function getArticleCategoryInfo(category_id: number) {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function addArticleCategory(params: Record<string, any>) {
return request.post('article/category', params, { showSuccessMessage: true })
return request.post('article/category', params, {showSuccessMessage: true})
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function editArticleCategory(params: Record<string, any>) {
return request.put(`article/category/${params.category_id}`, params, { showSuccessMessage: true })
return request.put(`article/category/${params.category_id}`, params, {showSuccessMessage: true})
}
/**
*
* @param id id
* @returns
* @param category_id
*/
export function deleteArticleCategory(category_id: number) {
return request.delete(`article/category/${category_id}`, { showSuccessMessage: true });
return request.delete(`article/category/${category_id}`, {showSuccessMessage: true});
}

View File

@ -2,16 +2,16 @@ import request from '@/utils/request'
/**
*
* @param params
* @returns
* @param params
* @param app_type
*/
export function login(params: Record<string, any>, app_type: string) {
return request.get(`login/${app_type}`, { params })
return request.get(`login/${app_type}`, {params})
}
/**
*
* @returns
* @returns
*/
export function getAuthMenus() {
return request.get('auth/authmenu')
@ -19,7 +19,7 @@ export function getAuthMenus() {
/**
*
* @returns
* @returns
*/
export function getSiteInfo() {
return request.get('auth/site')
@ -27,7 +27,7 @@ export function getSiteInfo() {
/**
*
* @returns
* @returns
*/
export function getLoginConfig() {
return request.get('login/config')

View File

@ -2,7 +2,7 @@ import request from '@/utils/request'
/**
* h5配置
* @returns
* @returns
*/
export function getH5Config() {
return request.get('channel/h5/config')
@ -10,9 +10,9 @@ export function getH5Config() {
/**
* h5配置
* @param params
* @returns
* @param params
* @returns
*/
export function setH5Config(params: Record<string, any>) {
return request.put('channel/h5/config', params, { showSuccessMessage: true })
return request.put('channel/h5/config', params, {showSuccessMessage: true})
}

View File

@ -5,17 +5,17 @@ import request from '@/utils/request'
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getMemberList(params: Record<string, any>) {
return request.get(`member/member`, { params })
return request.get(`member/member`, {params})
}
/**
*
* @param id id
* @returns
* @returns
*/
export function getMemberInfo(id: number) {
return request.get(`member/member/${id}`);
@ -23,7 +23,7 @@ export function getMemberInfo(id: number) {
/**
*
* @returns
* @returns
*/
export function getMemberNo() {
return request.get(`member/memberno`);
@ -31,17 +31,17 @@ export function getMemberNo() {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function addMember(params: Record<string, any>) {
return request.post(`member/member`, params, { showSuccessMessage: true })
return request.post(`member/member`, params, {showSuccessMessage: true})
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getRegisterType(params: Record<string, any>) {
return request.get(`member/registertype`, params)
@ -49,8 +49,8 @@ export function getRegisterType(params: Record<string, any>) {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getRegisterChannelType(params: Record<string, any>) {
return request.get(`member/register/channel`, params)
@ -58,15 +58,13 @@ export function getRegisterChannelType(params: Record<string, any>) {
/**
*
* @param params
* @returns
* @param member_id
*/
export function deleteMember(member_id: number) {
return request.delete(`member/member/${member_id}`, { showSuccessMessage: true })
return request.delete(`member/member/${member_id}`, {showSuccessMessage: true})
}
/***************************************************** 会员标签 ****************************************************/
/**
@ -75,7 +73,7 @@ export function deleteMember(member_id: number) {
* @returns
*/
export function getMemberLabelList(params: Record<string, any>) {
return request.get(`member/label`, { params })
return request.get(`member/label`, {params})
}
/**
@ -93,17 +91,15 @@ export function getMemberLabelInfo(label_id: number) {
* @returns
*/
export function addMemberLabel(params: Record<string, any>) {
return request.post('member/label', params, { showSuccessMessage: true })
return request.post('member/label', params, {showSuccessMessage: true})
}
/**
*
* @param label_id
* @param params
* @returns
*/
export function updateMemberLabel(params: Record<string, any>) {
return request.put(`member/label/${params.label_id}`, params, { showSuccessMessage: true })
return request.put(`member/label/${params.label_id}`, params, {showSuccessMessage: true})
}
/**
@ -112,13 +108,11 @@ export function updateMemberLabel(params: Record<string, any>) {
* @returns
*/
export function deleteMemberLabel(label_id: number) {
return request.delete(`member/label/${label_id}`, { showSuccessMessage: true })
return request.delete(`member/label/${label_id}`, {showSuccessMessage: true})
}
/**
*
* @param label_id label_id
* @returns
*/
export function getMemberLabelAll() {
return request.get(`member/label/all`);
@ -126,25 +120,20 @@ export function getMemberLabelAll() {
/**
*
* @param id
* @param params
* @returns
* @param params
*/
export function editMemberDetail(params: Record<string, any>) {
return request.put(`member/member/modify/${params.member_id}/${params.field}`, params, { showSuccessMessage: true })
return request.put(`member/member/modify/${params.member_id}/${params.field}`, params, {showSuccessMessage: true})
}
/***************************************************** 会员零钱 ****************************************************/
/***************************************************** 会员账户 ****************************************************/
/**
*
* @param params
* @returns
* @param change_type
*/
export function getChangeTypeList(change_type: string) {
return request.get(`member/account/change_type/${change_type}`)
@ -152,77 +141,78 @@ export function getChangeTypeList(change_type: string) {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getPointList(params: Record<string, any>) {
return request.get(`member/account/point`, { params })
return request.get(`member/account/point`, {params})
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getBalanceList(params: Record<string, any>) {
return request.get(`member/account/balance`, { params })
return request.get(`member/account/balance`, {params})
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getMoneyList(params: Record<string, any>) {
return request.get(`member/account/money`, { params })
return request.get(`member/account/money`, {params})
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getCommissionList(params: Record<string, any>) {
return request.get(`member/account/commission`, { params })
return request.get(`member/account/commission`, {params})
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function adjustPoint(params: Record<string, any>) {
return request.post(`member/account/point`, params, { showSuccessMessage: true })
return request.post(`member/account/point`, params, {showSuccessMessage: true})
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function adjustBalance(params: Record<string, any>) {
return request.post(`member/account/balance`, params, { showSuccessMessage: true })
return request.post(`member/account/balance`, params, {showSuccessMessage: true})
}
/***************************************************** 会员相关设置 ****************************************************/
/**
*
* @param params
* @returns
*/
export function getLoginConfig() {
return request.get(`member/config/login`)
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function setLoginConfig(params: Record<string, any>) {
return request.post(`member/config/login`, params, { showSuccessMessage: true })
return request.post(`member/config/login`, params, {showSuccessMessage: true})
}
/**
*
* @param params
* @returns
*/
export function getMemberConfig() {
return request.get(`member/config/member`)
@ -230,18 +220,16 @@ export function getMemberConfig() {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function setMemberConfig(params: Record<string, any>) {
return request.post(`member/config/member`, params, { showSuccessMessage: true })
return request.post(`member/config/member`, params, {showSuccessMessage: true})
}
/**
*
* @param params
* @returns
*/
export function getTransfertype() {
return request.get(`member/cash_out/transfertype`)
@ -250,35 +238,33 @@ export function getTransfertype() {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getCommissionSum(params: Record<string, any>) {
return request.get(`member/account/sum_commission`, { params })
return request.get(`member/account/sum_commission`, {params})
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getPointSum(params: Record<string, any>) {
return request.get(`member/account/sum_point`, { params })
return request.get(`member/account/sum_point`, {params})
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getBalanceSum(params: Record<string, any>) {
return request.get(`member/account/sum_balance`, { params })
return request.get(`member/account/sum_balance`, {params})
}
/**
*
* @param params
* @returns
*/
export function getBalanceStatus() {
return request.get(`member/account/type`)
@ -296,34 +282,32 @@ export function getAccountType(params: Record<string, any>) {
/**
*
* @param params
* @returns
*/
export function getCashOutConfig() {
return request.get(`member/config/cash_out`)
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function setCashOutConfig(params: Record<string, any>) {
return request.post(`member/config/cash_out`, params, { showSuccessMessage: true })
return request.post(`member/config/cash_out`, params, {showSuccessMessage: true})
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getCashOutList(params: Record<string, any>) {
return request.get(`member/cash_out`, { params })
return request.get(`member/cash_out`, {params})
}
/**
*
* @param params
* @returns id
* @param id
*/
export function getCashOutDetail(id: number) {
return request.get(`member/cash_out/${id}`, {})
@ -331,38 +315,30 @@ export function getCashOutDetail(id: number) {
/**
*
* @param id
* @param params
* @returns
*/
export function memberAudit(params: Record<string, any>) {
return request.put(`member/cash_out/audit/${params.id}/${params.action}`, params, { showSuccessMessage: true })
return request.put(`member/cash_out/audit/${params.id}/${params.action}`, params, {showSuccessMessage: true})
}
/**
*
* @param id
* @param params
* @returns
*/
export function memberTransfer(params: Record<string, any>) {
return request.put(`member/cash_out/transfer/${params.id}`, params, { showSuccessMessage: true })
return request.put(`member/cash_out/transfer/${params.id}`, params, {showSuccessMessage: true})
}
/**
*
* @param id
* @param params
* @returns
* @param params
*/
export function editMemberStatus(params: Record<string, any>) {
return request.put(`member/setstatus/${params.status}`, params, { showSuccessMessage: true })
return request.put(`member/setstatus/${params.status}`, params, {showSuccessMessage: true})
}
/**
*
* @param params
* @returns
*/
export function getCashOutStatusList() {
return request.get(`member/cash_out/status`)

View File

@ -4,7 +4,7 @@ import request from '@/utils/request'
/**
*
* @returns
* @returns
*/
export function getNoticeList() {
return request.get('notice/notice')
@ -13,7 +13,7 @@ export function getNoticeList() {
/**
*
* @param key
* @returns
* @returns
*/
export function getNoticeInfo(key: string) {
return request.get(`notice/notice/${key}`)
@ -21,35 +21,35 @@ export function getNoticeInfo(key: string) {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getNoticeLog(params: any) {
return request.get(`notice/log`, { params })
return request.get(`notice/log`, {params})
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function editNoticeStatus(params: Record<string, any>) {
return request.post(`notice/notice/editstatus`, params, { showSuccessMessage: true })
return request.post(`notice/notice/editstatus`, params, {showSuccessMessage: true})
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function editNotice(params: Record<string, any>) {
return request.post(`notice/notice/edit`, params, { showSuccessMessage: true })
return request.post(`notice/notice/edit`, params, {showSuccessMessage: true})
}
/**
*
* @returns
* @returns
*/
export function getSmsList() {
return request.get('notice/notice/sms')
@ -57,8 +57,8 @@ export function getSmsList() {
/**
*
* @param sms_type
* @returns
* @param sms_type
* @returns
*/
export function getSmsInfo(sms_type: string) {
return request.get(`notice/notice/sms/${sms_type}`,)
@ -66,19 +66,15 @@ export function getSmsInfo(sms_type: string) {
/**
*
* @param sms_type
* @param params
* @returns
* @param params
*/
export function editSms(params: Record<string, any>) {
return request.put(`notice/notice/sms/${params.sms_type}`, params, { showSuccessMessage: true })
return request.put(`notice/notice/sms/${params.sms_type}`, params, {showSuccessMessage: true})
}
/**
*
* @param sms_type
* @param params
* @returns
* @param params
*/
export function getSmsLog(params: Record<string, any>) {
return request.get(`notice/sms/log`, params)

View File

@ -8,7 +8,7 @@ import request from '@/utils/request'
* @returns
*/
export function getRechargeOrderList(params: Record<string, any>) {
return request.get(`order/recharge`, { params })
return request.get(`order/recharge`, {params})
}
/**
@ -17,7 +17,7 @@ export function getRechargeOrderList(params: Record<string, any>) {
* @returns
*/
export function getRechargeStat(params: Record<string, any>) {
return request.get(`order/recharge/stat`, { params })
return request.get(`order/recharge/stat`, {params})
}
/**
@ -42,7 +42,7 @@ export function getRechargeOrderStatusList() {
* @returns
*/
export function getRechargeRefund(params: Record<string, any>) {
return request.get(`order/recharge/refund`, { params })
return request.get(`order/recharge/refund`, {params})
}
/**
@ -54,15 +54,15 @@ export function getRechargeRefundStatus() {
}
/**
* 退
* 退
* @returns
*/
export function rechargeRefund(id: number) {
return request.put(`order/recharge/refund/${id}`, {}, { showSuccessMessage: true });
return request.put(`order/recharge/refund/${id}`, {}, {showSuccessMessage: true});
}
/**
* 退
* 退
* @returns
*/
export function getRechargeRefundStat() {

View File

@ -2,7 +2,7 @@ import request from '@/utils/request'
/**
*
* @returns
* @returns
*/
export function getUserInfo(type: string) {
return request.get(`auth/get`)
@ -10,9 +10,9 @@ export function getUserInfo(type: string) {
/**
*
* @returns
* @returns
*/
export function setUserInfo(params: Record<string, any>) {
return request.put(`auth/edit`, params, { showSuccessMessage: true });
return request.put(`auth/edit`, params, {showSuccessMessage: true});
}

View File

@ -6,17 +6,16 @@ import request from '@/utils/request'
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getSiteList(params: Record<string, any>) {
return request.get(`site/site`, { params })
return request.get(`site/site`, {params})
}
/**
*
* @param id id
* @returns
* @param site_id
*/
export function getSiteInfo(site_id: number) {
return request.get(`site/site/${site_id}`);
@ -24,47 +23,39 @@ export function getSiteInfo(site_id: number) {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function addSite(params: Record<string, any>) {
return request.post('site/site', params, { showSuccessMessage: true })
return request.post('site/site', params, {showSuccessMessage: true})
}
/**
*
* @param id
* @param params
* @returns
* @param params
*/
export function editSite(params: Record<string, any>) {
return request.put(`site/site/${params.site_id}`, params, { showSuccessMessage: true })
return request.put(`site/site/${params.site_id}`, params, {showSuccessMessage: true})
}
/**
*
* @param id
* @param params
* @returns
* @param params
*/
export function closeSite(params: Record<string, any>) {
return request.put(`site/closesite/${params.site_id}`, params, { showSuccessMessage: true })
return request.put(`site/closesite/${params.site_id}`, params, {showSuccessMessage: true})
}
/**
*
* @param id
* @param params
* @returns
*
* @param params
*/
export function openSite(params: Record<string, any>) {
return request.put(`site/opensite/${params.site_id}`, params, { showSuccessMessage: true })
return request.put(`site/opensite/${params.site_id}`, params, {showSuccessMessage: true})
}
/**
*
* @param params
* @returns
*/
export function getStatusList() {
return request.get(`site/statuslist`)
@ -75,17 +66,16 @@ export function getStatusList() {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getSiteGroupList(params: Record<string, any>) {
return request.get(`site/group`, { params })
return request.get(`site/group`, {params})
}
/**
*
* @param id id
* @returns
* @param site_id
*/
export function getSiteGroupInfo(site_id: number) {
return request.get(`site/group/${site_id}`);
@ -93,37 +83,33 @@ export function getSiteGroupInfo(site_id: number) {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function addSiteGroup(params: Record<string, any>) {
return request.post('site/group', params, { showSuccessMessage: true })
return request.post('site/group', params, {showSuccessMessage: true})
}
/**
*
* @param id
* @param params
* @returns
* @param params
*/
export function editSiteGroup(params: Record<string, any>) {
return request.put(`site/group/${params.group_id}`, params, { showSuccessMessage: true })
return request.put(`site/group/${params.group_id}`, params, {showSuccessMessage: true})
}
/**
*
* @param id
* @param params
* @returns
* @param group_id
*/
export function deleteSiteGroup(group_id: number) {
return request.delete(`site/group/${group_id}`, { showSuccessMessage: true });
return request.delete(`site/group/${group_id}`, {showSuccessMessage: true});
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getSiteGroupAll(params: Record<string, any>) {
return request.get(`site/group/all`, params)
@ -133,17 +119,16 @@ export function getSiteGroupAll(params: Record<string, any>) {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getUserList(params: Record<string, any>) {
return request.get(`site/user`, { params })
return request.get(`site/user`, {params})
}
/**
*
* @param id id
* @returns
* @param uid
*/
export function getUserInfo(uid: number) {
return request.get(`site/user/${uid}`);
@ -151,37 +136,35 @@ export function getUserInfo(uid: number) {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function addUser(params: Record<string, any>) {
return request.post('site/user', params, { showSuccessMessage: true })
return request.post('site/user', params, {showSuccessMessage: true})
}
/**
*
* @param uid
* @param params
* @returns
* @param params
*/
export function editUser(params: Record<string, any>) {
return request.put(`site/user/${params.uid}`, params, { showSuccessMessage: true })
return request.put(`site/user/${params.uid}`, params, {showSuccessMessage: true})
}
/**
*
* @param uid
* @returns
* @param uid
* @returns
*/
export function deleteUser(uid: number) {
return request.delete(`site/user/${uid}`, { showSuccessMessage: true })
return request.delete(`site/user/${uid}`, {showSuccessMessage: true})
}
/**
*
* @param uid
* @returns
* @param uid
* @returns
*/
export function lockUser(uid: number) {
return request.put(`site/user/lock/${uid}`)
@ -190,8 +173,8 @@ export function lockUser(uid: number) {
/**
*
* @param uid
* @returns
* @param uid
* @returns
*/
export function unlockUser(uid: number) {
return request.put(`site/user/unlock/${uid}`)
@ -202,36 +185,35 @@ export function unlockUser(uid: number) {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getLogList(params: Record<string, any>) {
return request.get(`site/log`, { params })
return request.get(`site/log`, {params})
}
/**
*
* @param params
* @returns
* @param id
*/
export function getLogInfo(id: number) {
return request.get(`site/log/${id}`)
}
/***************************************************** 账单列表 **************************************************/
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getAccountList(params: Record<string, any>) {
return request.get(`site/account`, { params })
return request.get(`site/account`, {params})
}
/**
*
* @param params
* @returns
* @param id
*/
export function getAccountInfo(id: number) {
return request.get(`site/account/${id}`)
@ -239,7 +221,7 @@ export function getAccountInfo(id: number) {
/**
*
* @returns
* @returns
*/
export function getAccountStat() {
return request.get(`site/account/stat`)
@ -247,7 +229,7 @@ export function getAccountStat() {
/**
*
* @returns
* @returns
*/
export function getAccountType() {
return request.get(`site/account/type`)

View File

@ -3,16 +3,13 @@ import request from '@/utils/request'
/***************************************************** 统计信息 **************************************************/
/**
*
* @param params
* @returns
*/
export function getStatInfo() {
return request.get(`stat/index`)
}
/**
*
* @param params
* @returns
*/
export function getSiteStatInfo() {
return request.get(`stat/siteindex`)

View File

@ -4,7 +4,7 @@ import request from '@/utils/request'
/**
*
* @returns
* @returns
*/
export function getInfo() {
return request.get('sys/role')
@ -12,25 +12,25 @@ export function getInfo() {
/**
*
* @returns
* @returns
*/
export function getUrl() {
return request.get('sys/url')
}
/***************************************************** 用户组 ****************************************************/
/**
*
* @returns
* @returns
*/
export function getRoleList(params: Record<string, any>) {
return request.get('sys/role', { params })
return request.get('sys/role', {params})
}
/**
*
* @param params
* @returns
* @param roleId
*/
export function getRoleInfo(roleId: number) {
return request.get(`sys/role/${roleId}`)
@ -38,35 +38,32 @@ export function getRoleInfo(roleId: number) {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function addRole(params: Record<string, any>) {
return request.post(`sys/role`, params, { showSuccessMessage: true })
return request.post(`sys/role`, params, {showSuccessMessage: true})
}
/**
*
* @param role_id
* @param params
* @returns
* @param params
*/
export function editRole(params: Record<string, any>) {
return request.put(`sys/role/${params.role_id}`, params, { showSuccessMessage: true })
return request.put(`sys/role/${params.role_id}`, params, {showSuccessMessage: true})
}
/**
*
* @param role_id
* @returns
* @param roleId
*/
export function deleteRole(roleId: number) {
return request.delete(`sys/role/${roleId}`, { showSuccessMessage: true })
return request.delete(`sys/role/${roleId}`, {showSuccessMessage: true})
}
/**
*
* @returns
* @returns
*/
export function allRole() {
return request.get('sys/role/all')
@ -76,7 +73,7 @@ export function allRole() {
/**
*
* @returns
* @returns
*/
export function getMenus(type: string) {
return request.get(`sys/menu/${type}`)
@ -84,8 +81,7 @@ export function getMenus(type: string) {
/**
*
* @param id
* @returns
* @param menu_key
*/
export function getMenuInfo(menu_key: string) {
return request.get(`sys/menu/info/${menu_key}`);
@ -93,37 +89,34 @@ export function getMenuInfo(menu_key: string) {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function addMenu(params: Record<string, any>) {
return request.post('sys/menu', params, { showSuccessMessage: true })
return request.post('sys/menu', params, {showSuccessMessage: true})
}
/**
*
* @param id
* @param params
* @returns
* @param params
*/
export function editMenu(params: Record<string, any>) {
return request.put(`sys/menu/${params.menu_key}`, params, { showSuccessMessage: true })
return request.put(`sys/menu/${params.menu_key}`, params, {showSuccessMessage: true})
}
/**
*
* @param id
* @returns
* @param menu_key
*/
export function deleteMenu(menu_key: string) {
return request.delete(`sys/menu/${menu_key}`, { showSuccessMessage: true })
return request.delete(`sys/menu/${menu_key}`, {showSuccessMessage: true})
}
/***************************************************** 站点菜单 ****************************************************/
/**
*
* @returns
* @returns
*/
export function getSiteMenus() {
return request.get(`site/site/menu`)
@ -134,7 +127,7 @@ export function getSiteMenus() {
/**
*
* @returns
* @returns
*/
export function getWebsite() {
return request.get('sys/config/website')
@ -142,7 +135,7 @@ export function getWebsite() {
/**
*
* @returns
* @returns
*/
export function getWebConfig() {
return request.get('sys/web/website')
@ -150,16 +143,16 @@ export function getWebConfig() {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function setWebsite(params: Record<string, any>) {
return request.put(`sys/config/website`, params, { showSuccessMessage: true })
return request.put(`sys/config/website`, params, {showSuccessMessage: true})
}
/**
*
* @returns
* @returns
*/
export function getCopyright() {
return request.get('sys/config/copyright')
@ -167,7 +160,7 @@ export function getCopyright() {
/**
*
* @returns
* @returns
*/
export function getService() {
return request.get('sys/config/service')
@ -175,70 +168,70 @@ export function getService() {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function setCopyright(params: Record<string, any>) {
return request.put(`sys/config/copyright`, params, { showSuccessMessage: true })
return request.put(`sys/config/copyright`, params, {showSuccessMessage: true})
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getAttachmentCategoryList(params: Record<string, any>) {
return request.get(`sys/attachment/category`, { params })
return request.get(`sys/attachment/category`, {params})
}
/**
*
* @param params
* @param params
*/
export function addAttachmentCategory(params: Record<string, any>) {
return request.post(`sys/attachment/category`, params, { showSuccessMessage: true })
return request.post(`sys/attachment/category`, params, {showSuccessMessage: true})
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function editAttachmentCategory(params: Record<string, any>) {
return request.put(`sys/attachment/category/${params.id}`, params, { showSuccessMessage: true })
return request.put(`sys/attachment/category/${params.id}`, params, {showSuccessMessage: true})
}
/**
*
* @param id
* @returns
* @param id
* @returns
*/
export function deleteAttachmentCategory(id: number) {
return request.delete(`sys/attachment/category/${id}`, { showSuccessMessage: true })
return request.delete(`sys/attachment/category/${id}`, {showSuccessMessage: true})
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getAttachmentList(params: Record<string, any>) {
return request.get(`sys/attachment`, { params })
return request.get(`sys/attachment`, {params})
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function deleteAttachment(params: Record<string, any>) {
return request.delete(`sys/attachment/del`, { data: params, showSuccessMessage: true })
return request.delete(`sys/attachment/del`, {data: params, showSuccessMessage: true})
}
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function moveAttachment(params: Record<string, any>) {
return request.put(`sys/attachment/batchmove`, params)
@ -262,15 +255,32 @@ export function getShortcutMenu() {
*
*/
export function setShortcutMenu(params: Record<string, any>) {
return request.put(`sys/config/shortcut_menu`, params, { showSuccessMessage: true })
return request.put(`sys/config/shortcut_menu`, params, {showSuccessMessage: true})
}
/**
*
* @param params
* @returns
*/
export function getIconCategoryList(params: Record<string, any>) {
return request.get(`sys/attachment/icon_category`, {params})
}
/**
*
* @param params
* @returns
*/
export function getIconList(params: Record<string, any>) {
return request.get(`sys/attachment/icon`, {params})
}
/***************************************************** 地址管理 ****************************************************/
/**
*
* @param params
* @returns
* @param pid
*/
export function getAreaListByPid(pid: number = 0) {
return request.get(`sys/area/list_by_pid/${pid}`)
@ -278,8 +288,7 @@ export function getAreaListByPid(pid: number = 0) {
/**
*
* @param params
* @returns
* @param level
*/
export function getAreatree(level: number = 1) {
return request.get(`sys/area/tree/${level}`)
@ -290,22 +299,20 @@ export function getAreatree(level: number = 1) {
*
*/
export function getAddressInfo(params: any) {
return request.get(`sys/area/get_info`, { params })
return request.get(`sys/area/get_info`, {params})
}
/**
*
*/
export function getContraryAddress(params: any) {
return request.get(`sys/area/contrary`, { params })
return request.get(`sys/area/contrary`, {params})
}
/***************************************************** 存储设置 ****************************************************/
/**
*
* @param params
* @returns
*/
export function getStorageList() {
return request.get(`sys/storage`)
@ -313,8 +320,7 @@ export function getStorageList() {
/**
*
* @param params
* @returns
* @param type
*/
export function getStorageInfo(type: string) {
return request.get(`sys/storage/${type}`)
@ -322,18 +328,18 @@ export function getStorageInfo(type: string) {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function editStorage(params: Record<string, any>) {
return request.put(`sys/storage/${params.storage_type}`, params, { showSuccessMessage: true })
return request.put(`sys/storage/${params.storage_type}`, params, {showSuccessMessage: true})
}
/***************************************************** 支付设置 ****************************************************/
/**
*
* @returns
* @returns
*/
export function getPayConfig(type: string) {
return request.get(`pay/config/${type}`)
@ -341,15 +347,15 @@ export function getPayConfig(type: string) {
/**
*
* @returns
* @returns
*/
export function setPayConfig(params: Record<string, any>) {
return request.put(`pay/config/${params.type}`, params, { showSuccessMessage: true });
return request.put(`pay/config/${params.type}`, params, {showSuccessMessage: true});
}
/**
*
* @returns
* @returns
*/
export function getPayList() {
return request.get(`pay/lists`)
@ -358,8 +364,7 @@ export function getPayList() {
/***************************************************** 打款设置 ****************************************************/
/**
*
* @returns channel
* @returns
* @param channel
*/
export function getTransferInfo(channel) {
return request.get(`pay/channel/lists/${channel}`)
@ -367,43 +372,84 @@ export function getTransferInfo(channel) {
/**
*
* @param params
* @param params
* @returns
*/
export function setTransferInfo(params: Record<string, any>) {
return request.post(`pay/channel/set/transfer`, params)
}
/***************************************************** 定时任务 ****************************************************/
/**
*
* @returns
* @returns
*/
export function getCronList(params: any) {
return request.get(`sys/schedule/list`, { params })
return request.get(`sys/schedule/list`, {params})
}
/**
*
* @returns
* @returns
*/
export function getCronInfo(id: string) {
return request.get(`sys/cron/${id}`);
}
/**
*
* @returns
*
* @returns
*/
export function getCronType() {
return request.get(`sys/cron/type`)
export function getCronTemplate() {
return request.get(`sys/schedule/template`)
}
/**
*
* @returns
*/
export function getCronDateType() {
return request.get(`sys/schedule/datetype`)
}
/**
*
* @returns
*/
export function getWeek() {
return request.get(`sys/date/week`)
}
/**
*
* @returns
*/
export function addCron(params: Record<string, any>) {
return request.post(`sys/schedule`, params, {showSuccessMessage: true})
}
/**
*
* @returns
*/
export function editCron(params: Record<string, any>) {
return request.put(`sys/schedule/${params.id}`, params, {showSuccessMessage: true})
}
/**
*
* @returns
*/
export function deleteCron(id: string) {
return request.delete(`sys/schedule/${id}`, {showSuccessMessage: true})
}
/***************************************************** 协议管理 ****************************************************/
/**
*
* @returns
* @returns
*/
export function getAgreementList() {
return request.get(`sys/agreement`)
@ -411,7 +457,7 @@ export function getAgreementList() {
/**
*
* @returns
* @returns
*/
export function getAgreementInfo(key: string) {
return request.get(`sys/agreement/${key}`);
@ -419,15 +465,15 @@ export function getAgreementInfo(key: string) {
/**
*
* @returns
* @returns
*/
export function editAgreement(params: Record<string, any>) {
return request.put(`sys/agreement/${params.key}`, params, { showSuccessMessage: true })
return request.put(`sys/agreement/${params.key}`, params, {showSuccessMessage: true})
}
/**
*
* @returns
* @returns
*/
export function getChannelType() {
return request.get(`sys/channel`);
@ -436,7 +482,7 @@ export function getChannelType() {
/**
*
* @returns
* @returns
*/
export function getSceneDomain() {
return request.get(`sys/scene_domain`);
@ -446,8 +492,6 @@ export function getSceneDomain() {
/**
*
* @param params
* @returns
*/
export function getConfigLogin() {
return request.get(`sys/config/login`)
@ -455,11 +499,11 @@ export function getConfigLogin() {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function setConfigLogin(params: Record<string, any>) {
return request.put(`sys/config/login`, params, { showSuccessMessage: true })
return request.put(`sys/config/login`, params, {showSuccessMessage: true})
}
/**
@ -473,7 +517,7 @@ export function getPayConfigList() {
*
*/
export function setPatConfig(params: Record<string, any>) {
return request.post(`pay/channel/set/all`, params, { showSuccessMessage: true })
return request.post(`pay/channel/set/all`, params, {showSuccessMessage: true})
}
@ -482,14 +526,14 @@ export function setPatConfig(params: Record<string, any>) {
*
*/
export function menuRefresh(params: Record<string, any>) {
return request.post(`sys/menu/refresh`, {}, { showSuccessMessage: true })
return request.post(`sys/menu/refresh`, {}, {showSuccessMessage: true})
}
/**
*
*/
export function clearSchemaCache(params: Record<string, any>) {
return request.post(`sys/schema/clear`, {}, { showSuccessMessage: true })
return request.post(`sys/schema/clear`, {}, {showSuccessMessage: true})
}
@ -507,8 +551,9 @@ export function getAppMange() {
* key
*/
export function setMap(params: Record<string, any>) {
return request.put(`sys/config/map`, params, { showSuccessMessage: true })
return request.put(`sys/config/map`, params, {showSuccessMessage: true})
}
/**
*
*/
@ -528,5 +573,5 @@ export function getIndexList() {
*
*/
export function setIndexList(params: Record<string, any>) {
return request.put(`sys/config/site_index`, params, { showSuccessMessage: true })
return request.put(`sys/config/site_index`, params, {showSuccessMessage: true})
}

View File

@ -8,7 +8,7 @@ import request from '@/utils/request'
* @returns
*/
export function getGenerateTableList(params: Record<string, any>) {
return request.get(`generator/generator`, { params })
return request.get(`generator/generator`, {params})
}
/**
@ -26,17 +26,15 @@ export function getGenerateTableInfo(id: number) {
* @returns
*/
export function addGenerateTable(params: Record<string, any>) {
return request.post('generator/generator', params, { showSuccessMessage: true })
return request.post('generator/generator', params, {showSuccessMessage: true})
}
/**
*
* @param id
* @param params
* @returns
*/
export function editGenerateTable(params: Record<string, any>) {
return request.put(`generator/generator/${params.id}`, params, { showSuccessMessage: true })
return request.put(`generator/generator/${params.id}`, params, {showSuccessMessage: true})
}
/**
@ -45,7 +43,7 @@ export function editGenerateTable(params: Record<string, any>) {
* @returns
*/
export function deleteGenerateTable(id: number) {
return request.delete(`generator/generator/${id}`, { showSuccessMessage: true })
return request.delete(`generator/generator/${id}`, {showSuccessMessage: true})
}
/**
@ -59,8 +57,6 @@ export function generateCreate(params: Record<string, any>) {
/**
*
* @param file
* @returns
*/
export function generateTable() {
return request.get(`generator/table`)
@ -68,8 +64,6 @@ export function generateTable() {
/**
*
* @param file
* @returns
*/
export function getSystem() {
return request.get(`sys/system`)

View File

@ -33,9 +33,7 @@ export function addUser(params: Record<string, any>) {
/**
*
* @param id
* @param params
* @returns
* @param params
*/
export function editUser(params: Record<string, any>) {
return request.put(`user/user/${params.uid}`, params, { showSuccessMessage: true })

View File

@ -2,7 +2,7 @@ import request from '@/utils/request'
/**
*
* @returns
* @returns
*/
export function getWeappConfig() {
return request.get('weapp/config')
@ -10,16 +10,16 @@ export function getWeappConfig() {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function setWeappConfig(params: Record<string, any>) {
return request.put('weapp/config', params, { showSuccessMessage: true })
return request.put('weapp/config', params, {showSuccessMessage: true})
}
/**
*
* @returns
* @returns
*/
export function getTemplateList() {
return request.get('weapp/template')
@ -27,9 +27,65 @@ export function getTemplateList() {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getBatchAcquisition(params: Record<string, any>) {
return request.put('weapp/template/sync', params, { showSuccessMessage: true })
return request.put('weapp/template/sync', params, {showSuccessMessage: true})
}
/***************************************************** 管理端 ****************************************************/
/**
*
* @param params
* @returns
*/
export function uploadVersion(params: Record<string, any>) {
return request.put('applet/upload', params, {showSuccessMessage: true})
}
/**
*
* @param params
* @returns
*/
export function addVersion(params: Record<string, any>) {
return request.put('applet/version/add', params, {showSuccessMessage: true})
}
/**
*
* @param params
* @returns
*/
export function getVersionList(params: Record<string, any>) {
return request.get('applet/version', {params})
}
/**
*
* @param params
* @returns
*/
export function getVersionInfo(id: string) {
return request.get(`applet/version/${id}`)
}
/**
*
* @param params
* @returns
*/
export function editVersion(params: Record<string, any>) {
return request.get(`applet/version/${params.id}`, params, {showSuccessMessage: true})
}
/**
*
* @param params
* @returns
*/
export function deleteVersion(id: string) {
return request.delete(`applet/version/${id}`)
}

View File

@ -2,7 +2,7 @@ import request from '@/utils/request'
/**
*
* @returns
* @returns
*/
export function getWechatConfig() {
return request.get('wechat/config')
@ -10,8 +10,6 @@ export function getWechatConfig() {
/**
*
* @param uid uid
* @returns
*/
export function getWechatStatic() {
return request.get('wechat/static');
@ -19,16 +17,16 @@ export function getWechatStatic() {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function editWechatConfig(params: Record<string, any>) {
return request.put('wechat/config', params, { showSuccessMessage: true })
return request.put('wechat/config', params, {showSuccessMessage: true})
}
/**
*
* @returns
* @returns
*/
export function getWechatMenu() {
return request.get('wechat/menu')
@ -36,16 +34,16 @@ export function getWechatMenu() {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function editWechatMenu(params: Record<string, any>) {
return request.put('wechat/menu', params, { showSuccessMessage: true })
return request.put('wechat/menu', params, {showSuccessMessage: true})
}
/**
*
* @returns
* @returns
*/
export function getTemplateList() {
return request.get('wechat/template')
@ -54,11 +52,11 @@ export function getTemplateList() {
/**
*
* @param params
* @returns
* @param params
* @returns
*/
export function getBatchAcquisition(params: Record<string, any>) {
return request.put('wechat/template/sync', params, { showSuccessMessage: true })
return request.put('wechat/template/sync', params, {showSuccessMessage: true})
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -73,7 +73,6 @@
import {cloneDeep} from 'lodash-es'
import {getLink} from '@/api/diy';
import {ElMessage} from 'element-plus'
import { CollectionTag } from '@element-plus/icons-vue';
const prop = defineProps({
modelValue: {

View File

@ -1,9 +1,13 @@
<script lang="ts">
import { createVNode, resolveComponent, defineComponent } from 'vue'
<template>
<el-icon v-if="type=='element'" :style="style" :class="['icon el-icon',props.class]">
<component :is="name"/>
</el-icon>
<i v-else :class="[type,name,props.class]" :style="style"></i>
</template>
<script lang="ts" setup>
import {watch, ref, reactive} from 'vue'
export default defineComponent({
name: 'Icon',
props: {
const props = defineProps({
name: {
type: String,
required: true
@ -20,23 +24,25 @@ export default defineComponent({
type: String,
default: '16px'
},
},
setup(props) {
let [type, name] = props.name.split(/-(.*)/)
})
let style = {
color: props.color,
fontSize: props.size
}
const type = ref('');
const name = ref('');
switch (type) {
case 'element':
return () => createVNode('el-icon', { class: ['icon el-icon', props.class], style: style }, [createVNode(resolveComponent(name))])
break;
case 'iconfont':
return () => createVNode('i', { class: [name, 'iconfont', props.class], style: style })
break;
}
}
})
const style = reactive({
color: props.color,
fontSize: props.size
});
const load = () => {
let arr = props.name.split(/-(.*)/);
type.value = arr[0];
name.value = arr[1];
};
load();
watch(() => props.name, () => {
load();
})
</script>

View File

@ -1,71 +1,145 @@
<template>
<el-popover trigger="click" v-model:visible="visible">
<template #reference>
<slot name="reference"></slot>
</template>
<div class="flex w-full flex-col">
<div class="head flex w-full mb-[10px]">
<span>请选择图标</span>
<div class="flex justify-end flex-auto">
<span class="ml-[10px] cursor-pointer" :class="{ active: type == 'element' }" @click="type = 'element'">element</span>
<span class="ml-[10px] cursor-pointer" :class="{ active: type == 'iconfont' }" @click="type = 'iconfont'">iconfont</span>
</div>
</div>
<div class="icon-wrap h-[240px]">
<el-scrollbar>
<div class="flex flex-wrap" v-show="type == 'element'">
<el-button v-for="icon in element" class="w-[35px] h-[35px] icon-item" @click="selectIcon('element-' + icon)">
<icon :name="'element-' + icon" />
</el-button>
</div>
<div class="flex flex-wrap" v-show="type == 'iconfont'">
<el-button v-for="icon in iconfont" class="w-[35px] h-[35px] icon-item" @click="selectIcon('iconfont-' + icon)">
<icon :name="'iconfont-' + icon" />
</el-button>
</div>
</el-scrollbar>
</div>
</div>
</el-popover>
<div class="flex flex-wrap">
<template v-if="limit == 1">
<div class="rounded cursor-pointer overflow-hidden relative border border-dashed border-color icon-wrap mr-[10px]" :style="style">
<div class="w-full h-full relative" v-if="icons.data.length">
<div class="w-full h-full flex items-center justify-center">
<icon :name="icons.data[0]" size="40px"></icon>
</div>
<div class="absolute z-[1] flex items-center justify-center w-full h-full inset-0 bg-black bg-opacity-60 operation">
<icon name="element-Delete" color="#fff" size="18px" @click="removeIcon"/>
</div>
</div>
<upload-attachment :limit="limit" type="icon" @confirm="confirmSelect" v-else>
<div class="w-full h-full flex items-center justify-center flex-col">
<icon name="element-Plus" size="20px" color="var(--el-text-color-secondary)"/>
<div class="leading-none text-xs mt-[10px] text-secondary">{{ iconText || t('upload.selecticon') }}</div>
</div>
</upload-attachment>
</div>
</template>
<template v-else>
<div class="rounded cursor-pointer overflow-hidden relative border border-dashed border-color icon-wrap mr-[10px]" :style="style" v-for="(item, index) in icons.data" :key="index">
<div class="w-full h-full relative">
<div class="w-full h-full flex items-center justify-center">
<icon :name="item" size="40px"></icon>
</div>
<div class="absolute z-[1] flex items-center justify-center w-full h-full inset-0 bg-black bg-opacity-60 operation">
<icon name="element-Delete" color="#fff" size="18px" @click="removeIcon(index)"/>
</div>
</div>
</div>
<div class="rounded cursor-pointer overflow-hidden relative border border-dashed border-color" :style="style" v-if="icons.data.length < limit">
<upload-attachment :limit="limit" @confirm="confirmSelect">
<div class="w-full h-full flex items-center justify-center flex-col">
<icon name="element-Plus" size="20px" color="var(--el-text-color-secondary)"/>
<div class="leading-none text-xs mt-[10px] text-secondary">{{ iconText || t('upload.selecticon') }}</div>
</div>
</upload-attachment>
</div>
</template>
</div>
</template>
<script lang="ts" setup>
import { computed, ref } from 'vue'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import {computed, reactive, watch, toRaw} from 'vue'
import {t} from '@/lang'
const type = ref('element')
const visible = ref('false')
// element
const element = computed(() => {
return Object.keys(ElementPlusIconsVue)
})
// iconfont
const iconfont = computed(() => {
const iconfile = import.meta.globEager('@/styles/iconfont.css')['/src/styles/iconfont.css'].default
const icons = Array.from(iconfile.matchAll(/(icon.*)\:before/g))
return icons.map(item => {
return item[1]
const prop = defineProps({
modelValue: {
type: String,
default: ''
},
width: {
type: String,
default: '100px'
},
height: {
type: String,
default: '100px'
},
iconText: {
type: String
},
limit: {
type: Number,
default: 1
}
})
})
const emit = defineEmits(['select'])
const emit = defineEmits(['update:modelValue', 'change'])
const value = computed({
get() {
return prop.modelValue
},
set(value) {
emit('update:modelValue', value)
}
})
const icons: Record<string, any> = reactive({
data: []
})
const setValue = () => {
value.value = toRaw(icons.data).toString()
}
watch(() => value.value, () => {
icons.data = [
...value.value.split(',').filter((item: string) => {
return item
})
]
setValue()
}, {immediate: true})
const style = computed(() => {
return {
width: prop.width,
height: prop.height
}
})
/**
* 选择图标
*/
const confirmSelect = (data: Record<string, any>) => {
if (prop.limit == 1) {
icons.data.splice(0, 1)
data && icons.data.push(data.url)
} else {
data.forEach((item: any) => {
if (icons.data.length < prop.limit) icons.data.push(item.url)
})
}
setValue()
emit('change', value.value)
}
/**
* 删除图标
* @param index
*/
const removeIcon = (index: number = 0) => {
icons.data.splice(index, 1)
setValue()
}
//
const selectIcon = (name) => {
emit('select', name)
visible.value = false
}
</script>
<style lang="scss" scoped>
.icon-item {
margin: 6px 6px 6px 0;
}
.icon-wrap {
.operation {
display: none;
}
.active {
color: var(--el-color-primary);
}
&:hover {
.operation {
display: flex;
}
}
}
</style>

File diff suppressed because it is too large Load Diff

View File

@ -1,157 +1,158 @@
<template>
<div class="flex flex-wrap">
<template v-if="limit == 1">
<div class="rounded cursor-pointer relative bg-page video-wrap mr-[10px]" :style="style">
<template v-if="videos.data.length">
<div class="w-full h-full relative flex items-center overflow-hidden rounded">
<video :src="img(videos.data[0])" class="w-full" />
<div class="absolute z-[1] flex items-center justify-center w-full h-full inset-0 bg-black bg-opacity-60 operation">
<icon name="iconfont-icon24gf-playCircle" color="#fff" size="25px" @click="previewVideo()" />
</div>
</div>
<icon name="element-CircleCloseFilled" color="#bbb" size="18px" @click="removeVideo" class="absolute z-[2] top-[-9px] right-[-9px]" />
</template>
<upload-attachment :limit="limit" type="video" @confirm="confirmSelect" v-else>
<div class="w-full h-full flex items-center justify-center flex-col">
<icon name="iconfont-icon24gf-playCircle" size="25px" color="var(--el-text-color-secondary)" />
</div>
</upload-attachment>
</div>
</template>
<template v-else>
<div class="rounded cursor-pointer relative bg-page video-wrap mr-[10px]" :style="style"
v-for="(item, index) in videos.data" :key="index">
<div class="w-full h-full relative flex items-center overflow-hidden rounded">
<video :src="img(item)" class="w-full" />
<div class="absolute z-[1] flex items-center justify-center w-full h-full inset-0 bg-black bg-opacity-60 operation">
<icon name="iconfont-icon24gf-playCircle" color="#fff" size="25px" @click="previewVideo(index)" />
</div>
</div>
<icon name="element-CircleCloseFilled" color="#bbb" size="18px" @click="removeVideo(index)" class="absolute z-[2] top-[-9px] right-[-9px]" />
</div>
<div class="rounded cursor-pointer relative bg-page video-wrap mr-[10px]" :style="style" v-if="videos.data.length < limit">
<upload-attachment :limit="limit" type="video" @confirm="confirmSelect">
<div class="w-full h-full flex items-center justify-center flex-col">
<icon name="iconfont-icon24gf-playCircle" size="25px" color="var(--el-text-color-secondary)" />
</div>
</upload-attachment>
</div>
</template>
<div class="flex flex-wrap">
<template v-if="limit == 1">
<div class="rounded cursor-pointer relative bg-page video-wrap mr-[10px]" :style="style">
<template v-if="videos.data.length">
<div class="w-full h-full relative flex items-center overflow-hidden rounded">
<video :src="img(videos.data[0])" class="w-full"/>
<div class="absolute z-[1] flex items-center justify-center w-full h-full inset-0 bg-black bg-opacity-60 operation">
<icon name="iconfont-icon24gf-playCircle" color="#fff" size="25px" @click="previewVideo()"/>
</div>
</div>
<icon name="element-CircleCloseFilled" color="#bbb" size="18px" @click="removeVideo" class="absolute z-[2] top-[-9px] right-[-9px]"/>
</template>
<upload-attachment :limit="limit" type="video" @confirm="confirmSelect" v-else>
<div class="w-full h-full flex items-center justify-center flex-col">
<icon name="iconfont-icon24gf-playCircle" size="25px" color="var(--el-text-color-secondary)"/>
</div>
</upload-attachment>
</div>
</template>
<template v-else>
<div class="rounded cursor-pointer relative bg-page video-wrap mr-[10px]" :style="style" v-for="(item, index) in videos.data" :key="index">
<div class="w-full h-full relative flex items-center overflow-hidden rounded">
<video :src="img(item)" class="w-full"/>
<div class="absolute z-[1] flex items-center justify-center w-full h-full inset-0 bg-black bg-opacity-60 operation">
<icon name="iconfont-icon24gf-playCircle" color="#fff" size="25px" @click="previewVideo(index)"/>
</div>
</div>
<icon name="element-CircleCloseFilled" color="#bbb" size="18px" @click="removeVideo(index)" class="absolute z-[2] top-[-9px] right-[-9px]"/>
</div>
<div class="rounded cursor-pointer relative bg-page video-wrap mr-[10px]" :style="style" v-if="videos.data.length < limit">
<upload-attachment :limit="limit" type="video" @confirm="confirmSelect">
<div class="w-full h-full flex items-center justify-center flex-col">
<icon name="iconfont-icon24gf-playCircle" size="25px" color="var(--el-text-color-secondary)"/>
</div>
</upload-attachment>
</div>
</template>
<!-- 视频预览 -->
<el-dialog v-model="videoViewer.visible" width="50%" align-center :destroy-on-close="true" custom-class="video-preview">
<video-player :src="videoViewer.src" width="100%" />
</el-dialog>
<!-- 视频预览 -->
<el-dialog v-model="videoViewer.visible" width="50%" align-center :destroy-on-close="true" custom-class="video-preview">
<video-player :src="videoViewer.src" width="100%"/>
</el-dialog>
</div>
</div>
</template>
<script lang="ts" setup>
import { computed, reactive, watch, toRaw } from 'vue'
import { img } from '@/utils/common'
import {computed, reactive, watch, toRaw} from 'vue'
import {img} from '@/utils/common'
const prop = defineProps({
modelValue: {
type: String,
default: ''
},
width: {
type: String,
default: '200px'
},
height: {
type: String,
default: '100px'
},
limit: {
type: Number,
default: 1
const prop = defineProps({
modelValue: {
type: String,
default: ''
},
width: {
type: String,
default: '200px'
},
height: {
type: String,
default: '100px'
},
limit: {
type: Number,
default: 1
}
})
const emit = defineEmits(['update:modelValue'])
const value = computed({
get() {
return prop.modelValue
},
set(value) {
emit('update:modelValue', value)
}
})
const videos: Record<string, any> = reactive({
data: []
})
watch(() => value.value, () => {
videos.data = [
...value.value.split(',').filter((item: string) => {
return item
})
]
setValue()
})
const style = computed(() => {
return {
width: prop.width,
height: prop.height
}
})
/**
* 选择视频
*/
const confirmSelect = (data: Record<string, any>) => {
if (prop.limit == 1) {
videos.data.splice(0, 1)
data && videos.data.push(data.url)
} else {
data.forEach((item: any) => {
if (videos.data.length < prop.limit) videos.data.push(item.url)
})
}
setValue()
}
})
const emit = defineEmits(['update:modelValue'])
const value = computed({
get() {
return prop.modelValue
},
set(value) {
emit('update:modelValue', value)
/**
* 删除视频
* @param index
*/
const removeVideo = (index: number = 0) => {
videos.data.splice(index, 1)
setValue()
}
})
const videos: Record<string, any> = reactive({
data: []
})
watch(() => value.value, () => {
videos.data = [
...value.value.split(',').filter((item: string) => { return item })
]
setValue()
})
const style = computed(() => {
return {
width: prop.width,
height: prop.height
const setValue = () => {
value.value = toRaw(videos.data).toString()
}
})
/**
* 选择视频
*/
const confirmSelect = (data: Record<string, any>) => {
if (prop.limit == 1) {
videos.data.splice(0, 1)
data && videos.data.push(data.url)
} else {
data.forEach((item: any) => {
if (videos.data.length < prop.limit) videos.data.push(item.url)
})
/**
* 查看视频
*/
const videoViewer = reactive({
visible: false,
src: ''
})
const previewVideo = (index: number = 0) => {
videoViewer.visible = true
videoViewer.src = img(videos.data[index])
}
setValue()
}
/**
* 删除视频
* @param index
*/
const removeVideo = (index: number = 0) => {
videos.data.splice(index, 1)
setValue()
}
const setValue = () => {
value.value = toRaw(videos.data).toString()
}
/**
* 查看视频
*/
const videoViewer = reactive({
visible: false,
src: ''
})
const previewVideo = (index: number = 0) => {
videoViewer.visible = true
videoViewer.src = img(videos.data[index])
}
</script>
<style lang="scss">
.video-preview {
background: none !important;
box-shadow: none !important;
.video-preview {
background: none !important;
box-shadow: none !important;
.el-dialog__headerbtn .el-dialog__close {
border-radius: 50%;
width: 34px;
height: 34px;
font-size: 24px;
color: #fff;
background-color: var(--el-text-color-regular);
border-color: #fff;
}
}
.el-dialog__headerbtn .el-dialog__close {
border-radius: 50%;
width: 34px;
height: 34px;
font-size: 24px;
color: #fff;
background-color: var(--el-text-color-regular);
border-color: #fff;
}
}
</style>

View File

@ -46,11 +46,13 @@
"root": "上传",
"selectimage": "选择图片",
"selectvideo": "选择视频",
"selecticon": "选择图标",
"uploadimage": "上传图片",
"uploadvideo": "上传视频",
"addAttachmentCategory": "添加分组",
"attachmentCategoryPlaceholder": "请输入分组名称",
"attachmentEmpty": "暂无附件,请点击上传按钮上传",
"iconEmpty": "暂无图标",
"deleteCategoryTips": "确定要删除该分组吗?",
"deleteAttachmentTips": "确定要删除所选附件吗?如所选附件已被使用删除将会受到影响,请谨慎操作!",
"move": "移动",
@ -58,6 +60,7 @@
"moveTo": "移动至",
"placeholderimageName": "请输入图片名称",
"placeholdervideoName": "请输入视频名称",
"placeholdericonName": "请输入图标名称",
"success": "上传成功",
"triggerUpperLimit": "可选数量已达上限"
},

View File

@ -1,5 +1,6 @@
{
"preview": "预览",
"h5": "H5",
"weapp": "微信小程序",
"wechat": "微信公众号",
"link": "链接",

View File

@ -2,19 +2,12 @@
"id":"主键",
"accountDetail":"账单详情",
"detail":"详情",
"idPlaceholder":"请输入主键",
"siteId":"站点id",
"siteIdPlaceholder":"请输入站点id",
"type":"账单类型",
"money":"账单金额",
"moneyPlaceholder":"请输入账单金额",
"tradeNo":"账单编号",
"tradeNoPlaceholder":"请输入账单编号",
"createTime":"添加时间",
"createTimePlaceholder":"请输入添加时间",
"addSiteAccountLog":"添加站点账单记录",
"updateSiteAccountLog":"编辑站点账单记录",
"siteAccountLogDeleteTips":"确定要删除该站点账单记录吗?",
"createTime":"账单日期",
"totalPay":"累计收款(元)",
"totalRefund":"累计退款(元)",
"totalTransfer":"累计转账(元)",

View File

@ -52,14 +52,14 @@
"siteType": "站点类型",
"periodTime": "有效期",
"renew": "续费",
"selectModel": "选择模",
"selectModel": "选择模",
"addMenu": "添加模块",
"shortcutLink": "模版",
"emptyMenu": "暂无快捷模块",
"select": "选择",
"custom": "自定义",
"accessSite": "访问站点",
"pathSelect": "选择模",
"pathSelect": "选择模",
"bgColorPlaceholder": "请选择背景色",
"iconPlaceholder": "请选择图标",
"pathPlaceholder": "请选择链接",

View File

@ -3,7 +3,7 @@
"contactAddress":"联系地址",
"siteName": "站点名称",
"keywords": "网站关键字",
"logo": "网站Logo",
"logo": "长方形logo",
"desc": "网站简介",
"province": "省",
"city": "市",
@ -15,7 +15,6 @@
"contactAddressPlaceholder":"联系地址",
"siteNamePlaceholder": "站点名称",
"keywordsPlaceholder": "网站关键字",
"logoPlaceholder": "网站Logo",
"descPlaceholder": "网站简介",
"addressPlaceholder": "详细地址",
"phonePlaceholder": "客服电话",
@ -25,10 +24,12 @@
"frontEndName": "前台名称",
"frontEndNamePlaceholder": "请输入前台名称",
"frontEndLogo": "前台Logo",
"icon": "网站图标",
"icon": "网站方形logo",
"serviceInformation": "服务信息",
"wechatCode": "公众号二维码",
"customerServiceCode": "客服二维码",
"contactsTel": "联系电话",
"contactsTelPlaceholder": "请输入联系电话"
}
"contactsTelPlaceholder": "请输入联系电话",
"logoPlaceholder": "建议图片尺寸210*30像素图片格式jpg、png、jpeg。",
"iconPlaceholder": "建议图片尺寸100*100像素图片格式jpg、png、jpeg。"
}

View File

@ -0,0 +1,11 @@
{
"addVersion": "上传版本",
"version": "版本号",
"versionPlaceholder": "请添加版本号",
"createTime": "创建时间",
"status": "状态",
"editVersion": "添加/编辑版本",
"file": "文件",
"filePlaceholder":"请上传版本文件",
"desc": "版本说明"
}

View File

@ -6,7 +6,7 @@
"startDate":"开始时间",
"cron":"定时执行",
"endDate":"结束时间",
"titlePlaceholder": "请输入任务名称",
"titlePlaceholder": "请选择任务模版",
"typeName":"任务类型",
"crondType":"任务周期",
"count":"已执行次数",
@ -16,5 +16,15 @@
"statusDesc":"最后执行结果",
"key": "key",
"timeClass": "时间类型",
"executeTime": "执行时间"
"executeTime": "执行时间",
"editCron": "编辑任务",
"cronTemplate": "任务模版",
"cronTime": "任务周期",
"openStatus": "任务状态",
"day": "日",
"hour": "时",
"min": "分",
"cronDeleteTips": "你确定要删除任务吗",
"addCron": "添加任务",
"cronTimeTips": "任务周期时间不能为空"
}

View File

@ -3,8 +3,7 @@
<side class="hidden-xs-only" />
</el-aside>
<el-drawer v-model="systemStore.menuDrawer" direction="ltr" :with-header="false" custom-class="aside-drawer"
size="210px">
<el-drawer v-model="systemStore.menuDrawer" direction="ltr" :with-header="false" custom-class="aside-drawer" size="210px">
<template #default>
<side />
</template>

View File

@ -16,8 +16,8 @@
<template #title>
<div class="relative">
<span :class="['ml-[10px]', {'text-[15px]': routes.meta.class == 1}, {'text-[14px]': routes.meta.class != 1}]">{{ meta.title }}</span>
<div class="absolute top-[50%] -translate-y-[50%] right-[-288%]" @click="checkIndexList">
<img v-if="routes.path == '/site/siteindex'" class="w-[12px] h-[12px]" src="@/assets/images/index/model_tag.png"/>
<div v-if="routes.path == '/site/siteindex'" class="absolute top-[50%] -translate-y-[50%] right-[-180%]" @click="checkIndexList">
<img class="w-[12px] h-[12px]" src="@/assets/images/index/model_tag.png"/>
</div>
</div>
</template>
@ -31,12 +31,12 @@
<el-dialog v-model="showDialog" :title="t('indexTemplate')" width="550px" :destroy-on-close="true" >
<div class="flex flex-wrap">
<div v-for="(items, index) in indexList" :key="index" v-if="index_path == ''">
<div @click="index_path = items.view_path" class="index-item py-[5px] px-[10px] mr-[10px] rounded-[3px] cursor-pointer" :class="items.is_use == 1 ? 'selected' : '' ">
<div @click="index_path = items.view_path" class="index-item py-[5px] px-[10px] mr-[10px] rounded-[3px] cursor-pointer" :class="items.is_use == 1 ? 'bg-primary text-[#fff]' : '' ">
<span >{{ items.name }}</span>
</div>
</div>
<div v-for="(itemTo, indexTo) in indexList" :key="indexTo" v-else>
<div @click="index_path = itemTo.view_path" class="index-item py-[5px] px-[10px] mr-[10px] rounded-[3px] cursor-pointer" :class="index_path == itemTo.view_path ? 'selected' : '' ">
<div @click="index_path = itemTo.view_path" class="index-item py-[5px] px-[10px] mr-[10px] rounded-[3px] cursor-pointer" :class="index_path == itemTo.view_path ? 'bg-primary text-[#fff]' : '' ">
<span >{{ itemTo.name }}</span>
</div>
</div>
@ -53,7 +53,6 @@
import { t } from '@/lang'
import { getIndexList, setIndexList } from '@/api/sys'
import { useRoute, useRouter } from 'vue-router'
import { CollectionTag } from '@element-plus/icons-vue'
import { ref, computed } from 'vue'
import menuItem from './menu-item.vue'
const router = useRouter()
@ -79,6 +78,11 @@ const checkIndexList = () => {
getIndexList().then(res => {
showDialog.value = true
indexList.value = res.data
for(let i = 0 ; i < indexList.value.length; i ++){
if(indexList.value[i].is_use == 1){
index_path.value = indexList.value[i].view_path
}
}
})
}
@ -106,8 +110,13 @@ const submitIndex = () => {
.el-alert .el-alert__description{
margin-top: 0;
}
.selected {
color: #fff;
background-color: #2C3EEF;
.index-item {
border: 1px solid;
border-color: var(--el-color-primary);
&:hover {
color: #fff;
background-color: var(--el-color-primary);
}
}
</style>

View File

@ -1,6 +1,5 @@
<template>
<el-container class="w-100 h-screen"
:class="[{ 'sidebar-dark-mode': systemStore.sidebar == 'twoType' }, { 'sidebar-brightness-mode': systemStore.sidebar == 'oneType' }]">
<el-container class="w-100 h-screen" :class="[{ 'sidebar-dark-mode': systemStore.sidebar == 'twoType' }, { 'sidebar-brightness-mode': systemStore.sidebar == 'oneType' }]">
<el-header class="logo-wrap w-100">
<div class="logo flex items-center m-auto max-w-[210px] h-[30px]" v-if="!systemStore.menuIsCollapse">
<img class="max-h-full max-w-full" v-if="storage.get('siteInfo').logo" :src="img(siteInfo.logo)" alt="">
@ -13,10 +12,8 @@
<el-main class="menu-wrap">
<el-scrollbar>
<el-menu :default-active="menuActive" :router="true" class="aside-menu h-full" unique-opened="true"
:collapse="systemStore.menuIsCollapse">
<menu-item v-for="(route, index) in userStore.routers" :routes="route" :route-path="route.path"
:key="index" />
<el-menu :default-active="menuActive" :router="true" class="aside-menu h-full" unique-opened="true" :collapse="systemStore.menuIsCollapse">
<menu-item v-for="(route, index) in userStore.routers" :routes="route" :route-path="route.path" :key="index" />
</el-menu>
<div class="h-[48px]"></div>
</el-scrollbar>

View File

@ -64,12 +64,12 @@
<el-dialog v-model="showDialog" :title="t('indexTemplate')" width="550px" :destroy-on-close="true" >
<div class="flex flex-wrap">
<div v-for="(items, index) in indexList" :key="index" v-if="index_path == ''">
<div @click="index_path = items.view_path" class="index-item py-[5px] px-[10px] mr-[10px] rounded-[3px] cursor-pointer" :class="items.is_use == 1 ? 'selected' : '' ">
<div @click="index_path = items.view_path" class="index-item py-[5px] px-[10px] mr-[10px] rounded-[3px] cursor-pointer" :class="items.is_use == 1 ? 'bg-primary text-[#fff]' : '' ">
<span >{{ items.name }}</span>
</div>
</div>
<div v-for="(itemTo, indexTo) in indexList" :key="indexTo" v-else>
<div @click="index_path = itemTo.view_path" class="index-item py-[5px] px-[10px] mr-[10px] rounded-[3px] cursor-pointer" :class="index_path == itemTo.view_path ? 'selected' : '' ">
<div @click="index_path = itemTo.view_path" class="index-item py-[5px] px-[10px] mr-[10px] rounded-[3px] cursor-pointer" :class="index_path == itemTo.view_path ? 'bg-primary text-[#fff]' : '' ">
<span >{{ itemTo.name }}</span>
</div>
</div>
@ -94,9 +94,7 @@ import useAppStore from '@/stores/modules/app'
import { useRoute, useRouter } from 'vue-router'
import { t } from '@/lang'
import storage from '@/utils/storage'
import useUserStore from '@/stores/modules/user'
import { getIndexList, setIndexList } from '@/api/sys'
import { ElMessageBox } from 'element-plus'
const router = useRouter()
const appType = storage.get('app_type')
@ -188,6 +186,11 @@ const checkIndexList = () => {
getIndexList().then(res => {
showDialog.value = true
indexList.value = res.data
for(let i = 0 ; i < indexList.value.length; i ++){
if(indexList.value[i].is_use == 1){
index_path.value = indexList.value[i].view_path
}
}
})
}
@ -210,20 +213,17 @@ const submitIndex = () => {
}
.navbar-item {
padding: 0 8px;
&:hover {
background-color: var(--el-bg-color-page);
}
}
.index-item {
background-color: var(--el-bg-color-page);
&:hover {
border: 1px solid;
border-color: var(--el-color-primary);
&:hover {
color: #fff;
background-color: #2C3EEF;
}
}
.selected {
color: #fff;
background-color: #2C3EEF;
background-color: var(--el-color-primary);
}
}
</style>

View File

@ -43,6 +43,7 @@ import useSystemStore from '@/stores/modules/system'
import { useDark, useToggle } from '@vueuse/core'
import { setThemeColor } from '@/utils/common'
import { t } from '@/lang'
const drawer = ref(false)
const systemStore = useSystemStore()

View File

@ -1,8 +1,8 @@
import {defineStore} from 'pinia'
import {t} from '@/lang'
import {toRaw, watch} from 'vue'
import {toRaw} from 'vue'
import {ElMessage, ElMessageBox} from 'element-plus'
import {cloneDeep, range, isEmpty} from 'lodash-es'
import {cloneDeep } from 'lodash-es'
const useDiyStore = defineStore('diy', {
state: () => {

View File

@ -33,9 +33,9 @@ const useSystemStore = defineStore('user', {
this.userInfo = res.data.userinfo
setToken(res.data.token)
storage.set({ key: 'userinfo', data: res.data.userinfo })
storage.set({ key: 'siteId', data: res.data.site_info.site_code })
storage.set({ key: 'siteId', data: res.data.site_info.site_id })
storage.set({ key: 'siteInfo', data: res.data.site_info })
storage.set({ key: 'comparisonSiteIdStorage', data: res.data.site_info.site_code })
storage.set({ key: 'comparisonSiteIdStorage', data: res.data.site_info.site_id })
storage.set({ key: 'comparisonTokenStorage', data: res.data.token })
resolve(res)
})

View File

@ -0,0 +1 @@
@import "addon/tourism/iconfont.css";

View File

@ -0,0 +1,58 @@
@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

@ -0,0 +1,86 @@
{
"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-family: "iconfont"; /* Project id 3883393 */
src: url('//at.alicdn.com/t/c/font_3883393_pgas1v4bw2a.woff2?t=1686965237342') format('woff2'),
url('//at.alicdn.com/t/c/font_3883393_pgas1v4bw2a.woff?t=1686965237342') format('woff'),
url('//at.alicdn.com/t/c/font_3883393_pgas1v4bw2a.ttf?t=1686965237342') format('truetype');
src: url('//at.alicdn.com/t/c/font_3883393_0wpbzuop0spi.woff2?t=1688032173237') format('woff2'),
url('//at.alicdn.com/t/c/font_3883393_0wpbzuop0spi.woff?t=1688032173237') format('woff'),
url('//at.alicdn.com/t/c/font_3883393_0wpbzuop0spi.ttf?t=1688032173237') format('truetype');
}
.iconfont {
@ -13,6 +13,30 @@
-moz-osx-font-smoothing: grayscale;
}
.icona-02_luxian:before {
content: "\e687";
}
.iconhuiyuanxinxi:before {
content: "\e688";
}
.iconjingdian:before {
content: "\e689";
}
.iconhuiyuandingdan:before {
content: "\e68a";
}
.iconjiudian:before {
content: "\e68b";
}
.iconhellowenbenanli:before {
content: "\e68c";
}
.iconqiehuan:before {
content: "\e61e";
}

View File

@ -0,0 +1,709 @@
{
"id": "3883393",
"name": "系统",
"font_family": "iconfont",
"css_prefix_text": "icon",
"description": "系统图标",
"glyphs": [
{
"icon_id": "36212724",
"name": "02_路线",
"font_class": "a-02_luxian",
"unicode": "e687",
"unicode_decimal": 59015
},
{
"icon_id": "36212725",
"name": "会员信息",
"font_class": "huiyuanxinxi",
"unicode": "e688",
"unicode_decimal": 59016
},
{
"icon_id": "36212726",
"name": "景点",
"font_class": "jingdian",
"unicode": "e689",
"unicode_decimal": 59017
},
{
"icon_id": "36212727",
"name": "会员订单",
"font_class": "huiyuandingdan",
"unicode": "e68a",
"unicode_decimal": 59018
},
{
"icon_id": "36212728",
"name": "酒店",
"font_class": "jiudian",
"unicode": "e68b",
"unicode_decimal": 59019
},
{
"icon_id": "36212729",
"name": "hello文本案例",
"font_class": "hellowenbenanli",
"unicode": "e68c",
"unicode_decimal": 59020
},
{
"icon_id": "18993709",
"name": "切换",
"font_class": "qiehuan",
"unicode": "e61e",
"unicode_decimal": 58910
},
{
"icon_id": "630094",
"name": "向右箭头",
"font_class": "xiangyoujiantou",
"unicode": "e660",
"unicode_decimal": 58976
},
{
"icon_id": "630095",
"name": "向左箭头",
"font_class": "xiangzuojiantou",
"unicode": "e663",
"unicode_decimal": 58979
},
{
"icon_id": "2127167",
"name": "订单",
"font_class": "dingdan",
"unicode": "e61d",
"unicode_decimal": 58909
},
{
"icon_id": "10066818",
"name": "应用市场",
"font_class": "yingyongshichang1",
"unicode": "e61c",
"unicode_decimal": 58908
},
{
"icon_id": "28871251",
"name": "应用市场",
"font_class": "yingyongshichang2",
"unicode": "e60b",
"unicode_decimal": 58891
},
{
"icon_id": "1727436",
"name": "211铃铛-线性",
"font_class": "lingdang-xianxing",
"unicode": "e8c0",
"unicode_decimal": 59584
},
{
"icon_id": "11372759",
"name": "电话",
"font_class": "dianhua",
"unicode": "e8c3",
"unicode_decimal": 59587
},
{
"icon_id": "4734150",
"name": "管理房屋",
"font_class": "ic_manage_assignprop",
"unicode": "e60c",
"unicode_decimal": 58892
},
{
"icon_id": "5975445",
"name": "城市",
"font_class": "chengshi",
"unicode": "ec70",
"unicode_decimal": 60528
},
{
"icon_id": "25069700",
"name": "套餐列表",
"font_class": "taocanliebiao",
"unicode": "e6b2",
"unicode_decimal": 59058
},
{
"icon_id": "11239058",
"name": "微信",
"font_class": "weixin",
"unicode": "e647",
"unicode_decimal": 58951
},
{
"icon_id": "417391",
"name": "会员管理",
"font_class": "huiyuanguanli",
"unicode": "e64c",
"unicode_decimal": 58956
},
{
"icon_id": "651208",
"name": "我的会员",
"font_class": "huangjinhuiyuan0101-copy",
"unicode": "e621",
"unicode_decimal": 58913
},
{
"icon_id": "897811",
"name": "会员(1)",
"font_class": "huiyuan1",
"unicode": "e644",
"unicode_decimal": 58948
},
{
"icon_id": "8361821",
"name": "钱包1",
"font_class": "qianbao",
"unicode": "e6ca",
"unicode_decimal": 59082
},
{
"icon_id": "15053947",
"name": "文章",
"font_class": "ic_description_file24px",
"unicode": "e61a",
"unicode_decimal": 58906
},
{
"icon_id": "26677253",
"name": "FormatPainterOutlined",
"font_class": "zhuangxiu1",
"unicode": "e66b",
"unicode_decimal": 58987
},
{
"icon_id": "5856622",
"name": "退款记录",
"font_class": "tuikuanjilu",
"unicode": "e8cf",
"unicode_decimal": 59599
},
{
"icon_id": "11296483",
"name": "更新缓存",
"font_class": "gengxinhuancun",
"unicode": "e686",
"unicode_decimal": 59014
},
{
"icon_id": "11661874",
"name": "四性检测",
"font_class": "sixingjiance",
"unicode": "e645",
"unicode_decimal": 58949
},
{
"icon_id": "30527484",
"name": "注册设置",
"font_class": "zhuceshezhi",
"unicode": "e6ad",
"unicode_decimal": 59053
},
{
"icon_id": "9117790",
"name": "应用管理",
"font_class": "manage-apply",
"unicode": "e619",
"unicode_decimal": 58905
},
{
"icon_id": "508272",
"name": "应用管理",
"font_class": "yingyongguanli",
"unicode": "e61f",
"unicode_decimal": 58911
},
{
"icon_id": "3090731",
"name": "开发者管理",
"font_class": "kaifazheguanli",
"unicode": "e624",
"unicode_decimal": 58916
},
{
"icon_id": "6263297",
"name": "联盟管理",
"font_class": "lianmengguanli",
"unicode": "e65f",
"unicode_decimal": 58975
},
{
"icon_id": "6337455",
"name": "点赞",
"font_class": "dianzan",
"unicode": "ec7f",
"unicode_decimal": 60543
},
{
"icon_id": "1160150",
"name": "h5e",
"font_class": "h5e",
"unicode": "e654",
"unicode_decimal": 58964
},
{
"icon_id": "10067274",
"name": "应用市场",
"font_class": "yingyongshichang",
"unicode": "e618",
"unicode_decimal": 58904
},
{
"icon_id": "1735584",
"name": "电脑端",
"font_class": "desktop",
"unicode": "e6e8",
"unicode_decimal": 59112
},
{
"icon_id": "2465639",
"name": "支付宝",
"font_class": "zhifubao",
"unicode": "e8e4",
"unicode_decimal": 59620
},
{
"icon_id": "16372351",
"name": "云空间",
"font_class": "yunkongjian",
"unicode": "e666",
"unicode_decimal": 58982
},
{
"icon_id": "1110699",
"name": "板块",
"font_class": "bankuai",
"unicode": "e668",
"unicode_decimal": 58984
},
{
"icon_id": "2076244",
"name": " 内容2",
"font_class": "neirong2",
"unicode": "e889",
"unicode_decimal": 59529
},
{
"icon_id": "7596821",
"name": "24gl-userGroup",
"font_class": "24gl-userGroup",
"unicode": "eb26",
"unicode_decimal": 60198
},
{
"icon_id": "11124966",
"name": "论坛",
"font_class": "14",
"unicode": "e615",
"unicode_decimal": 58901
},
{
"icon_id": "13763389",
"name": "举报",
"font_class": "jubao",
"unicode": "e611",
"unicode_decimal": 58897
},
{
"icon_id": "30454127",
"name": "标题",
"font_class": "biaoti",
"unicode": "e643",
"unicode_decimal": 58947
},
{
"icon_id": "33622251",
"name": "会员中心",
"font_class": "huiyuanzhongxin",
"unicode": "e692",
"unicode_decimal": 59026
},
{
"icon_id": "30454128",
"name": "icon-kfckfc",
"font_class": "fuzhukongbai1",
"unicode": "e642",
"unicode_decimal": 58946
},
{
"icon_id": "34679438",
"name": "system-jiantoushang",
"font_class": "jiantoushang",
"unicode": "e600",
"unicode_decimal": 58880
},
{
"icon_id": "34679439",
"name": "system-loader-4-line",
"font_class": "loader-line",
"unicode": "e601",
"unicode_decimal": 58881
},
{
"icon_id": "34679440",
"name": "system-delete-bin-6-line",
"font_class": "delete-line",
"unicode": "e602",
"unicode_decimal": 58882
},
{
"icon_id": "34679441",
"name": "system-jiantouxia",
"font_class": "jiantouxia",
"unicode": "e603",
"unicode_decimal": 58883
},
{
"icon_id": "34679442",
"name": "system-file-copy-line",
"font_class": "copy-line",
"unicode": "e605",
"unicode_decimal": 58885
},
{
"icon_id": "1604633",
"name": "拖动",
"font_class": "tuodong",
"unicode": "e884",
"unicode_decimal": 59524
},
{
"icon_id": "4315844",
"name": "line",
"font_class": "fuzhushuxian",
"unicode": "e6f7",
"unicode_decimal": 59127
},
{
"icon_id": "9213697",
"name": "魔方",
"font_class": "mofang",
"unicode": "e6c4",
"unicode_decimal": 59076
},
{
"icon_id": "13126664",
"name": "手动选择",
"font_class": "shoudongxuanze",
"unicode": "e6e1",
"unicode_decimal": 59105
},
{
"icon_id": "15035365",
"name": "一行三个",
"font_class": "yihangsange",
"unicode": "e6d5",
"unicode_decimal": 59093
},
{
"icon_id": "15035367",
"name": "一行四个",
"font_class": "yihangsige",
"unicode": "e6d6",
"unicode_decimal": 59094
},
{
"icon_id": "16552058",
"name": "一行两个",
"font_class": "yihangliangge",
"unicode": "e6e2",
"unicode_decimal": 59106
},
{
"icon_id": "19363687",
"name": "一行5个",
"font_class": "yihang5ge",
"unicode": "e6f3",
"unicode_decimal": 59123
},
{
"icon_id": "30454132",
"name": "图片广告",
"font_class": "tupianguanggao1",
"unicode": "e649",
"unicode_decimal": 58953
},
{
"icon_id": "30454144",
"name": "图文导航",
"font_class": "tuwendaohang2",
"unicode": "e65d",
"unicode_decimal": 58973
},
{
"icon_id": "30461206",
"name": "文章",
"font_class": "wenzhang",
"unicode": "e662",
"unicode_decimal": 58978
},
{
"icon_id": "30621137",
"name": "固定展示",
"font_class": "gudingzhanshi",
"unicode": "e66e",
"unicode_decimal": 58990
},
{
"icon_id": "30621139",
"name": "单行滑动",
"font_class": "danhanghuadong",
"unicode": "e66f",
"unicode_decimal": 58991
},
{
"icon_id": "30621140",
"name": "图文导航",
"font_class": "tuwendaohang3",
"unicode": "e670",
"unicode_decimal": 58992
},
{
"icon_id": "30621141",
"name": "图导航",
"font_class": "tudaohang",
"unicode": "e671",
"unicode_decimal": 58993
},
{
"icon_id": "30621143",
"name": "分页滑动",
"font_class": "fenyehuadong",
"unicode": "e673",
"unicode_decimal": 58995
},
{
"icon_id": "30621144",
"name": "文导航",
"font_class": "wendaohang",
"unicode": "e674",
"unicode_decimal": 58996
},
{
"icon_id": "386395",
"name": "装修",
"font_class": "zhuangxiu",
"unicode": "e627",
"unicode_decimal": 58919
},
{
"icon_id": "1376045",
"name": "店铺装修",
"font_class": "dianpuzhuangxiu",
"unicode": "e616",
"unicode_decimal": 58902
},
{
"icon_id": "4315691",
"name": "底部导航",
"font_class": "dibudaohang",
"unicode": "e617",
"unicode_decimal": 58903
},
{
"icon_id": "34453370",
"name": "旺铺装修",
"font_class": "wangpuzhuangxiu",
"unicode": "e881",
"unicode_decimal": 59521
},
{
"icon_id": "8710560",
"name": "微信公众号",
"font_class": "weixingongzhonghao1",
"unicode": "e705",
"unicode_decimal": 59141
},
{
"icon_id": "4846336",
"name": "微信公众号管理",
"font_class": "weixingongzhonghaoguanli",
"unicode": "e609",
"unicode_decimal": 58889
},
{
"icon_id": "9810504",
"name": "小程序",
"font_class": "xiaochengxu",
"unicode": "e635",
"unicode_decimal": 58933
},
{
"icon_id": "10392614",
"name": "登录",
"font_class": "denglu",
"unicode": "e604",
"unicode_decimal": 58884
},
{
"icon_id": "15643755",
"name": "小程序设置",
"font_class": "xiaochengxushezhi",
"unicode": "e6b4",
"unicode_decimal": 59060
},
{
"icon_id": "321993",
"name": "integral",
"font_class": "jifen",
"unicode": "e70c",
"unicode_decimal": 59148
},
{
"icon_id": "731270",
"name": "登录注册密码",
"font_class": "guanbi",
"unicode": "e612",
"unicode_decimal": 58898
},
{
"icon_id": "845851",
"name": "登录注册密码",
"font_class": "dengluzhucemima",
"unicode": "e67f",
"unicode_decimal": 59007
},
{
"icon_id": "1440387",
"name": "切换角色",
"font_class": "qiehuanjiaose",
"unicode": "e60f",
"unicode_decimal": 58895
},
{
"icon_id": "1440877",
"name": "版权",
"font_class": "banquan",
"unicode": "e632",
"unicode_decimal": 58930
},
{
"icon_id": "1727353",
"name": "20积分-线性",
"font_class": "jifen-xianxing",
"unicode": "e897",
"unicode_decimal": 59543
},
{
"icon_id": "3590938",
"name": "会员列表",
"font_class": "huiyuanliebiao",
"unicode": "e62c",
"unicode_decimal": 58924
},
{
"icon_id": "5082143",
"name": "角色用户",
"font_class": "jiaoseyonghu",
"unicode": "e648",
"unicode_decimal": 58952
},
{
"icon_id": "5582337",
"name": "用户",
"font_class": "yonghu",
"unicode": "e65e",
"unicode_decimal": 58974
},
{
"icon_id": "6415223",
"name": "版权",
"font_class": "banquan1",
"unicode": "e66d",
"unicode_decimal": 58989
},
{
"icon_id": "7006681",
"name": "微信公众号",
"font_class": "weixingongzhonghao",
"unicode": "e613",
"unicode_decimal": 58899
},
{
"icon_id": "7006683",
"name": "微信小程序",
"font_class": "weixinxiaochengxu",
"unicode": "e614",
"unicode_decimal": 58900
},
{
"icon_id": "7577294",
"name": "24gl-code",
"font_class": "24gl-code",
"unicode": "e9ba",
"unicode_decimal": 59834
},
{
"icon_id": "7596833",
"name": "24gl-portraitMalePlus2",
"font_class": "24gl-portraitMalePlus2",
"unicode": "eb25",
"unicode_decimal": 60197
},
{
"icon_id": "7874533",
"name": "源代码",
"font_class": "yuandaima",
"unicode": "e610",
"unicode_decimal": 58896
},
{
"icon_id": "11121397",
"name": "角色管理",
"font_class": "jiaoseguanli",
"unicode": "e62d",
"unicode_decimal": 58925
},
{
"icon_id": "12797047",
"name": "积分",
"font_class": "jifen1",
"unicode": "e641",
"unicode_decimal": 58945
},
{
"icon_id": "26257279",
"name": "版权",
"font_class": "banquan2",
"unicode": "e61b",
"unicode_decimal": 58907
},
{
"icon_id": "26847628",
"name": "键盘",
"font_class": "jianpan",
"unicode": "e661",
"unicode_decimal": 58977
},
{
"icon_id": "7594157",
"name": "24gf-playCircle",
"font_class": "24gf-playCircle",
"unicode": "ea82",
"unicode_decimal": 60034
},
{
"icon_id": "1025135",
"name": "退出全屏",
"font_class": "tuichuquanping",
"unicode": "e755",
"unicode_decimal": 59221
},
{
"icon_id": "23359065",
"name": "翻译",
"font_class": "fanyi",
"unicode": "e6fb",
"unicode_decimal": 59131
},
{
"icon_id": "5387606",
"name": "全屏",
"font_class": "quanping",
"unicode": "eb11",
"unicode_decimal": 60177
}
]
}

View File

@ -3,5 +3,6 @@
@import 'element-plus/theme-chalk/display.css';
@import 'tailwind.css';
@import 'element-plus.scss';
@import 'iconfont.css';
@import 'icon/iconfont.css';
@import 'icon/addon-iconfont.css'; // 安装卸载插件时动态引用插件的图标库文件
@import 'common.scss';

View File

@ -3,7 +3,6 @@ import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import { useCssVar, useTitle } from '@vueuse/core'
import colorFunction from 'css-color-function'
import storage from './storage'
import { useRoute } from 'vue-router'
/**
* element-icon

View File

@ -2,7 +2,7 @@
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-[24px]">{{ pageName }}</span>
<span class="text-[20px]">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">{{ t('addArticleCategory') }}</el-button>
</div>
@ -59,6 +59,7 @@ import { ElMessageBox, FormInstance } from 'element-plus'
import EditCategory from '@/views/article/components/edit-category.vue'
import { debounce } from '@/utils/common'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title

View File

@ -9,42 +9,35 @@
<span class="right">{{ pageName }}</span>
</div>
<el-card class="box-card !border-none" shadow="never">
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"
v-loading="loading">
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
<el-form-item :label="t('title')" prop="title">
<el-input v-model="formData.title" clearable :placeholder="t('titlePlaceholder')" class="input-width"
maxlength="20" />
<el-input v-model="formData.title" clearable :placeholder="t('titlePlaceholder')" class="input-width" maxlength="20" />
</el-form-item>
<el-form-item :label="t('categoryName')" prop="category_id">
<el-select v-model="formData.category_id" clearable :placeholder="t('categoryIdPlaceholder')"
class="input-width">
<el-select v-model="formData.category_id" clearable :placeholder="t('categoryIdPlaceholder')" class="input-width">
<el-option :label="item['name']" :value="item['category_id']" v-for="item in categoryList" />
</el-select>
</el-form-item>
<el-form-item :label="t('intro')" prop="intro">
<el-input v-model="formData.intro" type="textarea" rows="4" clearable
:placeholder="t('introPlaceholder')" class="input-width" maxlength="50" />
<el-input v-model="formData.intro" type="textarea" rows="4" clearable :placeholder="t('introPlaceholder')" class="input-width" maxlength="50" />
</el-form-item>
<el-form-item :label="t('summary')" prop="summary">
<el-input v-model="formData.summary" type="textarea" rows="4" clearable
:placeholder="t('summaryPlaceholder')" class="input-width" maxlength="50" />
<el-input v-model="formData.summary" type="textarea" rows="4" clearable :placeholder="t('summaryPlaceholder')" class="input-width" maxlength="50" />
</el-form-item>
<el-form-item :label="t('image')">
<upload-image v-model="formData.image" />
</el-form-item>
<el-form-item :label="t('author')" prop="author">
<el-input v-model="formData.author" clearable :placeholder="t('authorPlaceholder')" class="input-width"
maxlength="20" />
<el-input v-model="formData.author" clearable :placeholder="t('authorPlaceholder')" class="input-width" maxlength="20" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
<el-form-item :label="t('visitVirtual')">
<el-input v-model="formData.visit_virtual" clearable :placeholder="t('visitVirtualPlaceholder')"
class="input-width" />
<el-input v-model="formData.visit_virtual" clearable :placeholder="t('visitVirtualPlaceholder')" class="input-width" />
</el-form-item>
<el-form-item :label="t('isShow')">
<el-radio-group v-model="formData.is_show" :placeholder="t('isShowPlaceholder')">

View File

@ -3,7 +3,7 @@
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-[24px]">{{ pageName }}</span>
<span class="text-[20px]">{{ pageName }}</span>
<el-button type="primary" class="w-[100px]" @click="addEvent">{{ t('addArticle') }}</el-button>
</div>

View File

@ -46,19 +46,7 @@
<el-form-item :label="t('menuIcon')" prop="icon" v-show="formData.menu_type != 2">
<div class="input-width">
<select-icon placement="bottom" width="300px" @select="selectMenuIcon">
<template #reference>
<el-input>
<template #prepend>
<icon :name="formData.icon" v-if="formData.icon" />
<div v-else class="w-[16px]"></div>
</template>
<template #append>
<icon name="element-RefreshRight" type="element" @click="formData.icon = ''" />
</template>
</el-input>
</template>
</select-icon>
<select-icon v-model="formData.icon" />
</div>
</el-form-item>
@ -171,12 +159,6 @@ const formRules = computed(() => {
}
})
//
const selectMenuIcon = (icon: any) => {
formData.icon = ''
setTimeout(() => { formData.icon = icon }, 200)
}
const emit = defineEmits(['complete'])
/**

View File

@ -1,7 +1,6 @@
<template>
<el-dialog v-model="showDialog" :title="popTitle" width="500px" :destroy-on-close="true">
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"
v-loading="loading">
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
<el-form-item :label="t('roleName')" prop="role_name">
<el-input v-model="formData.role_name" :placeholder="t('roleNamePlaceholder')" clearable :disabled="formData.uid" class="input-width" maxlength="10" :show-word-limit="true" />
</el-form-item>

View File

@ -2,7 +2,7 @@
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="sysUserLogTableData.searchParam" ref="searchFormRef">
@ -61,6 +61,7 @@ import { getLogList } from '@/api/site'
import UserLogDetail from '@/views/auth/components/user-log-detail.vue'
import { useRoute } from 'vue-router'
import { FormInstance } from 'element-plus'
const route = useRoute()
const pageName = route.meta.title;

View File

@ -2,7 +2,7 @@
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-[24px]">{{ pageName }}</span>
<span class="text-[20px]">{{ pageName }}</span>
<!-- <el-button type="primary" class="w-[100px]" @click="addEvent">
{{ t('addMenu') }}
</el-button> -->
@ -55,6 +55,7 @@ import { getMenus, deleteMenu } from '@/api/sys'
import { t } from '@/lang'
import { ElMessageBox } from 'element-plus'
import EditMenu from '@/views/auth/components/edit-menu.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title

View File

@ -2,7 +2,7 @@
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
<el-button type="primary" class="w-[100px]" @click="addEvent">{{ t('addRole') }}</el-button>
</div>
@ -55,6 +55,7 @@ import { t } from '@/lang'
import { getRoleList, deleteRole } from '@/api/sys'
import { ElMessageBox, FormInstance } from 'element-plus'
import EditRole from '@/views/auth/components/edit-role.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;

View File

@ -3,7 +3,7 @@
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-[24px]">{{ pageName }}</span>
<span class="text-[20px]">{{ pageName }}</span>
<!-- <el-button type="primary" class="w-[100px]" @click="addEvent">
{{ t('addMenu') }}
</el-button> -->
@ -56,6 +56,7 @@ import { getMenus, deleteMenu } from '@/api/sys'
import { t } from '@/lang'
import { ElMessageBox } from 'element-plus'
import EditMenu from '@/views/auth/components/edit-menu.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title

View File

@ -2,7 +2,7 @@
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
<el-button type="primary" class="w-[100px]" @click="addEvent">{{ t('addUser') }}</el-button>
</div>
@ -88,6 +88,7 @@ import { img } from '@/utils/common'
import { ElMessageBox } from 'element-plus'
import type { FormInstance } from 'element-plus'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;

View File

@ -1,7 +1,7 @@
<template>
<div class="main-container">
<div class="flex ml-[18px] justify-between items-center mt-[20px] mb-[5px]">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
</div>
<el-form :model="formData" label-width="150px" ref="formRef" class="page-form" v-loading="loading">
<el-card class="box-card !border-none" shadow="never">
@ -95,6 +95,7 @@ import { setAliappConfig, getAliappConfig, getAliappStatic } from '@/api/aliapp'
import { useClipboard } from '@vueuse/core'
import { ElMessage, FormInstance } from 'element-plus'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title

View File

@ -1,7 +1,7 @@
<template>
<div class="main-container">
<div class="flex ml-[18px] justify-between items-center mt-[20px]">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
</div>
<el-form :model="formData" label-width="150px" ref="formRef" class="page-form" v-loading="loading">
<el-card class="box-card !border-none" shadow="never">
@ -36,6 +36,7 @@ import { getUrl } from '@/api/sys'
import { useClipboard } from '@vueuse/core'
import { ElMessage, FormInstance } from 'element-plus'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title

View File

@ -1,7 +1,7 @@
<template>
<div class="main-container" v-loading="loading">
<div class="flex ml-[18px] justify-between items-center mt-[20px]">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
</div>
<el-form :model="formData" label-width="150px" ref="formRef" class="page-form">
@ -29,8 +29,9 @@ import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { getUrl } from '@/api/sys'
import { useClipboard } from '@vueuse/core'
import { ElMessage, FormInstance, FormRules } from 'element-plus'
import { ElMessage, FormInstance } from 'element-plus'
import { useRouter, useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title

View File

@ -1,7 +1,7 @@
<template>
<div class="main-container">
<div class="flex ml-[18px] justify-between items-center mt-[20px]">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
</div>
<el-form :model="formData" label-width="170px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
<el-card class="box-card !border-none" shadow="never">
@ -43,8 +43,7 @@
<el-form-item label="URL">
<el-input :model-value="formData.serve_url" placeholder="Please input" class="input-width" :readonly="true">
<template #append>
<div class="cursor-pointer" @click="copyEvent(formData.serve_url)">{{ t('copy') }}
</div>
<div class="cursor-pointer" @click="copyEvent(formData.serve_url)">{{ t('copy') }}</div>
</template>
</el-input>
</el-form-item>
@ -79,32 +78,28 @@
<el-form-item :label="t('requestUrl')">
<el-input :model-value="formData.request_url" placeholder="Please input" class="input-width" :readonly="true">
<template #append>
<div class="cursor-pointer" @click="copyEvent(formData.request_url)">{{ t('copy') }}
</div>
<div class="cursor-pointer" @click="copyEvent(formData.request_url)">{{ t('copy') }}</div>
</template>
</el-input>
</el-form-item>
<el-form-item :label="t('socketUrl')">
<el-input :model-value="formData.socket_url" placeholder="Please input" class="input-width" :readonly="true">
<template #append>
<div class="cursor-pointer" @click="copyEvent(formData.socket_url)">{{ t('copy') }}
</div>
<div class="cursor-pointer" @click="copyEvent(formData.socket_url)">{{ t('copy') }}</div>
</template>
</el-input>
</el-form-item>
<el-form-item :label="t('uploadUrl')">
<el-input :model-value="formData.upload_url" placeholder="Please input" class="input-width" :readonly="true">
<template #append>
<div class="cursor-pointer" @click="copyEvent(formData.upload_url)">{{ t('copy') }}
</div>
<div class="cursor-pointer" @click="copyEvent(formData.upload_url)">{{ t('copy') }}</div>
</template>
</el-input>
</el-form-item>
<el-form-item :label="t('downloadUrl')">
<el-input :model-value="formData.download_url" placeholder="Please input" class="input-width" :readonly="true">
<template #append>
<div class="cursor-pointer" @click="copyEvent(formData.download_url)">{{ t('copy') }}
</div>
<div class="cursor-pointer" @click="copyEvent(formData.download_url)">{{ t('copy') }}</div>
</template>
</el-input>
</el-form-item>
@ -127,6 +122,7 @@ import { getWeappConfig, setWeappConfig } from '@/api/weapp'
import { useClipboard } from '@vueuse/core'
import { ElMessage, FormInstance, FormRules } from 'element-plus'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title

View File

@ -2,7 +2,7 @@
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
<el-button type="primary" class="w-[100px]" @click="batchAcquisitionFn">{{ t('batchAcquisition') }}</el-button>
</div>
<el-alert class="warm-prompt !my-[20px]" type="info">

View File

@ -1,7 +1,7 @@
<template>
<div class="main-container">
<div class="flex ml-[18px] justify-between items-center mt-[20px]">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
</div>
<el-form :model="formData" label-width="150px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
@ -44,8 +44,7 @@
<el-form-item label="URL">
<el-input :model-value="wechatStatic.serve_url" placeholder="Please input" class="input-width" :readonly="true">
<template #append>
<div class="cursor-pointer" @click="copyEvent(wechatStatic.serve_url)">{{ t('copy') }}
</div>
<div class="cursor-pointer" @click="copyEvent(wechatStatic.serve_url)">{{ t('copy') }}</div>
</template>
</el-input>
</el-form-item>
@ -84,8 +83,7 @@
<el-form-item :label="t('businessDomain')">
<el-input :model-value="wechatStatic.business_domain" placeholder="Please input" class="input-width" :readonly="true">
<template #append>
<div class="cursor-pointer" @click="copyEvent(wechatStatic.business_domain)">{{ t('copy') }}
</div>
<div class="cursor-pointer" @click="copyEvent(wechatStatic.business_domain)">{{ t('copy') }}</div>
</template>
</el-input>
</el-form-item>
@ -93,8 +91,7 @@
<el-form-item :label="t('jsSecureDomain')">
<el-input :model-value="wechatStatic.js_secure_domain" placeholder="Please input" class="input-width" :readonly="true">
<template #append>
<div class="cursor-pointer" @click="copyEvent(wechatStatic.business_domain)">{{ t('copy') }}
</div>
<div class="cursor-pointer" @click="copyEvent(wechatStatic.business_domain)">{{ t('copy') }}</div>
</template>
</el-input>
</el-form-item>
@ -102,8 +99,7 @@
<el-form-item :label="t('webAuthDomain')">
<el-input :model-value="wechatStatic.web_auth_domain" placeholder="Please input" class="input-width" :readonly="true">
<template #append>
<div class="cursor-pointer" @click="copyEvent(wechatStatic.business_domain)">{{ t('copy') }}
</div>
<div class="cursor-pointer" @click="copyEvent(wechatStatic.business_domain)">{{ t('copy') }}</div>
</template>
</el-input>
</el-form-item>
@ -126,6 +122,7 @@ import { getWechatConfig, getWechatStatic, editWechatConfig } from '@/api/wechat
import { useClipboard } from '@vueuse/core'
import { ElMessage, FormInstance, FormRules } from 'element-plus'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title

View File

@ -11,8 +11,7 @@
</div>
</div>
<div class="flex-1 flex w-0">
<div class="menu-item py-[15px] flex items-center justify-center cursor-pointer"
:class="{ 'size-1': button.length == 1, 'size-2-3': button.length > 1, 'active': index == buttonIndex, 'curr': index == buttonIndex && subButtonIndex == -1 }"
<div class="menu-item py-[15px] flex items-center justify-center cursor-pointer" :class="{ 'size-1': button.length == 1, 'size-2-3': button.length > 1, 'active': index == buttonIndex, 'curr': index == buttonIndex && subButtonIndex == -1 }"
v-for="(item, index) in button" :key="index" @click="selectButton(index)">
<div class="menu-name px-[10px] border-r border-color w-full leading-[40px] text-base truncate text-center">{{ item.name }}</div>
<div class="active-shade"></div>

View File

@ -2,7 +2,7 @@
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
<el-button type="primary" class="w-[100px]" @click="batchAcquisitionFn">{{ t('batchAcquisition') }}</el-button>
</div>
<el-alert class="warm-prompt !my-[20px]" type="info">

View File

@ -94,7 +94,6 @@
import {ref, reactive} from 'vue'
import {img} from '@/utils/common'
import {getArticleList} from '@/api/article'
import {ElTable} from 'element-plus'
const diyStore = useDiyStore()
diyStore.editComponent.ignore = []; //

View File

@ -49,7 +49,6 @@
import Sortable from 'sortablejs'
import {img} from '@/utils/common'
import {range} from 'lodash-es'
import useDiyStore from '@/stores/modules/diy'
const diyStore = useDiyStore()

View File

@ -89,7 +89,7 @@
<template #header>
<div class="card-header flex justify-between items-center">
<span class="title flex-1">{{ diyStore.currentIndex == -99 ? t('pageSet') : diyStore.editComponent.componentTitle }}</span>
<div class="tab-wrap flex rounded-[50px] bg-gray-100 text-[14px]">
<div class="tab-wrap flex rounded-[50px] bg-gray-100 text-[14px]" v-if="diyStore.currentComponent">
<span class="cursor-pointer rounded-[50px] py-[5px] px-[15px]" :class="{ 'bg-primary text-white': diyStore.editTab == 'content'}" @click="diyStore.editTab = 'content'">{{ t('tabEditContent') }}</span>
<span class="cursor-pointer rounded-[50px] py-[5px] px-[15px]" :class="{ 'bg-primary text-white': diyStore.editTab == 'style'}" @click="diyStore.editTab = 'style'">{{ t('tabEditStyle') }}</span>
</div>
@ -98,7 +98,7 @@
<div class="edit-component-wrap">
<component :is="modules[diyStore.currentComponent]" :value="diyStore.value[diyStore.currentIndex]">
<component v-if="diyStore.currentComponent" :is="modules[diyStore.currentComponent]" :value="diyStore.value[diyStore.currentIndex]">
<template #style>
<div class="edit-attr-item-wrap">
<h3 class="mb-[10px]">{{ t('componentStyleTitle') }}</h3>
@ -129,6 +129,33 @@
</div>
</template>
</component>
<div class="edit-attr-item-wrap" v-else>
<h3 class="mb-[10px]">{{ t('componentStyleTitle') }}</h3>
<el-form label-width="80px" class="px-[10px]">
<el-form-item :label="t('bottomBgColor')" class="display-block" v-if="diyStore.editComponent.ignore.indexOf('pageBgColor') == -1">
<el-color-picker v-model="diyStore.editComponent.pageBgColor" show-alpha :predefine="diyStore.predefineColors"/>
<div class="text-sm text-gray-400">{{ t('bottomBgTips') }}</div>
</el-form-item>
<el-form-item :label="t('componentBgColor')" v-if="diyStore.editComponent.ignore.indexOf('componentBgColor') == -1">
<el-color-picker v-model="diyStore.editComponent.componentBgColor" show-alpha :predefine="diyStore.predefineColors"/>
</el-form-item>
<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="0" class="ml-[10px] horz-blank-slider"/>
</el-form-item>
<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-form-item>
<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-form-item>
<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="50"/>
</el-form-item>
<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="50"/>
</el-form-item>
</el-form>
</div>
</div>
@ -146,7 +173,7 @@ import { ref, reactive, toRaw, watch } from 'vue'
import { t } from '@/lang'
import { addDiyPage, editDiyPage, initPage } from '@/api/diy';
import { useRoute, useRouter } from 'vue-router'
import { cloneDeep, range, isEmpty } from 'lodash-es'
import { cloneDeep } from 'lodash-es'
import { ElMessage, ElMessageBox } from 'element-plus'
import useDiyStore from '@/stores/modules/diy'
import storage from '@/utils/storage'
@ -174,7 +201,6 @@ const backPath = route.query.back
const component = ref([])
const componentType: string[] = reactive([])
const page = ref('')
const siteId = ref(0)
const activeNames = ref(componentType)
const handleChange = (val: string[]) => { }
@ -299,7 +325,6 @@ initPage({
wapDomain.value = data.domain_url.wap_domain;
wapUrl.value = data.domain_url.wap_url;
page.value = data.page;
siteId.value = data.site_id;
setDomain();
//
@ -348,15 +373,27 @@ window.addEventListener('message', (event) => {
}, false);
const saveWapDomain = ()=> {
if (wapDomain.value.trim().length == 0) {
ElMessage({
type: 'warning',
message: `${t('wapDomainPlaceholder')}`,
});
return;
}
wapUrl.value = wapDomain.value + '/wap'
setDomain();
storage.set({ key : 'wap_domain', data :wapUrl.value });
storage.set({key: 'wap_domain', data: wapUrl.value});
loadingIframe.value = true;
loadingDev.value = false;
}
const setDomain = ()=>{
wapPreview.value = `${wapUrl.value}/${page.value}?mode=decorate&site_id=${siteId.value}`; // decorate 访
wapPreview.value = `${wapUrl.value}/${page.value}?mode=decorate`; // decorate 访
// id
if (import.meta.env.MODE == 'development') {
let siteId = storage.get('siteId') || 0;
wapPreview.value += `&site_id=${siteId}`;
}
}
// iframe

View File

@ -1,18 +1,11 @@
<template>
<div class="flex flex-wrap">
<div class="page-item relative bg-no-repeat mr-[40px] mt-[20px] bg-[#f7f7f7] w-[300px] pt-[80px] pb-[20px]"
:class="{ 'cursor-pointer' : !item.isDisabledPop }"
v-for="(item,key) in page"
:key="key">
<p class="absolute top-[46px] left-[50%] translate-x-[-50%] text-[14px] truncate w-[130px] text-center">
{{item.use_template.title}}</p>
<div class="page-item relative bg-no-repeat ml-[20px] mr-[40px] mt-[20px] bg-[#f7f7f7] w-[300px] pt-[80px] pb-[20px]" :class="{ 'cursor-pointer' : !item.isDisabledPop }" v-for="(item,key) in page" :key="key">
<p class="absolute top-[46px] left-[50%] translate-x-[-50%] text-[14px] truncate w-[130px] text-center">{{item.use_template.title}}</p>
<div v-show="item.use_template.url" class="w-[282px] h-[500px] mx-auto">
<iframe v-show="item.loadingIframe" class="w-[282px] h-[500px] mx-auto"
:src="item.use_template.wapPreview"
frameborder="0" @load="loadIframe(key)"></iframe>
<div v-show="item.loadingDev"
class="w-[282px] h-[500px] mx-auto bg-body pt-[20px] px-[20px]">
<div v-show="item.use_template.url" class="w-[282px] h-[493px] mx-auto">
<iframe v-show="item.loadingIframe" class="w-[282px] h-[493px] mx-auto" :src="item.use_template.wapPreview" frameborder="0" @load="loadIframe(key)"></iframe>
<div v-show="item.loadingDev" class="w-[282px] h-[493px] mx-auto bg-body pt-[20px] px-[20px]">
<div class="font-bold text-xl mb-[40px]">{{t('developTitle')}}</div>
<div class="mb-[20px] flex flex-col">
<text class="mb-[10px]">{{ t('wapDomain') }}</text>
@ -22,20 +15,17 @@
</div>
</div>
<div v-show="!item.use_template.wapPreview" class="overflow-hidden w-[282px] h-[500px] mx-auto">
<img class="max-w-full" v-if="item.use_template.cover"
:src="img(item.use_template.cover)"/>
<div v-show="!item.use_template.wapPreview" class="overflow-hidden w-[282px] h-[493px] mx-auto">
<img class="max-w-full" v-if="item.use_template.cover" :src="img(item.use_template.cover)"/>
</div>
<p class="text-[12px] text-[#999] mt-[10px] mx-auto truncate text-center w-[250px]">
{{item.use_template.desc}}</p>
<p class="text-[12px] text-[#999] mt-[10px] mx-auto truncate text-center w-[250px]">{{item.use_template.desc}}</p>
<div class="item-hide absolute inset-x-0 inset-y-0 bg-black bg-opacity-50 text-center rounded-[40px]"
:class="{ 'disabled' : item.isDisabledPop }">
<div class="item-hide absolute inset-x-0 inset-y-0 bg-black bg-opacity-50 text-center" :class="{ 'disabled' : item.isDisabledPop }">
<div class="item-btn-box absolute top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%] flex flex-col flex-wrap">
<el-button @click="show(key,item)">切换</el-button>
<el-button v-show="item.use_template.mode == 'diy'" @click="toDecorate(item.use_template)">装修
</el-button>
<!-- v-show="item.use_template.mode == 'diy'"-->
<el-button @click="toDecorate(item.use_template)">装修</el-button>
<el-button @click="toPreview(item.use_template)">预览</el-button>
</div>
</div>
@ -43,19 +33,16 @@
</div>
</div>
<el-dialog v-model="showDialog" :title="t('changeTemplate')" width="400px" :close-on-press-escape="false"
:destroy-on-close="true" :close-on-click-modal="false">
<el-dialog v-model="showDialog" :title="t('changeTemplate')" width="400px" :close-on-press-escape="false" :destroy-on-close="true" :close-on-click-modal="false">
<el-form :model="form" label-width="0px" v-if="formData.type">
<el-form-item label="">
<div>{{t('hopeBeforeTip')}}<span class="text-primary px-[5px]">{{ page[formData.type].title }}</span>{{t('hopeAfterTip')}}
</div>
<div>{{t('hopeBeforeTip')}}<span class="text-primary px-[5px]">{{ page[formData.type].title }}</span>{{t('hopeAfterTip')}}</div>
</el-form-item>
<el-form-item label="">
<el-select v-model="hope" class="w-full">
<el-option :label="t('changeTemplateTip') + ' ' + page[formData.type].title + ' ' + t('template')"
value="template"/>
<el-option :label="t('changeTemplateTip') + ' ' + page[formData.type].title + ' ' + t('template')" value="template"/>
<el-option :label="t('changeMyPageTip') + ' ' + page[formData.type].title" value="diy"/>
</el-select>
</el-form-item>
@ -68,8 +55,7 @@
<el-form-item label="" v-show="hope == 'diy'">
<el-select v-model="formData.id" class="w-full">
<el-option v-for="(item, index) in page[formData.type].my_page" :label="item.title"
:value="item.id"/>
<el-option v-for="(item, index) in page[formData.type].my_page" :label="item.title" :value="item.id"/>
</el-select>
<div class="mt-[10px]">
<span class="cursor-pointer text-primary mr-[10px]" @click="toDiyList">{{ t('createPage') }}</span>
@ -90,11 +76,11 @@
</template>
<script lang="ts" setup>
import {reactive, ref, watch, computed} from 'vue'
import {reactive, ref, watch} from 'vue'
import {t} from '@/lang'
import {img} from '@/utils/common'
import {useRoute, useRouter} from 'vue-router'
import {TabsPaneContext, ElMessage, ElMessageBox} from 'element-plus'
import { useRouter } from 'vue-router'
import { ElMessage } from 'element-plus'
import {getDecoratePage, getDiyList, changeTemplate} from '@/api/diy'
import storage from '@/utils/storage'
@ -124,23 +110,31 @@
for (let key in page) {
if (page[key].use_template.url) {
page[key].loadingIframe = false; // iframe
page[key].loadingDev = false; //
page[key].isDisabledPop = false; //
page[key].timeFrame = 0;
wapDomain.value = page[key].domain_url.wap_domain;
page[key].wapUrl = page[key].domain_url.wap_url;
// wap
if (import.meta.env.MODE == 'development' && !wapDomain.value && storage.get('wap_domain')) {
page[key].wapUrl = storage.get('wap_domain')
page[key].loadingIframe = true; // iframe
page[key].loadingDev = false; //
page[key].isDisabledPop = false; //
// id
if (import.meta.env.MODE == 'development') {
let siteId = storage.get('siteId') || 0;
page[key].use_template.url += `&site_id=${siteId}`;
// wap
if (!wapDomain.value && storage.get('wap_domain')) {
page[key].wapUrl = storage.get('wap_domain')
page[key].loadingIframe = true; // iframe
page[key].loadingDev = false; //
page[key].isDisabledPop = false; //
}
page[key].timeFrame = new Date().getTime();
}
setDomain(key);
page[key].timeFrame = new Date().getTime();
}
}
@ -151,7 +145,6 @@
// iframe
const loadIframe = (key: string) => {
if (storage.get('wap_domain')) return;
if (!page[key].use_template.wapPreview) return;
var loadTime = new Date().getTime();
@ -169,6 +162,13 @@
}
const saveDomain = () => {
if (wapDomain.value.trim().length == 0) {
ElMessage({
type: 'warning',
message: `${t('wapDomainPlaceholder')}`,
});
return;
}
let wapUrl = wapDomain.value + '/wap';
storage.set({key: 'wap_domain', data: wapUrl});
@ -250,7 +250,7 @@
//
const refreshMyPage = () => {
getDiyList({type: formData.type, mode: 'diy'}).then((res) => {
getDiyList({type: formData.type}).then((res) => {
let isExist = true; //
for (let i = 0; i < res.data.length; i++) {
if (formData.id == res.data[i].id) {

View File

@ -2,7 +2,7 @@
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
<el-button type="primary" class="w-[100px]" @click="dialogVisible = true">
{{ t('addDiyPage') }}
</el-button>
@ -123,12 +123,11 @@
</template>
<script lang="ts" setup>
import { reactive, ref, watch, computed } from 'vue'
import { reactive, ref, computed } from 'vue'
import { t } from '@/lang'
import { getDiyPageList, deleteDiyPage, getDiyTemplate, editDiyPageShare } from '@/api/diy'
import { ElMessage, ElMessageBox, FormInstance } from 'element-plus'
import { ElMessageBox, FormInstance } from 'element-plus'
import { useRoute, useRouter } from 'vue-router'
import QRCode from "qrcode";
import { getUrl } from '@/api/sys'
const router = useRouter()
@ -186,7 +185,7 @@
getDomain();
//
getDiyTemplate({ mode : 'diy' }).then(res => {
getDiyTemplate({ mode : '' }).then(res => {
for (let key in res.data) {
pageType[key] = res.data[key]
}
@ -200,7 +199,8 @@
data: [],
searchParam: {
"title": "",
"template": '',
"type": '',
'mode':''
}
})

View File

@ -15,33 +15,32 @@
<div class="w-[400px] absolute bg-body top-[10%] -right-[450px]" v-if="loadingIframe">
<div class="info-wrap mt-[20px]">
<div class="px-[20px] pb-[10px] font-bold">{{t('h5')}}</div>
<el-form label-width="40px" class="px-[20px]">
<el-form-item :label="t('preview')">
<el-radio-group v-model="previewMode">
<el-radio :label="'weapp'">{{t('weapp')}}</el-radio>
<el-radio :label="'wechat'">{{t('wechat')}}</el-radio>
</el-radio-group>
<el-form-item :label="t('link')" v-show="wapPreview">
<el-input readonly :value="wapPreview">
<template #append>
<el-button @click="copyEvent(wapPreview)" class="bg-primary copy">{{ t('copy') }}</el-button>
</template>
</el-input>
</el-form-item>
<el-form-item label=" " v-show="wapImage">
<el-image :src="wapImage"/>
</el-form-item>
</el-form>
<div class="px-[20px] pb-[10px] font-bold mt-[40px]">{{t('weapp')}}</div>
<el-form label-width="40px" class="px-[20px]">
<el-form-item label=" " v-if="weappConfig.qr_code">
<el-image class="w-[100px] h-[100px]" :src="img(weappConfig.qr_code)"/>
</el-form-item>
<el-form-item label=" " v-else>
<span class="text-gray-400">{{t('weappNotSet')}}</span>
</el-form-item>
<template v-if="previewMode == 'wechat'">
<el-form-item :label="t('link')" v-show="wapPreview">
<el-input readonly :value="wapPreview">
<template #append>
<el-button @click="copyEvent(wapPreview)" class="bg-primary copy">{{ t('copy') }}</el-button>
</template>
</el-input>
</el-form-item>
<el-form-item label=" " v-show="wapImage">
<el-image :src="wapImage"/>
</el-form-item>
</template>
<template v-if="previewMode == 'weapp'">
<el-form-item label=" " v-if="weappConfig.qr_code">
<el-image class="w-[100px] h-[100px]" :src="img(weappConfig.qr_code)"/>
</el-form-item>
<el-form-item label=" " v-else>
<span class="text-gray-400">{{t('weappNotSet')}}</span>
</el-form-item>
</template>
</el-form>
</div>
@ -56,7 +55,7 @@
<script lang="ts" setup>
import {ref, reactive, watch} from 'vue'
import {t} from '@/lang'
import {useRoute, useRouter} from 'vue-router'
import {useRoute} from 'vue-router'
import {getWeappConfig} from '@/api/weapp'
import {getUrl} from '@/api/sys'
import {useClipboard} from '@vueuse/core'
@ -103,6 +102,13 @@
});
const save = () => {
if (wapDomain.value.trim().length == 0) {
ElMessage({
type: 'warning',
message: `${t('wapDomainPlaceholder')}`,
});
return;
}
wapUrl.value = wapDomain.value + '/wap';
setDomain();
storage.set({key: 'wap_domain', data: wapUrl.value});
@ -111,16 +117,18 @@
}
const setDomain = () => {
let siteInfo = storage.get('siteInfo');
let siteCode = '';
if (siteInfo) siteCode = siteInfo.site_code;
getPreviewData({
id: route.query.id,
name: route.query.name,
}).then((res: any) => {
let data = res.data;
wapPreview.value = `${wapUrl.value}/${data.page}&mode=preview&site_id=${siteCode}`;
wapPreview.value = `${wapUrl.value}/${data.page}`;
// id
if (import.meta.env.MODE == 'development') {
let siteId = storage.get('siteId') || 0;
wapPreview.value += `&site_id=${siteId}`;
}
QRCode.toDataURL(wapPreview.value, {errorCorrectionLevel: 'L', margin: 0, width: 100}).then(url => {
wapImage.value = url
})

View File

@ -2,7 +2,7 @@
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
@ -80,10 +80,9 @@
import { reactive, ref, watch, computed } from 'vue'
import { t } from '@/lang'
import { getDiyTemplate, getDiyRouteList, getDiyRouteInfo, editDiyRouteShare } from '@/api/diy'
import { ElMessage, ElMessageBox, FormInstance } from 'element-plus'
import { ElMessage, FormInstance } from 'element-plus'
import { useRoute, useRouter } from 'vue-router'
import { useClipboard } from '@vueuse/core'
import QRCode from "qrcode";
import { getUrl } from '@/api/sys'
const pageTemplate: any = reactive({})
@ -108,6 +107,7 @@ const wapDomain = ref('')
const getDomain = async () => {
wapDomain.value = (await getUrl()).data.wap_url;
};
getDomain();
/**
@ -134,7 +134,6 @@ getDiyTemplate({}).then(res => {
}
})
const searchFormDiyRouteRef = ref<FormInstance>()
/**

View File

@ -3,7 +3,7 @@
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
</div>
<el-card class="box-card !border-none base-bg !px-[35px]" shadow="never">
<el-row class="flex">
@ -203,12 +203,13 @@
</template>
<script lang="ts" setup>
import { reactive, ref, watch } from 'vue'
import { reactive, ref } from 'vue'
import { t } from '@/lang'
import { getAccountList, getAccountStat, getAccountType } from '@/api/site'
import { img } from '@/utils/common'
import { ElMessageBox } from 'element-plus'
import type { FormInstance } from 'element-plus'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
@ -262,7 +263,6 @@ const accountType = ref([])
const checkAccountType = () => {
getAccountType().then(res=>{
accountType.value = res.data
console.log(accountType.value)
})
}
checkAccountType()

View File

@ -2,7 +2,7 @@
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center mb-[5px]">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
</div>
<el-card class="box-card !border-none base-bg !px-[35px]" shadow="never">
<el-row class="flex">
@ -203,12 +203,11 @@
</template>
<script lang="ts" setup>
import { reactive, ref, watch } from 'vue'
import { reactive, ref } from 'vue'
import { t } from '@/lang'
import { getCashOutList, getTransfertype, memberTransfer, memberAudit, getCashOutDetail, getCashOutStatusList,getCashOutStat } from '@/api/member'
import { img } from '@/utils/common'
import { ElMessageBox, FormInstance } from 'element-plus'
import { data } from 'dom7'
import { useRouter, useRoute } from 'vue-router'
const cashOutStatusList = ref([])

View File

@ -160,14 +160,14 @@
</template>
<script lang="ts" setup>
import { reactive, ref,onMounted } from 'vue'
import { reactive, ref } from 'vue'
import useSystemStore from '@/stores/modules/system'
import { t } from '@/lang'
import { getStatInfo } from '@/api/stat'
import { ElMessage, FormRules } from 'element-plus'
import * as echarts from 'echarts'
import { img } from '@/utils/common'
import { useRouter } from 'vue-router'
const loading = ref(true)
const visitStat = ref<any>(null)
const memberStat = ref<any>(null)

View File

@ -32,10 +32,9 @@
</template>
<script lang="ts" setup>
import { reactive, ref, computed } from 'vue'
import { reactive, ref } from 'vue'
import { t } from '@/lang'
import type { FormInstance, FormRules, ElNotification } from 'element-plus'
import { useRoute, useRouter } from 'vue-router'
import { img } from '@/utils/common'
import { getUserInfo,setUserInfo } from '@/api/personal'

View File

@ -4,22 +4,26 @@
<el-card class="box-card !border-none" shadow="never" >
<div class="flex justify-between items-center">
<div class="flex">
<div><img class="w-[44px] h-[44px]" src="@/assets/images/index/site_img.png"/></div>
<div>
<img v-if="statInfo.site_info.icon" class="w-[50px] h-[50px]" :src="img(statInfo.site_info.icon)"/>
<img v-else class="w-[50px] h-[50px]" src="@/assets/images/index/site_img.png"/>
</div>
<div class="ml-[12px]">
<div>
<span class="font-bold text-[18px]">{{ statInfo.site_info.site_name }}</span>
<span class="text-[12px] ml-[12px]">ID:{{ statInfo.site_info.site_code }}</span>
<span class="text-[12px] ml-[12px]">ID:{{ statInfo.site_info.site_id }}</span>
</div>
<div>
<span class="text-[14px] text-[#666] mr-[12px]">{{ t('siteType') }}{{ statInfo.site_info.group_name }}</span>
<span class="text-[10px] py-[3px] px-[10px] bg-[#E6EFFF] text-[#2D5FFF] rounded-[3px]">{{ statInfo.site_info.status_name }}</span>
<span v-if="statInfo.site_info.status == 1" class="text-[10px] py-[3px] px-[10px] bg-[#E6EFFF] text-[#2D5FFF] rounded-[3px]">{{ statInfo.site_info.status_name }}</span>
<span v-else class="text-[10px] py-[3px] px-[10px] bg-[#FFE6E9] text-[#FF2D2D] rounded-[3px]">{{ statInfo.site_info.status_name }}</span>
</div>
</div>
</div>
<div class="flex">
<div>
<div><span class="text-[14px] text-[#666]">{{ t('periodTime') }}{{ statInfo.site_info.create_time ? statInfo.site_info.create_time.split(' ')[0] : '' }} / {{ statInfo.site_info.expire_time ? statInfo.site_info.expire_time.split(' ')[0] : '' }}</span></div>
<div class="w-[300px] h-[12px] bg-[#E6EFFF] rounded-[999px] mt-1">
<div class="w-[225px] h-[12px] bg-[#E6EFFF] rounded-[999px] mt-1">
<div class="bg-primary site-date rounded-[999px] h-[12px]" :style="{width: statInfo.site_info.mix}"></div>
</div>
</div>
@ -29,7 +33,7 @@
</div>
</div>
</div>
<div class="mt-[60px]">
<div class="mt-[60px]" v-if="!loading">
<div class="card-header flex justify-between border-b-[1px] border-[#EBEBEC] pb-[15px]">
<span class="text-[18px]">{{t('appTemplate')}}</span>
<div @click="optionModel" v-if="!edit_menu" class="cursor-pointer">
@ -39,25 +43,31 @@
<el-button type="primary" @click="primary">{{ t('complete') }}</el-button>
</div>
</div>
<div class="flex flex-wrap" >
<div class="flex flex-wrap">
<div class="flex flex-wrap" ref="shortcutModel" v-if="edit_menu">
<div v-for="(items, index) in shortcut_menu" :style="{backgroundColor : items.bg_color}" :id="items.id" class="design-field w-[180px] h-[120px] relative mt-[30px] rounded-[5px] mr-[30px] cursor-pointer">
<div v-for="(items, index) in shortcut_menu" :style="{backgroundColor : items.bg_color}" :key="items.id" class="design-field w-[180px] h-[120px] relative mt-[30px] rounded-[5px] mr-[30px] cursor-pointer">
<div class="flex items-center h-[88px]" @click="editModel(items)">
<img class="ml-[24px] w-[40px]" :src="img(items.img)"/>
<!-- <img class="ml-[24px] w-[40px]" :src="img(items.img)"/> -->
<div class="ml-[24px] w-[40px]">
<icon :name="items.img" size="40px" color="#fff"></icon>
</div>
<span class="text-item text-[16px] text-[#fff] ml-[12px] max-w-[120px]">{{ items.name }}</span>
</div>
<div class="item-bottom h-[32px] leading-[32px] text-center" @click="editModel(items)">
<span class="text-item text-[12px] text-[#fff] max-w-[150px]">{{ items.desc }}</span>
</div>
<div class="delete-item absolute w-[20px] h-[20px] rounded-[999px] overflow-hidden" v-if="edit_menu" @click="remowMenu(items)">
<div class="delete-item absolute w-[20px] h-[20px] rounded-[999px] overflow-hidden" v-if="edit_menu" @click="removeMenu(items)">
<img class="w-[20px] h-[20px]" src="@/assets/images/index/del_model.png"/>
</div>
</div>
</div>
<div v-else class="flex flex-wrap">
<div v-for="(items, index) in shortcut_menu" :style="{backgroundColor : items.bg_color}" class="design-field w-[180px] h-[120px] relative mt-[30px] rounded-[5px] overflow-hidden mr-[30px] cursor-pointer">
<div v-for="(items, index) in shortcut_menu" :style="{backgroundColor : items.bg_color}" class="w-[180px] h-[120px] relative mt-[30px] rounded-[5px] overflow-hidden mr-[30px] cursor-pointer">
<div class="flex items-center h-[88px]" @click="toLink(items.router_path)">
<img class="ml-[24px] w-[40px]" :src="img(items.img)"/>
<!-- <img class="" :src="img(items.img)"/> -->
<div class="ml-[24px] w-[40px]">
<icon :name="items.img" size="40px" color="#fff"></icon>
</div>
<span class="text-item text-[16px] text-[#fff] ml-[12px] max-w-[120px]">{{ items.name }}</span>
</div>
<div class="item-bottom h-[32px] leading-[32px] text-center" @click="toLink(items.router_path)">
@ -65,12 +75,12 @@
</div>
</div>
</div>
<div v-if="edit_menu" class="w-[180px] h-[120px] mt-[30px] rounded-[5px] overflow-hidden border-dashed border-[1px] border-[#D0D7D9] cursor-pointer" @click="showFromMunu">
<div v-if="edit_menu" class="w-[180px] h-[120px] mt-[30px] rounded-[5px] overflow-hidden border-dashed border-[1px] border-[#D0D7D9] cursor-pointer" @click="showFromMenu">
<div class="w-[40px] mx-auto mt-[20px]"><img class="w-[40px]" src="@/assets/images/index/add_menu.png" /></div>
<p class="text-center mt-[5px] text-[20px]">{{ t('addMenu') }}</p>
</div>
<div v-if="shortcut_menu.length <= 0 && !edit_menu" class="flex w-full justify-center items-center min-w-[1000px] min-h-[400px]">
<div>
<div v-if="!loading">
<img src="@/assets/images/empty.png"/>
<p class="text-center text-gray-400">{{ t('emptyMenu') }}</p>
</div>
@ -80,17 +90,26 @@
</el-card>
</div>
<el-dialog v-model="shortcutMenu" :title="t('addShortcutMenu')" width="500px" :destroy-on-close="true">
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"
v-loading="loading">
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
<el-form-item :label="t('path')" prop="router_path">
<el-input v-model="formData.router_path" clearable class="w-[245px]" placeholder="https://"/>
<el-button class="model-btn ml-[10px] text-[14px]" type="primary" plain @click="showMenu = true">{{ t('selectModel') }}</el-button>
<el-form-item :label="t('menuName')" prop="name">
<el-input v-model="formData.name" clearable class="w-[245px]" :placeholder="t('menuNamePlaceholder')" />
</el-form-item>
<el-form-item :label="t('menuName')" prop="name">
<el-input v-model="formData.name" clearable class="w-[245px]" :placeholder="t('menuNamePlaceholder')" />
</el-form-item>
<el-form-item :label="t('path')" prop="router_path">
<div class="w-[245px]">
<el-input v-if="!model_show" v-model="formData.router_path" clearable class="w-[245px]" placeholder="https://"/>
<div v-else>
<span class="bg-primary py-[5px] px-[10px] text-[#fff] relative rounded-[3px]">
{{ formData.link_name }}
<span class="absolute top-[-5px] right-[-5px] cursor-pointer" @click="deleteMenu">
<img class="w-[15px] h-[15px]" src="@/assets/images/index/del_model.png"/>
</span>
</span>
</div>
</div>
<el-button class="model-btn ml-[10px] text-[14px]" type="primary" @click="showMenu = true">{{ t('selectModel') }}</el-button>
</el-form-item>
<el-form-item :label="t('menuBgColor')" prop="bg_color">
<div class="flex items-center">
@ -118,21 +137,13 @@
<el-color-picker v-model="formData.bg_color" show-alpha />
</div>
</el-form-item>
<!-- <el-form-item :label="t('shortcutLink')" prop="path">
<div>
<span v-if='formData.router_path' class="py-[8px] px-[15px] bg-[#E6EFFF] text-[12px] max-w-[200px] overflow-hidden">{{ formData.link_name ? formData.link_name : formData.router_path }}</span>
<el-button text type="primary" @click="showMenu = true" >{{ t('select') }}</el-button>
<el-button text type="primary" @click="customPath = true">{{ t('custom') }}</el-button>
</div>
</el-form-item> -->
<el-form-item :label="t('menuImg')" prop="icon">
<upload-image v-model="formData.img" :limit="1" />
<select-icon v-model="formData.img" />
</el-form-item>
<el-form-item :label="t('menuDesc')">
<el-input v-model="formData.desc" :placeholder="t('descPlaceholder')" clearable class="w-[245px] bg-[#F2F4F6]" />
<el-input v-model="formData.desc" :placeholder="t('descPlaceholder')" clearable class="w-[245px]" />
</el-form-item>
</el-form>
@ -179,10 +190,11 @@
</template>
<script lang="ts" setup>
import { reactive, ref, computed, onMounted } from 'vue'
import { reactive, ref, computed, nextTick } from 'vue'
import { t } from '@/lang'
import { getSiteStatInfo } from '@/api/stat'
import { getService, getShortcutMenu, setShortcutMenu, getAuthMenu } from '@/api/sys'
import { range } from 'lodash-es'
import { img } from '@/utils/common'
import Sortable, { SortableEvent } from 'sortablejs'
import { useRouter } from 'vue-router'
@ -198,7 +210,6 @@ const loading = ref(true)
let statInfo = ref({'today_data':{},system:{},version:{},about:[],visit_stat:{},member_stat:{},site_info:{},total_data:{}})
const getStatInfoFn = async (id: number = 0) => {
statInfo.value = await (await getSiteStatInfo()).data
loading.value = false;
}
getStatInfoFn()
@ -236,7 +247,7 @@ const formRules = computed(() => {
icon: [
{ required: true, validator: iconPass, trigger: 'blur' }
],
path: [
router_path: [
{ required: true, validator: pathPass, trigger: 'blur' },
]
}
@ -262,11 +273,11 @@ const showMenu = ref(false)
const shortcut_menu = ref([]);
const menu_list = ref()
const is_remove = ref(false)
const model_show = ref(false)
const checkMenu = () => {
getShortcutMenu().then(res=>{
if(res.data){
shortcut_menu.value = res.data
}
shortcut_menu.value = res.data
loading.value = false;
})
}
checkMenu()
@ -282,25 +293,32 @@ const addShortcut = async (formEl: FormInstance | undefined) => {
let time = parseInt(new Date().getTime() / 1000) + '';
let num = Math.floor(Math.random() * (999 - 1) ) + 1;
//
//
if(formData.id > 0){
for(let i in data){
if(data[i].id == formData.id){
data.splice(i, 1)
data[i].name = formData.name,
data[i].bg_color = formData.bg_color,
data[i].img = formData.img,
data[i].desc = formData.desc,
data[i].link_name = formData.link_name,
data[i].router_path = formData.router_path,
data[i].menu_key = formData.menu_key
}
}
}else{
data.push({
id: formData.id > 0 ? formData.id : time+num,
name: formData.name,
bg_color: formData.bg_color,
img: formData.img,
desc: formData.desc,
link_name: formData.link_name,
router_path: formData.router_path,
menu_key: formData.menu_key
})
}
data.push({
id: formData.id > 0 ? formData.id : time+num,
name: formData.name,
bg_color: formData.bg_color,
img: formData.img,
desc: formData.desc,
link_name: formData.link_name,
router_path: formData.path,
menu_key: formData.menu_key
})
setShortcutMenu({
menu: data
}).then(() =>{
@ -321,9 +339,12 @@ const editModel = (item) => {
formData.link_name = item.link_name,
formData.router_path = item.router_path,
formData.menu_key = item.menu_key
if(item.menu_key){
model_show.value = true
}
}
const remowMenu = (item) => {
const removeMenu = (item) => {
is_remove.value = true
let menu_arr = shortcut_menu.value;
for(let i in menu_arr){
@ -337,13 +358,13 @@ const remowMenu = (item) => {
const primary = () => {
edit_menu.value = false;
if(!is_remove.value) return
if(new_model_arr.value.length > 0) shortcut_menu.value = new_model_arr.value;
setShortcutMenu({
menu: shortcut_menu.value
}).then(() =>{})
}
const showFromMunu = () =>{
const showFromMenu = () =>{
shortcutMenu.value = true
model_show.value = false
formData.name = ''
formData.bg_color = ''
formData.img = ''
@ -363,73 +384,35 @@ const selectMenu = (item) => {
formData.router_path = item.router_path
formData.menu_key = item.menu_key
showMenu.value = false
model_show.value = true
}
const shortcutModel = ref()
const new_model_arr = ref([])
interface SortableEvt extends SortableEvent {
originalEvent?: DragEvent
}
const deleteMenu = () => {
model_show.value = false
formData.link_name = ''
formData.router_path = ''
formData.menu_key = ''
}
const optionModel = () =>{
edit_menu.value = true
setTimeout(() => {
const sortable = Sortable.create(shortcutModel.value, {
group: {
name: 'design-field',
pull: 'clone',
put: false
},
ghostClass: '.design-field',
animation: 200,
onAdd: (evt) => {
console.log("1111")
console.log(evt)
},
onEnd: (evt) => {
let new_data = [];
// evt.oldIndex
// evt.newIndex
// console.log(evt.oldIndex+"")
// console.log(evt.newIndex+"")
if(new_model_arr.value.length > 0){
let k = 0;
let newIndex = evt.newIndex;
if(evt.oldIndex < evt.newIndex) newIndex = evt.newIndex + 1; //
for(k; k < newIndex; k ++){
if(k != evt.oldIndex){
new_data.push(new_model_arr.value[k])
}
}
new_data.push(new_model_arr.value[evt.oldIndex])
let i = 0;
if(evt.newIndex > 0 && evt.oldIndex > evt.newIndex) i = i+1
if(evt.oldIndex < evt.newIndex) i = evt.newIndex + 1; //
for(i; i < new_model_arr.value.length; i ++){
if(i != evt.oldIndex){
new_data.push(new_model_arr.value[i])
}
}
}else{
let k2 = 0;
let newIndex = evt.newIndex;
if(evt.oldIndex < evt.newIndex) newIndex = evt.newIndex + 1; //
for(k2; k2 < newIndex; k2 ++){
if(k2 != evt.oldIndex){
new_data.push(shortcut_menu.value[k2])
}
}
new_data.push(shortcut_menu.value[evt.oldIndex])
let i2 = 0;
if(evt.newIndex > 0 && evt.oldIndex > evt.newIndex) i2 = i2+1
if(evt.oldIndex < evt.newIndex) i2 = evt.newIndex + 1; //
for( i2; i2 < shortcut_menu.value.length; i2 ++){
if(i2 != evt.oldIndex){
new_data.push(shortcut_menu.value[i2])
}
}
}
new_model_arr.value = new_data;
is_remove.value = true;
let arr = shortcut_menu.value[evt.oldIndex!];
shortcut_menu.value.splice(evt.oldIndex!, 1)
shortcut_menu.value.splice(evt.newIndex!, 0, arr)
nextTick(() => {
sortable.sort(range(shortcut_menu.value.length).map((value) => value.toString()))
is_remove.value = true;
})
}
})
}, 500)
@ -450,7 +433,10 @@ const optionModel = () =>{
background-color: rgba(0, 0, 0, 0.10);
}
.bottom-back {
background-color:rgba(255, 255, 255, 0)
background-color:rgba(255, 255, 255, 0);
&:hover {
background-color: var(--el-color-primary);
}
}
.delete-item {
top: -8px;

View File

@ -62,9 +62,7 @@
<div class="statistic-footer">
<div class="footer-item text-[14px] text-[#333333]">
<span>{{t('accumulative')}}</span>
<span class="green ml-1">
{{ statInfo.total_data.total_order_count }}
</span>
<span class="green ml-1">{{ statInfo.total_data.total_order_count }}</span>
</div>
</div>
</el-col>
@ -226,11 +224,11 @@
</template>
<script lang="ts" setup>
import { reactive, ref,onMounted } from 'vue'
import { reactive, ref } from 'vue'
import { t } from '@/lang'
import { getSiteStatInfo } from '@/api/stat'
import { getService } from '@/api/sys'
import { ElMessage, FormRules, ElMessageBox } from 'element-plus'
import { ElMessage } from 'element-plus'
import * as echarts from 'echarts'
import { img } from '@/utils/common'
import { useRouter } from 'vue-router'

View File

@ -1,8 +1,8 @@
<template>
<el-container :class="['w-full h-screen bg-page', { 'login-wrap': loginType == 'admin' }, { 'site-login-wrap': loginType == 'site' }]">
<el-container :class="['w-full h-screen bg-page', { 'login-wrap': loginType == 'admin' } ,{ 'site-login-wrap': loginType == 'site' }]">
<!-- 平台端登录 -->
<el-main class="login-main items-center justify-center" v-if="!imgLoading && loginType == 'admin'">
<div class="flex rounded-2xl overflow-hidden">
<div class="flex rounded-2xl overflow-hidden">
<div class="login-main-left w-[450px] flex flex-wrap justify-center">
<el-image v-if="loginConfig.bg" class="w-[450px] h-[400px]" :src="img(loginConfig.bg)" fit="cover" />
<img v-else src="@/assets/images/login/login_index_left.png" alt="">
@ -38,49 +38,45 @@
</el-main>
<!-- 站点端登录 -->
<el-main class="login-main items-center justify-evenly" v-else-if="!imgLoading && loginType == 'site'">
<div>
<el-row class="items-end mb-[20px] h-[40px] w-[360px]">
<el-col :span="8">
<img class="max-h-[40px]" :src="img(webSite.logo)" alt="" v-if="webSite.logo">
<img src="@/assets/images/site_login.png" alt="" v-else>
</el-col>
<el-col :span="12" class="ml-[20px] text-[18px]">
<div class="admin_name" v-if="webSite.site_name">{{ webSite.site_name }}</div>
<div class="admin_name" v-else>{{ t('manageAdminFramework') }}</div>
</el-col>
</el-row>
<div class="login flex flex-col w-[360px] p-[40px] rounded-md rounded-[10px]">
<h3 class="text-center text-3xl mb-[30px]">{{ t('siteLogin') }}</h3>
<el-form :model="form" ref="formRef" :rules="formRules">
<el-form-item prop="username">
<el-input v-model="form.username" @keyup.enter="handleLogin(formRef)" class="w-50 m-1 h-[40px]" :placeholder="t('userPlaceholder')">
<template #prefix>
<icon name="element-User" />
</template>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input type="password" v-model="form.password" @keyup.enter="handleLogin(formRef)" :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>
<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>
<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">
<img v-if="loginConfig.site_bg" class="hidden h-[100%] lg:block" :src="img(loginConfig.site_bg)"/>
<img v-else class="hidden h-[100%] lg:block" src="@/assets/images/site_login_bg.png"/>
<div class="w-[100%] bg-[#F8FAFF] flex justify-center items-center absolute right-0 top-0 h-screen lg:w-[60%]">
<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="form.username" @keyup.enter="handleLogin(formRef)" class="w-50 m-1 h-[40px]" :placeholder="t('userPlaceholder')">
<template #prefix>
<icon name="element-User" />
</template>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input type="password" v-model="form.password" @keyup.enter="handleLogin(formRef)" :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>
<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>
<!-- <img class="w-[15%] max-w-[50px] absolute top-0 right-0" src="@/assets/images/login/site_code.png"/> -->
</div>
</div>
</div>
</el-main>
<!-- 验证组件 -->
<verify @success="success" :mode="pop" captchaType="blockPuzzle" :imgSize="{ width: '330px', height: '155px' }" ref="verifyRef"></verify>
<el-footer></el-footer>
<!-- <el-footer></el-footer> -->
</el-container>
</template>
@ -181,11 +177,20 @@ const loginFn = (data = {}) => {
background-repeat: no-repeat;
background-size: cover;
}
.login-site-main {
padding: 0 !important;
}
.site-warp {
background-image: url("@/assets/images/login/site_bg.png");
background-color: #fff;
background-repeat: no-repeat;
background-size: 100% 100%;
}
.site-login-wrap {
background-image: url('@/assets/images/back_login.jpg');
background-repeat: no-repeat;
background-size: cover;
// background-image: url('@/assets/images/back_login.jpg');
// background-repeat: no-repeat;
// background-size: cover;
}
.input-with-select .el-input-group__prepend {

View File

@ -2,7 +2,7 @@
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center mb-[5px]">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
</div>
<el-card class="box-card !border-none base-bg !px-[35px]" shadow="never">
<el-row class="flex">
@ -131,7 +131,7 @@
</template>
<script lang="ts" setup>
import { reactive, ref, watch } from 'vue'
import { reactive, ref } from 'vue'
import { t } from '@/lang'
import {
getBalanceList,
@ -145,6 +145,7 @@ import { FormInstance } from 'element-plus'
import { img } from '@/utils/common'
import balanceInfo from '@/views/member/components/member-balance-info.vue'
import { useRoute,useRouter } from 'vue-router'
const route = useRoute()
const member_id: number = parseInt(route.query.id || 0)
const pageName = route.meta.title;

View File

@ -2,7 +2,7 @@
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center mb-[5px]">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
</div>
<el-card class="box-card !border-none base-bg !px-[35px]" shadow="never">
<el-row class="flex">
@ -52,8 +52,7 @@
<el-card class="box-card !border-none mb-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="memberAccountLogTableData.searchParam" ref="searchFormRef">
<el-form-item :label="t('memberInfo')" prop="keywords">
<el-input v-model="memberAccountLogTableData.searchParam.keywords" class="w-[240px]"
:placeholder="t('memberInfoPlaceholder')" />
<el-input v-model="memberAccountLogTableData.searchParam.keywords" class="w-[240px]" :placeholder="t('memberInfoPlaceholder')" />
</el-form-item>
<el-form-item :label="t('fromType')" prop="from_type">
<el-select v-model="memberAccountLogTableData.searchParam.from_type" clearable :placeholder="t('fromTypePlaceholder')" class="input-width">
@ -137,13 +136,14 @@
</template>
<script lang="ts" setup>
import { reactive, ref, watch } from 'vue'
import { reactive, ref } from 'vue'
import { t } from '@/lang'
import { FormInstance } from 'element-plus'
import { getChangeTypeList,getCommissionList,getCommissionSum } from '@/api/member'
import { img } from '@/utils/common'
import moneyInfo from '@/views/member/components/member-commission-info.vue'
import { useRouter,useRoute } from 'vue-router'
const route = useRoute()
const member_id: number = parseInt(route.query.id || 0)
const pageName = route.meta.title;

View File

@ -1,7 +1,6 @@
<template>
<el-dialog v-model="showDialog" :title="popTitle" width="500px" :destroy-on-close="true">
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"
v-loading="loading">
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
<el-form-item :label="t('memberNo')" prop="member_no">
<el-input v-model="formData.member_no" clearable maxlength="20" :placeholder="t('memberNoPlaceholder')" class="input-width" />
@ -34,7 +33,7 @@
</template>
<script lang="ts" setup>
import { ref, reactive, computed, watch } from 'vue'
import { ref, reactive, computed } from 'vue'
import { t } from '@/lang'
import type { FormInstance } from 'element-plus'
import { addMember, getMemberList, getMemberNo } from '@/api/member'
@ -81,6 +80,7 @@ const formRules = computed(() => {
]
}
})
//
const mobileVerify = (rule: any, value: any, callback: any) => {
if (value && !/^1[3-9]\d{9}$/.test(value)) {

View File

@ -1,6 +1,5 @@
<template>
<el-dialog v-model="showDialog" :title="popTitle" width="500px"
:destroy-on-close="true">
<el-dialog v-model="showDialog" :title="popTitle" width="500px" :destroy-on-close="true">
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
<el-form-item :label="t('labelName')" prop="label_name">
<el-input v-model="formData.label_name" clearable :placeholder="t('labelNamePlaceholder')" class="input-width" />

View File

@ -13,7 +13,7 @@
</el-form-item>
<el-form-item :label="t('sex')" v-if="type == 'sex'">
<el-select v-model="saveData.sex" clearable :placeholder="t('sexPlaceholder')" class="input-width">
<el-option :label="item['name']" :value="item['id']" v-for="item in sexSeleteData" />
<el-option :label="item['name']" :value="item['id']" v-for="item in sexSelectData" />
</el-select>
</el-form-item>
<el-form-item :label="t('memberLabel')" v-if="type == 'member_label'">
@ -33,7 +33,7 @@
</template>
<script lang="ts" setup>
import { ref, reactive, computed } from 'vue'
import { ref, reactive } from 'vue'
import { t } from '@/lang'
import type { FormInstance } from 'element-plus'
import { editMemberDetail, getMemberLabelAll } from '@/api/member'
@ -45,7 +45,7 @@ let title = ref('')
let memberId = ref('')
let showDialog = ref(false)
const loading = ref(false)
let sexSeleteData = ref([
const sexSelectData = ref([
{
id: 0,
name: t('secrecySex')
@ -67,7 +67,6 @@ const getMemberLabelAllFn = async () => {
getMemberLabelAllFn();
/**
* 表单数据
*/

View File

@ -1,7 +1,6 @@
<template>
<el-dialog v-model="showDialog" :title="t('balanceInfo')" 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 :model="formData" label-width="110px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
<el-form-item :label="t('headimg')" >
<div class="flex items-center">
@ -18,7 +17,6 @@
<div class="input-width"> {{ formData.member.nickname }} </div>
</el-form-item>
<el-form-item :label="t('mobile')" >
<div class="input-width"> {{ formData.member.mobile }} </div>
</el-form-item>

View File

@ -1,7 +1,6 @@
<template>
<el-dialog v-model="showDialog" :title="t('moneyInfo')" 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 :model="formData" label-width="110px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
<el-form-item :label="t('headimg')" >
<div class="flex items-center">

View File

@ -4,10 +4,8 @@
<el-form-item :label="t('headimg')" >
<div class="flex items-center">
<img class="w-[50px] h-[50px] mr-[10px]" v-if="formData.headimg" :src="img(formData.headimg)" alt="" >
<img class="w-[50px] h-[50px] mr-[10px]" v-else src="@/assets/images/default_headimg.png" alt="" >
</div>
</el-form-item>
@ -15,7 +13,6 @@
<div class="input-width"> {{ formData.nickname }} </div>
</el-form-item>
<el-form-item :label="t('mobile')" >
<div class="input-width"> {{ formData.mobile }} </div>
</el-form-item>

View File

@ -109,7 +109,6 @@ const formRules = computed(() => {
})
}
const emit = defineEmits(['complete'])
const setFormData = async (row: any = null) => {

View File

@ -4,10 +4,8 @@
<el-form-item :label="t('headimg')" >
<div class="flex items-center">
<img class="w-[50px] h-[50px] mr-[10px]" v-if="formData.member.headimg" :src="img(formData.member.headimg)" alt="" >
<img class="w-[50px] h-[50px] mr-[10px]" v-else src="@/assets/images/default_headimg.png" alt="" >
</div>
</el-form-item>

View File

@ -2,7 +2,7 @@
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
<el-button type="primary" @click="addEvent">{{ t('addMemberLabel') }}</el-button>
</div>
@ -57,6 +57,7 @@ import { getMemberLabelList, deleteMemberLabel } from '@/api/member'
import { ElMessageBox, FormInstance } from 'element-plus'
import EditMemberLabel from '@/views/member/components/edit-label.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
@ -73,8 +74,6 @@ let memberLabelTableData = reactive({
const searchFormRef = ref<FormInstance>()
const resetForm = (formEl: FormInstance | undefined)=>{
if (!formEl) return
formEl.resetFields();

View File

@ -3,7 +3,7 @@
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
<el-button type="primary" @click="addEvent">{{ t('addMember') }}</el-button>
</div>
@ -14,24 +14,20 @@
</el-form-item>
<el-form-item :label="t('registerChannel')" prop="register_channel">
<el-select v-model="memberTableData.searchParam.register_channel" clearable
:placeholder="t('channelPlaceholder')" class="input-width">
<el-select v-model="memberTableData.searchParam.register_channel" clearable :placeholder="t('channelPlaceholder')" class="input-width">
<el-option :label="t('selectPlaceholder')" value="" />
<el-option :label="item" :value="key" v-for="(item, key) in channelList" />
</el-select>
</el-form-item>
<el-form-item :label="t('memberLabel')" prop="member_label">
<el-select v-model="memberTableData.searchParam.member_label" collapse-tags clearable
:placeholder="t('memberLabelPlaceholder')" class="input-width">
<el-select v-model="memberTableData.searchParam.member_label" collapse-tags clearable :placeholder="t('memberLabelPlaceholder')" class="input-width">
<el-option :label="t('selectPlaceholder')" value=""/>
<el-option :label="item['label_name']" :value="item['label_id']" v-for="item in labelSelectData" />
</el-select>
</el-form-item>
<el-form-item :label="t('createTime')" prop="create_time">
<el-date-picker v-model="memberTableData.searchParam.create_time" type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss" :start-placeholder="t('startDate')"
:end-placeholder="t('endDate')" />
<el-date-picker v-model="memberTableData.searchParam.create_time" type="datetimerange" value-format="YYYY-MM-DD HH:mm:ss" :start-placeholder="t('startDate')" :end-placeholder="t('endDate')" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadMemberList()">{{ t('search') }}</el-button>
@ -118,7 +114,7 @@
</template>
<script lang="ts" setup>
import { reactive, ref, computed } from 'vue'
import { reactive, ref } from 'vue'
import { t } from '@/lang'
import { img } from '@/utils/common'
import { addMember, getRegisterChannelType, getMemberList, getMemberLabelAll, editMemberStatus,deleteMember } from '@/api/member'
@ -127,6 +123,7 @@ import { useRouter } from 'vue-router'
import AddMember from '@/views/member/components/add-member.vue'
import EditMember from '@/views/member/components/edit-member.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const memberTableData = reactive({

View File

@ -171,8 +171,7 @@
<div class="flex items-center mt-[15px]">
<span class="text-[14px] w-[130px] text-right mr-[20px]">{{ t('memberLabel') }}</span>
<span class="text-[14px] text-[#666666]">
{{ formData.member_label_name.toString() || t('notAvailable') }}<el-icon
@click="editMemberInfo('member_label')" class="-bottom-[2px] -right-[4px] cursor-pointer">
{{ formData.member_label_name.toString() || t('notAvailable') }}<el-icon @click="editMemberInfo('member_label')" class="-bottom-[2px] -right-[4px] cursor-pointer">
<EditPen color="#273CE2" />
</el-icon>
</span>
@ -180,8 +179,7 @@
<div class="flex items-center mt-[15px]">
<span class="text-[14px] w-[130px] text-right mr-[20px]">{{ t('birthday') }}</span>
<span class="text-[14px] text-[#666666]">
{{ formData.birthday || t('notAvailable') }}<el-icon @click="editMemberInfo('birthday')"
class="-bottom-[2px] -right-[4px] cursor-pointer">
{{ formData.birthday || t('notAvailable') }}<el-icon @click="editMemberInfo('birthday')" class="-bottom-[2px] -right-[4px] cursor-pointer">
<EditPen color="#273CE2" />
</el-icon>
</span>
@ -189,8 +187,7 @@
<div class="flex items-center mt-[15px]">
<span class="text-[14px] w-[130px] text-right mr-[20px]">{{ t('sex') }}</span>
<span class="text-[14px] text-[#666666]">
{{ formData.sex == 1 && t('manSex') || formData.sex == 2 && t('girlSex') || t('secrecySex') }}<el-icon
@click="editMemberInfo('sex')" class="-bottom-[2px] -right-[4px] cursor-pointer">
{{ formData.sex == 1 && t('manSex') || formData.sex == 2 && t('girlSex') || t('secrecySex') }}<el-icon @click="editMemberInfo('sex')" class="-bottom-[2px] -right-[4px] cursor-pointer">
<EditPen color="#273CE2" />
</el-icon>
</span>

View File

@ -2,7 +2,7 @@
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center mb-[5px]">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20x]">{{pageName}}</span>
</div>
<el-card class="box-card !border-none base-bg !px-[35px]" shadow="never">
<el-row class="flex">
@ -116,13 +116,14 @@
</template>
<script lang="ts" setup>
import { reactive, ref, watch } from 'vue'
import { reactive, ref } from 'vue'
import { t } from '@/lang'
import { getChangeTypeList,getPointList,getPointSum } from '@/api/member'
import { ElMessageBox, FormInstance } from 'element-plus'
import { img } from '@/utils/common'
import pointInfo from '@/views/member/components/member-point-info.vue'
import { useRouter,useRoute } from 'vue-router'
const route = useRoute()
const member_id: number = parseInt(route.query.id || 0)
const pageName = route.meta.title;

View File

@ -64,7 +64,7 @@
</template>
<script lang="ts" setup>
import { ref, watch } from 'vue'
import { ref } from 'vue'
import { t } from '@/lang'
import type { FormInstance } from 'element-plus'
import { getRechargeOrderInfo } from '@/api/order'

View File

@ -2,7 +2,7 @@
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center mb-[5px]">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
</div>
<el-card class="box-card !border-none table-search-wra base-bg !px-[35px]" shadow="never">
@ -46,9 +46,7 @@
</el-form-item>
<el-form-item :label="t('createTime')" prop="create_time">
<el-date-picker v-model="orderTableData.searchParam.create_time" type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss" :start-placeholder="t('startDate')"
:end-placeholder="t('endDate')" />
<el-date-picker v-model="orderTableData.searchParam.create_time" type="datetimerange" value-format="YYYY-MM-DD HH:mm:ss" :start-placeholder="t('startDate')" :end-placeholder="t('endDate')" />
</el-form-item>
<el-form-item :label="t('rechargeMoney')">
@ -64,9 +62,7 @@
</el-form-item>
<el-form-item :label="t('payTime')">
<el-date-picker v-model="orderTableData.searchParam.pay_time" type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss" :start-placeholder="t('startDate')"
:end-placeholder="t('endDate')" />
<el-date-picker v-model="orderTableData.searchParam.pay_time" type="datetimerange" value-format="YYYY-MM-DD HH:mm:ss" :start-placeholder="t('startDate')" :end-placeholder="t('endDate')" />
</el-form-item>
<el-form-item>
@ -85,7 +81,7 @@
<el-table-column :show-overflow-tooltip="true" :label="t('member')" align="left" min-width="140">
<template #default="{ row }">
<div class="flex items-center cursor-pointer " @click="toMember(row.member.member_id)">
<img class="w-[50px] h-[50px] mr-[10px]" v-if="row.headimg" :src="img(row.member.headimg)" alt="">
<img class="w-[50px] h-[50px] mr-[10px]" v-if="row.member.headimg" :src="img(row.member.headimg)" alt="">
<img class="w-[50px] h-[50px] mr-[10px]" v-else src="@/assets/images/default_headimg.png" alt="">
<div class="flex flex flex-col">
<span class="">{{ row.member.nickname || '' }}</span>
@ -161,6 +157,7 @@ import { getRechargeOrderStatusList, getRechargeOrderList, rechargeRefund, getRe
import { getChannelType } from '@/api/sys'
import { useRouter, useRoute } from 'vue-router'
import { AnyObject } from '@/types/global'
import type { FormInstance } from 'element-plus'
const route = useRoute()
const router = useRouter()

View File

@ -2,7 +2,7 @@
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center mb-[5px]">
<span class="text-[24px]">{{ pageName }}</span>
<span class="text-[20px]">{{ pageName }}</span>
</div>
<el-card class="box-card !border-none table-search-wra base-bg !px-[35px]" shadow="never">
@ -33,16 +33,13 @@
<el-card class="box-card !border-none mb-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="refundTableData.searchParam" ref="searchFormRef">
<el-form-item :label="t('memberInfo')" prop="keywords">
<el-input v-model="refundTableData.searchParam.keywords" class="w-[240px]"
:placeholder="t('memberInfoPlaceholder')" />
<el-input v-model="refundTableData.searchParam.keywords" class="w-[240px]" :placeholder="t('memberInfoPlaceholder')" />
</el-form-item>
<el-form-item :label="t('refundNumber')" prop="refund_no">
<el-input v-model="refundTableData.searchParam.refund_no" class="w-[240px]"
:placeholder="t('refundNumberPlaceholder')" />
<el-input v-model="refundTableData.searchParam.refund_no" class="w-[240px]" :placeholder="t('refundNumberPlaceholder')" />
</el-form-item>
<el-form-item :label="t('orderNumber')" prop="order_no">
<el-input v-model="refundTableData.searchParam.order_no" class="w-[240px]"
:placeholder="t('orderNumberPlaceholder')" />
<el-input v-model="refundTableData.searchParam.order_no" class="w-[240px]" :placeholder="t('orderNumberPlaceholder')" />
</el-form-item>
<el-form-item :label="t('refundStatus')" prop="status">
@ -52,9 +49,7 @@
</el-select>
</el-form-item>
<el-form-item :label="t('refundTime')" prop="create_time">
<el-date-picker v-model="refundTableData.searchParam.create_time" type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss" :start-placeholder="t('startDate')"
:end-placeholder="t('endDate')" />
<el-date-picker v-model="refundTableData.searchParam.create_time" type="datetimerange" value-format="YYYY-MM-DD HH:mm:ss" :start-placeholder="t('startDate')" :end-placeholder="t('endDate')" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadRefundList()">{{ t('search') }}</el-button>
@ -72,10 +67,8 @@
<el-table-column :show-overflow-tooltip="true" :label="t('memberInfo')" align="left" min-width="140">
<template #default="{ row }">
<div class="flex items-center cursor-pointer " @click="toMember(row.member.member_id)">
<img class="w-[50px] h-[50px] mr-[10px]" v-if="row.headimg" :src="img(row.member.headimg)"
alt="">
<img class="w-[50px] h-[50px] mr-[10px]" v-else src="@/assets/images/default_headimg.png"
alt="">
<img class="w-[50px] h-[50px] mr-[10px]" v-if="row.headimg" :src="img(row.member.headimg)" alt="">
<img class="w-[50px] h-[50px] mr-[10px]" v-else src="@/assets/images/default_headimg.png" alt="">
<div class="flex flex flex-col">
<span class="">{{ row.member.nickname || '' }}</span>
<span class="">{{ row.member.mobile || '' }}</span>

View File

@ -1,7 +1,7 @@
<template>
<div class="main-container">
<div class="flex ml-[18px] justify-between items-center mt-[20px]">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
</div>
<el-form :model="formData" label-width="150px" ref="ruleFormRef" :rules="formRules" class="page-form" v-loading="loading">
@ -46,20 +46,20 @@
import { reactive, ref } from 'vue'
import { t } from '@/lang'
import { getConfigLogin, setConfigLogin } from '@/api/sys'
import { ElMessage, FormRules, FormInstance } from 'element-plus'
import { FormRules, FormInstance } from 'element-plus'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title
const loading = ref(true),
ruleFormRef = ref<FormInstance>(),
formData = reactive<Record<string, number | string>>({
is_captcha: 0,
is_site_captcha: 0,
bg: '',
site_bg: ''
});
ruleFormRef = ref<FormInstance>(),
formData = reactive<Record<string, number | string>>({
is_captcha: 0,
is_site_captcha: 0,
bg: '',
site_bg: ''
});
const getFormData = async (id: number = 0) => {
const data = await (await getConfigLogin()).data

View File

@ -2,7 +2,7 @@
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-[24px]">{{pageName}}</span>
<span class="text-[20px]">{{pageName}}</span>
</div>
<div class="mt-[20px]">
<el-table :data="agreementTableData.data" size="large" v-loading="agreementTableData.loading">
@ -35,10 +35,11 @@
</template>
<script lang="ts" setup>
import { reactive, ref, watch } from 'vue'
import { reactive } from 'vue'
import { t } from '@/lang'
import { getAgreementList } from '@/api/sys'
import { useRouter,useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;

Some files were not shown because too many files have changed in this diff Show More