更新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

@ -5,7 +5,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getAddonLocal(params: Record<string, any>) { export function getAddonLocal(params: Record<string, any>) {
return request.get('addon/local', params, { showSuccessMessage: true }) return request.get('addon/local', params, {showSuccessMessage: true})
} }
/** /**
@ -31,7 +31,7 @@ export function installAddon(params: Record<string, any>) {
* @returns * @returns
*/ */
export function uninstallAddon(params: Record<string, any>) { export function uninstallAddon(params: Record<string, any>) {
return request.post(`addon/uninstall/${params.addon}`, params, { showSuccessMessage: true }) return request.post(`addon/uninstall/${params.addon}`, params, {showSuccessMessage: true})
} }
/** /**
@ -40,7 +40,7 @@ export function uninstallAddon(params: Record<string, any>) {
* @returns * @returns
*/ */
export function preInstallCheck(addon: string) { export function preInstallCheck(addon: string) {
return request.get(`addon/install/check/${addon}`, { timeout: 30 * 1000 }) return request.get(`addon/install/check/${addon}`, {timeout: 30 * 1000})
} }
/** /**
@ -55,8 +55,7 @@ export function getAddonInstallTaskState(addon: string, key: string) {
/** /**
* *
* @param params * @param addon
* @returns
*/ */
export function executeInstall(addon: string) { export function executeInstall(addon: string) {
return request.post(`addon/install/execute/${addon}`, {}) return request.post(`addon/install/execute/${addon}`, {})

View File

@ -14,7 +14,7 @@ export function getAliappConfig() {
* @returns * @returns
*/ */
export function setAliappConfig(params: Record<string, any>) { export function setAliappConfig(params: Record<string, any>) {
return request.put('aliapp/config', params, { showSuccessMessage: true }) return request.put('aliapp/config', params, {showSuccessMessage: true})
} }
/** /**

View File

@ -8,7 +8,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getArticleList(params: Record<string, any>) { 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 * @returns
*/ */
export function addArticle(params: Record<string, any>) { 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 * @param params
* @returns
*/ */
export function editArticle(params: Record<string, any>) { 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,8 +43,9 @@ export function editArticle(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteArticle(id: number) { export function deleteArticle(id: number) {
return request.delete(`article/article/${id}`, { showSuccessMessage: true }) return request.delete(`article/article/${id}`, {showSuccessMessage: true})
} }
/***************************************************** 文章分类管理 ****************************************************/ /***************************************************** 文章分类管理 ****************************************************/
/** /**
@ -55,7 +54,7 @@ export function deleteArticle(id: number) {
* @returns * @returns
*/ */
export function getArticleCategoryList(params: Record<string, any>) { export function getArticleCategoryList(params: Record<string, any>) {
return request.get(`article/category`, { params }) return request.get(`article/category`, {params})
} }
@ -70,8 +69,7 @@ export function getArticleCategoryAll(params: Record<string, any>) {
/** /**
* *
* @param id id * @param category_id
* @returns
*/ */
export function getArticleCategoryInfo(category_id: number) { export function getArticleCategoryInfo(category_id: number) {
return request.get(`article/category/${category_id}`); return request.get(`article/category/${category_id}`);
@ -83,7 +81,7 @@ export function getArticleCategoryInfo(category_id: number) {
* @returns * @returns
*/ */
export function addArticleCategory(params: Record<string, any>) { export function addArticleCategory(params: Record<string, any>) {
return request.post('article/category', params, { showSuccessMessage: true }) return request.post('article/category', params, {showSuccessMessage: true})
} }
/** /**
@ -92,14 +90,13 @@ export function addArticleCategory(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editArticleCategory(params: Record<string, any>) { 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 * @param category_id
* @returns
*/ */
export function deleteArticleCategory(category_id: number) { 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

@ -3,10 +3,10 @@ import request from '@/utils/request'
/** /**
* *
* @param params * @param params
* @returns * @param app_type
*/ */
export function login(params: Record<string, any>, app_type: string) { export function login(params: Record<string, any>, app_type: string) {
return request.get(`login/${app_type}`, { params }) return request.get(`login/${app_type}`, {params})
} }
/** /**

View File

@ -14,5 +14,5 @@ export function getH5Config() {
* @returns * @returns
*/ */
export function setH5Config(params: Record<string, any>) { 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

@ -9,7 +9,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getMemberList(params: Record<string, any>) { export function getMemberList(params: Record<string, any>) {
return request.get(`member/member`, { params }) return request.get(`member/member`, {params})
} }
/** /**
@ -35,7 +35,7 @@ export function getMemberNo() {
* @returns * @returns
*/ */
export function addMember(params: Record<string, any>) { export function addMember(params: Record<string, any>) {
return request.post(`member/member`, params, { showSuccessMessage: true }) return request.post(`member/member`, params, {showSuccessMessage: true})
} }
/** /**
@ -58,15 +58,13 @@ export function getRegisterChannelType(params: Record<string, any>) {
/** /**
* *
* @param params * @param member_id
* @returns
*/ */
export function deleteMember(member_id: number) { 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 * @returns
*/ */
export function getMemberLabelList(params: Record<string, any>) { 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 * @returns
*/ */
export function addMemberLabel(params: Record<string, any>) { 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 * @param params
* @returns
*/ */
export function updateMemberLabel(params: Record<string, any>) { 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 * @returns
*/ */
export function deleteMemberLabel(label_id: number) { 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() { export function getMemberLabelAll() {
return request.get(`member/label/all`); return request.get(`member/label/all`);
@ -126,25 +120,20 @@ export function getMemberLabelAll() {
/** /**
* *
* @param id
* @param params * @param params
* @returns
*/ */
export function editMemberDetail(params: Record<string, any>) { 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 * @param change_type
* @returns
*/ */
export function getChangeTypeList(change_type: string) { export function getChangeTypeList(change_type: string) {
return request.get(`member/account/change_type/${change_type}`) return request.get(`member/account/change_type/${change_type}`)
@ -156,73 +145,74 @@ export function getChangeTypeList(change_type: string) {
* @returns * @returns
*/ */
export function getPointList(params: Record<string, any>) { export function getPointList(params: Record<string, any>) {
return request.get(`member/account/point`, { params }) return request.get(`member/account/point`, {params})
} }
/** /**
* *
* @param params * @param params
* @returns * @returns
*/ */
export function getBalanceList(params: Record<string, any>) { export function getBalanceList(params: Record<string, any>) {
return request.get(`member/account/balance`, { params }) return request.get(`member/account/balance`, {params})
} }
/** /**
* *
* @param params * @param params
* @returns * @returns
*/ */
export function getMoneyList(params: Record<string, any>) { export function getMoneyList(params: Record<string, any>) {
return request.get(`member/account/money`, { params }) return request.get(`member/account/money`, {params})
} }
/** /**
* *
* @param params * @param params
* @returns * @returns
*/ */
export function getCommissionList(params: Record<string, any>) { export function getCommissionList(params: Record<string, any>) {
return request.get(`member/account/commission`, { params }) return request.get(`member/account/commission`, {params})
} }
/** /**
* *
* @param params * @param params
* @returns * @returns
*/ */
export function adjustPoint(params: Record<string, any>) { 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 * @param params
* @returns * @returns
*/ */
export function adjustBalance(params: Record<string, any>) { 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() { export function getLoginConfig() {
return request.get(`member/config/login`) return request.get(`member/config/login`)
} }
/** /**
* *
* @param params * @param params
* @returns * @returns
*/ */
export function setLoginConfig(params: Record<string, any>) { 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() { export function getMemberConfig() {
return request.get(`member/config/member`) return request.get(`member/config/member`)
@ -234,14 +224,12 @@ export function getMemberConfig() {
* @returns * @returns
*/ */
export function setMemberConfig(params: Record<string, any>) { 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() { export function getTransfertype() {
return request.get(`member/cash_out/transfertype`) return request.get(`member/cash_out/transfertype`)
@ -254,7 +242,7 @@ export function getTransfertype() {
* @returns * @returns
*/ */
export function getCommissionSum(params: Record<string, any>) { export function getCommissionSum(params: Record<string, any>) {
return request.get(`member/account/sum_commission`, { params }) return request.get(`member/account/sum_commission`, {params})
} }
/** /**
@ -263,7 +251,7 @@ export function getCommissionSum(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getPointSum(params: Record<string, any>) { export function getPointSum(params: Record<string, any>) {
return request.get(`member/account/sum_point`, { params }) return request.get(`member/account/sum_point`, {params})
} }
/** /**
@ -272,13 +260,11 @@ export function getPointSum(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getBalanceSum(params: Record<string, any>) { 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() { export function getBalanceStatus() {
return request.get(`member/account/type`) return request.get(`member/account/type`)
@ -296,19 +282,18 @@ export function getAccountType(params: Record<string, any>) {
/** /**
* *
* @param params
* @returns
*/ */
export function getCashOutConfig() { export function getCashOutConfig() {
return request.get(`member/config/cash_out`) return request.get(`member/config/cash_out`)
} }
/** /**
* *
* @param params * @param params
* @returns * @returns
*/ */
export function setCashOutConfig(params: Record<string, any>) { 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})
} }
/** /**
@ -317,13 +302,12 @@ export function setCashOutConfig(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getCashOutList(params: Record<string, any>) { export function getCashOutList(params: Record<string, any>) {
return request.get(`member/cash_out`, { params }) return request.get(`member/cash_out`, {params})
} }
/** /**
* *
* @param params * @param id
* @returns id
*/ */
export function getCashOutDetail(id: number) { export function getCashOutDetail(id: number) {
return request.get(`member/cash_out/${id}`, {}) return request.get(`member/cash_out/${id}`, {})
@ -331,38 +315,30 @@ export function getCashOutDetail(id: number) {
/** /**
* *
* @param id
* @param params * @param params
* @returns
*/ */
export function memberAudit(params: Record<string, any>) { 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 * @param params
* @returns
*/ */
export function memberTransfer(params: Record<string, any>) { 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 * @param params
* @returns
*/ */
export function editMemberStatus(params: Record<string, any>) { 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() { export function getCashOutStatusList() {
return request.get(`member/cash_out/status`) return request.get(`member/cash_out/status`)

View File

@ -25,7 +25,7 @@ export function getNoticeInfo(key: string) {
* @returns * @returns
*/ */
export function getNoticeLog(params: any) { export function getNoticeLog(params: any) {
return request.get(`notice/log`, { params }) return request.get(`notice/log`, {params})
} }
@ -35,7 +35,7 @@ export function getNoticeLog(params: any) {
* @returns * @returns
*/ */
export function editNoticeStatus(params: Record<string, any>) { 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})
} }
/** /**
@ -44,7 +44,7 @@ export function editNoticeStatus(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editNotice(params: Record<string, any>) { 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})
} }
/** /**
@ -66,19 +66,15 @@ export function getSmsInfo(sms_type: string) {
/** /**
* *
* @param sms_type
* @param params * @param params
* @returns
*/ */
export function editSms(params: Record<string, any>) { 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 * @param params
* @returns
*/ */
export function getSmsLog(params: Record<string, any>) { export function getSmsLog(params: Record<string, any>) {
return request.get(`notice/sms/log`, params) return request.get(`notice/sms/log`, params)

View File

@ -8,7 +8,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getRechargeOrderList(params: Record<string, any>) { 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 * @returns
*/ */
export function getRechargeStat(params: Record<string, any>) { 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 * @returns
*/ */
export function getRechargeRefund(params: Record<string, any>) { 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 * @returns
*/ */
export function rechargeRefund(id: number) { export function rechargeRefund(id: number) {
return request.put(`order/recharge/refund/${id}`, {}, { showSuccessMessage: true }); return request.put(`order/recharge/refund/${id}`, {}, {showSuccessMessage: true});
} }
/** /**
* 退 * 退
* @returns * @returns
*/ */
export function getRechargeRefundStat() { export function getRechargeRefundStat() {

View File

@ -13,6 +13,6 @@ export function getUserInfo(type: string) {
* @returns * @returns
*/ */
export function setUserInfo(params: Record<string, any>) { 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

@ -10,13 +10,12 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getSiteList(params: Record<string, any>) { export function getSiteList(params: Record<string, any>) {
return request.get(`site/site`, { params }) return request.get(`site/site`, {params})
} }
/** /**
* *
* @param id id * @param site_id
* @returns
*/ */
export function getSiteInfo(site_id: number) { export function getSiteInfo(site_id: number) {
return request.get(`site/site/${site_id}`); return request.get(`site/site/${site_id}`);
@ -28,43 +27,35 @@ export function getSiteInfo(site_id: number) {
* @returns * @returns
*/ */
export function addSite(params: Record<string, any>) { 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 * @param params
* @returns
*/ */
export function editSite(params: Record<string, any>) { 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 * @param params
* @returns
*/ */
export function closeSite(params: Record<string, any>) { 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 * @param params
* @returns
*/ */
export function openSite(params: Record<string, any>) { 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() { export function getStatusList() {
return request.get(`site/statuslist`) return request.get(`site/statuslist`)
@ -79,13 +70,12 @@ export function getStatusList() {
* @returns * @returns
*/ */
export function getSiteGroupList(params: Record<string, any>) { export function getSiteGroupList(params: Record<string, any>) {
return request.get(`site/group`, { params }) return request.get(`site/group`, {params})
} }
/** /**
* *
* @param id id * @param site_id
* @returns
*/ */
export function getSiteGroupInfo(site_id: number) { export function getSiteGroupInfo(site_id: number) {
return request.get(`site/group/${site_id}`); return request.get(`site/group/${site_id}`);
@ -97,27 +87,23 @@ export function getSiteGroupInfo(site_id: number) {
* @returns * @returns
*/ */
export function addSiteGroup(params: Record<string, any>) { 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 * @param params
* @returns
*/ */
export function editSiteGroup(params: Record<string, any>) { 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 group_id
* @param params
* @returns
*/ */
export function deleteSiteGroup(group_id: number) { export function deleteSiteGroup(group_id: number) {
return request.delete(`site/group/${group_id}`, { showSuccessMessage: true }); return request.delete(`site/group/${group_id}`, {showSuccessMessage: true});
} }
/** /**
@ -137,13 +123,12 @@ export function getSiteGroupAll(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getUserList(params: Record<string, any>) { export function getUserList(params: Record<string, any>) {
return request.get(`site/user`, { params }) return request.get(`site/user`, {params})
} }
/** /**
* *
* @param id id * @param uid
* @returns
*/ */
export function getUserInfo(uid: number) { export function getUserInfo(uid: number) {
return request.get(`site/user/${uid}`); return request.get(`site/user/${uid}`);
@ -155,17 +140,15 @@ export function getUserInfo(uid: number) {
* @returns * @returns
*/ */
export function addUser(params: Record<string, any>) { 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 * @param params
* @returns
*/ */
export function editUser(params: Record<string, any>) { 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})
} }
/** /**
@ -174,7 +157,7 @@ export function editUser(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteUser(uid: number) { export function deleteUser(uid: number) {
return request.delete(`site/user/${uid}`, { showSuccessMessage: true }) return request.delete(`site/user/${uid}`, {showSuccessMessage: true})
} }
@ -206,17 +189,17 @@ export function unlockUser(uid: number) {
* @returns * @returns
*/ */
export function getLogList(params: Record<string, any>) { export function getLogList(params: Record<string, any>) {
return request.get(`site/log`, { params }) return request.get(`site/log`, {params})
} }
/** /**
* *
* @param params * @param id
* @returns
*/ */
export function getLogInfo(id: number) { export function getLogInfo(id: number) {
return request.get(`site/log/${id}`) return request.get(`site/log/${id}`)
} }
/***************************************************** 账单列表 **************************************************/ /***************************************************** 账单列表 **************************************************/
/** /**
@ -225,13 +208,12 @@ export function getLogInfo(id: number) {
* @returns * @returns
*/ */
export function getAccountList(params: Record<string, any>) { export function getAccountList(params: Record<string, any>) {
return request.get(`site/account`, { params }) return request.get(`site/account`, {params})
} }
/** /**
* *
* @param params * @param id
* @returns
*/ */
export function getAccountInfo(id: number) { export function getAccountInfo(id: number) {
return request.get(`site/account/${id}`) return request.get(`site/account/${id}`)

View File

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

View File

@ -17,6 +17,7 @@ export function getInfo() {
export function getUrl() { export function getUrl() {
return request.get('sys/url') return request.get('sys/url')
} }
/***************************************************** 用户组 ****************************************************/ /***************************************************** 用户组 ****************************************************/
/** /**
@ -24,13 +25,12 @@ export function getUrl() {
* @returns * @returns
*/ */
export function getRoleList(params: Record<string, any>) { export function getRoleList(params: Record<string, any>) {
return request.get('sys/role', { params }) return request.get('sys/role', {params})
} }
/** /**
* *
* @param params * @param roleId
* @returns
*/ */
export function getRoleInfo(roleId: number) { export function getRoleInfo(roleId: number) {
return request.get(`sys/role/${roleId}`) return request.get(`sys/role/${roleId}`)
@ -42,26 +42,23 @@ export function getRoleInfo(roleId: number) {
* @returns * @returns
*/ */
export function addRole(params: Record<string, any>) { 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 * @param params
* @returns
*/ */
export function editRole(params: Record<string, any>) { 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 * @param roleId
* @returns
*/ */
export function deleteRole(roleId: number) { export function deleteRole(roleId: number) {
return request.delete(`sys/role/${roleId}`, { showSuccessMessage: true }) return request.delete(`sys/role/${roleId}`, {showSuccessMessage: true})
} }
/** /**
@ -84,8 +81,7 @@ export function getMenus(type: string) {
/** /**
* *
* @param id * @param menu_key
* @returns
*/ */
export function getMenuInfo(menu_key: string) { export function getMenuInfo(menu_key: string) {
return request.get(`sys/menu/info/${menu_key}`); return request.get(`sys/menu/info/${menu_key}`);
@ -97,26 +93,23 @@ export function getMenuInfo(menu_key: string) {
* @returns * @returns
*/ */
export function addMenu(params: Record<string, any>) { 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 * @param params
* @returns
*/ */
export function editMenu(params: Record<string, any>) { 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 * @param menu_key
* @returns
*/ */
export function deleteMenu(menu_key: string) { export function deleteMenu(menu_key: string) {
return request.delete(`sys/menu/${menu_key}`, { showSuccessMessage: true }) return request.delete(`sys/menu/${menu_key}`, {showSuccessMessage: true})
} }
/***************************************************** 站点菜单 ****************************************************/ /***************************************************** 站点菜单 ****************************************************/
@ -154,7 +147,7 @@ export function getWebConfig() {
* @returns * @returns
*/ */
export function setWebsite(params: Record<string, any>) { 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})
} }
/** /**
@ -179,7 +172,7 @@ export function getService() {
* @returns * @returns
*/ */
export function setCopyright(params: Record<string, any>) { 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})
} }
/** /**
@ -188,7 +181,7 @@ export function setCopyright(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getAttachmentCategoryList(params: Record<string, any>) { export function getAttachmentCategoryList(params: Record<string, any>) {
return request.get(`sys/attachment/category`, { params }) return request.get(`sys/attachment/category`, {params})
} }
/** /**
@ -196,7 +189,7 @@ export function getAttachmentCategoryList(params: Record<string, any>) {
* @param params * @param params
*/ */
export function addAttachmentCategory(params: Record<string, any>) { 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})
} }
/** /**
@ -205,7 +198,7 @@ export function addAttachmentCategory(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editAttachmentCategory(params: Record<string, any>) { 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})
} }
/** /**
@ -214,7 +207,7 @@ export function editAttachmentCategory(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteAttachmentCategory(id: number) { export function deleteAttachmentCategory(id: number) {
return request.delete(`sys/attachment/category/${id}`, { showSuccessMessage: true }) return request.delete(`sys/attachment/category/${id}`, {showSuccessMessage: true})
} }
/** /**
@ -223,7 +216,7 @@ export function deleteAttachmentCategory(id: number) {
* @returns * @returns
*/ */
export function getAttachmentList(params: Record<string, any>) { export function getAttachmentList(params: Record<string, any>) {
return request.get(`sys/attachment`, { params }) return request.get(`sys/attachment`, {params})
} }
/** /**
@ -232,7 +225,7 @@ export function getAttachmentList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteAttachment(params: Record<string, any>) { 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})
} }
/** /**
@ -262,15 +255,32 @@ export function getShortcutMenu() {
* *
*/ */
export function setShortcutMenu(params: Record<string, any>) { 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 * @param pid
* @returns
*/ */
export function getAreaListByPid(pid: number = 0) { export function getAreaListByPid(pid: number = 0) {
return request.get(`sys/area/list_by_pid/${pid}`) return request.get(`sys/area/list_by_pid/${pid}`)
@ -278,8 +288,7 @@ export function getAreaListByPid(pid: number = 0) {
/** /**
* *
* @param params * @param level
* @returns
*/ */
export function getAreatree(level: number = 1) { export function getAreatree(level: number = 1) {
return request.get(`sys/area/tree/${level}`) return request.get(`sys/area/tree/${level}`)
@ -290,22 +299,20 @@ export function getAreatree(level: number = 1) {
* *
*/ */
export function getAddressInfo(params: any) { 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) { 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() { export function getStorageList() {
return request.get(`sys/storage`) return request.get(`sys/storage`)
@ -313,8 +320,7 @@ export function getStorageList() {
/** /**
* *
* @param params * @param type
* @returns
*/ */
export function getStorageInfo(type: string) { export function getStorageInfo(type: string) {
return request.get(`sys/storage/${type}`) return request.get(`sys/storage/${type}`)
@ -326,7 +332,7 @@ export function getStorageInfo(type: string) {
* @returns * @returns
*/ */
export function editStorage(params: Record<string, any>) { 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})
} }
/***************************************************** 支付设置 ****************************************************/ /***************************************************** 支付设置 ****************************************************/
@ -344,7 +350,7 @@ export function getPayConfig(type: string) {
* @returns * @returns
*/ */
export function setPayConfig(params: Record<string, any>) { 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});
} }
/** /**
@ -358,8 +364,7 @@ export function getPayList() {
/***************************************************** 打款设置 ****************************************************/ /***************************************************** 打款设置 ****************************************************/
/** /**
* *
* @returns channel * @param channel
* @returns
*/ */
export function getTransferInfo(channel) { export function getTransferInfo(channel) {
return request.get(`pay/channel/lists/${channel}`) return request.get(`pay/channel/lists/${channel}`)
@ -373,6 +378,7 @@ export function getTransferInfo(channel) {
export function setTransferInfo(params: Record<string, any>) { export function setTransferInfo(params: Record<string, any>) {
return request.post(`pay/channel/set/transfer`, params) return request.post(`pay/channel/set/transfer`, params)
} }
/***************************************************** 定时任务 ****************************************************/ /***************************************************** 定时任务 ****************************************************/
/** /**
@ -380,7 +386,7 @@ export function setTransferInfo(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getCronList(params: any) { export function getCronList(params: any) {
return request.get(`sys/schedule/list`, { params }) return request.get(`sys/schedule/list`, {params})
} }
/** /**
@ -392,11 +398,51 @@ export function getCronInfo(id: string) {
} }
/** /**
* *
* @returns * @returns
*/ */
export function getCronType() { export function getCronTemplate() {
return request.get(`sys/cron/type`) 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})
} }
/***************************************************** 协议管理 ****************************************************/ /***************************************************** 协议管理 ****************************************************/
@ -422,7 +468,7 @@ export function getAgreementInfo(key: string) {
* @returns * @returns
*/ */
export function editAgreement(params: Record<string, any>) { 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})
} }
/** /**
@ -446,8 +492,6 @@ export function getSceneDomain() {
/** /**
* *
* @param params
* @returns
*/ */
export function getConfigLogin() { export function getConfigLogin() {
return request.get(`sys/config/login`) return request.get(`sys/config/login`)
@ -459,7 +503,7 @@ export function getConfigLogin() {
* @returns * @returns
*/ */
export function setConfigLogin(params: Record<string, any>) { 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>) { 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>) { 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>) { 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 * key
*/ */
export function setMap(params: Record<string, any>) { 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>) { 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 * @returns
*/ */
export function getGenerateTableList(params: Record<string, any>) { 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 * @returns
*/ */
export function addGenerateTable(params: Record<string, any>) { 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 * @param params
* @returns
*/ */
export function editGenerateTable(params: Record<string, any>) { 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 * @returns
*/ */
export function deleteGenerateTable(id: number) { 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() { export function generateTable() {
return request.get(`generator/table`) return request.get(`generator/table`)
@ -68,8 +64,6 @@ export function generateTable() {
/** /**
* *
* @param file
* @returns
*/ */
export function getSystem() { export function getSystem() {
return request.get(`sys/system`) return request.get(`sys/system`)

View File

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

View File

@ -14,7 +14,7 @@ export function getWeappConfig() {
* @returns * @returns
*/ */
export function setWeappConfig(params: Record<string, any>) { export function setWeappConfig(params: Record<string, any>) {
return request.put('weapp/config', params, { showSuccessMessage: true }) return request.put('weapp/config', params, {showSuccessMessage: true})
} }
/** /**
@ -31,5 +31,61 @@ export function getTemplateList() {
* @returns * @returns
*/ */
export function getBatchAcquisition(params: Record<string, any>) { 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

@ -10,8 +10,6 @@ export function getWechatConfig() {
/** /**
* *
* @param uid uid
* @returns
*/ */
export function getWechatStatic() { export function getWechatStatic() {
return request.get('wechat/static'); return request.get('wechat/static');
@ -23,7 +21,7 @@ export function getWechatStatic() {
* @returns * @returns
*/ */
export function editWechatConfig(params: Record<string, any>) { export function editWechatConfig(params: Record<string, any>) {
return request.put('wechat/config', params, { showSuccessMessage: true }) return request.put('wechat/config', params, {showSuccessMessage: true})
} }
/** /**
@ -40,7 +38,7 @@ export function getWechatMenu() {
* @returns * @returns
*/ */
export function editWechatMenu(params: Record<string, any>) { export function editWechatMenu(params: Record<string, any>) {
return request.put('wechat/menu', params, { showSuccessMessage: true }) return request.put('wechat/menu', params, {showSuccessMessage: true})
} }
/** /**
@ -58,7 +56,7 @@ export function getTemplateList() {
* @returns * @returns
*/ */
export function getBatchAcquisition(params: Record<string, any>) { 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 {cloneDeep} from 'lodash-es'
import {getLink} from '@/api/diy'; import {getLink} from '@/api/diy';
import {ElMessage} from 'element-plus' import {ElMessage} from 'element-plus'
import { CollectionTag } from '@element-plus/icons-vue';
const prop = defineProps({ const prop = defineProps({
modelValue: { modelValue: {

View File

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

View File

@ -1,71 +1,145 @@
<template> <template>
<el-popover trigger="click" v-model:visible="visible"> <div class="flex flex-wrap">
<template #reference> <template v-if="limit == 1">
<slot name="reference"></slot> <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>
<div class="flex w-full flex-col"> <template v-else>
<div class="head flex w-full mb-[10px]"> <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">
<span>请选择图标</span> <div class="w-full h-full relative">
<div class="flex justify-end flex-auto"> <div class="w-full h-full flex items-center justify-center">
<span class="ml-[10px] cursor-pointer" :class="{ active: type == 'element' }" @click="type = 'element'">element</span> <icon :name="item" size="40px"></icon>
<span class="ml-[10px] cursor-pointer" :class="{ active: type == 'iconfont' }" @click="type = 'iconfont'">iconfont</span> </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>
<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>
<div class="flex flex-wrap" v-show="type == 'iconfont'"> <div class="rounded cursor-pointer overflow-hidden relative border border-dashed border-color" :style="style" v-if="icons.data.length < limit">
<el-button v-for="icon in iconfont" class="w-[35px] h-[35px] icon-item" @click="selectIcon('iconfont-' + icon)"> <upload-attachment :limit="limit" @confirm="confirmSelect">
<icon :name="'iconfont-' + icon" /> <div class="w-full h-full flex items-center justify-center flex-col">
</el-button> <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> </div>
</el-scrollbar> </upload-attachment>
</div> </div>
</template>
</div> </div>
</el-popover>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed, ref } from 'vue' import {computed, reactive, watch, toRaw} from 'vue'
import * as ElementPlusIconsVue from '@element-plus/icons-vue' import {t} from '@/lang'
const type = ref('element') const prop = defineProps({
const visible = ref('false') modelValue: {
type: String,
// element default: ''
const element = computed(() => { },
return Object.keys(ElementPlusIconsVue) width: {
}) type: String,
default: '100px'
// iconfont },
const iconfont = computed(() => { height: {
const iconfile = import.meta.globEager('@/styles/iconfont.css')['/src/styles/iconfont.css'].default type: String,
const icons = Array.from(iconfile.matchAll(/(icon.*)\:before/g)) default: '100px'
},
return icons.map(item => { iconText: {
return item[1] 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> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.icon-item { .icon-wrap {
margin: 6px 6px 6px 0; .operation {
} display: none;
}
.active { &:hover {
color: var(--el-color-primary); .operation {
} display: flex;
}
}
}
</style> </style>

View File

@ -3,8 +3,7 @@
<!-- 分组 --> <!-- 分组 -->
<div class="group-wrap w-[180px] p-[15px] h-full border-r border-color flex flex-col"> <div class="group-wrap w-[180px] p-[15px] h-full border-r border-color flex flex-col">
<el-input v-model="categoryParam.name" class="m-0" :placeholder="t('upload.attachmentCategoryPlaceholder')" clearable <el-input v-model="categoryParam.name" class="m-0" :placeholder="t('upload.attachmentCategoryPlaceholder')" clearable prefix-icon="Search" @input="getAttachmentCategoryList()"/>
prefix-icon="Search" @input="getAttachmentCategoryList()" />
<div class="group-list flex-1 my-[10px]"> <div class="group-list flex-1 my-[10px]">
<el-scrollbar> <el-scrollbar>
<div class="group-item p-[10px] leading-none text-xs rounded cursor-pointer" :class="{ active: attachmentParam.cate_id == 0 }" @click="attachmentParam.cate_id = 0"> <div class="group-item p-[10px] leading-none text-xs rounded cursor-pointer" :class="{ active: attachmentParam.cate_id == 0 }" @click="attachmentParam.cate_id = 0">
@ -12,10 +11,11 @@
</div> </div>
<div class="group-item px-[10px] text-xs rounded cursor-pointer flex" v-for="(item, index) in attachmentCategory.data" :key="index" :class="{ active: attachmentParam.cate_id == item.id }"> <div class="group-item px-[10px] text-xs rounded cursor-pointer flex" v-for="(item, index) in attachmentCategory.data" :key="index" :class="{ active: attachmentParam.cate_id == item.id }">
<div class="flex-1 leading-none truncate py-[10px]" @click="attachmentParam.cate_id = item.id">{{item.name }}</div> <div class="flex-1 leading-none truncate py-[10px]" @click="attachmentParam.cate_id = item.id">{{item.name }}</div>
<div class="leading-none operate py-[10px]" v-if="scene == 'attachment'"> <div class="leading-none operate py-[10px]" v-if="scene == 'attachment' && prop.type !='icon' ">
<!-- 图片操作 --> <!-- 图片操作 -->
<el-dropdown :hide-on-click="false" v-if="scene == 'attachment'"> <el-dropdown :hide-on-click="false" v-if="scene == 'attachment'">
<icon name="element-MoreFilled" class="cursor-pointer ml-[10px]" size="14px" />{{item.name}} <icon name="element-MoreFilled" class="cursor-pointer ml-[10px]" size="14px"/>
{{item.name}}
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
<el-dropdown-item class="text-center"> <el-dropdown-item class="text-center">
@ -34,47 +34,50 @@
</el-scrollbar> </el-scrollbar>
</div> </div>
<!-- 添加分组 --> <!-- 添加分组 -->
<popover-input :placeholder="t('upload.attachmentCategoryPlaceholder')" @confirm="addAttachmentCategory"> <popover-input :placeholder="t('upload.attachmentCategoryPlaceholder')" @confirm="addAttachmentCategory" v-if="prop.type !='icon'">
<el-button>{{ t('upload.addAttachmentCategory') }}</el-button> <el-button>{{ t('upload.addAttachmentCategory') }}</el-button>
</popover-input> </popover-input>
</div> </div>
<!-- 素材 --> <!-- 素材 -->
<div class="attachment-list-wrap flex flex-col p-[15px] flex-1"> <div class="attachment-list-wrap flex flex-col p-[15px] flex-1 overflow-hidden">
<el-row :gutter="15" class="h-[32px]"> <el-row :gutter="15" class="h-[32px]">
<el-col :span="12"> <el-col :span="10">
<div class="flex"> <div class="flex">
<el-upload v-bind="upload" ref="uploadRef"> <el-upload v-bind="upload" ref="uploadRef" v-if="prop.type !='icon'">
<el-button type="primary">{{ t('upload.upload' + type) }} {{ isOpen }}</el-button> <el-button type="primary">{{ t('upload.upload' + type) }} {{ isOpen }}</el-button>
</el-upload> </el-upload>
<div v-if="scene == 'attachment'"> <div v-if="scene == 'attachment' && prop.type !='icon'">
<el-button v-if="operate === false" class="ml-[10px]" type="primary" @click="operate = true">{{t('edit') }}</el-button> <el-button v-if="operate === false" class="ml-[10px]" type="primary" @click="operate = true">{{t('edit') }}
</el-button>
<el-button v-else class="ml-[10px]" type="primary" @click="operate = false">{{ t('complete') }}</el-button> <el-button v-else class="ml-[10px]" type="primary" @click="operate = false">{{ t('complete') }}</el-button>
</div> </div>
</div> </div>
</el-col> </el-col>
<el-col :span="12" class="text-right"> <el-col :span="14" class="text-right">
<el-input v-model="attachmentParam.real_name" class="m-0 w-[200px]" clearable :placeholder="t('upload.placeholder' + type + 'Name')" prefix-icon="Search" @input="getAttachmentList()" /> <el-input v-model="attachmentParam.real_name" class="m-0 w-[200px]" clearable :placeholder="t('upload.placeholder' + type + 'Name')" prefix-icon="Search" @input="getAttachmentList()"/>
</el-col> </el-col>
</el-row> </el-row>
<div class="flex-1 my-[15px] h-0" v-loading="attachment.loading"> <div class="flex-1 my-[15px] h-0" v-loading="attachment.loading">
<el-scrollbar> <el-scrollbar>
<!-- 选择弹出框 -->
<div class="flex flex-wrap" v-if="attachment.data.length && (operate === true || scene != 'attachment')"> <div class="flex flex-wrap" v-if="attachment.data.length && (operate === true || scene != 'attachment')">
<div class="attachment-item mr-[10px]" :class="scene == 'select' ? 'w-[100px]' : 'w-[120px]'" v-for="(item, index) in attachment.data" :key="index"> <div class="attachment-item mr-[10px]" :class="scene == 'select' ? 'w-[100px]' : 'w-[120px]'" v-for="(item, index) in attachment.data" :key="index">
<div class="attachment-wrap w-full rounded cursor-pointer overflow-hidden relative flex items-center justify-center" :class="scene == 'select' ? 'h-[100px]' : 'h-[120px]'" @click="selectFile(item)"> <div class="attachment-wrap w-full rounded cursor-pointer overflow-hidden relative flex items-center justify-center" :class="scene == 'select' ? 'h-[100px]' : 'h-[120px]'" @click="selectFile(item)">
<el-image :src="img(item.url)" fit="contain" v-if="type == 'image'"></el-image> <el-image :src="img(item.url)" fit="contain" v-if="type == 'image'"></el-image>
<video :src="img(item.url)" v-else></video> <video :src="img(item.url)" v-else-if="type == 'video'"></video>
<icon :name="item.url" size="40px" v-else-if="type == 'icon'"></icon>
<div class="absolute z-[1] flex items-center justify-center w-full h-full inset-0 bg-black bg-opacity-60" v-show="selectedFile[item.att_id]"> <div class="absolute z-[1] flex items-center justify-center w-full h-full inset-0 bg-black bg-opacity-60" v-show="selectedFile[item.att_id]">
<icon name="element-Select" color="#fff" size="25px" /> <icon name="element-Select" color="#fff" size="40px"/>
</div> </div>
</div> </div>
<div class="flex items-center"> <div class="flex items-center">
<el-tooltip placement="top"> <el-tooltip placement="top">
<template #content>{{ item.real_name }}</template> <template #content>{{ item.real_name }}</template>
<div class="truncate my-[10px] cursor-pointer text-base flex-1 ">{{ item.real_name }}</div> <div class="truncate my-[10px] cursor-pointer text-base flex-1 text-center">{{ item.real_name }}</div>
</el-tooltip> </el-tooltip>
<!-- 图片操作 --> <!-- 图片操作 -->
<el-dropdown :hide-on-click="false" v-if="scene == 'attachment'" class="attachment-action hidden "> <el-dropdown :hide-on-click="false" v-if="scene == 'attachment'" class="attachment-action hidden ">
<icon name="element-MoreFilled" class="cursor-pointer ml-[8px]" size="14px" /> <icon name="element-MoreFilled" class="cursor-pointer ml-[8px]" size="14px"/>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
<el-dropdown-item class="text-center" @click="previewImage(index)" v-if="item.att_type == 'image'"> <el-dropdown-item class="text-center" @click="previewImage(index)" v-if="item.att_type == 'image'">
@ -95,36 +98,42 @@
</div> </div>
</div> </div>
</div> </div>
<!-- 素材管理 -->
<div class="flex flex-wrap" v-else-if="attachment.data.length && operate === false"> <div class="flex flex-wrap" v-else-if="attachment.data.length && operate === false">
<div class="attachment-item mr-[10px] w-[120px]" v-for="(item, index) in attachment.data" :key="index"> <div class="attachment-item mr-[10px] w-[120px]" v-for="(item, index) in attachment.data" :key="index">
<div class="attachment-wrap w-full rounded cursor-pointer overflow-hidden relative flex items-center justify-center h-[120px]"> <div class="attachment-wrap w-full rounded cursor-pointer overflow-hidden relative flex items-center justify-center h-[120px]">
<el-image :src="img(item.url)" fit="contain" v-if="type == 'image'" :preview-src-list="item.image_list"></el-image> <el-image :src="img(item.url)" fit="contain" v-if="type == 'image'" :preview-src-list="item.image_list"></el-image>
<video :src="img(item.url)" v-else></video> <video :src="img(item.url)" v-else-if="type == 'video'"></video>
<icon :name="item.url" size="40px" v-else-if="type == 'icon'"></icon>
</div> </div>
<div class="flex items-center"> <div class="flex items-center">
<el-tooltip placement="top"> <el-tooltip placement="top">
<template #content>{{ item.real_name }}</template> <template #content>{{ item.real_name }}</template>
<div class="truncate my-[10px] cursor-pointer text-base flex-1 ">{{ item.real_name }}</div> <div class="truncate my-[10px] cursor-pointer text-base flex-1 text-center">{{ item.real_name }}</div>
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
</div> </div>
<div class="flex items-center justify-center" v-else> <div class="flex items-center justify-center" v-else>
<el-empty v-if="!attachment.loading" :description="t('upload.attachmentEmpty')" :image-size="100" /> <el-empty v-if="!attachment.loading" :description="type == 'icon' ? t('upload.iconEmpty') : t('upload.attachmentEmpty')" :image-size="100"/>
</div> </div>
</el-scrollbar> </el-scrollbar>
</div> </div>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="8" v-if="scene == 'attachment' && operate === true"> <el-col :span="8" v-if="scene == 'attachment' && operate === true">
<div class="flex items-center"> <div class="flex items-center">
<el-checkbox v-model="selectAll" :label="t('selectAll')" size="large" /> <el-checkbox v-model="selectAll" :label="t('selectAll')" size="large"/>
<el-button class="ml-[15px]" :disabled="batchOperateDisabled" @click="deleteAttachmentEvent()">{{t('delete') }}</el-button> <el-button class="ml-[15px]" :disabled="batchOperateDisabled" @click="deleteAttachmentEvent()">{{t('delete') }}</el-button>
<el-button :disabled="batchOperateDisabled" @click="moveAttachmentEvent()">{{ t('upload.move') }}</el-button> <el-button :disabled="batchOperateDisabled" @click="moveAttachmentEvent()">{{ t('upload.move') }}</el-button>
</div> </div>
</el-col> </el-col>
<el-col :span="scene == 'attachment' ? 16 : 24"> <el-col :span="scene == 'attachment' ? 16 : 24">
<div class="flex h-full justify-end items-center"> <div class="flex h-full justify-end items-center">
<el-pagination v-model:current-page="attachment.page" :small="true" v-model:page-size="attachment.limit" :page-sizes="[10, 20, 40, 60]" layout="total, sizes, prev, pager, next, jumper" :total="attachment.total" @size-change="getAttachmentList()" @current-change="getAttachmentList" /> <el-pagination v-model:current-page="attachment.page" :small="true"
v-model:page-size="attachment.limit" :page-sizes="[10, 20, 30, 40, 60]"
layout="total, sizes, prev, pager, next, jumper" :total="attachment.total"
@size-change="getAttachmentList()" @current-change="getAttachmentList"/>
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
@ -136,7 +145,7 @@
<el-form label-width="60px"> <el-form label-width="60px">
<el-form-item :label="t('upload.moveTo')" style="margin-bottom: 0;"> <el-form-item :label="t('upload.moveTo')" style="margin-bottom: 0;">
<el-select v-model="moveAttachmentData.cateId" class="input-width"> <el-select v-model="moveAttachmentData.cateId" class="input-width">
<el-option :label="item.name" :value="item.id" v-for="(item, index) in attachmentCategory.data" :key="index" /> <el-option :label="item.name" :value="item.id" v-for="(item, index) in attachmentCategory.data" :key="index"/>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -150,11 +159,11 @@
</el-dialog> </el-dialog>
<!-- 图片预览 --> <!-- 图片预览 -->
<el-image-viewer :url-list="previewImageList" v-if="imageViewer.show" @close="imageViewer.show = false" :initial-index="imageViewer.index" :zoom-rate="1" /> <el-image-viewer :url-list="previewImageList" v-if="imageViewer.show" @close="imageViewer.show = false" :initial-index="imageViewer.index" :zoom-rate="1"/>
<!-- 视频预览 --> <!-- 视频预览 -->
<el-dialog v-model="videoViewer.visible" width="50%" align-center :destroy-on-close="true" custom-class="video-preview"> <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%" /> <video-player :src="videoViewer.src" width="100%"/>
</el-dialog> </el-dialog>
</template> </template>
@ -162,23 +171,25 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, reactive, watch, computed, toRaw } from 'vue' import {ref, reactive, watch, computed, toRaw} from 'vue'
import { t } from '@/lang' import {t} from '@/lang'
import { import {
getAttachmentCategoryList as attachmentCategoryList, getAttachmentCategoryList as attachmentCategoryList,
getAttachmentList as attachmentList, getAttachmentList as attachmentList,
addAttachmentCategory as addCategory, addAttachmentCategory as addCategory,
editAttachmentCategory as updateCategory, editAttachmentCategory as updateCategory,
deleteAttachmentCategory as deleteCategory, deleteAttachmentCategory as deleteCategory,
deleteAttachment, deleteAttachment,
moveAttachment moveAttachment,
} from '@/api/sys' getIconCategoryList,
import { debounce, img, getToken } from '@/utils/common' getIconList
import { ElMessage, UploadFile, UploadFiles, ElMessageBox } from 'element-plus' } from '@/api/sys'
import storage from '@/utils/storage' import {debounce, img, getToken} from '@/utils/common'
import {ElMessage, UploadFile, UploadFiles, ElMessageBox} from 'element-plus'
import storage from '@/utils/storage'
const operate = ref(false) const operate = ref(false)
const prop = defineProps({ const prop = defineProps({
// //
limit: { limit: {
type: Number, type: Number,
@ -193,34 +204,50 @@ const prop = defineProps({
type: String, type: String,
default: 'select' // select attachment default: 'select' // select attachment
} }
}) })
// //
const selectedFile: Record<string, any> = reactive({}) const selectedFile: Record<string, any> = reactive({})
const attachmentCategory: Record<string, any> = reactive({ const attachmentCategory: Record<string, any> = reactive({
data: [] data: []
}) })
const attachment: Record<string, any> = reactive({
const attachment: Record<string, any> = reactive({
loading: true, loading: true,
page: 1, page: 1,
total: 0, total: 0,
limit: prop.scene == 'select' ? 10 : 20, limit: prop.scene == 'select' ? 10 : 20,
data: [] data: []
}) })
const categoryParam = reactive({
if( prop.scene == 'select'){
attachment.limit = 10;
if(prop.type == 'icon'){
attachment.limit = 20;
}
}else{
attachment.limit = 20;
if(prop.type == 'icon'){
attachment.limit = 30;
}
}
const categoryParam = reactive({
name: '' name: ''
}) })
const attachmentParam = reactive({
const attachmentParam = reactive({
real_name: '', real_name: '',
cate_id: 0 cate_id: 0
}) })
/** /**
* 查询分组 * 查询分组
*/ */
const getAttachmentCategoryList = debounce(() => { const getAttachmentCategoryList = debounce(() => {
attachmentCategoryList({ let getFn = prop.type == 'icon' ? getIconCategoryList : attachmentCategoryList;
getFn({
type: prop.type, type: prop.type,
...categoryParam ...categoryParam
}).then(res => { }).then(res => {
@ -228,16 +255,19 @@ const getAttachmentCategoryList = debounce(() => {
}).catch(() => { }).catch(() => {
}) })
}) })
getAttachmentCategoryList()
/** getAttachmentCategoryList()
/**
* 查询图片 * 查询图片
*/ */
const getAttachmentList = debounce((page: number = 1) => { const getAttachmentList = debounce((page: number = 1) => {
let getFn = prop.type == 'icon' ? getIconList : attachmentList;
attachment.loading = true attachment.loading = true
attachment.page = page attachment.page = page
attachmentList({ getFn({
page: attachment.page, page: attachment.page,
limit: attachment.limit, limit: attachment.limit,
att_type: prop.type, att_type: prop.type,
@ -248,26 +278,28 @@ const getAttachmentList = debounce((page: number = 1) => {
attachment.loading = false attachment.loading = false
prop.scene == 'attachment' && clearSelected() prop.scene == 'attachment' && clearSelected()
if (prop.type != 'icon') {
for (let i = 0; i < attachment.data.length; i++) { for (let i = 0; i < attachment.data.length; i++) {
attachment.data[i]['image_list'] = [] attachment.data[i]['image_list'] = []
attachment.data[i]['image_list'].push(img(res.data.data[i]['url'])) attachment.data[i]['image_list'].push(img(res.data.data[i]['url']))
} }
}
}).catch(() => { }).catch(() => {
attachment.loading = false attachment.loading = false
}) })
})
getAttachmentList()
watch(() => attachmentParam.cate_id, () => { })
getAttachmentList() getAttachmentList()
})
/** watch(() => attachmentParam.cate_id, () => {
getAttachmentList()
})
/**
* 添加分组 * 添加分组
*/ */
const addAttachmentCategory = (name: string) => { const addAttachmentCategory = (name: string) => {
addCategory({ addCategory({
type: prop.type, type: prop.type,
name name
@ -276,14 +308,14 @@ const addAttachmentCategory = (name: string) => {
}).catch(() => { }).catch(() => {
}) })
} }
/** /**
* 编辑分组 * 编辑分组
* @param name * @param name
* @param index * @param index
*/ */
const updateAttachmentCategory = (name: string, index: number) => { const updateAttachmentCategory = (name: string, index: number) => {
updateCategory({ updateCategory({
id: attachmentCategory.data[index].id, id: attachmentCategory.data[index].id,
name name
@ -292,12 +324,12 @@ const updateAttachmentCategory = (name: string, index: number) => {
}).catch(() => { }).catch(() => {
}) })
} }
/** /**
* 删除分组 * 删除分组
*/ */
const deleteAttachmentCategory = (index: number) => { const deleteAttachmentCategory = (index: number) => {
ElMessageBox.confirm(t('upload.deleteCategoryTips'), t('warning'), ElMessageBox.confirm(t('upload.deleteCategoryTips'), t('warning'),
{ {
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
@ -310,12 +342,12 @@ const deleteAttachmentCategory = (index: number) => {
}).catch(() => { }).catch(() => {
}) })
}) })
} }
const uploadRef = ref<Record<string, any> | null>(null) const uploadRef = ref<Record<string, any> | null>(null)
// //
const upload = computed(() => { const upload = computed(() => {
const headers: Record<string, any> = {} const headers: Record<string, any> = {}
headers[import.meta.env.VITE_REQUEST_HEADER_TOKEN_KEY] = getToken() headers[import.meta.env.VITE_REQUEST_HEADER_TOKEN_KEY] = getToken()
headers[import.meta.env.VITE_REQUEST_HEADER_SITEID_KEY] = storage.get('siteId') || 0 headers[import.meta.env.VITE_REQUEST_HEADER_SITEID_KEY] = storage.get('siteId') || 0
@ -333,15 +365,15 @@ const upload = computed(() => {
uploadRef.value?.handleRemove(uploadFile) uploadRef.value?.handleRemove(uploadFile)
} else { } else {
uploadFile.status = 'fail' uploadFile.status = 'fail'
ElMessage({ message: response.msg, type: 'error' }) ElMessage({message: response.msg, type: 'error'})
} }
} }
} }
}) })
// //
const selectAll = ref(false) const selectAll = ref(false)
watch(selectAll, () => { watch(selectAll, () => {
if (selectAll.value) { if (selectAll.value) {
const keys = Object.keys(toRaw(selectedFile)) const keys = Object.keys(toRaw(selectedFile))
attachment.data.forEach((item: Record<string, any>) => { attachment.data.forEach((item: Record<string, any>) => {
@ -350,23 +382,25 @@ watch(selectAll, () => {
} else { } else {
clearSelected() clearSelected()
} }
}) })
/** /**
* 清空选中 * 清空选中
*/ */
const clearSelected = () => { const clearSelected = () => {
const keys = Object.keys(toRaw(selectedFile)) const keys = Object.keys(toRaw(selectedFile))
if (keys.length) { if (keys.length) {
keys.forEach((key) => { delete selectedFile[key] }) keys.forEach((key) => {
delete selectedFile[key]
})
selectAll.value = false selectAll.value = false
} }
} }
/** /**
* 选择文件 * 选择文件
*/ */
const selectFile = (data: any) => { const selectFile = (data: any) => {
if (selectedFile[data.att_id]) delete selectedFile[data.att_id] if (selectedFile[data.att_id]) delete selectedFile[data.att_id]
else if (prop.scene == 'select') { else if (prop.scene == 'select') {
const keys = Object.keys(toRaw(selectedFile)) const keys = Object.keys(toRaw(selectedFile))
@ -381,13 +415,13 @@ const selectFile = (data: any) => {
} else { } else {
selectedFile[data.att_id] = toRaw(data) selectedFile[data.att_id] = toRaw(data)
} }
} }
/** /**
* 删除附件 * 删除附件
* @param index * @param index
*/ */
const deleteAttachmentEvent = (index: number | null = null) => { const deleteAttachmentEvent = (index: number | null = null) => {
const ids = index === null ? Object.keys(toRaw(selectedFile)) : [attachment.data[index].att_id] const ids = index === null ? Object.keys(toRaw(selectedFile)) : [attachment.data[index].att_id]
ElMessageBox.confirm(t('upload.deleteAttachmentTips'), t('warning'), ElMessageBox.confirm(t('upload.deleteAttachmentTips'), t('warning'),
@ -397,29 +431,29 @@ const deleteAttachmentEvent = (index: number | null = null) => {
type: 'warning' type: 'warning'
} }
).then(() => { ).then(() => {
deleteAttachment({ att_ids: ids }).then(() => { deleteAttachment({att_ids: ids}).then(() => {
getAttachmentList() getAttachmentList()
}).catch(() => { }).catch(() => {
}) })
}) })
} }
/** /**
* 移动附件 * 移动附件
*/ */
const moveAttachmentData: Record<string, any> = reactive({ const moveAttachmentData: Record<string, any> = reactive({
cateId: '', cateId: '',
loading: false, loading: false,
visible: false visible: false
}) })
const moveAttachmentEvent = (index: number | null = null) => { const moveAttachmentEvent = (index: number | null = null) => {
const ids = index === null ? Object.keys(toRaw(selectedFile)) : [attachment.data[index].att_id] const ids = index === null ? Object.keys(toRaw(selectedFile)) : [attachment.data[index].att_id]
moveAttachmentData.visible = true moveAttachmentData.visible = true
moveAttachmentData.cateId = attachmentCategory.data[0].id moveAttachmentData.cateId = attachmentCategory.data[0].id
moveAttachmentData.confirm = () => { moveAttachmentData.confirm = () => {
moveAttachmentData.loading = true moveAttachmentData.loading = true
moveAttachment({ cate_id: moveAttachmentData.cateId, att_ids: ids }).then(() => { moveAttachment({cate_id: moveAttachmentData.cateId, att_ids: ids}).then(() => {
moveAttachmentData.visible = false moveAttachmentData.visible = false
moveAttachmentData.loading = false moveAttachmentData.loading = false
getAttachmentList() getAttachmentList()
@ -427,48 +461,51 @@ const moveAttachmentEvent = (index: number | null = null) => {
moveAttachmentData.loading = false moveAttachmentData.loading = false
}) })
} }
} }
// //
const batchOperateDisabled = ref(true) const batchOperateDisabled = ref(true)
watch(selectedFile, () => { watch(selectedFile, () => {
batchOperateDisabled.value = Object.keys(toRaw(selectedFile)).length == 0 batchOperateDisabled.value = Object.keys(toRaw(selectedFile)).length == 0
}) })
/** /**
* 查看图片 * 查看图片
*/ */
const imageViewer = reactive({ const imageViewer = reactive({
show: false, show: false,
index: 0 index: 0
}) })
const previewImage = (index: number) => {
const previewImage = (index: number) => {
imageViewer.show = true imageViewer.show = true
imageViewer.index = index imageViewer.index = index
} }
const previewImageList = computed(() => { const previewImageList = computed(() => {
return toRaw(attachment.data).map((item: Record<string, any>) => { return img(item.url) }) return toRaw(attachment.data).map((item: Record<string, any>) => {
}) return img(item.url)
})
})
/** /**
* 视频预览 * 视频预览
*/ */
const videoViewer = reactive({ const videoViewer = reactive({
visible: false, visible: false,
src: '' src: ''
}) })
const previewVideo = (index: number) => { const previewVideo = (index: number) => {
videoViewer.visible = true videoViewer.visible = true
videoViewer.src = img(attachment.data[index].url) videoViewer.src = img(attachment.data[index].url)
} }
defineExpose({ defineExpose({
selectedFile selectedFile
}) })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.group-list { .group-list {
.group-item { .group-item {
margin-top: 3px; margin-top: 3px;
@ -489,21 +526,22 @@ defineExpose({
} }
} }
} }
} }
.attachment-item:hover{
.attachment-action{ .attachment-item:hover {
.attachment-action {
display: block; display: block;
} }
} }
.attachment-list-wrap { .attachment-list-wrap {
.attachment-wrap { .attachment-wrap {
background: var(--el-border-color-extra-light); background: var(--el-border-color-extra-light);
} }
} }
</style> </style>
<style lang="scss"> <style lang="scss">
.video-preview { .video-preview {
background: none !important; background: none !important;
box-shadow: none !important; box-shadow: none !important;
@ -516,9 +554,9 @@ defineExpose({
background-color: var(--el-text-color-regular); background-color: var(--el-text-color-regular);
border-color: #fff; border-color: #fff;
} }
} }
.el-upload-list { .el-upload-list {
position: absolute !important; position: absolute !important;
z-index: 10; z-index: 10;
@ -526,4 +564,4 @@ defineExpose({
background: #fff !important; background: #fff !important;
box-shadow: var(--el-box-shadow-light); box-shadow: var(--el-box-shadow-light);
} }
}</style> }</style>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -3,7 +3,7 @@
"contactAddress":"联系地址", "contactAddress":"联系地址",
"siteName": "站点名称", "siteName": "站点名称",
"keywords": "网站关键字", "keywords": "网站关键字",
"logo": "网站Logo", "logo": "长方形logo",
"desc": "网站简介", "desc": "网站简介",
"province": "省", "province": "省",
"city": "市", "city": "市",
@ -15,7 +15,6 @@
"contactAddressPlaceholder":"联系地址", "contactAddressPlaceholder":"联系地址",
"siteNamePlaceholder": "站点名称", "siteNamePlaceholder": "站点名称",
"keywordsPlaceholder": "网站关键字", "keywordsPlaceholder": "网站关键字",
"logoPlaceholder": "网站Logo",
"descPlaceholder": "网站简介", "descPlaceholder": "网站简介",
"addressPlaceholder": "详细地址", "addressPlaceholder": "详细地址",
"phonePlaceholder": "客服电话", "phonePlaceholder": "客服电话",
@ -25,10 +24,12 @@
"frontEndName": "前台名称", "frontEndName": "前台名称",
"frontEndNamePlaceholder": "请输入前台名称", "frontEndNamePlaceholder": "请输入前台名称",
"frontEndLogo": "前台Logo", "frontEndLogo": "前台Logo",
"icon": "网站图标", "icon": "网站方形logo",
"serviceInformation": "服务信息", "serviceInformation": "服务信息",
"wechatCode": "公众号二维码", "wechatCode": "公众号二维码",
"customerServiceCode": "客服二维码", "customerServiceCode": "客服二维码",
"contactsTel": "联系电话", "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":"开始时间", "startDate":"开始时间",
"cron":"定时执行", "cron":"定时执行",
"endDate":"结束时间", "endDate":"结束时间",
"titlePlaceholder": "请输入任务名称", "titlePlaceholder": "请选择任务模版",
"typeName":"任务类型", "typeName":"任务类型",
"crondType":"任务周期", "crondType":"任务周期",
"count":"已执行次数", "count":"已执行次数",
@ -16,5 +16,15 @@
"statusDesc":"最后执行结果", "statusDesc":"最后执行结果",
"key": "key", "key": "key",
"timeClass": "时间类型", "timeClass": "时间类型",
"executeTime": "执行时间" "executeTime": "执行时间",
"editCron": "编辑任务",
"cronTemplate": "任务模版",
"cronTime": "任务周期",
"openStatus": "任务状态",
"day": "日",
"hour": "时",
"min": "分",
"cronDeleteTips": "你确定要删除任务吗",
"addCron": "添加任务",
"cronTimeTips": "任务周期时间不能为空"
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -33,9 +33,9 @@ const useSystemStore = defineStore('user', {
this.userInfo = res.data.userinfo this.userInfo = res.data.userinfo
setToken(res.data.token) setToken(res.data.token)
storage.set({ key: 'userinfo', data: res.data.userinfo }) 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: '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 }) storage.set({ key: 'comparisonTokenStorage', data: res.data.token })
resolve(res) 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-face {
font-family: "iconfont"; /* Project id 3883393 */ font-family: "iconfont"; /* Project id 3883393 */
src: url('//at.alicdn.com/t/c/font_3883393_pgas1v4bw2a.woff2?t=1686965237342') format('woff2'), src: url('//at.alicdn.com/t/c/font_3883393_0wpbzuop0spi.woff2?t=1688032173237') format('woff2'),
url('//at.alicdn.com/t/c/font_3883393_pgas1v4bw2a.woff?t=1686965237342') format('woff'), url('//at.alicdn.com/t/c/font_3883393_0wpbzuop0spi.woff?t=1688032173237') format('woff'),
url('//at.alicdn.com/t/c/font_3883393_pgas1v4bw2a.ttf?t=1686965237342') format('truetype'); url('//at.alicdn.com/t/c/font_3883393_0wpbzuop0spi.ttf?t=1688032173237') format('truetype');
} }
.iconfont { .iconfont {
@ -13,6 +13,30 @@
-moz-osx-font-smoothing: grayscale; -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 { .iconqiehuan:before {
content: "\e61e"; 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 'element-plus/theme-chalk/display.css';
@import 'tailwind.css'; @import 'tailwind.css';
@import 'element-plus.scss'; @import 'element-plus.scss';
@import 'iconfont.css'; @import 'icon/iconfont.css';
@import 'icon/addon-iconfont.css'; // 安装卸载插件时动态引用插件的图标库文件
@import 'common.scss'; @import 'common.scss';

View File

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

View File

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

View File

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

View File

@ -46,19 +46,7 @@
<el-form-item :label="t('menuIcon')" prop="icon" v-show="formData.menu_type != 2"> <el-form-item :label="t('menuIcon')" prop="icon" v-show="formData.menu_type != 2">
<div class="input-width"> <div class="input-width">
<select-icon placement="bottom" width="300px" @select="selectMenuIcon"> <select-icon v-model="formData.icon" />
<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>
</div> </div>
</el-form-item> </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']) const emit = defineEmits(['complete'])
/** /**

View File

@ -1,7 +1,6 @@
<template> <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" <el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
v-loading="loading">
<el-form-item :label="t('roleName')" prop="role_name"> <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-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> </el-form-item>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -11,8 +11,7 @@
</div> </div>
</div> </div>
<div class="flex-1 flex w-0"> <div class="flex-1 flex w-0">
<div class="menu-item py-[15px] flex items-center justify-center cursor-pointer" <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 }"
: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)"> 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="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> <div class="active-shade"></div>

View File

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

View File

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

View File

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

View File

@ -89,7 +89,7 @@
<template #header> <template #header>
<div class="card-header flex justify-between items-center"> <div class="card-header flex justify-between items-center">
<span class="title flex-1">{{ diyStore.currentIndex == -99 ? t('pageSet') : diyStore.editComponent.componentTitle }}</span> <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 == '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> <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> </div>
@ -98,7 +98,7 @@
<div class="edit-component-wrap"> <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> <template #style>
<div class="edit-attr-item-wrap"> <div class="edit-attr-item-wrap">
<h3 class="mb-[10px]">{{ t('componentStyleTitle') }}</h3> <h3 class="mb-[10px]">{{ t('componentStyleTitle') }}</h3>
@ -129,6 +129,33 @@
</div> </div>
</template> </template>
</component> </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> </div>
@ -146,7 +173,7 @@ import { ref, reactive, toRaw, watch } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import { addDiyPage, editDiyPage, initPage } from '@/api/diy'; import { addDiyPage, editDiyPage, initPage } from '@/api/diy';
import { useRoute, useRouter } from 'vue-router' 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 { ElMessage, ElMessageBox } from 'element-plus'
import useDiyStore from '@/stores/modules/diy' import useDiyStore from '@/stores/modules/diy'
import storage from '@/utils/storage' import storage from '@/utils/storage'
@ -174,7 +201,6 @@ const backPath = route.query.back
const component = ref([]) const component = ref([])
const componentType: string[] = reactive([]) const componentType: string[] = reactive([])
const page = ref('') const page = ref('')
const siteId = ref(0)
const activeNames = ref(componentType) const activeNames = ref(componentType)
const handleChange = (val: string[]) => { } const handleChange = (val: string[]) => { }
@ -299,7 +325,6 @@ initPage({
wapDomain.value = data.domain_url.wap_domain; wapDomain.value = data.domain_url.wap_domain;
wapUrl.value = data.domain_url.wap_url; wapUrl.value = data.domain_url.wap_url;
page.value = data.page; page.value = data.page;
siteId.value = data.site_id;
setDomain(); setDomain();
// //
@ -348,15 +373,27 @@ window.addEventListener('message', (event) => {
}, false); }, false);
const saveWapDomain = ()=> { const saveWapDomain = ()=> {
if (wapDomain.value.trim().length == 0) {
ElMessage({
type: 'warning',
message: `${t('wapDomainPlaceholder')}`,
});
return;
}
wapUrl.value = wapDomain.value + '/wap' wapUrl.value = wapDomain.value + '/wap'
setDomain(); setDomain();
storage.set({ key : 'wap_domain', data :wapUrl.value }); storage.set({key: 'wap_domain', data: wapUrl.value});
loadingIframe.value = true; loadingIframe.value = true;
loadingDev.value = false; loadingDev.value = false;
} }
const setDomain = ()=>{ 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 // iframe

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -4,22 +4,26 @@
<el-card class="box-card !border-none" shadow="never" > <el-card class="box-card !border-none" shadow="never" >
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<div class="flex"> <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 class="ml-[12px]">
<div> <div>
<span class="font-bold text-[18px]">{{ statInfo.site_info.site_name }}</span> <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>
<div> <div>
<span class="text-[14px] text-[#666] mr-[12px]">{{ t('siteType') }}{{ statInfo.site_info.group_name }}</span> <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>
</div> </div>
<div class="flex"> <div class="flex">
<div> <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><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 class="bg-primary site-date rounded-[999px] h-[12px]" :style="{width: statInfo.site_info.mix}"></div>
</div> </div>
</div> </div>
@ -29,7 +33,7 @@
</div> </div>
</div> </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]"> <div class="card-header flex justify-between border-b-[1px] border-[#EBEBEC] pb-[15px]">
<span class="text-[18px]">{{t('appTemplate')}}</span> <span class="text-[18px]">{{t('appTemplate')}}</span>
<div @click="optionModel" v-if="!edit_menu" class="cursor-pointer"> <div @click="optionModel" v-if="!edit_menu" class="cursor-pointer">
@ -39,25 +43,31 @@
<el-button type="primary" @click="primary">{{ t('complete') }}</el-button> <el-button type="primary" @click="primary">{{ t('complete') }}</el-button>
</div> </div>
</div> </div>
<div class="flex flex-wrap" > <div class="flex flex-wrap">
<div class="flex flex-wrap" ref="shortcutModel" v-if="edit_menu"> <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)"> <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> <span class="text-item text-[16px] text-[#fff] ml-[12px] max-w-[120px]">{{ items.name }}</span>
</div> </div>
<div class="item-bottom h-[32px] leading-[32px] text-center" @click="editModel(items)"> <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> <span class="text-item text-[12px] text-[#fff] max-w-[150px]">{{ items.desc }}</span>
</div> </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"/> <img class="w-[20px] h-[20px]" src="@/assets/images/index/del_model.png"/>
</div> </div>
</div> </div>
</div> </div>
<div v-else class="flex flex-wrap"> <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)"> <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> <span class="text-item text-[16px] text-[#fff] ml-[12px] max-w-[120px]">{{ items.name }}</span>
</div> </div>
<div class="item-bottom h-[32px] leading-[32px] text-center" @click="toLink(items.router_path)"> <div class="item-bottom h-[32px] leading-[32px] text-center" @click="toLink(items.router_path)">
@ -65,12 +75,12 @@
</div> </div>
</div> </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> <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> <p class="text-center mt-[5px] text-[20px]">{{ t('addMenu') }}</p>
</div> </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 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"/> <img src="@/assets/images/empty.png"/>
<p class="text-center text-gray-400">{{ t('emptyMenu') }}</p> <p class="text-center text-gray-400">{{ t('emptyMenu') }}</p>
</div> </div>
@ -80,18 +90,27 @@
</el-card> </el-card>
</div> </div>
<el-dialog v-model="shortcutMenu" :title="t('addShortcutMenu')" width="500px" :destroy-on-close="true"> <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" <el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
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>
<el-form-item :label="t('menuName')" prop="name"> <el-form-item :label="t('menuName')" prop="name">
<el-input v-model="formData.name" clearable class="w-[245px]" :placeholder="t('menuNamePlaceholder')" /> <el-input v-model="formData.name" clearable class="w-[245px]" :placeholder="t('menuNamePlaceholder')" />
</el-form-item> </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"> <el-form-item :label="t('menuBgColor')" prop="bg_color">
<div class="flex items-center"> <div class="flex items-center">
<div class="mr-[8px] p-[4px] rounded-[99px]" :class="formData.bg_color == '#6F77FF' ? 'border-[1px] border-[##DCDFE6]' : '' "> <div class="mr-[8px] p-[4px] rounded-[99px]" :class="formData.bg_color == '#6F77FF' ? 'border-[1px] border-[##DCDFE6]' : '' ">
@ -119,20 +138,12 @@
</div> </div>
</el-form-item> </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"> <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>
<el-form-item :label="t('menuDesc')"> <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-item>
</el-form> </el-form>
@ -179,10 +190,11 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { reactive, ref, computed, onMounted } from 'vue' import { reactive, ref, computed, nextTick } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import { getSiteStatInfo } from '@/api/stat' import { getSiteStatInfo } from '@/api/stat'
import { getService, getShortcutMenu, setShortcutMenu, getAuthMenu } from '@/api/sys' import { getService, getShortcutMenu, setShortcutMenu, getAuthMenu } from '@/api/sys'
import { range } from 'lodash-es'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import Sortable, { SortableEvent } from 'sortablejs' import Sortable, { SortableEvent } from 'sortablejs'
import { useRouter } from 'vue-router' 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:{}}) let statInfo = ref({'today_data':{},system:{},version:{},about:[],visit_stat:{},member_stat:{},site_info:{},total_data:{}})
const getStatInfoFn = async (id: number = 0) => { const getStatInfoFn = async (id: number = 0) => {
statInfo.value = await (await getSiteStatInfo()).data statInfo.value = await (await getSiteStatInfo()).data
loading.value = false;
} }
getStatInfoFn() getStatInfoFn()
@ -236,7 +247,7 @@ const formRules = computed(() => {
icon: [ icon: [
{ required: true, validator: iconPass, trigger: 'blur' } { required: true, validator: iconPass, trigger: 'blur' }
], ],
path: [ router_path: [
{ required: true, validator: pathPass, trigger: 'blur' }, { required: true, validator: pathPass, trigger: 'blur' },
] ]
} }
@ -262,11 +273,11 @@ const showMenu = ref(false)
const shortcut_menu = ref([]); const shortcut_menu = ref([]);
const menu_list = ref() const menu_list = ref()
const is_remove = ref(false) const is_remove = ref(false)
const model_show = ref(false)
const checkMenu = () => { const checkMenu = () => {
getShortcutMenu().then(res=>{ getShortcutMenu().then(res=>{
if(res.data){
shortcut_menu.value = res.data shortcut_menu.value = res.data
} loading.value = false;
}) })
} }
checkMenu() checkMenu()
@ -282,15 +293,20 @@ const addShortcut = async (formEl: FormInstance | undefined) => {
let time = parseInt(new Date().getTime() / 1000) + ''; let time = parseInt(new Date().getTime() / 1000) + '';
let num = Math.floor(Math.random() * (999 - 1) ) + 1; let num = Math.floor(Math.random() * (999 - 1) ) + 1;
// //
if(formData.id > 0){ if(formData.id > 0){
for(let i in data){ for(let i in data){
if(data[i].id == formData.id){ 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({ data.push({
id: formData.id > 0 ? formData.id : time+num, id: formData.id > 0 ? formData.id : time+num,
name: formData.name, name: formData.name,
@ -298,9 +314,11 @@ const addShortcut = async (formEl: FormInstance | undefined) => {
img: formData.img, img: formData.img,
desc: formData.desc, desc: formData.desc,
link_name: formData.link_name, link_name: formData.link_name,
router_path: formData.path, router_path: formData.router_path,
menu_key: formData.menu_key menu_key: formData.menu_key
}) })
}
setShortcutMenu({ setShortcutMenu({
menu: data menu: data
}).then(() =>{ }).then(() =>{
@ -321,9 +339,12 @@ const editModel = (item) => {
formData.link_name = item.link_name, formData.link_name = item.link_name,
formData.router_path = item.router_path, formData.router_path = item.router_path,
formData.menu_key = item.menu_key formData.menu_key = item.menu_key
if(item.menu_key){
model_show.value = true
}
} }
const remowMenu = (item) => { const removeMenu = (item) => {
is_remove.value = true is_remove.value = true
let menu_arr = shortcut_menu.value; let menu_arr = shortcut_menu.value;
for(let i in menu_arr){ for(let i in menu_arr){
@ -337,13 +358,13 @@ const remowMenu = (item) => {
const primary = () => { const primary = () => {
edit_menu.value = false; edit_menu.value = false;
if(!is_remove.value) return if(!is_remove.value) return
if(new_model_arr.value.length > 0) shortcut_menu.value = new_model_arr.value;
setShortcutMenu({ setShortcutMenu({
menu: shortcut_menu.value menu: shortcut_menu.value
}).then(() =>{}) }).then(() =>{})
} }
const showFromMunu = () =>{ const showFromMenu = () =>{
shortcutMenu.value = true shortcutMenu.value = true
model_show.value = false
formData.name = '' formData.name = ''
formData.bg_color = '' formData.bg_color = ''
formData.img = '' formData.img = ''
@ -363,73 +384,35 @@ const selectMenu = (item) => {
formData.router_path = item.router_path formData.router_path = item.router_path
formData.menu_key = item.menu_key formData.menu_key = item.menu_key
showMenu.value = false showMenu.value = false
model_show.value = true
} }
const shortcutModel = ref() 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 = () =>{ const optionModel = () =>{
edit_menu.value = true edit_menu.value = true
setTimeout(() => { setTimeout(() => {
const sortable = Sortable.create(shortcutModel.value, { const sortable = Sortable.create(shortcutModel.value, {
group: { ghostClass: '.design-field',
name: 'design-field',
pull: 'clone',
put: false
},
animation: 200, animation: 200,
onAdd: (evt) => {
console.log("1111")
console.log(evt)
},
onEnd: (evt) => { onEnd: (evt) => {
let new_data = []; let arr = shortcut_menu.value[evt.oldIndex!];
// evt.oldIndex shortcut_menu.value.splice(evt.oldIndex!, 1)
// evt.newIndex shortcut_menu.value.splice(evt.newIndex!, 0, arr)
// 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]) nextTick(() => {
sortable.sort(range(shortcut_menu.value.length).map((value) => value.toString()))
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; is_remove.value = true;
})
} }
}) })
}, 500) }, 500)
@ -450,7 +433,10 @@ const optionModel = () =>{
background-color: rgba(0, 0, 0, 0.10); background-color: rgba(0, 0, 0, 0.10);
} }
.bottom-back { .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 { .delete-item {
top: -8px; top: -8px;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,6 +1,5 @@
<template> <template>
<el-dialog v-model="showDialog" :title="popTitle" width="500px" <el-dialog v-model="showDialog" :title="popTitle" width="500px" :destroy-on-close="true">
: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('labelName')" prop="label_name"> <el-form-item :label="t('labelName')" prop="label_name">
<el-input v-model="formData.label_name" clearable :placeholder="t('labelNamePlaceholder')" class="input-width" /> <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>
<el-form-item :label="t('sex')" v-if="type == 'sex'"> <el-form-item :label="t('sex')" v-if="type == 'sex'">
<el-select v-model="saveData.sex" clearable :placeholder="t('sexPlaceholder')" class="input-width"> <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-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('memberLabel')" v-if="type == 'member_label'"> <el-form-item :label="t('memberLabel')" v-if="type == 'member_label'">
@ -33,7 +33,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, reactive, computed } from 'vue' import { ref, reactive } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { editMemberDetail, getMemberLabelAll } from '@/api/member' import { editMemberDetail, getMemberLabelAll } from '@/api/member'
@ -45,7 +45,7 @@ let title = ref('')
let memberId = ref('') let memberId = ref('')
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
let sexSeleteData = ref([ const sexSelectData = ref([
{ {
id: 0, id: 0,
name: t('secrecySex') name: t('secrecySex')
@ -67,7 +67,6 @@ const getMemberLabelAllFn = async () => {
getMemberLabelAllFn(); getMemberLabelAllFn();
/** /**
* 表单数据 * 表单数据
*/ */

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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