逐步替换代码
This commit is contained in:
parent
c83e3a293b
commit
b870115444
@ -8,4 +8,4 @@ const getEnvUrl = (path: string) => {
|
|||||||
<img :src="getEnvUrl(module.thumb)" :alt="module.title" />
|
<img :src="getEnvUrl(module.thumb)" :alt="module.title" />
|
||||||
|
|
||||||
|
|
||||||
const url = getEnvUrl('/admin/moduleCenter/modules');
|
const url = getEnvUrl('/platform/moduleCenter/modules');
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import request from "@/utils/request";
|
|||||||
// 获取内容统计
|
// 获取内容统计
|
||||||
export function getContentStats() {
|
export function getContentStats() {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/contentstats",
|
url: "/platform/contentstats",
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -12,7 +12,7 @@ export function getContentStats() {
|
|||||||
// 获取用户统计
|
// 获取用户统计
|
||||||
export function getUserStats() {
|
export function getUserStats() {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/usersstats",
|
url: "/platform/usersstats",
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -4,7 +4,7 @@ import request from "@/utils/request";
|
|||||||
// 获取文章列表
|
// 获取文章列表
|
||||||
export function listArticles(params) {
|
export function listArticles(params) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/articlesList`,
|
url: `/platform/articlesList`,
|
||||||
method: "get",
|
method: "get",
|
||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
@ -13,7 +13,7 @@ export function listArticles(params) {
|
|||||||
// 获取文章所有文章
|
// 获取文章所有文章
|
||||||
export function listAllArticles(params) {
|
export function listAllArticles(params) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/allarticles`,
|
url: `/platform/allarticles`,
|
||||||
method: "get",
|
method: "get",
|
||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
@ -22,7 +22,7 @@ export function listAllArticles(params) {
|
|||||||
// 获取文章详情
|
// 获取文章详情
|
||||||
export function getArticle(id) {
|
export function getArticle(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/articles/${id}`,
|
url: `/platform/articles/${id}`,
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -30,7 +30,7 @@ export function getArticle(id) {
|
|||||||
// 创建文章
|
// 创建文章
|
||||||
export function createArticle(data) {
|
export function createArticle(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/createarticle',
|
url: '/platform/createarticle',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -39,7 +39,7 @@ export function createArticle(data) {
|
|||||||
// 编辑文章
|
// 编辑文章
|
||||||
export function editArticle(id, data) {
|
export function editArticle(id, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/editarticle/${id}`,
|
url: `/platform/editarticle/${id}`,
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -48,7 +48,7 @@ export function editArticle(id, data) {
|
|||||||
// 删除文章
|
// 删除文章
|
||||||
export function deleteArticle(id) {
|
export function deleteArticle(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/deletearticle/${id}`,
|
url: `/platform/deletearticle/${id}`,
|
||||||
method: "delete",
|
method: "delete",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -56,7 +56,7 @@ export function deleteArticle(id) {
|
|||||||
// 发布文章
|
// 发布文章
|
||||||
export function publishArticle(id,uid) {
|
export function publishArticle(id,uid) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/publisharticle/${id}`,
|
url: `/platform/publisharticle/${id}`,
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: {
|
data: {
|
||||||
uid
|
uid
|
||||||
@ -67,7 +67,7 @@ export function publishArticle(id,uid) {
|
|||||||
// 下架文章
|
// 下架文章
|
||||||
export function unPublishArticle(id) {
|
export function unPublishArticle(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/unPublisharticle/${id}`,
|
url: `/platform/unPublisharticle/${id}`,
|
||||||
method: 'post'
|
method: 'post'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -75,7 +75,7 @@ export function unPublishArticle(id) {
|
|||||||
// 文章推荐
|
// 文章推荐
|
||||||
export function articleRecommend(id) {
|
export function articleRecommend(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/articleRecommend/${id}`,
|
url: `/platform/articleRecommend/${id}`,
|
||||||
method: 'post'
|
method: 'post'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -83,7 +83,7 @@ export function articleRecommend(id) {
|
|||||||
// 取消文章推荐
|
// 取消文章推荐
|
||||||
export function unArticleRecommend(id) {
|
export function unArticleRecommend(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/unArticleRecommend/${id}`,
|
url: `/platform/unArticleRecommend/${id}`,
|
||||||
method: 'post'
|
method: 'post'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -91,7 +91,7 @@ export function unArticleRecommend(id) {
|
|||||||
// 文章置顶
|
// 文章置顶
|
||||||
export function articleTop(id) {
|
export function articleTop(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/articleTop/${id}`,
|
url: `/platform/articleTop/${id}`,
|
||||||
method: 'post'
|
method: 'post'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -99,7 +99,7 @@ export function articleTop(id) {
|
|||||||
// 取消文章置顶
|
// 取消文章置顶
|
||||||
export function unArticleTop(id) {
|
export function unArticleTop(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/unArticleTop/${id}`,
|
url: `/platform/unArticleTop/${id}`,
|
||||||
method: 'post'
|
method: 'post'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -111,7 +111,7 @@ export function unArticleTop(id) {
|
|||||||
// 获取所有分类列表
|
// 获取所有分类列表
|
||||||
export function allCategories(params) {
|
export function allCategories(params) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/allcategories`,
|
url: `/platform/allcategories`,
|
||||||
method: "get",
|
method: "get",
|
||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
@ -120,7 +120,7 @@ export function allCategories(params) {
|
|||||||
// 获取分类列表
|
// 获取分类列表
|
||||||
export function listCategories(params) {
|
export function listCategories(params) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/categories`,
|
url: `/platform/categories`,
|
||||||
method: "get",
|
method: "get",
|
||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
@ -129,7 +129,7 @@ export function listCategories(params) {
|
|||||||
// 获取分类详情
|
// 获取分类详情
|
||||||
export function getCategory(id) {
|
export function getCategory(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/categories/${id}`,
|
url: `/platform/categories/${id}`,
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -137,7 +137,7 @@ export function getCategory(id) {
|
|||||||
// 创建分类
|
// 创建分类
|
||||||
export function createCategory(data) {
|
export function createCategory(data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/createCategory`,
|
url: `/platform/createCategory`,
|
||||||
method: "post",
|
method: "post",
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -146,7 +146,7 @@ export function createCategory(data) {
|
|||||||
// 更新分类
|
// 更新分类
|
||||||
export function editCategory(id, data) {
|
export function editCategory(id, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/editCategory/${id}`,
|
url: `/platform/editCategory/${id}`,
|
||||||
method: "post",
|
method: "post",
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -155,7 +155,7 @@ export function editCategory(id, data) {
|
|||||||
// 删除分类
|
// 删除分类
|
||||||
export function deleteCategory(id) {
|
export function deleteCategory(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/categories/${id}`,
|
url: `/platform/categories/${id}`,
|
||||||
method: "delete",
|
method: "delete",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -163,7 +163,7 @@ export function deleteCategory(id) {
|
|||||||
// 更新分类状态
|
// 更新分类状态
|
||||||
export function updateCategoryStatus(id, status) {
|
export function updateCategoryStatus(id, status) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/categories/${id}/status`,
|
url: `/platform/categories/${id}/status`,
|
||||||
method: "patch",
|
method: "patch",
|
||||||
data: { status },
|
data: { status },
|
||||||
});
|
});
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import request from "@/utils/request";
|
|||||||
*/
|
*/
|
||||||
export function getBabyList() {
|
export function getBabyList() {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/babys/list',
|
url: '/platform/babys/list',
|
||||||
method: 'get'
|
method: 'get'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -22,7 +22,7 @@ export function getBabyList() {
|
|||||||
*/
|
*/
|
||||||
export function getBabyDetail(id) {
|
export function getBabyDetail(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/babys/${id}`,
|
url: `/platform/babys/${id}`,
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -34,7 +34,7 @@ export function getBabyDetail(id) {
|
|||||||
*/
|
*/
|
||||||
export function createBaby(data) {
|
export function createBaby(data) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/babys",
|
url: "/platform/babys",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: data,
|
data: data,
|
||||||
headers: {
|
headers: {
|
||||||
@ -46,7 +46,7 @@ export function createBaby(data) {
|
|||||||
// 更新宝贝信息
|
// 更新宝贝信息
|
||||||
export function editBaby(id, data) {
|
export function editBaby(id, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/baby/update/${id}`,
|
url: `/platform/baby/update/${id}`,
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: data
|
data: data
|
||||||
});
|
});
|
||||||
@ -59,7 +59,7 @@ export function editBaby(id, data) {
|
|||||||
*/
|
*/
|
||||||
export function deleteBaby(id) {
|
export function deleteBaby(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/babys/${id}`,
|
url: `/platform/babys/${id}`,
|
||||||
method: "delete",
|
method: "delete",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -72,7 +72,7 @@ export function deleteBaby(id) {
|
|||||||
*/
|
*/
|
||||||
export function bindParent(id, data) {
|
export function bindParent(id, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/babys/bindparents/${id}`,
|
url: `/platform/babys/bindparents/${id}`,
|
||||||
method: "post",
|
method: "post",
|
||||||
data: data,
|
data: data,
|
||||||
});
|
});
|
||||||
@ -85,7 +85,7 @@ export function bindParent(id, data) {
|
|||||||
*/
|
*/
|
||||||
export function getParents(id) {
|
export function getParents(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/babys/getParents/${id}`,
|
url: `/platform/babys/getParents/${id}`,
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -100,7 +100,7 @@ export function getParents(id) {
|
|||||||
*/
|
*/
|
||||||
export function getUserList() {
|
export function getUserList() {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/babyhealthUser/list",
|
url: "/platform/babyhealthUser/list",
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -112,7 +112,7 @@ export function getUserList() {
|
|||||||
*/
|
*/
|
||||||
export function getUserDetail(id) {
|
export function getUserDetail(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/babyhealthUser/detail/${id}`,
|
url: `/platform/babyhealthUser/detail/${id}`,
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -124,7 +124,7 @@ export function getUserDetail(id) {
|
|||||||
*/
|
*/
|
||||||
export function createUser(data) {
|
export function createUser(data) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/babyhealthUser/create",
|
url: "/platform/babyhealthUser/create",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: data,
|
data: data,
|
||||||
headers: {
|
headers: {
|
||||||
@ -141,7 +141,7 @@ export function createUser(data) {
|
|||||||
*/
|
*/
|
||||||
export function updateUser(id, data) {
|
export function updateUser(id, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/babyhealthUser/update/${id}`,
|
url: `/platform/babyhealthUser/update/${id}`,
|
||||||
method: "post",
|
method: "post",
|
||||||
data: data,
|
data: data,
|
||||||
headers: {
|
headers: {
|
||||||
@ -157,7 +157,7 @@ export function updateUser(id, data) {
|
|||||||
*/
|
*/
|
||||||
export function deleteUser(id) {
|
export function deleteUser(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/babyhealthUser/delete/${id}`,
|
url: `/platform/babyhealthUser/delete/${id}`,
|
||||||
method: "delete",
|
method: "delete",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -173,7 +173,7 @@ export function deleteUser(id) {
|
|||||||
*/
|
*/
|
||||||
export function getDashborad() {
|
export function getDashborad() {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/babyhealthDashborad/dashborad",
|
url: "/platform/babyhealthDashborad/dashborad",
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -6,7 +6,7 @@ import request from "@/utils/request";
|
|||||||
*/
|
*/
|
||||||
export function getBanners() {
|
export function getBanners() {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/allbanners",
|
url: "/platform/allbanners",
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -18,7 +18,7 @@ export function getBanners() {
|
|||||||
*/
|
*/
|
||||||
export function createBanner(formData) {
|
export function createBanner(formData) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/createbanner",
|
url: "/platform/createbanner",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: formData,
|
data: formData,
|
||||||
headers: {
|
headers: {
|
||||||
@ -35,7 +35,7 @@ export function createBanner(formData) {
|
|||||||
*/
|
*/
|
||||||
export function editBanner(id, bannerData) {
|
export function editBanner(id, bannerData) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/editbanner/${id}`,
|
url: `/platform/editbanner/${id}`,
|
||||||
method: "post",
|
method: "post",
|
||||||
data: bannerData,
|
data: bannerData,
|
||||||
});
|
});
|
||||||
@ -48,7 +48,7 @@ export function editBanner(id, bannerData) {
|
|||||||
*/
|
*/
|
||||||
export function deleteBanner(id) {
|
export function deleteBanner(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/deletebanner/${id}`,
|
url: `/platform/deletebanner/${id}`,
|
||||||
method: "delete",
|
method: "delete",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import request from '@/utils/request'
|
|||||||
|
|
||||||
export function listContacts(params) {
|
export function listContacts(params) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/crm/contact/list',
|
url: '/platform/crm/contact/list',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params,
|
params,
|
||||||
})
|
})
|
||||||
@ -10,7 +10,7 @@ export function listContacts(params) {
|
|||||||
|
|
||||||
export function createContact(data) {
|
export function createContact(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/crm/contact/add',
|
url: '/platform/crm/contact/add',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data,
|
data,
|
||||||
})
|
})
|
||||||
@ -18,7 +18,7 @@ export function createContact(data) {
|
|||||||
|
|
||||||
export function updateContact(data) {
|
export function updateContact(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/crm/contact/edit',
|
url: '/platform/crm/contact/edit',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data,
|
data,
|
||||||
})
|
})
|
||||||
@ -26,7 +26,7 @@ export function updateContact(data) {
|
|||||||
|
|
||||||
export function deleteContact(data) {
|
export function deleteContact(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/crm/contact/delete',
|
url: '/platform/crm/contact/delete',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data,
|
data,
|
||||||
})
|
})
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import request from "@/utils/request";
|
|||||||
*/
|
*/
|
||||||
export function getPlatformStats() {
|
export function getPlatformStats() {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/dashboard/platform-stats",
|
url: "/platform/dashboard/platform-stats",
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -17,7 +17,7 @@ export function getPlatformStats() {
|
|||||||
*/
|
*/
|
||||||
export function getTenantStats() {
|
export function getTenantStats() {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/dashboard/tenant-stats",
|
url: "/platform/dashboard/tenant-stats",
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -30,7 +30,7 @@ export function getTenantStats() {
|
|||||||
*/
|
*/
|
||||||
export function getActivityLogs(pageNum = 1, pageSize = 10) {
|
export function getActivityLogs(pageNum = 1, pageSize = 10) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/dashboard/user-activity-logs",
|
url: "/platform/dashboard/user-activity-logs",
|
||||||
method: "get",
|
method: "get",
|
||||||
params: {
|
params: {
|
||||||
page_num: pageNum,
|
page_num: pageNum,
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import request from "@/utils/request";
|
|||||||
*/
|
*/
|
||||||
export function getDemandList() {
|
export function getDemandList() {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/demandList",
|
url: "/platform/demandList",
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -18,7 +18,7 @@ export function getDemandList() {
|
|||||||
*/
|
*/
|
||||||
export function addDemand(data) {
|
export function addDemand(data) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/addDemand",
|
url: "/platform/addDemand",
|
||||||
method: "post",
|
method: "post",
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -32,7 +32,7 @@ export function addDemand(data) {
|
|||||||
*/
|
*/
|
||||||
export function editDemand(id, data) {
|
export function editDemand(id, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/editDemand/${id}`,
|
url: `/platform/editDemand/${id}`,
|
||||||
method: "post",
|
method: "post",
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -45,7 +45,7 @@ export function editDemand(id, data) {
|
|||||||
*/
|
*/
|
||||||
export function deleteDemand(id) {
|
export function deleteDemand(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/deleteDemand/${id}`,
|
url: `/platform/deleteDemand/${id}`,
|
||||||
method: "post",
|
method: "post",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import request from '@/utils/request';
|
|||||||
// 获取租户下的所有部门
|
// 获取租户下的所有部门
|
||||||
export function getTenantDepartments(tenantId) {
|
export function getTenantDepartments(tenantId) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/departments/tenant/${tenantId}`,
|
url: `/platform/departments/tenant/${tenantId}`,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -11,7 +11,7 @@ export function getTenantDepartments(tenantId) {
|
|||||||
// 获取部门详情
|
// 获取部门详情
|
||||||
export function getDepartmentInfo(departmentId) {
|
export function getDepartmentInfo(departmentId) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/departments/${departmentId}`,
|
url: `/platform/departments/${departmentId}`,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -19,7 +19,7 @@ export function getDepartmentInfo(departmentId) {
|
|||||||
// 添加部门
|
// 添加部门
|
||||||
export function addDepartment(data) {
|
export function addDepartment(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/departments',
|
url: '/platform/departments',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -28,7 +28,7 @@ export function addDepartment(data) {
|
|||||||
// 更新部门信息
|
// 更新部门信息
|
||||||
export function editDepartment(departmentId, data) {
|
export function editDepartment(departmentId, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/departments/${departmentId}`,
|
url: `/platform/departments/${departmentId}`,
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -37,7 +37,7 @@ export function editDepartment(departmentId, data) {
|
|||||||
// 删除部门
|
// 删除部门
|
||||||
export function deleteDepartment(departmentId) {
|
export function deleteDepartment(departmentId) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/departments/${departmentId}`,
|
url: `/platform/departments/${departmentId}`,
|
||||||
method: 'delete',
|
method: 'delete',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import request from '@/utils/request'
|
|||||||
// 获取字典类型列表
|
// 获取字典类型列表
|
||||||
export function getDictTypes(params) {
|
export function getDictTypes(params) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dict/types',
|
url: '/platform/dict/types',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
@ -12,7 +12,7 @@ export function getDictTypes(params) {
|
|||||||
// 根据ID获取字典类型
|
// 根据ID获取字典类型
|
||||||
export function getDictTypeById(id) {
|
export function getDictTypeById(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/dict/types/${id}`,
|
url: `/platform/dict/types/${id}`,
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -20,7 +20,7 @@ export function getDictTypeById(id) {
|
|||||||
// 添加字典类型
|
// 添加字典类型
|
||||||
export function addDictType(data) {
|
export function addDictType(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dict/types',
|
url: '/platform/dict/types',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: {
|
data: {
|
||||||
...data,
|
...data,
|
||||||
@ -32,7 +32,7 @@ export function addDictType(data) {
|
|||||||
// 更新字典类型
|
// 更新字典类型
|
||||||
export function updateDictType(id, data) {
|
export function updateDictType(id, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/dict/types/${id}`,
|
url: `/platform/dict/types/${id}`,
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data: {
|
data: {
|
||||||
...data,
|
...data,
|
||||||
@ -44,7 +44,7 @@ export function updateDictType(id, data) {
|
|||||||
// 删除字典类型
|
// 删除字典类型
|
||||||
export function deleteDictType(id) {
|
export function deleteDictType(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/dict/types/${id}`,
|
url: `/platform/dict/types/${id}`,
|
||||||
method: 'delete'
|
method: 'delete'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -52,7 +52,7 @@ export function deleteDictType(id) {
|
|||||||
// 获取字典项列表
|
// 获取字典项列表
|
||||||
export function getDictItems(params) {
|
export function getDictItems(params) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dict/items',
|
url: '/platform/dict/items',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
@ -61,7 +61,7 @@ export function getDictItems(params) {
|
|||||||
// 根据ID获取字典项
|
// 根据ID获取字典项
|
||||||
export function getDictItemById(id) {
|
export function getDictItemById(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/dict/items/${id}`,
|
url: `/platform/dict/items/${id}`,
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -69,7 +69,7 @@ export function getDictItemById(id) {
|
|||||||
// 添加字典项
|
// 添加字典项
|
||||||
export function addDictItem(data) {
|
export function addDictItem(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dict/items',
|
url: '/platform/dict/items',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
@ -78,7 +78,7 @@ export function addDictItem(data) {
|
|||||||
// 更新字典项
|
// 更新字典项
|
||||||
export function updateDictItem(id, data) {
|
export function updateDictItem(id, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/dict/items/${id}`,
|
url: `/platform/dict/items/${id}`,
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
@ -87,7 +87,7 @@ export function updateDictItem(id, data) {
|
|||||||
// 删除字典项
|
// 删除字典项
|
||||||
export function deleteDictItem(id) {
|
export function deleteDictItem(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/dict/items/${id}`,
|
url: `/platform/dict/items/${id}`,
|
||||||
method: 'delete'
|
method: 'delete'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -95,7 +95,7 @@ export function deleteDictItem(id) {
|
|||||||
// 根据字典编码获取字典项(用于业务查询)
|
// 根据字典编码获取字典项(用于业务查询)
|
||||||
export function getDictItemsByCode(code, includeDisabled = false) {
|
export function getDictItemsByCode(code, includeDisabled = false) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/dict/items/code/${code}`,
|
url: `/platform/dict/items/code/${code}`,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params: {
|
params: {
|
||||||
include_disabled: includeDisabled ? '1' : '0'
|
include_disabled: includeDisabled ? '1' : '0'
|
||||||
@ -106,7 +106,7 @@ export function getDictItemsByCode(code, includeDisabled = false) {
|
|||||||
// 批量更新字典项排序
|
// 批量更新字典项排序
|
||||||
export function batchUpdateDictItemSort(data) {
|
export function batchUpdateDictItemSort(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dict/items/sort',
|
url: '/platform/dict/items/sort',
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import request from '@/utils/request'
|
|||||||
// 获取域名池列表
|
// 获取域名池列表
|
||||||
export function getDomainPoolList(params) {
|
export function getDomainPoolList(params) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/domain/pool/index',
|
url: '/platform/domain/pool/index',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
@ -14,7 +14,7 @@ export function getDomainPoolList(params) {
|
|||||||
// 获取启用的主域名列表
|
// 获取启用的主域名列表
|
||||||
export function getEnabledDomains() {
|
export function getEnabledDomains() {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/domain/pool/getEnabledDomains',
|
url: '/platform/domain/pool/getEnabledDomains',
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -22,7 +22,7 @@ export function getEnabledDomains() {
|
|||||||
// 创建主域名
|
// 创建主域名
|
||||||
export function createDomainPool(data) {
|
export function createDomainPool(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/domain/pool/create',
|
url: '/platform/domain/pool/create',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
@ -31,7 +31,7 @@ export function createDomainPool(data) {
|
|||||||
// 更新主域名
|
// 更新主域名
|
||||||
export function updateDomainPool(data) {
|
export function updateDomainPool(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/domain/pool/update',
|
url: '/platform/domain/pool/update',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
@ -40,7 +40,7 @@ export function updateDomainPool(data) {
|
|||||||
// 删除主域名
|
// 删除主域名
|
||||||
export function deleteDomainPool(id) {
|
export function deleteDomainPool(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/domain/pool/delete/${id}`,
|
url: `/platform/domain/pool/delete/${id}`,
|
||||||
method: 'delete'
|
method: 'delete'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -48,7 +48,7 @@ export function deleteDomainPool(id) {
|
|||||||
// 切换主域名状态
|
// 切换主域名状态
|
||||||
export function toggleDomainPoolStatus(id) {
|
export function toggleDomainPoolStatus(id) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/domain/pool/toggleStatus',
|
url: '/platform/domain/pool/toggleStatus',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: { id }
|
data: { id }
|
||||||
})
|
})
|
||||||
@ -59,7 +59,7 @@ export function toggleDomainPoolStatus(id) {
|
|||||||
// 获取租户域名列表(管理员)
|
// 获取租户域名列表(管理员)
|
||||||
export function getTenantDomainList(params) {
|
export function getTenantDomainList(params) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/domain/tenant/index',
|
url: '/platform/domain/tenant/index',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
@ -68,7 +68,7 @@ export function getTenantDomainList(params) {
|
|||||||
// 获取当前租户的域名列表
|
// 获取当前租户的域名列表
|
||||||
export function getMyDomains(params) {
|
export function getMyDomains(params) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/domain/tenant/myDomains',
|
url: '/platform/domain/tenant/myDomains',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
@ -77,7 +77,7 @@ export function getMyDomains(params) {
|
|||||||
// 申请二级域名
|
// 申请二级域名
|
||||||
export function applyTenantDomain(data) {
|
export function applyTenantDomain(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/domain/tenant/apply',
|
url: '/platform/domain/tenant/apply',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
@ -86,7 +86,7 @@ export function applyTenantDomain(data) {
|
|||||||
// 审核租户域名
|
// 审核租户域名
|
||||||
export function auditTenantDomain(data) {
|
export function auditTenantDomain(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/domain/tenant/audit',
|
url: '/platform/domain/tenant/audit',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
@ -95,7 +95,7 @@ export function auditTenantDomain(data) {
|
|||||||
// 禁用/启用租户域名
|
// 禁用/启用租户域名
|
||||||
export function toggleTenantDomainStatus(id) {
|
export function toggleTenantDomainStatus(id) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/domain/tenant/toggleStatus',
|
url: '/platform/domain/tenant/toggleStatus',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: { id }
|
data: { id }
|
||||||
})
|
})
|
||||||
@ -104,7 +104,7 @@ export function toggleTenantDomainStatus(id) {
|
|||||||
// 删除租户域名
|
// 删除租户域名
|
||||||
export function deleteTenantDomain(id) {
|
export function deleteTenantDomain(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/domain/tenant/delete/${id}`,
|
url: `/platform/domain/tenant/delete/${id}`,
|
||||||
method: 'delete'
|
method: 'delete'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import request from "@/utils/request";
|
|||||||
*/
|
*/
|
||||||
export function getEmailInfo() {
|
export function getEmailInfo() {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/email/info",
|
url: "/platform/email/info",
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -17,7 +17,7 @@ export function getEmailInfo() {
|
|||||||
*/
|
*/
|
||||||
export function editEmailInfo(data) {
|
export function editEmailInfo(data) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/email/editinfo",
|
url: "/platform/email/editinfo",
|
||||||
method: "post",
|
method: "post",
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -29,7 +29,7 @@ export function editEmailInfo(data) {
|
|||||||
*/
|
*/
|
||||||
export function sendTestEmail(data) {
|
export function sendTestEmail(data) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/email/sendtestemail",
|
url: "/platform/email/sendtestemail",
|
||||||
method: "post",
|
method: "post",
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import request from "@/utils/request";
|
|||||||
*/
|
*/
|
||||||
export function getOrganizationList() {
|
export function getOrganizationList() {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/erp/getOrganization',
|
url: '/platform/erp/getOrganization',
|
||||||
method: 'get'
|
method: 'get'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -22,7 +22,7 @@ export function getOrganizationList() {
|
|||||||
*/
|
*/
|
||||||
export function getOrganizationDetail(id) {
|
export function getOrganizationDetail(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/erp/getOrganizationDetail/${id}`,
|
url: `/platform/erp/getOrganizationDetail/${id}`,
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -34,7 +34,7 @@ export function getOrganizationDetail(id) {
|
|||||||
*/
|
*/
|
||||||
export function createOrganization(data) {
|
export function createOrganization(data) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/erp/createOrganization",
|
url: "/platform/erp/createOrganization",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: data,
|
data: data,
|
||||||
headers: {
|
headers: {
|
||||||
@ -46,7 +46,7 @@ export function createOrganization(data) {
|
|||||||
// 更新组织机构信息
|
// 更新组织机构信息
|
||||||
export function editOrganization(id, data) {
|
export function editOrganization(id, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/erp/editOrganization/${id}`,
|
url: `/platform/erp/editOrganization/${id}`,
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: data
|
data: data
|
||||||
});
|
});
|
||||||
@ -59,7 +59,7 @@ export function editOrganization(id, data) {
|
|||||||
*/
|
*/
|
||||||
export function deleteOrganization(id) {
|
export function deleteOrganization(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/erp/deleteOrganization/${id}`,
|
url: `/platform/erp/deleteOrganization/${id}`,
|
||||||
method: "delete",
|
method: "delete",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -70,7 +70,7 @@ export function deleteOrganization(id) {
|
|||||||
*/
|
*/
|
||||||
export function getCompanys() {
|
export function getCompanys() {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/erp/getCompanys',
|
url: '/platform/erp/getCompanys',
|
||||||
method: 'get'
|
method: 'get'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -82,7 +82,7 @@ export function getCompanys() {
|
|||||||
*/
|
*/
|
||||||
export function getDepartments(parentId) {
|
export function getDepartments(parentId) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/erp/getDepartments',
|
url: '/platform/erp/getDepartments',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params: parentId ? { parent_id: parentId } : {}
|
params: parentId ? { parent_id: parentId } : {}
|
||||||
});
|
});
|
||||||
@ -99,7 +99,7 @@ export function getDepartments(parentId) {
|
|||||||
*/
|
*/
|
||||||
export function getEmployeeList(tenantId) {
|
export function getEmployeeList(tenantId) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/erp/getEmployee',
|
url: '/platform/erp/getEmployee',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params: { tid: tenantId }
|
params: { tid: tenantId }
|
||||||
});
|
});
|
||||||
@ -112,7 +112,7 @@ export function getEmployeeList(tenantId) {
|
|||||||
*/
|
*/
|
||||||
export function getEmployeeDetail(id) {
|
export function getEmployeeDetail(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/erp/getEmployeeDetail/${id}`,
|
url: `/platform/erp/getEmployeeDetail/${id}`,
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -124,7 +124,7 @@ export function getEmployeeDetail(id) {
|
|||||||
*/
|
*/
|
||||||
export function createEmployee(data) {
|
export function createEmployee(data) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/erp/createEmployee",
|
url: "/platform/erp/createEmployee",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: data,
|
data: data,
|
||||||
headers: {
|
headers: {
|
||||||
@ -136,7 +136,7 @@ export function createEmployee(data) {
|
|||||||
// 更新员工信息
|
// 更新员工信息
|
||||||
export function editEmployee(id, data) {
|
export function editEmployee(id, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/erp/editEmployee/${id}`,
|
url: `/platform/erp/editEmployee/${id}`,
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: data
|
data: data
|
||||||
});
|
});
|
||||||
@ -149,7 +149,7 @@ export function editEmployee(id, data) {
|
|||||||
*/
|
*/
|
||||||
export function deleteEmployee(id) {
|
export function deleteEmployee(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/erp/deleteEmployee/${id}`,
|
url: `/platform/erp/deleteEmployee/${id}`,
|
||||||
method: "delete",
|
method: "delete",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import request from "@/utils/request";
|
|||||||
*/
|
*/
|
||||||
export function getUserCate() {
|
export function getUserCate() {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/usercate`,
|
url: `/platform/usercate`,
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -17,7 +17,7 @@ export function getUserCate() {
|
|||||||
*/
|
*/
|
||||||
export function getAllFiles() {
|
export function getAllFiles() {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/allfiles",
|
url: "/platform/allfiles",
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -29,7 +29,7 @@ export function getAllFiles() {
|
|||||||
*/
|
*/
|
||||||
export function createFileCate(data) {
|
export function createFileCate(data) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/createfilecate",
|
url: "/platform/createfilecate",
|
||||||
method: "post",
|
method: "post",
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -43,7 +43,7 @@ export function createFileCate(data) {
|
|||||||
*/
|
*/
|
||||||
export function renameFileCate(id, data) {
|
export function renameFileCate(id, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/renamefilecate/${id}`,
|
url: `/platform/renamefilecate/${id}`,
|
||||||
method: "post",
|
method: "post",
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -56,7 +56,7 @@ export function renameFileCate(id, data) {
|
|||||||
*/
|
*/
|
||||||
export function deleteFileCate(id) {
|
export function deleteFileCate(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/deletefilecate/${id}`,
|
url: `/platform/deletefilecate/${id}`,
|
||||||
method: "delete",
|
method: "delete",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -78,7 +78,7 @@ export function getCateFiles(id, page = 1, pageSize = 24, keyword = "") {
|
|||||||
params.keyword = keyword;
|
params.keyword = keyword;
|
||||||
}
|
}
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/catefiles/${id}`,
|
url: `/platform/catefiles/${id}`,
|
||||||
method: "get",
|
method: "get",
|
||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
@ -91,7 +91,7 @@ export function getCateFiles(id, page = 1, pageSize = 24, keyword = "") {
|
|||||||
*/
|
*/
|
||||||
export function getFileById(id) {
|
export function getFileById(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/catefiles`,
|
url: `/platform/catefiles`,
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -109,7 +109,7 @@ export function uploadFile(formData, options = {}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/uploadfile",
|
url: "/platform/uploadfile",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: formData,
|
data: formData,
|
||||||
headers: {
|
headers: {
|
||||||
@ -126,7 +126,7 @@ export function uploadFile(formData, options = {}) {
|
|||||||
*/
|
*/
|
||||||
export function updateFile(id, fileData) {
|
export function updateFile(id, fileData) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/updatefile/${id}`,
|
url: `/platform/updatefile/${id}`,
|
||||||
method: "post",
|
method: "post",
|
||||||
data: fileData,
|
data: fileData,
|
||||||
});
|
});
|
||||||
@ -139,7 +139,7 @@ export function updateFile(id, fileData) {
|
|||||||
*/
|
*/
|
||||||
export function deleteFile(id) {
|
export function deleteFile(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/deletefile/${id}`,
|
url: `/platform/deletefile/${id}`,
|
||||||
method: "delete",
|
method: "delete",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -151,7 +151,7 @@ export function deleteFile(id) {
|
|||||||
*/
|
*/
|
||||||
export function deleteFilePermanently(id) {
|
export function deleteFilePermanently(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/deleteFilePermanently/${id}`,
|
url: `/platform/deleteFilePermanently/${id}`,
|
||||||
method: "delete",
|
method: "delete",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -164,7 +164,7 @@ export function deleteFilePermanently(id) {
|
|||||||
*/
|
*/
|
||||||
export function moveFile(id, cate) {
|
export function moveFile(id, cate) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/movefile/${id}`,
|
url: `/platform/movefile/${id}`,
|
||||||
method: "get",
|
method: "get",
|
||||||
params: { cate },
|
params: { cate },
|
||||||
});
|
});
|
||||||
@ -177,7 +177,7 @@ export function moveFile(id, cate) {
|
|||||||
*/
|
*/
|
||||||
export function batchDeleteFiles(ids) {
|
export function batchDeleteFiles(ids) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/batchDeleteFiles",
|
url: "/platform/batchDeleteFiles",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: { ids },
|
data: { ids },
|
||||||
});
|
});
|
||||||
@ -190,7 +190,7 @@ export function batchDeleteFiles(ids) {
|
|||||||
*/
|
*/
|
||||||
export function batchDeleteFilesPermanently(ids) {
|
export function batchDeleteFilesPermanently(ids) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/batchDeleteFilesPermanently",
|
url: "/platform/batchDeleteFilesPermanently",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: { ids },
|
data: { ids },
|
||||||
});
|
});
|
||||||
@ -204,7 +204,7 @@ export function batchDeleteFilesPermanently(ids) {
|
|||||||
*/
|
*/
|
||||||
export function batchMoveFiles(ids, cate) {
|
export function batchMoveFiles(ids, cate) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/batchMoveFiles",
|
url: "/platform/batchMoveFiles",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: { ids, cate },
|
data: { ids, cate },
|
||||||
});
|
});
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import request from '@/utils/request'
|
|||||||
*/
|
*/
|
||||||
export function getFriendlinkList(params) {
|
export function getFriendlinkList(params) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/friendlinks',
|
url: '/platform/friendlinks',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
@ -19,7 +19,7 @@ export function getFriendlinkList(params) {
|
|||||||
*/
|
*/
|
||||||
export function getAllFriendlinks() {
|
export function getAllFriendlinks() {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/friendlinks/all',
|
url: '/platform/friendlinks/all',
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -31,7 +31,7 @@ export function getAllFriendlinks() {
|
|||||||
*/
|
*/
|
||||||
export function addFriendlink(data) {
|
export function addFriendlink(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/friendlinks',
|
url: '/platform/friendlinks',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
@ -45,7 +45,7 @@ export function addFriendlink(data) {
|
|||||||
*/
|
*/
|
||||||
export function updateFriendlink(id, data) {
|
export function updateFriendlink(id, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/friendlinks/${id}`,
|
url: `/platform/friendlinks/${id}`,
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
@ -58,7 +58,7 @@ export function updateFriendlink(id, data) {
|
|||||||
*/
|
*/
|
||||||
export function deleteFriendlink(id) {
|
export function deleteFriendlink(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/friendlinks/${id}`,
|
url: `/platform/friendlinks/${id}`,
|
||||||
method: 'delete'
|
method: 'delete'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -70,7 +70,7 @@ export function deleteFriendlink(id) {
|
|||||||
*/
|
*/
|
||||||
export function batchDeleteFriendlinks(ids) {
|
export function batchDeleteFriendlinks(ids) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/friendlinks/batchdelete',
|
url: '/platform/friendlinks/batchdelete',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: { ids }
|
data: { ids }
|
||||||
})
|
})
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import request from "@/utils/request";
|
|||||||
*/
|
*/
|
||||||
export function getFrontMenus() {
|
export function getFrontMenus() {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/frontmenus",
|
url: "/platform/frontmenus",
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -18,7 +18,7 @@ export function getFrontMenus() {
|
|||||||
*/
|
*/
|
||||||
export function createFrontMenu(formData, options = {}) {
|
export function createFrontMenu(formData, options = {}) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/createfrontmenu",
|
url: "/platform/createfrontmenu",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: formData,
|
data: formData,
|
||||||
headers: {
|
headers: {
|
||||||
@ -35,7 +35,7 @@ export function createFrontMenu(formData, options = {}) {
|
|||||||
*/
|
*/
|
||||||
export function editFrontMenu(id, frontMenuData) {
|
export function editFrontMenu(id, frontMenuData) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/editfrontmenu/${id}`,
|
url: `/platform/editfrontmenu/${id}`,
|
||||||
method: "post",
|
method: "post",
|
||||||
data: frontMenuData,
|
data: frontMenuData,
|
||||||
});
|
});
|
||||||
@ -48,7 +48,7 @@ export function editFrontMenu(id, frontMenuData) {
|
|||||||
*/
|
*/
|
||||||
export function deleteFrontMenu(id) {
|
export function deleteFrontMenu(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/deletefrontmenu/${id}`,
|
url: `/platform/deletefrontmenu/${id}`,
|
||||||
method: "delete",
|
method: "delete",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,17 +1,18 @@
|
|||||||
import request from "@/utils/request";
|
import request from "@/utils/request";
|
||||||
|
|
||||||
// 获取所有菜单
|
// 获取所有菜单
|
||||||
export function getAllMenus() {
|
export function getAllMenus(params) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/allmenu`,
|
url: `/platform/allmenu`,
|
||||||
method: "get",
|
method: "get",
|
||||||
|
params,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
//获取用户菜单
|
//获取用户菜单
|
||||||
export function getMenus(id){
|
export function getMenus(id){
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/menu/${parseInt(id)}`,
|
url: `/platform/menu/${parseInt(id)}`,
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -19,7 +20,7 @@ export function getMenus(id){
|
|||||||
// 更新菜单状态
|
// 更新菜单状态
|
||||||
export function updateMenuStatus(menuId, status) {
|
export function updateMenuStatus(menuId, status) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/menu/status/${menuId}`,
|
url: `/platform/menu/status/${menuId}`,
|
||||||
method: "patch",
|
method: "patch",
|
||||||
data: { status },
|
data: { status },
|
||||||
});
|
});
|
||||||
@ -28,7 +29,7 @@ export function updateMenuStatus(menuId, status) {
|
|||||||
// 创建菜单
|
// 创建菜单
|
||||||
export function createMenu(menuData) {
|
export function createMenu(menuData) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/createmenu`,
|
url: `/platform/createmenu`,
|
||||||
method: "post",
|
method: "post",
|
||||||
data: menuData,
|
data: menuData,
|
||||||
});
|
});
|
||||||
@ -37,7 +38,7 @@ export function createMenu(menuData) {
|
|||||||
// 更新菜单
|
// 更新菜单
|
||||||
export function updateMenu(menuId, menuData) {
|
export function updateMenu(menuId, menuData) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/updatemenu/${menuId}`,
|
url: `/platform/updatemenu/${menuId}`,
|
||||||
method: "put",
|
method: "put",
|
||||||
data: menuData,
|
data: menuData,
|
||||||
});
|
});
|
||||||
@ -46,7 +47,7 @@ export function updateMenu(menuId, menuData) {
|
|||||||
// 删除菜单
|
// 删除菜单
|
||||||
export function deleteMenu(menuId) {
|
export function deleteMenu(menuId) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/deletemenu/${menuId}`,
|
url: `/platform/deletemenu/${menuId}`,
|
||||||
method: "delete",
|
method: "delete",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import request from "@/utils/request";
|
|||||||
*/
|
*/
|
||||||
export function getModuleCategory() {
|
export function getModuleCategory() {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/moduleCategory",
|
url: "/platform/moduleCategory",
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -18,7 +18,7 @@ export function getModuleCategory() {
|
|||||||
*/
|
*/
|
||||||
export function getModules(cid) {
|
export function getModules(cid) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/moduleCenter/modules",
|
url: "/platform/moduleCenter/modules",
|
||||||
method: "get",
|
method: "get",
|
||||||
params: { cid }
|
params: { cid }
|
||||||
});
|
});
|
||||||
@ -34,7 +34,7 @@ export function getModules(cid) {
|
|||||||
*/
|
*/
|
||||||
export function editModuleCategory(data) {
|
export function editModuleCategory(data) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/moduleCenter/editCategory",
|
url: "/platform/moduleCenter/editCategory",
|
||||||
method: "post",
|
method: "post",
|
||||||
data
|
data
|
||||||
});
|
});
|
||||||
@ -50,7 +50,7 @@ export function editModuleCategory(data) {
|
|||||||
*/
|
*/
|
||||||
export function editModules(data) {
|
export function editModules(data) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/moduleCenter/editModules",
|
url: "/platform/moduleCenter/editModules",
|
||||||
method: "post",
|
method: "post",
|
||||||
data
|
data
|
||||||
});
|
});
|
||||||
|
|||||||
@ -2,28 +2,28 @@ import request from '@/utils/request';
|
|||||||
|
|
||||||
export function getModulesList() {
|
export function getModulesList() {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/modules/list',
|
url: '/platform/modules/list',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getTenantList() {
|
export function getTenantList() {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/modules/getTenantList',
|
url: '/platform/modules/getTenantList',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getModuleDetail(id) {
|
export function getModuleDetail(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/modules/${id}`,
|
url: `/platform/modules/${id}`,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function addModule(data) {
|
export function addModule(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/modules',
|
url: '/platform/modules',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -31,7 +31,7 @@ export function addModule(data) {
|
|||||||
|
|
||||||
export function editModule(id, data) {
|
export function editModule(id, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/modules/${id}`,
|
url: `/platform/modules/${id}`,
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -39,14 +39,14 @@ export function editModule(id, data) {
|
|||||||
|
|
||||||
export function deleteModule(id) {
|
export function deleteModule(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/modules/${id}`,
|
url: `/platform/modules/${id}`,
|
||||||
method: 'delete',
|
method: 'delete',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function batchDeleteModules(ids) {
|
export function batchDeleteModules(ids) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/modules/batchDelete',
|
url: '/platform/modules/batchDelete',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: { ids },
|
data: { ids },
|
||||||
});
|
});
|
||||||
@ -54,7 +54,7 @@ export function batchDeleteModules(ids) {
|
|||||||
|
|
||||||
export function changeModuleStatus(id, status) {
|
export function changeModuleStatus(id, status) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/modules/status',
|
url: '/platform/modules/status',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: { id, status },
|
data: { id, status },
|
||||||
});
|
});
|
||||||
@ -62,7 +62,7 @@ export function changeModuleStatus(id, status) {
|
|||||||
|
|
||||||
export function getModulesSelectList() {
|
export function getModulesSelectList() {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/modules/select/list',
|
url: '/platform/modules/select/list',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import request from "@/utils/request";
|
|||||||
*/
|
*/
|
||||||
export function getOnePages() {
|
export function getOnePages() {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/allonepages",
|
url: "/platform/allonepages",
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -18,7 +18,7 @@ export function getOnePages() {
|
|||||||
*/
|
*/
|
||||||
export function createOnePage(formData) {
|
export function createOnePage(formData) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/createonepage",
|
url: "/platform/createonepage",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: formData,
|
data: formData,
|
||||||
});
|
});
|
||||||
@ -32,7 +32,7 @@ export function createOnePage(formData) {
|
|||||||
*/
|
*/
|
||||||
export function editOnePage(id, onePageData) {
|
export function editOnePage(id, onePageData) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/editonepage/${id}`,
|
url: `/platform/editonepage/${id}`,
|
||||||
method: "post",
|
method: "post",
|
||||||
data: onePageData,
|
data: onePageData,
|
||||||
});
|
});
|
||||||
@ -45,7 +45,7 @@ export function editOnePage(id, onePageData) {
|
|||||||
*/
|
*/
|
||||||
export function deleteOnePage(id) {
|
export function deleteOnePage(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/deleteonepage/${id}`,
|
url: `/platform/deleteonepage/${id}`,
|
||||||
method: "delete",
|
method: "delete",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import request from "@/utils/request";
|
|||||||
*/
|
*/
|
||||||
export function getOperationLogs(params) {
|
export function getOperationLogs(params) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/operationLogs",
|
url: "/platform/operationLogs",
|
||||||
method: "get",
|
method: "get",
|
||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
@ -28,7 +28,7 @@ export function getOperationLogs(params) {
|
|||||||
*/
|
*/
|
||||||
export function getOperationLogDetail(id) {
|
export function getOperationLogDetail(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/operationLogs/${id}`,
|
url: `/platform/operationLogs/${id}`,
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -40,7 +40,7 @@ export function getOperationLogDetail(id) {
|
|||||||
*/
|
*/
|
||||||
export function deleteOperationLog(id) {
|
export function deleteOperationLog(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/operationLogs/${id}`,
|
url: `/platform/operationLogs/${id}`,
|
||||||
method: "delete",
|
method: "delete",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -52,7 +52,7 @@ export function deleteOperationLog(id) {
|
|||||||
*/
|
*/
|
||||||
export function batchDeleteOperationLogs(ids) {
|
export function batchDeleteOperationLogs(ids) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/operationLogs/batchDelete",
|
url: "/platform/operationLogs/batchDelete",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: { ids },
|
data: { ids },
|
||||||
});
|
});
|
||||||
@ -64,7 +64,7 @@ export function batchDeleteOperationLogs(ids) {
|
|||||||
*/
|
*/
|
||||||
export function getOperationStatistics() {
|
export function getOperationStatistics() {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/operationLogs/statistics",
|
url: "/platform/operationLogs/statistics",
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -2,7 +2,7 @@ import request from '@/utils/request';
|
|||||||
|
|
||||||
export function getAllMenuPermissions(params = {}) {
|
export function getAllMenuPermissions(params = {}) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/allmenupermissions',
|
url: '/platform/allmenupermissions',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
});
|
});
|
||||||
@ -10,14 +10,14 @@ export function getAllMenuPermissions(params = {}) {
|
|||||||
|
|
||||||
export function getRolePermissions(roleId) {
|
export function getRolePermissions(roleId) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/rolepermissions/${roleId}`,
|
url: `/platform/rolepermissions/${roleId}`,
|
||||||
method: 'get'
|
method: 'get'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function assignRolePermissions(roleId, permissions) {
|
export function assignRolePermissions(roleId, permissions) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/assignrolepermissions/${roleId}`,
|
url: `/platform/assignrolepermissions/${roleId}`,
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: { permissions }
|
data: { permissions }
|
||||||
});
|
});
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import request from '@/utils/request';
|
|||||||
// 获取租户下的所有职位
|
// 获取租户下的所有职位
|
||||||
export function getTenantPositions(tenantId) {
|
export function getTenantPositions(tenantId) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/positions/tenant/${tenantId}`,
|
url: `/platform/positions/tenant/${tenantId}`,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -11,7 +11,7 @@ export function getTenantPositions(tenantId) {
|
|||||||
// 根据部门ID获取职位列表
|
// 根据部门ID获取职位列表
|
||||||
export function getPositionsByDepartment(departmentId) {
|
export function getPositionsByDepartment(departmentId) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/positions/department/${departmentId}`,
|
url: `/platform/positions/department/${departmentId}`,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -19,7 +19,7 @@ export function getPositionsByDepartment(departmentId) {
|
|||||||
// 获取职位详情
|
// 获取职位详情
|
||||||
export function getPositionInfo(positionId) {
|
export function getPositionInfo(positionId) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/positions/${positionId}`,
|
url: `/platform/positions/${positionId}`,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -27,7 +27,7 @@ export function getPositionInfo(positionId) {
|
|||||||
// 添加职位
|
// 添加职位
|
||||||
export function addPosition(data) {
|
export function addPosition(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/positions',
|
url: '/platform/positions',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -36,7 +36,7 @@ export function addPosition(data) {
|
|||||||
// 更新职位信息
|
// 更新职位信息
|
||||||
export function editPosition(positionId, data) {
|
export function editPosition(positionId, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/positions/${positionId}`,
|
url: `/platform/positions/${positionId}`,
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -45,7 +45,7 @@ export function editPosition(positionId, data) {
|
|||||||
// 删除职位
|
// 删除职位
|
||||||
export function deletePosition(positionId) {
|
export function deletePosition(positionId) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/positions/${positionId}`,
|
url: `/platform/positions/${positionId}`,
|
||||||
method: 'delete',
|
method: 'delete',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import request from '@/utils/request'
|
|||||||
*/
|
*/
|
||||||
export function getProductsList(params) {
|
export function getProductsList(params) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/productsList',
|
url: '/platform/productsList',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
@ -20,7 +20,7 @@ export function getProductsList(params) {
|
|||||||
*/
|
*/
|
||||||
export function addProducts(data) {
|
export function addProducts(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/addProducts',
|
url: '/platform/addProducts',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
@ -34,7 +34,7 @@ export function addProducts(data) {
|
|||||||
*/
|
*/
|
||||||
export function updateProducts(id, data) {
|
export function updateProducts(id, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/editProducts/${id}`,
|
url: `/platform/editProducts/${id}`,
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
@ -47,7 +47,7 @@ export function updateProducts(id, data) {
|
|||||||
*/
|
*/
|
||||||
export function deleteProducts(id) {
|
export function deleteProducts(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/deleteProducts/${id}`,
|
url: `/platform/deleteProducts/${id}`,
|
||||||
method: 'delete'
|
method: 'delete'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -59,7 +59,7 @@ export function deleteProducts(id) {
|
|||||||
*/
|
*/
|
||||||
export function getProductsTypesList(params) {
|
export function getProductsTypesList(params) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/productsTypesList',
|
url: '/platform/productsTypesList',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
@ -72,7 +72,7 @@ export function getProductsTypesList(params) {
|
|||||||
*/
|
*/
|
||||||
export function addProductsTypes(data) {
|
export function addProductsTypes(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/addProductsTypes',
|
url: '/platform/addProductsTypes',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
@ -86,7 +86,7 @@ export function addProductsTypes(data) {
|
|||||||
*/
|
*/
|
||||||
export function updateProductsTypes(id, data) {
|
export function updateProductsTypes(id, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/editProductsTypes/${id}`,
|
url: `/platform/editProductsTypes/${id}`,
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
@ -99,7 +99,7 @@ export function updateProductsTypes(id, data) {
|
|||||||
*/
|
*/
|
||||||
export function deleteProductsTypes(id) {
|
export function deleteProductsTypes(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/deleteProductsTypes/${id}`,
|
url: `/platform/deleteProductsTypes/${id}`,
|
||||||
method: 'delete'
|
method: 'delete'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,21 +2,21 @@ import request from '@/utils/request'
|
|||||||
|
|
||||||
export function getAllRoles() {
|
export function getAllRoles() {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/allRoles',
|
url: '/platform/allRoles',
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getRoleById(id) {
|
export function getRoleById(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/roles/${id}`,
|
url: `/platform/roles/${id}`,
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function createRole(data) {
|
export function createRole(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/roles',
|
url: '/platform/roles',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
@ -24,7 +24,7 @@ export function createRole(data) {
|
|||||||
|
|
||||||
export function updateRole(id, data) {
|
export function updateRole(id, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/roles/${id}`,
|
url: `/platform/roles/${id}`,
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
@ -32,7 +32,7 @@ export function updateRole(id, data) {
|
|||||||
|
|
||||||
export function deleteRole(id) {
|
export function deleteRole(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/roles/${id}`,
|
url: `/platform/roles/${id}`,
|
||||||
method: 'delete'
|
method: 'delete'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import request from '@/utils/request'
|
|||||||
*/
|
*/
|
||||||
export function getServiceList(params) {
|
export function getServiceList(params) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/servicesList',
|
url: '/platform/servicesList',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
@ -20,7 +20,7 @@ export function getServiceList(params) {
|
|||||||
*/
|
*/
|
||||||
export function addService(data) {
|
export function addService(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/addServices',
|
url: '/platform/addServices',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
@ -34,7 +34,7 @@ export function addService(data) {
|
|||||||
*/
|
*/
|
||||||
export function updateService(id, data) {
|
export function updateService(id, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/editServices/${id}`,
|
url: `/platform/editServices/${id}`,
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
@ -47,7 +47,7 @@ export function updateService(id, data) {
|
|||||||
*/
|
*/
|
||||||
export function deleteService(id) {
|
export function deleteService(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/deleteServices/${id}`,
|
url: `/platform/deleteServices/${id}`,
|
||||||
method: 'delete'
|
method: 'delete'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import request from "@/utils/request";
|
|||||||
*/
|
*/
|
||||||
export function getNormalInfos(tid) {
|
export function getNormalInfos(tid) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/normalInfos",
|
url: "/platform/normalInfos",
|
||||||
method: "get",
|
method: "get",
|
||||||
params: { tid }
|
params: { tid }
|
||||||
});
|
});
|
||||||
@ -20,7 +20,7 @@ export function getNormalInfos(tid) {
|
|||||||
*/
|
*/
|
||||||
export function saveNormalInfos(data) {
|
export function saveNormalInfos(data) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/saveNormalInfos",
|
url: "/platform/saveNormalInfos",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: data,
|
data: data,
|
||||||
});
|
});
|
||||||
@ -32,7 +32,7 @@ export function saveNormalInfos(data) {
|
|||||||
*/
|
*/
|
||||||
export function getVerifyInfos() {
|
export function getVerifyInfos() {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/loginVerifyInfos",
|
url: "/platform/loginVerifyInfos",
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -44,7 +44,7 @@ export function getVerifyInfos() {
|
|||||||
*/
|
*/
|
||||||
export function saveVerifyInfos(data) {
|
export function saveVerifyInfos(data) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/saveloginVerifyInfos",
|
url: "/platform/saveloginVerifyInfos",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: data,
|
data: data,
|
||||||
});
|
});
|
||||||
@ -57,7 +57,7 @@ export function saveVerifyInfos(data) {
|
|||||||
*/
|
*/
|
||||||
export function getLegalInfos(tid) {
|
export function getLegalInfos(tid) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/legalInfos",
|
url: "/platform/legalInfos",
|
||||||
method: "get",
|
method: "get",
|
||||||
params: { tid }
|
params: { tid }
|
||||||
});
|
});
|
||||||
@ -70,7 +70,7 @@ export function getLegalInfos(tid) {
|
|||||||
*/
|
*/
|
||||||
export function saveLegalInfos(data) {
|
export function saveLegalInfos(data) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/saveLegalInfos",
|
url: "/platform/saveLegalInfos",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: data,
|
data: data,
|
||||||
});
|
});
|
||||||
@ -83,7 +83,7 @@ export function saveLegalInfos(data) {
|
|||||||
*/
|
*/
|
||||||
export function getCompanyInfos(tid) {
|
export function getCompanyInfos(tid) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/companyInfos",
|
url: "/platform/companyInfos",
|
||||||
method: "get",
|
method: "get",
|
||||||
params: { tid }
|
params: { tid }
|
||||||
});
|
});
|
||||||
@ -96,7 +96,7 @@ export function getCompanyInfos(tid) {
|
|||||||
*/
|
*/
|
||||||
export function saveCompanyInfos(data) {
|
export function saveCompanyInfos(data) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/saveCompanyInfos",
|
url: "/platform/saveCompanyInfos",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: data,
|
data: data,
|
||||||
});
|
});
|
||||||
@ -109,7 +109,7 @@ export function saveCompanyInfos(data) {
|
|||||||
*/
|
*/
|
||||||
export function getCompanySeo(tid) {
|
export function getCompanySeo(tid) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/companySeo",
|
url: "/platform/companySeo",
|
||||||
method: "get",
|
method: "get",
|
||||||
params: { tid }
|
params: { tid }
|
||||||
});
|
});
|
||||||
@ -122,7 +122,7 @@ export function getCompanySeo(tid) {
|
|||||||
*/
|
*/
|
||||||
export function saveCompanySeo(data) {
|
export function saveCompanySeo(data) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/saveCompanySeo",
|
url: "/platform/saveCompanySeo",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: data,
|
data: data,
|
||||||
});
|
});
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import request from "@/utils/request";
|
|||||||
*/
|
*/
|
||||||
export function getSmsInfo() {
|
export function getSmsInfo() {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/sms/info",
|
url: "/platform/sms/info",
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -15,7 +15,7 @@ export function getSmsInfo() {
|
|||||||
*/
|
*/
|
||||||
export function editSmsInfo(data: any) {
|
export function editSmsInfo(data: any) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/sms/editinfo",
|
url: "/platform/sms/editinfo",
|
||||||
method: "post",
|
method: "post",
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -26,7 +26,7 @@ export function editSmsInfo(data: any) {
|
|||||||
*/
|
*/
|
||||||
export function sendTestSms(data: any) {
|
export function sendTestSms(data: any) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/sms/sendtest",
|
url: "/platform/sms/sendtest",
|
||||||
method: "post",
|
method: "post",
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -37,7 +37,7 @@ export function sendTestSms(data: any) {
|
|||||||
*/
|
*/
|
||||||
export function getSmsTaskList(params: { status?: string | number; phone?: string } = {}) {
|
export function getSmsTaskList(params: { status?: string | number; phone?: string } = {}) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/sms/taskList",
|
url: "/platform/sms/taskList",
|
||||||
method: "get",
|
method: "get",
|
||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
@ -48,7 +48,7 @@ export function getSmsTaskList(params: { status?: string | number; phone?: strin
|
|||||||
*/
|
*/
|
||||||
export function editSmsTask(id: number | string, data: any) {
|
export function editSmsTask(id: number | string, data: any) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/sms/taskEdit/${id}`,
|
url: `/platform/sms/taskEdit/${id}`,
|
||||||
method: "post",
|
method: "post",
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import request from "@/utils/request";
|
|||||||
*/
|
*/
|
||||||
export function getTenantList(params) {
|
export function getTenantList(params) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/tenant/getTenant",
|
url: "/platform/tenant/getTenant",
|
||||||
method: "get",
|
method: "get",
|
||||||
params: params,
|
params: params,
|
||||||
});
|
});
|
||||||
@ -24,7 +24,7 @@ export function getTenantList(params) {
|
|||||||
*/
|
*/
|
||||||
export function getTenantDetail(id) {
|
export function getTenantDetail(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/tenant/getTenantDetail/${id}`,
|
url: `/platform/tenant/getTenantDetail/${id}`,
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -36,7 +36,7 @@ export function getTenantDetail(id) {
|
|||||||
*/
|
*/
|
||||||
export function createTenant(data) {
|
export function createTenant(data) {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/tenant/createTenant",
|
url: "/platform/tenant/createTenant",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: data,
|
data: data,
|
||||||
headers: {
|
headers: {
|
||||||
@ -52,7 +52,7 @@ export function createTenant(data) {
|
|||||||
*/
|
*/
|
||||||
export function editTenant(id, data) {
|
export function editTenant(id, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/tenant/editTenant/${id}`,
|
url: `/platform/tenant/editTenant/${id}`,
|
||||||
method: "post",
|
method: "post",
|
||||||
data: data,
|
data: data,
|
||||||
});
|
});
|
||||||
@ -65,7 +65,7 @@ export function editTenant(id, data) {
|
|||||||
*/
|
*/
|
||||||
export function deleteTenant(id) {
|
export function deleteTenant(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/tenant/deleteTenant/${id}`,
|
url: `/platform/tenant/deleteTenant/${id}`,
|
||||||
method: "delete",
|
method: "delete",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -77,7 +77,7 @@ export function deleteTenant(id) {
|
|||||||
*/
|
*/
|
||||||
export function checkTenantCode(tenant_code) {
|
export function checkTenantCode(tenant_code) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/tenant/findTenantCode',
|
url: '/platform/tenant/findTenantCode',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params: { tenant_code }
|
params: { tenant_code }
|
||||||
});
|
});
|
||||||
|
|||||||
29
src/api/tenantUser.js
Normal file
29
src/api/tenantUser.js
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import request from "@/utils/request";
|
||||||
|
|
||||||
|
// 获取租户用户列表
|
||||||
|
export function getTenantUserList(params) {
|
||||||
|
return request({
|
||||||
|
url: "/platform/tenantUser/list",
|
||||||
|
method: "get",
|
||||||
|
params,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建租户用户绑定关系
|
||||||
|
export function createTenantUser(data) {
|
||||||
|
return request({
|
||||||
|
url: "/platform/tenantUser/create",
|
||||||
|
method: "post",
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改租户用户绑定信息(用于修改密码等)
|
||||||
|
export function editTenantUser(id, data) {
|
||||||
|
return request({
|
||||||
|
url: `/platform/tenantUser/edit/${id}`,
|
||||||
|
method: "post",
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@ -3,7 +3,7 @@ import request from '@/utils/request'
|
|||||||
// 获取模板列表
|
// 获取模板列表
|
||||||
export function getThemeList() {
|
export function getThemeList() {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/theme',
|
url: '/platform/theme',
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -11,7 +11,7 @@ export function getThemeList() {
|
|||||||
// 切换模板
|
// 切换模板
|
||||||
export function switchTheme(data) {
|
export function switchTheme(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/theme/switch',
|
url: '/platform/theme/switch',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
@ -20,7 +20,7 @@ export function switchTheme(data) {
|
|||||||
// 获取模板数据
|
// 获取模板数据
|
||||||
export function getThemeData(params) {
|
export function getThemeData(params) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/theme/data',
|
url: '/platform/theme/data',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
@ -29,7 +29,7 @@ export function getThemeData(params) {
|
|||||||
// 保存模板数据
|
// 保存模板数据
|
||||||
export function saveThemeData(data) {
|
export function saveThemeData(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/theme/data',
|
url: '/platform/theme/data',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import request from '@/utils/request';
|
|||||||
//获取所有用户信息
|
//获取所有用户信息
|
||||||
export function getAllUsers() {
|
export function getAllUsers() {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/getAllUsers',
|
url: '/platform/getAllUsers',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -11,7 +11,7 @@ export function getAllUsers() {
|
|||||||
//获取租户用户
|
//获取租户用户
|
||||||
export function getTenantUsers(tenantId) {
|
export function getTenantUsers(tenantId) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/getTenantUsers/${tenantId}`,
|
url: `/platform/getTenantUsers/${tenantId}`,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -19,7 +19,7 @@ export function getTenantUsers(tenantId) {
|
|||||||
// 获取用户信息
|
// 获取用户信息
|
||||||
export function getUserInfo(userId) {
|
export function getUserInfo(userId) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/getUserInfo/${userId}`,
|
url: `/platform/getUserInfo/${userId}`,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -27,7 +27,7 @@ export function getUserInfo(userId) {
|
|||||||
// 添加用户
|
// 添加用户
|
||||||
export function addUser(data) {
|
export function addUser(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/addUser',
|
url: '/platform/addUser',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -36,7 +36,7 @@ export function addUser(data) {
|
|||||||
// 编辑用户信息
|
// 编辑用户信息
|
||||||
export function editUser(userId, data) {
|
export function editUser(userId, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/editUser/${userId}`,
|
url: `/platform/editUser/${userId}`,
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -50,7 +50,7 @@ export function updateUserInfo(userId, data) {
|
|||||||
// 删除用户
|
// 删除用户
|
||||||
export function deleteUser(userId) {
|
export function deleteUser(userId) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/deleteUser/${userId}`,
|
url: `/platform/deleteUser/${userId}`,
|
||||||
method: 'delete',
|
method: 'delete',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -58,7 +58,7 @@ export function deleteUser(userId) {
|
|||||||
// 修改密码
|
// 修改密码
|
||||||
export function changePassword(userId, data) {
|
export function changePassword(userId, data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/changePassword',
|
url: '/platform/changePassword',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: {
|
data: {
|
||||||
id: userId,
|
id: userId,
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import request from "@/utils/request";
|
|||||||
// 获取文章列表
|
// 获取文章列表
|
||||||
export function GetCRMWorkbench(params) {
|
export function GetCRMWorkbench(params) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/workbench/crm`,
|
url: `/platform/workbench/crm`,
|
||||||
method: "get",
|
method: "get",
|
||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
|
|||||||
@ -29,8 +29,8 @@
|
|||||||
<!-- 菜单标题 -->
|
<!-- 菜单标题 -->
|
||||||
<h3>{{ isCollapse ? "管理" : asideTitle }}</h3>
|
<h3>{{ isCollapse ? "管理" : asideTitle }}</h3>
|
||||||
|
|
||||||
<!-- 无模块时显示提示 -->
|
<!-- 无模块时显示提示(在首页 /home 时不显示,避免重复) -->
|
||||||
<el-menu-item v-if="!currentModule" index="/home">
|
<el-menu-item v-if="!currentModule && route.path !== '/home'" index="/home">
|
||||||
<i class="fa-solid fa-house"></i>
|
<i class="fa-solid fa-house"></i>
|
||||||
<template #title>返回首页</template>
|
<template #title>返回首页</template>
|
||||||
</el-menu-item>
|
</el-menu-item>
|
||||||
@ -245,29 +245,22 @@ const currentModule = computed(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const displayMenus = computed(() => {
|
const displayMenus = computed(() => {
|
||||||
if (!currentModule.value) {
|
// 侧边栏始终展示完整菜单树,不随当前路由切换为“子菜单视图”
|
||||||
return [];
|
return list.value;
|
||||||
}
|
|
||||||
|
|
||||||
const currentPath = route.path;
|
|
||||||
// 访问“父级 index 页面”时不展开子菜单;只有进入“子页面”后才展示 children。
|
|
||||||
// 例如:/apps/cms/products(父级)时不展示其 children(如 /apps/cms/products/types)。
|
|
||||||
if (currentPath === currentModule.value.path) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
return currentModule.value.children || [];
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const asideTitle = computed(() => {
|
const asideTitle = computed(() => {
|
||||||
if (isCollapse.value) return "管理";
|
if (isCollapse.value) return "管理";
|
||||||
if (!currentModule.value) return "子菜单";
|
return "菜单";
|
||||||
return displayMenus.value.length > 0 ? (currentModule.value.title || "子菜单") : "子菜单";
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const processMenus = (menus) => {
|
const processMenus = (menus) => {
|
||||||
return menus
|
return menus
|
||||||
.filter((menu) => {
|
.filter((menu) => {
|
||||||
|
// isPlatform 控制“平台端是否展示”,0 表示不在平台端显示
|
||||||
|
if (menu.isPlatform !== undefined && Number(menu.isPlatform) === 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
// is_visible 控制“侧边栏是否展示”,不参与动态路由与缓存层面的过滤
|
// is_visible 控制“侧边栏是否展示”,不参与动态路由与缓存层面的过滤
|
||||||
if (menu.is_visible !== undefined && Number(menu.is_visible) === 0) {
|
if (menu.is_visible !== undefined && Number(menu.is_visible) === 0) {
|
||||||
return false;
|
return false;
|
||||||
@ -298,16 +291,19 @@ const list = computed(() => {
|
|||||||
const allMenus = processMenus(menuData);
|
const allMenus = processMenus(menuData);
|
||||||
|
|
||||||
const sortMenusRecursively = (menus) => {
|
const sortMenusRecursively = (menus) => {
|
||||||
|
// 先对当前层级排序
|
||||||
|
menus.sort((a, b) => {
|
||||||
|
const orderA = Number(a.order) ?? 999999;
|
||||||
|
const orderB = Number(b.order) ?? 999999;
|
||||||
|
if (orderA === orderB) {
|
||||||
|
return (a.id || 0) - (b.id || 0);
|
||||||
|
}
|
||||||
|
return orderA - orderB;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 再递归对子级排序
|
||||||
menus.forEach((menu) => {
|
menus.forEach((menu) => {
|
||||||
if (menu.children && menu.children.length > 0) {
|
if (menu.children && menu.children.length > 0) {
|
||||||
menu.children.sort((a, b) => {
|
|
||||||
const orderA = Number(a.order) ?? 999999;
|
|
||||||
const orderB = Number(b.order) ?? 999999;
|
|
||||||
if (orderA === orderB) {
|
|
||||||
return (a.id || 0) - (b.id || 0);
|
|
||||||
}
|
|
||||||
return orderA - orderB;
|
|
||||||
});
|
|
||||||
sortMenusRecursively(menu.children);
|
sortMenusRecursively(menu.children);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@ -111,7 +111,10 @@ function nestedMenuToRoute(menu, layoutAbsPath) {
|
|||||||
export function convertMenusToRoutes(menus, parentPath = '') {
|
export function convertMenusToRoutes(menus, parentPath = '') {
|
||||||
if (!menus || menus.length === 0) return [];
|
if (!menus || menus.length === 0) return [];
|
||||||
|
|
||||||
return menus.map((menu) => {
|
return menus
|
||||||
|
// 平台端:只转换 isPlatform !== 0 的菜单(默认视为平台可见)
|
||||||
|
.filter((menu) => menu.isPlatform === undefined || Number(menu.isPlatform) !== 0)
|
||||||
|
.map((menu) => {
|
||||||
const fullPath = menu.path
|
const fullPath = menu.path
|
||||||
? menu.path.startsWith('/')
|
? menu.path.startsWith('/')
|
||||||
? menu.path.replace(/\/+/g, '/')
|
? menu.path.replace(/\/+/g, '/')
|
||||||
|
|||||||
@ -3,6 +3,12 @@ import { convertMenusToRoutes } from "./dynamicRoutes";
|
|||||||
|
|
||||||
// 静态子路由:需要在 Main 框架内显示的页面
|
// 静态子路由:需要在 Main 框架内显示的页面
|
||||||
const staticMainChildren = [
|
const staticMainChildren = [
|
||||||
|
{
|
||||||
|
path: "/home",
|
||||||
|
name: "Home",
|
||||||
|
component: () => import("@/views/home/index.vue"),
|
||||||
|
meta: { requiresAuth: true, title: "首页" }
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: "/user/userProfile",
|
path: "/user/userProfile",
|
||||||
name: "userProfile",
|
name: "userProfile",
|
||||||
@ -36,12 +42,7 @@ const staticRoutes = [
|
|||||||
component: () => import("@/views/login/forget.vue"),
|
component: () => import("@/views/login/forget.vue"),
|
||||||
meta: { requiresAuth: false }
|
meta: { requiresAuth: false }
|
||||||
},
|
},
|
||||||
{
|
|
||||||
path: "/home",
|
|
||||||
name: "Home",
|
|
||||||
component: () => import("@/views/home/index.vue"),
|
|
||||||
meta: { requiresAuth: true, title: "系统导航", isStandalone: true }
|
|
||||||
},
|
|
||||||
// 兼容路径拼写错误:dashborad -> dashboard
|
// 兼容路径拼写错误:dashborad -> dashboard
|
||||||
{
|
{
|
||||||
path: "/apps/erp/dashborad",
|
path: "/apps/erp/dashborad",
|
||||||
|
|||||||
@ -6,7 +6,7 @@ const defaultUser = {
|
|||||||
id:'',
|
id:'',
|
||||||
account: '',
|
account: '',
|
||||||
name: '',
|
name: '',
|
||||||
group_id: '',
|
rid: '',
|
||||||
avatar: ''
|
avatar: ''
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,8 +39,7 @@ export const useAuthStore = defineStore('auth', () => {
|
|||||||
id: parseInt(userInfo.id) || null,
|
id: parseInt(userInfo.id) || null,
|
||||||
account: userInfo.account || '',
|
account: userInfo.account || '',
|
||||||
name: userInfo.name || '',
|
name: userInfo.name || '',
|
||||||
group_id: userInfo.group_id || '',
|
rid: userInfo.rid || userInfo.group_id || '',
|
||||||
tid: userInfo.tid || '',
|
|
||||||
avatar: userInfo.avatar || ''
|
avatar: userInfo.avatar || ''
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -100,9 +100,9 @@ watch(
|
|||||||
const handleAsideMenuClick = async (menuItem) => {
|
const handleAsideMenuClick = async (menuItem) => {
|
||||||
const targetPath = menuItem.path;
|
const targetPath = menuItem.path;
|
||||||
|
|
||||||
if (targetPath === '/home') {
|
if (targetPath === '/home' || targetPath === defaultDashboardPath) {
|
||||||
tabsStore.closeAll();
|
tabsStore.closeAll();
|
||||||
router.push('/home');
|
router.push(defaultDashboardPath);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -170,7 +170,7 @@ watch(
|
|||||||
// 注意:这个watch主要用于处理tab点击切换,菜单点击由handleAsideMenuClick直接处理
|
// 注意:这个watch主要用于处理tab点击切换,菜单点击由handleAsideMenuClick直接处理
|
||||||
if (newVal && oldVal !== undefined && router.currentRoute.value.fullPath !== newVal) {
|
if (newVal && oldVal !== undefined && router.currentRoute.value.fullPath !== newVal) {
|
||||||
// 如果切换到首页,关闭其他所有tab
|
// 如果切换到首页,关闭其他所有tab
|
||||||
if (newVal === '/home') {
|
if (newVal === defaultDashboardPath) {
|
||||||
tabsStore.closeAll();
|
tabsStore.closeAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -213,7 +213,7 @@ watch(
|
|||||||
);
|
);
|
||||||
|
|
||||||
// 上传配置
|
// 上传配置
|
||||||
const uploadUrl = import.meta.env.VITE_API_BASE_URL + "/admin/upload";
|
const uploadUrl = import.meta.env.VITE_API_BASE_URL + "/platform/upload";
|
||||||
const uploadHeaders = {
|
const uploadHeaders = {
|
||||||
Authorization: "Bearer " + localStorage.getItem("token"),
|
Authorization: "Bearer " + localStorage.getItem("token"),
|
||||||
};
|
};
|
||||||
|
|||||||
@ -151,7 +151,7 @@ const currentBanner = ref<Partial<Banner>>({
|
|||||||
// 上传配置
|
// 上传配置
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
const API_BASE_URL = import.meta.env.VITE_API_BASE_URL;
|
const API_BASE_URL = import.meta.env.VITE_API_BASE_URL;
|
||||||
const uploadUrl = ref(API_BASE_URL + "/admin/uploadfiles");
|
const uploadUrl = ref(API_BASE_URL + "/platform/uploadfiles");
|
||||||
const uploadHeaders = ref({
|
const uploadHeaders = ref({
|
||||||
Authorization: "Bearer " + (localStorage.getItem("token") || ""),
|
Authorization: "Bearer " + (localStorage.getItem("token") || ""),
|
||||||
});
|
});
|
||||||
|
|||||||
@ -117,7 +117,7 @@ const submitLoading = ref(false)
|
|||||||
const formRef = ref(null)
|
const formRef = ref(null)
|
||||||
|
|
||||||
// 上传配置
|
// 上传配置
|
||||||
const uploadUrl = ref(API_BASE_URL + "/admin/uploadfiles");
|
const uploadUrl = ref(API_BASE_URL + "/platform/uploadfiles");
|
||||||
const uploadHeaders = ref({
|
const uploadHeaders = ref({
|
||||||
Authorization: "Bearer " + (localStorage.getItem("token") || ""),
|
Authorization: "Bearer " + (localStorage.getItem("token") || ""),
|
||||||
});
|
});
|
||||||
|
|||||||
@ -222,7 +222,7 @@ const currentMenu = ref<Partial<Menu>>({
|
|||||||
// 上传配置
|
// 上传配置
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
const API_BASE_URL = import.meta.env.VITE_API_BASE_URL;
|
const API_BASE_URL = import.meta.env.VITE_API_BASE_URL;
|
||||||
const uploadUrl = ref(API_BASE_URL + '/admin/uploadfiles');
|
const uploadUrl = ref(API_BASE_URL + '/platform/uploadfiles');
|
||||||
const uploadHeaders = ref({
|
const uploadHeaders = ref({
|
||||||
'Authorization': 'Bearer ' + (localStorage.getItem('token') || '')
|
'Authorization': 'Bearer ' + (localStorage.getItem('token') || '')
|
||||||
});
|
});
|
||||||
|
|||||||
@ -126,7 +126,7 @@ const submitLoading = ref(false);
|
|||||||
const formRef = ref(null);
|
const formRef = ref(null);
|
||||||
|
|
||||||
// 上传配置
|
// 上传配置
|
||||||
const uploadUrl = ref(API_BASE_URL + "/admin/uploadfiles");
|
const uploadUrl = ref(API_BASE_URL + "/platform/uploadfiles");
|
||||||
const uploadHeaders = ref({
|
const uploadHeaders = ref({
|
||||||
Authorization: "Bearer " + (localStorage.getItem("token") || ""),
|
Authorization: "Bearer " + (localStorage.getItem("token") || ""),
|
||||||
});
|
});
|
||||||
|
|||||||
@ -120,7 +120,7 @@ const submitLoading = ref(false);
|
|||||||
const formRef = ref(null);
|
const formRef = ref(null);
|
||||||
|
|
||||||
// 上传配置
|
// 上传配置
|
||||||
const uploadUrl = ref(API_BASE_URL + "/admin/uploadfiles");
|
const uploadUrl = ref(API_BASE_URL + "/platform/uploadfiles");
|
||||||
const uploadHeaders = ref({
|
const uploadHeaders = ref({
|
||||||
Authorization: "Bearer " + (localStorage.getItem("token") || ""),
|
Authorization: "Bearer " + (localStorage.getItem("token") || ""),
|
||||||
});
|
});
|
||||||
|
|||||||
@ -7,6 +7,11 @@
|
|||||||
<el-descriptions-item label="角色名称">
|
<el-descriptions-item label="角色名称">
|
||||||
{{ roleDetail.name }}
|
{{ roleDetail.name }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="角色分类">
|
||||||
|
<el-tag :type="Number(roleDetail.cid) === 2 ? 'warning' : 'primary'" size="small">
|
||||||
|
{{ Number(roleDetail.cid) === 2 ? "租户角色" : "平台角色" }}
|
||||||
|
</el-tag>
|
||||||
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="状态">
|
<el-descriptions-item label="状态">
|
||||||
<el-tag :type="roleDetail.status === 1 ? 'success' : 'info'" size="small">
|
<el-tag :type="roleDetail.status === 1 ? 'success' : 'info'" size="small">
|
||||||
{{ roleDetail.status === 1 ? "启用" : "禁用" }}
|
{{ roleDetail.status === 1 ? "启用" : "禁用" }}
|
||||||
@ -67,11 +72,10 @@ const allMenus = ref<any[]>([]);
|
|||||||
// 监听 modelValue
|
// 监听 modelValue
|
||||||
watch(
|
watch(
|
||||||
() => props.modelValue,
|
() => props.modelValue,
|
||||||
(val) => {
|
async (val) => {
|
||||||
visible.value = val;
|
visible.value = val;
|
||||||
if (val && props.roleId) {
|
if (val && props.roleId) {
|
||||||
loadRoleDetail();
|
await loadRoleDetail();
|
||||||
loadMenus();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@ -130,6 +134,7 @@ const loadRoleDetail = async () => {
|
|||||||
const res = await getRoleById(props.roleId);
|
const res = await getRoleById(props.roleId);
|
||||||
if (res.code === 200) {
|
if (res.code === 200) {
|
||||||
roleDetail.value = res.data || {};
|
roleDetail.value = res.data || {};
|
||||||
|
await loadMenus(Number(roleDetail.value?.cid || 1));
|
||||||
} else {
|
} else {
|
||||||
ElMessage.error(res.msg || "获取角色详情失败");
|
ElMessage.error(res.msg || "获取角色详情失败");
|
||||||
}
|
}
|
||||||
@ -142,9 +147,9 @@ const loadRoleDetail = async () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 加载菜单树
|
// 加载菜单树
|
||||||
const loadMenus = async () => {
|
const loadMenus = async (cid = 1) => {
|
||||||
try {
|
try {
|
||||||
const res = await getAllMenus();
|
const res = await getAllMenus({ cid });
|
||||||
if (res.code === 200) {
|
if (res.code === 200) {
|
||||||
allMenus.value = res.data || [];
|
allMenus.value = res.data || [];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,6 +5,13 @@
|
|||||||
<el-input v-model="form.name" placeholder="请输入角色名称" maxlength="50" show-word-limit />
|
<el-input v-model="form.name" placeholder="请输入角色名称" maxlength="50" show-word-limit />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="角色分类" prop="cid">
|
||||||
|
<el-radio-group v-model="form.cid" @change="handleRoleTypeChange">
|
||||||
|
<el-radio :label="1">平台角色</el-radio>
|
||||||
|
<el-radio :label="2">租户角色</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item label="状态" prop="status">
|
<el-form-item label="状态" prop="status">
|
||||||
<el-radio-group v-model="form.status">
|
<el-radio-group v-model="form.status">
|
||||||
<el-radio :label="1">启用</el-radio>
|
<el-radio :label="1">启用</el-radio>
|
||||||
@ -65,6 +72,7 @@ const isExpandAll = ref(false);
|
|||||||
|
|
||||||
const form = ref({
|
const form = ref({
|
||||||
name: "",
|
name: "",
|
||||||
|
cid: 1,
|
||||||
status: 1,
|
status: 1,
|
||||||
rights: [] as number[],
|
rights: [] as number[],
|
||||||
});
|
});
|
||||||
@ -75,6 +83,7 @@ const rules = {
|
|||||||
{ min: 2, max: 50, message: "角色名称长度在 2 到 50 个字符", trigger: "blur" },
|
{ min: 2, max: 50, message: "角色名称长度在 2 到 50 个字符", trigger: "blur" },
|
||||||
],
|
],
|
||||||
status: [{ required: true, message: "请选择状态", trigger: "change" }],
|
status: [{ required: true, message: "请选择状态", trigger: "change" }],
|
||||||
|
cid: [{ required: true, message: "请选择角色分类", trigger: "change" }],
|
||||||
};
|
};
|
||||||
|
|
||||||
// --- 辅助功能 ---
|
// --- 辅助功能 ---
|
||||||
@ -140,9 +149,9 @@ const toggleSelectAll = () => {
|
|||||||
// --- 数据加载与监听 ---
|
// --- 数据加载与监听 ---
|
||||||
|
|
||||||
// 加载菜单树数据
|
// 加载菜单树数据
|
||||||
const loadMenus = async () => {
|
const loadMenus = async (cid?: number) => {
|
||||||
try {
|
try {
|
||||||
const res = await getAllMenus();
|
const res = await getAllMenus({ cid: cid ?? form.value.cid });
|
||||||
if (res.code === 200) {
|
if (res.code === 200) {
|
||||||
menuTree.value = res.data || [];
|
menuTree.value = res.data || [];
|
||||||
}
|
}
|
||||||
@ -173,17 +182,16 @@ watch(
|
|||||||
async (val) => {
|
async (val) => {
|
||||||
visible.value = val;
|
visible.value = val;
|
||||||
if (val) {
|
if (val) {
|
||||||
// 先加载菜单数据
|
|
||||||
await loadMenus();
|
|
||||||
|
|
||||||
// 判断是编辑还是新增
|
// 判断是编辑还是新增
|
||||||
if (props.role) {
|
if (props.role) {
|
||||||
isEdit.value = true;
|
isEdit.value = true;
|
||||||
form.value = {
|
form.value = {
|
||||||
name: props.role.name,
|
name: props.role.name,
|
||||||
|
cid: Number(props.role.cid || 1),
|
||||||
status: props.role.status,
|
status: props.role.status,
|
||||||
rights: parseRights(props.role.rights),
|
rights: parseRights(props.role.rights),
|
||||||
};
|
};
|
||||||
|
await loadMenus(form.value.cid);
|
||||||
// 设置树的回显
|
// 设置树的回显
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
if (treeRef.value) {
|
if (treeRef.value) {
|
||||||
@ -195,6 +203,7 @@ watch(
|
|||||||
isEdit.value = false;
|
isEdit.value = false;
|
||||||
isAllSelected.value = false;
|
isAllSelected.value = false;
|
||||||
resetForm();
|
resetForm();
|
||||||
|
await loadMenus(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -209,6 +218,7 @@ watch(visible, (val) => {
|
|||||||
const resetForm = () => {
|
const resetForm = () => {
|
||||||
form.value = {
|
form.value = {
|
||||||
name: "",
|
name: "",
|
||||||
|
cid: 1,
|
||||||
status: 1,
|
status: 1,
|
||||||
rights: [],
|
rights: [],
|
||||||
};
|
};
|
||||||
@ -216,6 +226,16 @@ const resetForm = () => {
|
|||||||
if (treeRef.value) treeRef.value.setCheckedKeys([]);
|
if (treeRef.value) treeRef.value.setCheckedKeys([]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleRoleTypeChange = async () => {
|
||||||
|
if (!visible.value) return;
|
||||||
|
if (treeRef.value) {
|
||||||
|
treeRef.value.setCheckedKeys([]);
|
||||||
|
}
|
||||||
|
form.value.rights = [];
|
||||||
|
isAllSelected.value = false;
|
||||||
|
await loadMenus(form.value.cid);
|
||||||
|
};
|
||||||
|
|
||||||
const handleClose = () => {
|
const handleClose = () => {
|
||||||
visible.value = false;
|
visible.value = false;
|
||||||
resetForm();
|
resetForm();
|
||||||
@ -232,6 +252,7 @@ const handleSubmit = async () => {
|
|||||||
|
|
||||||
const submitData: any = {
|
const submitData: any = {
|
||||||
name: form.value.name,
|
name: form.value.name,
|
||||||
|
cid: form.value.cid,
|
||||||
status: form.value.status,
|
status: form.value.status,
|
||||||
rights: checkedKeys,
|
rights: checkedKeys,
|
||||||
};
|
};
|
||||||
|
|||||||
@ -31,6 +31,13 @@
|
|||||||
min-width="150"
|
min-width="150"
|
||||||
align="center"
|
align="center"
|
||||||
/>
|
/>
|
||||||
|
<el-table-column prop="cid" label="角色分类" width="120" align="center">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-tag :type="Number(row.cid) === 2 ? 'warning' : 'primary'" size="small">
|
||||||
|
{{ Number(row.cid) === 2 ? "租户角色" : "平台角色" }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column prop="status" label="状态" width="100" align="center">
|
<el-table-column prop="status" label="状态" width="100" align="center">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<el-tag :type="row.status === 1 ? 'success' : 'info'" size="small">
|
<el-tag :type="row.status === 1 ? 'success' : 'info'" size="small">
|
||||||
@ -56,7 +63,6 @@
|
|||||||
详情
|
详情
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
v-if="userInfo?.id === 2"
|
|
||||||
size="small"
|
size="small"
|
||||||
type="primary"
|
type="primary"
|
||||||
link
|
link
|
||||||
@ -66,7 +72,6 @@
|
|||||||
编辑
|
编辑
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
v-if="userInfo?.id === 2"
|
|
||||||
size="small"
|
size="small"
|
||||||
type="danger"
|
type="danger"
|
||||||
link
|
link
|
||||||
|
|||||||
@ -9,8 +9,11 @@
|
|||||||
<el-form-item label="密码" prop="password">
|
<el-form-item label="密码" prop="password">
|
||||||
<el-input v-model="formData.password" type="password" placeholder="请输入密码" show-password />
|
<el-input v-model="formData.password" type="password" placeholder="请输入密码" show-password />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="昵称" prop="name">
|
<el-form-item label="确认密码" prop="password2">
|
||||||
<el-input v-model="formData.name" placeholder="请输入昵称" />
|
<el-input v-model="formData.password2" type="password" placeholder="请再次输入密码" show-password />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="姓名" prop="name">
|
||||||
|
<el-input v-model="formData.name" placeholder="请输入姓名" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="手机号" prop="phone">
|
<el-form-item label="手机号" prop="phone">
|
||||||
<el-input v-model="formData.phone" placeholder="请输入手机号" />
|
<el-input v-model="formData.phone" placeholder="请输入手机号" />
|
||||||
@ -36,7 +39,7 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, reactive } from 'vue';
|
import { ref, reactive } from 'vue';
|
||||||
import { ElMessage } from 'element-plus';
|
import { ElMessage } from 'element-plus';
|
||||||
import { addUser } from '@/api/user';
|
import { createTenantUser } from '@/api/tenantUser';
|
||||||
|
|
||||||
const emit = defineEmits(['success']);
|
const emit = defineEmits(['success']);
|
||||||
const visible = ref(false);
|
const visible = ref(false);
|
||||||
@ -48,6 +51,7 @@ const currentTenantId = ref<number | null>(null);
|
|||||||
const formData = reactive({
|
const formData = reactive({
|
||||||
account: '',
|
account: '',
|
||||||
password: '',
|
password: '',
|
||||||
|
password2: '',
|
||||||
name: '',
|
name: '',
|
||||||
phone: '',
|
phone: '',
|
||||||
email: '',
|
email: '',
|
||||||
@ -57,6 +61,23 @@ const formData = reactive({
|
|||||||
const rules = {
|
const rules = {
|
||||||
account: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
|
account: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
|
||||||
password: [{ required: true, message: '请输入密码', trigger: 'blur', min: 6 }],
|
password: [{ required: true, message: '请输入密码', trigger: 'blur', min: 6 }],
|
||||||
|
password2: [
|
||||||
|
{ required: true, message: '请再次输入密码', trigger: 'blur' },
|
||||||
|
{
|
||||||
|
validator: (_rule: any, value: string, callback: any) => {
|
||||||
|
if (!value) {
|
||||||
|
callback(new Error('请再次输入密码'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (value !== formData.password) {
|
||||||
|
callback(new Error('两次输入的密码不一致'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
callback();
|
||||||
|
},
|
||||||
|
trigger: 'blur'
|
||||||
|
}
|
||||||
|
],
|
||||||
phone: [
|
phone: [
|
||||||
{ pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }
|
{ pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }
|
||||||
],
|
],
|
||||||
@ -71,6 +92,7 @@ const open = (tenantId: number) => {
|
|||||||
Object.assign(formData, {
|
Object.assign(formData, {
|
||||||
account: '',
|
account: '',
|
||||||
password: '',
|
password: '',
|
||||||
|
password2: '',
|
||||||
name: '',
|
name: '',
|
||||||
phone: '',
|
phone: '',
|
||||||
email: '',
|
email: '',
|
||||||
@ -88,10 +110,11 @@ const submitForm = async () => {
|
|||||||
try {
|
try {
|
||||||
const submitData = {
|
const submitData = {
|
||||||
...formData,
|
...formData,
|
||||||
tid: currentTenantId.value
|
tid: currentTenantId.value,
|
||||||
};
|
};
|
||||||
const res = await addUser(submitData);
|
// 提交时不需要把确认密码发给后端
|
||||||
|
delete (submitData as any).password2;
|
||||||
|
const res = await createTenantUser(submitData);
|
||||||
if (res.code === 200) {
|
if (res.code === 200) {
|
||||||
ElMessage.success('添加成功');
|
ElMessage.success('添加成功');
|
||||||
visible.value = false;
|
visible.value = false;
|
||||||
|
|||||||
@ -2,11 +2,16 @@
|
|||||||
<el-drawer
|
<el-drawer
|
||||||
v-model="visible"
|
v-model="visible"
|
||||||
title="租户详细信息"
|
title="租户详细信息"
|
||||||
size="600px"
|
size="1000px"
|
||||||
@closed="handleClosed"
|
@closed="handleClosed"
|
||||||
>
|
>
|
||||||
<div v-loading="loading" class="detail-container">
|
<div v-loading="loading" class="detail-container">
|
||||||
<el-descriptions :column="1" border>
|
<el-descriptions
|
||||||
|
:column="2"
|
||||||
|
:label-width="110"
|
||||||
|
border
|
||||||
|
class="tenant-detail-descriptions"
|
||||||
|
>
|
||||||
<el-descriptions-item label="租户名称">
|
<el-descriptions-item label="租户名称">
|
||||||
<span class="detail-value">{{ detailData.tenant_name }}</span>
|
<span class="detail-value">{{ detailData.tenant_name }}</span>
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
@ -22,52 +27,160 @@
|
|||||||
<el-descriptions-item label="电子邮箱">
|
<el-descriptions-item label="电子邮箱">
|
||||||
{{ detailData.contact_email || '-' }}
|
{{ detailData.contact_email || '-' }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="租户地址" :span="2">
|
||||||
|
{{ detailData.address || '-' }}
|
||||||
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="租户状态">
|
<el-descriptions-item label="租户状态">
|
||||||
<el-tag :type="detailData.status === 1 ? 'success' : 'danger'">
|
<el-tag :type="detailData.status === 1 ? 'success' : 'danger'">
|
||||||
{{ detailData.status === 1 ? '启用' : '禁用' }}
|
{{ detailData.status === 1 ? '启用' : '禁用' }}
|
||||||
</el-tag>
|
</el-tag>
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="租户地址">
|
|
||||||
{{ detailData.address || '-' }}
|
|
||||||
</el-descriptions-item>
|
|
||||||
<el-descriptions-item label="创建时间">
|
<el-descriptions-item label="创建时间">
|
||||||
{{ detailData.create_time || '-' }}
|
{{ detailData.create_time || '-' }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
</el-descriptions>
|
</el-descriptions>
|
||||||
|
|
||||||
|
<div class="users-section">
|
||||||
|
<div class="section-title">租户用户列表</div>
|
||||||
|
<el-table :data="tenantUsers" v-loading="usersLoading" border style="width: 100%">
|
||||||
|
<el-table-column prop="account" label="用户名" min-width="140" align="center" />
|
||||||
|
<el-table-column prop="name" label="姓名" min-width="120" align="center" />
|
||||||
|
<el-table-column prop="phone" label="手机号" min-width="140" align="center" />
|
||||||
|
<el-table-column prop="email" label="邮箱" min-width="180" align="center" />
|
||||||
|
<el-table-column prop="status" label="状态" width="90" align="center">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-tag :type="Number(row.status) === 1 ? 'success' : 'danger'">
|
||||||
|
{{ Number(row.status) === 1 ? "启用" : "禁用" }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="操作" width="140" align="center" fixed="right">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-button text type="primary" @click="openPasswordDialog(row)">
|
||||||
|
修改密码
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="footer-actions">
|
<div class="footer-actions">
|
||||||
<el-button @click="visible = false">关闭</el-button>
|
<el-button @click="visible = false">关闭</el-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-drawer>
|
</el-drawer>
|
||||||
|
|
||||||
|
<el-dialog v-model="passwordDialogVisible" title="修改密码" width="420px" destroy-on-close>
|
||||||
|
<el-form ref="passwordFormRef" :model="passwordForm" :rules="passwordRules" label-width="90px">
|
||||||
|
<el-form-item label="新密码" prop="password">
|
||||||
|
<el-input v-model="passwordForm.password" type="password" show-password placeholder="请输入新密码" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="确认密码" prop="password2">
|
||||||
|
<el-input v-model="passwordForm.password2" type="password" show-password placeholder="请再次输入新密码" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<template #footer>
|
||||||
|
<el-button @click="passwordDialogVisible = false">取消</el-button>
|
||||||
|
<el-button type="primary" :loading="passwordSubmitting" @click="submitPassword">确定</el-button>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref } from 'vue';
|
import { ref, reactive } from 'vue';
|
||||||
|
import { ElMessage } from "element-plus";
|
||||||
import { getTenantDetail } from '@/api/tenant';
|
import { getTenantDetail } from '@/api/tenant';
|
||||||
|
import { getTenantUserList, editTenantUser } from "@/api/tenantUser";
|
||||||
|
|
||||||
const visible = ref(false);
|
const visible = ref(false);
|
||||||
const loading = ref(false);
|
const loading = ref(false);
|
||||||
|
const usersLoading = ref(false);
|
||||||
const detailData = ref<any>({});
|
const detailData = ref<any>({});
|
||||||
|
const tenantUsers = ref<any[]>([]);
|
||||||
|
|
||||||
|
const passwordDialogVisible = ref(false);
|
||||||
|
const passwordSubmitting = ref(false);
|
||||||
|
const currentTenantUserId = ref<number | null>(null);
|
||||||
|
const passwordFormRef = ref();
|
||||||
|
const passwordForm = reactive({
|
||||||
|
password: "",
|
||||||
|
password2: "",
|
||||||
|
});
|
||||||
|
|
||||||
|
const passwordRules = {
|
||||||
|
password: [
|
||||||
|
{ required: true, message: "请输入新密码", trigger: "blur" },
|
||||||
|
{ min: 6, message: "密码至少 6 位", trigger: "blur" },
|
||||||
|
],
|
||||||
|
password2: [
|
||||||
|
{ required: true, message: "请再次输入新密码", trigger: "blur" },
|
||||||
|
{
|
||||||
|
validator: (_rule: any, value: string, callback: any) => {
|
||||||
|
if (!value) return callback(new Error("请再次输入新密码"));
|
||||||
|
if (value !== passwordForm.password) return callback(new Error("两次密码不一致"));
|
||||||
|
callback();
|
||||||
|
},
|
||||||
|
trigger: "blur",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
const openPasswordDialog = (row: any) => {
|
||||||
|
currentTenantUserId.value = Number(row?.id || 0) || null;
|
||||||
|
passwordForm.password = "";
|
||||||
|
passwordForm.password2 = "";
|
||||||
|
passwordDialogVisible.value = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
const submitPassword = async () => {
|
||||||
|
if (!passwordFormRef.value || !currentTenantUserId.value) return;
|
||||||
|
await passwordFormRef.value.validate();
|
||||||
|
|
||||||
|
passwordSubmitting.value = true;
|
||||||
|
try {
|
||||||
|
const res = await editTenantUser(currentTenantUserId.value, { password: passwordForm.password });
|
||||||
|
if (res.code === 200) {
|
||||||
|
ElMessage.success("密码修改成功");
|
||||||
|
passwordDialogVisible.value = false;
|
||||||
|
} else {
|
||||||
|
ElMessage.error(res.msg || "密码修改失败");
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
passwordSubmitting.value = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// 暴露给父组件的方法
|
// 暴露给父组件的方法
|
||||||
const open = async (id: number) => {
|
const open = async (id: number) => {
|
||||||
visible.value = true;
|
visible.value = true;
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
|
usersLoading.value = true;
|
||||||
try {
|
try {
|
||||||
const res = await getTenantDetail(id);
|
const [detailRes, usersRes] = await Promise.all([
|
||||||
if (res.code === 200) {
|
getTenantDetail(id),
|
||||||
detailData.value = res.data;
|
getTenantUserList({ tid: id }),
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (detailRes.code === 200) {
|
||||||
|
detailData.value = detailRes.data;
|
||||||
|
}
|
||||||
|
if (usersRes?.code === 200) {
|
||||||
|
tenantUsers.value = usersRes?.data?.list || usersRes?.data || [];
|
||||||
|
} else {
|
||||||
|
tenantUsers.value = [];
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('获取详情失败', error);
|
console.error('获取详情失败', error);
|
||||||
|
tenantUsers.value = [];
|
||||||
} finally {
|
} finally {
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
|
usersLoading.value = false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleClosed = () => {
|
const handleClosed = () => {
|
||||||
detailData.value = {};
|
detailData.value = {};
|
||||||
|
tenantUsers.value = [];
|
||||||
};
|
};
|
||||||
|
|
||||||
// 必须暴露给外部
|
// 必须暴露给外部
|
||||||
@ -87,8 +200,22 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
}
|
}
|
||||||
|
.users-section {
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
.section-title {
|
||||||
|
margin-bottom: 12px;
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #303133;
|
||||||
|
}
|
||||||
:deep(.el-descriptions__label) {
|
:deep(.el-descriptions__label) {
|
||||||
width: 120px;
|
width: 120px;
|
||||||
background-color: #f5f7fa;
|
background-color: #f5f7fa;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tenant-detail-descriptions :deep(.el-descriptions__table) {
|
||||||
|
width: 100%;
|
||||||
|
table-layout: fixed;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
@ -3,15 +3,15 @@
|
|||||||
destroy-on-close>
|
destroy-on-close>
|
||||||
<el-form ref="formRef" :model="formData" :rules="rules" label-width="100px" v-loading="loading"
|
<el-form ref="formRef" :model="formData" :rules="rules" label-width="100px" v-loading="loading"
|
||||||
style="padding: 20px">
|
style="padding: 20px">
|
||||||
<el-form-item label="租户名称" prop="tenant_name">
|
|
||||||
<el-input v-model="formData.tenant_name" placeholder="请输入租户名称" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="租户编码" prop="tenant_code">
|
<el-form-item label="租户编码" prop="tenant_code">
|
||||||
<el-input v-model="formData.tenant_code" placeholder="系统自动生成" disabled />
|
<el-input v-model="formData.tenant_code" placeholder="系统自动生成" disabled />
|
||||||
<div class="form-tip" v-if="!formData.id" style="font-size: 12px; color: #999;">
|
<div class="form-tip" v-if="!formData.id" style="font-size: 12px; color: #999;">
|
||||||
* 编码由系统随机分配,提交时将自动校验唯一性
|
* 编码由系统随机分配,提交时将自动校验唯一性
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item label="租户名称" prop="tenant_name">
|
||||||
|
<el-input v-model="formData.tenant_name" placeholder="请输入租户名称" />
|
||||||
|
</el-form-item>
|
||||||
<el-form-item label="联系人" prop="contact_person">
|
<el-form-item label="联系人" prop="contact_person">
|
||||||
<el-input v-model="formData.contact_person" placeholder="请输入联系人" />
|
<el-input v-model="formData.contact_person" placeholder="请输入联系人" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|||||||
@ -24,7 +24,7 @@
|
|||||||
<el-form-item label="资质图片" prop="file_url">
|
<el-form-item label="资质图片" prop="file_url">
|
||||||
<el-upload
|
<el-upload
|
||||||
class="avatar-uploader"
|
class="avatar-uploader"
|
||||||
action="/api/admin/common/upload"
|
action="/api/platform/common/upload"
|
||||||
:show-file-list="false"
|
:show-file-list="false"
|
||||||
:on-success="handleUploadSuccess"
|
:on-success="handleUploadSuccess"
|
||||||
:before-upload="beforeAvatarUpload"
|
:before-upload="beforeAvatarUpload"
|
||||||
|
|||||||
@ -67,7 +67,13 @@
|
|||||||
label="租户名称"
|
label="租户名称"
|
||||||
min-width="220"
|
min-width="220"
|
||||||
align="center"
|
align="center"
|
||||||
/>
|
>
|
||||||
|
<template #default="scope">
|
||||||
|
<span class="name-link" @click="handlePreview(scope.row)">
|
||||||
|
{{ scope.row.tenant_name }}
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="tenant_code"
|
prop="tenant_code"
|
||||||
label="租户编码"
|
label="租户编码"
|
||||||
@ -105,25 +111,30 @@
|
|||||||
}}</el-tag>
|
}}</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" width="280" align="center" fixed="right">
|
<el-table-column label="操作" width="200" align="center" fixed="right">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<!-- <el-button size="small" @click="handleQualification(scope.row)">资质</el-button> -->
|
<div class="action-icons">
|
||||||
<el-button text size="small" @click="handleAddUser(scope.row)"
|
<el-tooltip content="增加用户" placement="top">
|
||||||
>增加用户</el-button
|
<el-button text size="small" @click="handleAddUser(scope.row)">
|
||||||
>
|
<el-icon><UserFilled /></el-icon>
|
||||||
<el-button text size="small" @click="handlePreview(scope.row)"
|
</el-button>
|
||||||
>查看</el-button
|
</el-tooltip>
|
||||||
>
|
<el-tooltip content="编辑" placement="top">
|
||||||
<el-button text size="small" @click="editRef.open(scope.row.id)"
|
<el-button text size="small" @click="editRef.open(scope.row.id)">
|
||||||
>编辑</el-button
|
<el-icon><Edit /></el-icon>
|
||||||
>
|
</el-button>
|
||||||
<el-button
|
</el-tooltip>
|
||||||
text
|
<el-tooltip content="删除" placement="top">
|
||||||
size="small"
|
<el-button
|
||||||
type="danger"
|
text
|
||||||
@click="handleDelete(scope.row)"
|
size="small"
|
||||||
>删除</el-button
|
type="danger"
|
||||||
>
|
@click="handleDelete(scope.row)"
|
||||||
|
>
|
||||||
|
<el-icon><Delete /></el-icon>
|
||||||
|
</el-button>
|
||||||
|
</el-tooltip>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@ -150,10 +161,12 @@
|
|||||||
import { getTenantList, deleteTenant } from "@/api/tenant";
|
import { getTenantList, deleteTenant } from "@/api/tenant";
|
||||||
import { onMounted, ref, reactive } from "vue";
|
import { onMounted, ref, reactive } from "vue";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
|
import { ElMessage, ElMessageBox } from "element-plus";
|
||||||
import EditModal from "./components/edit.vue";
|
import EditModal from "./components/edit.vue";
|
||||||
import DetailDrawer from "./components/detail.vue";
|
import DetailDrawer from "./components/detail.vue";
|
||||||
import Qualification from "./components/qualification.vue";
|
import Qualification from "./components/qualification.vue";
|
||||||
import AddUser from "./components/adduser.vue";
|
import AddUser from "./components/adduser.vue";
|
||||||
|
import { UserFilled, Edit, Delete } from "@element-plus/icons-vue";
|
||||||
|
|
||||||
const total = ref(0);
|
const total = ref(0);
|
||||||
const page = ref(1);
|
const page = ref(1);
|
||||||
@ -290,4 +303,10 @@ onMounted(() => {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.action-icons {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -51,6 +51,18 @@
|
|||||||
<el-input v-model="form.qq" placeholder="请输入QQ" />
|
<el-input v-model="form.qq" placeholder="请输入QQ" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
|
<!-- 角色 -->
|
||||||
|
<el-form-item label="角色" prop="group_id">
|
||||||
|
<el-select v-model="form.group_id" placeholder="请选择角色" style="width: 100%">
|
||||||
|
<el-option
|
||||||
|
v-for="role in roleOptions"
|
||||||
|
:key="role.id"
|
||||||
|
:label="role.name"
|
||||||
|
:value="Number(role.id)"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
<!-- 性别 -->
|
<!-- 性别 -->
|
||||||
<el-form-item label="性别">
|
<el-form-item label="性别">
|
||||||
<el-radio-group v-model="form.sex" placeholder="请选择性别">
|
<el-radio-group v-model="form.sex" placeholder="请选择性别">
|
||||||
@ -84,6 +96,7 @@
|
|||||||
import { ref, computed, watch } from "vue";
|
import { ref, computed, watch } from "vue";
|
||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
import { addUser, editUser, getUserInfo } from "@/api/user";
|
import { addUser, editUser, getUserInfo } from "@/api/user";
|
||||||
|
import { getAllRoles } from "@/api/role";
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
modelValue: {
|
modelValue: {
|
||||||
@ -112,12 +125,14 @@ const form = ref<any>({
|
|||||||
name: "",
|
name: "",
|
||||||
phone: "",
|
phone: "",
|
||||||
qq: "",
|
qq: "",
|
||||||
|
group_id: undefined,
|
||||||
sex: 1,
|
sex: 1,
|
||||||
password: "",
|
password: "",
|
||||||
confirmPassword: "",
|
confirmPassword: "",
|
||||||
email: "",
|
email: "",
|
||||||
status: 1,
|
status: 1,
|
||||||
});
|
});
|
||||||
|
const roleOptions = ref<any[]>([]);
|
||||||
|
|
||||||
const dialogTitle = computed(() => {
|
const dialogTitle = computed(() => {
|
||||||
return isAdd.value ? "添加用户" : "编辑用户";
|
return isAdd.value ? "添加用户" : "编辑用户";
|
||||||
@ -179,6 +194,7 @@ const rules = {
|
|||||||
{ min: 3, max: 20, message: "账号长度在 3 到 20 个字符", trigger: "blur" },
|
{ min: 3, max: 20, message: "账号长度在 3 到 20 个字符", trigger: "blur" },
|
||||||
],
|
],
|
||||||
name: [{ required: true, message: "请输入姓名", trigger: "blur" }],
|
name: [{ required: true, message: "请输入姓名", trigger: "blur" }],
|
||||||
|
group_id: [{ required: true, message: "请选择角色", trigger: "change" }],
|
||||||
password: [{ validator: validatePassword, trigger: "blur" }],
|
password: [{ validator: validatePassword, trigger: "blur" }],
|
||||||
confirmPassword: [{ validator: validateConfirmPassword, trigger: "blur" }],
|
confirmPassword: [{ validator: validateConfirmPassword, trigger: "blur" }],
|
||||||
email: [{ type: "email", message: "请输入正确的邮箱地址", trigger: "blur" }],
|
email: [{ type: "email", message: "请输入正确的邮箱地址", trigger: "blur" }],
|
||||||
@ -235,6 +251,7 @@ const loadUserData = async (user: any) => {
|
|||||||
name: data.name,
|
name: data.name,
|
||||||
phone: data.phone,
|
phone: data.phone,
|
||||||
qq: data.qq,
|
qq: data.qq,
|
||||||
|
group_id: data.group_id,
|
||||||
sex: sexValue,
|
sex: sexValue,
|
||||||
password: "",
|
password: "",
|
||||||
confirmPassword: "",
|
confirmPassword: "",
|
||||||
@ -249,6 +266,17 @@ const loadUserData = async (user: any) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const loadRoles = async () => {
|
||||||
|
try {
|
||||||
|
const res = await getAllRoles();
|
||||||
|
const allRoles = Array.isArray(res?.data) ? res.data : [];
|
||||||
|
// 平台用户只能绑定平台角色
|
||||||
|
roleOptions.value = allRoles.filter((r: any) => Number(r.cid || 1) === 1);
|
||||||
|
} catch {
|
||||||
|
roleOptions.value = [];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handleCancel = () => {
|
const handleCancel = () => {
|
||||||
visible.value = false;
|
visible.value = false;
|
||||||
};
|
};
|
||||||
@ -295,6 +323,7 @@ const handleSubmit = async () => {
|
|||||||
name: form.value.name,
|
name: form.value.name,
|
||||||
phone: form.value.phone,
|
phone: form.value.phone,
|
||||||
qq: form.value.qq,
|
qq: form.value.qq,
|
||||||
|
group_id: form.value.group_id,
|
||||||
sex: form.value.sex,
|
sex: form.value.sex,
|
||||||
email: form.value.email,
|
email: form.value.email,
|
||||||
status: form.value.status,
|
status: form.value.status,
|
||||||
@ -316,6 +345,7 @@ const handleSubmit = async () => {
|
|||||||
name: form.value.name,
|
name: form.value.name,
|
||||||
phone: form.value.phone,
|
phone: form.value.phone,
|
||||||
qq: form.value.qq,
|
qq: form.value.qq,
|
||||||
|
group_id: form.value.group_id,
|
||||||
sex: form.value.sex,
|
sex: form.value.sex,
|
||||||
email: form.value.email,
|
email: form.value.email,
|
||||||
status: form.value.status,
|
status: form.value.status,
|
||||||
@ -343,12 +373,14 @@ defineExpose({
|
|||||||
loadUserData,
|
loadUserData,
|
||||||
openAdd: () => {
|
openAdd: () => {
|
||||||
isAdd.value = true;
|
isAdd.value = true;
|
||||||
|
loadRoles();
|
||||||
form.value = {
|
form.value = {
|
||||||
id: 0,
|
id: 0,
|
||||||
account: "",
|
account: "",
|
||||||
name: "",
|
name: "",
|
||||||
phone: "",
|
phone: "",
|
||||||
qq: "",
|
qq: "",
|
||||||
|
group_id: undefined,
|
||||||
sex: 1,
|
sex: 1,
|
||||||
password: "",
|
password: "",
|
||||||
confirmPassword: "",
|
confirmPassword: "",
|
||||||
@ -363,6 +395,7 @@ defineExpose({
|
|||||||
},
|
},
|
||||||
openEdit: (user: any) => {
|
openEdit: (user: any) => {
|
||||||
isAdd.value = false;
|
isAdd.value = false;
|
||||||
|
loadRoles();
|
||||||
visible.value = true;
|
visible.value = true;
|
||||||
// 清除表单验证
|
// 清除表单验证
|
||||||
if (formRef.value) {
|
if (formRef.value) {
|
||||||
@ -372,6 +405,7 @@ defineExpose({
|
|||||||
loadUserData(user);
|
loadUserData(user);
|
||||||
},
|
},
|
||||||
open: (user?: any) => {
|
open: (user?: any) => {
|
||||||
|
loadRoles();
|
||||||
if (user) {
|
if (user) {
|
||||||
isAdd.value = false;
|
isAdd.value = false;
|
||||||
loadUserData(user);
|
loadUserData(user);
|
||||||
@ -383,6 +417,7 @@ defineExpose({
|
|||||||
name: "",
|
name: "",
|
||||||
phone: "",
|
phone: "",
|
||||||
qq: "",
|
qq: "",
|
||||||
|
group_id: undefined,
|
||||||
sex: 1,
|
sex: 1,
|
||||||
password: "",
|
password: "",
|
||||||
confirmPassword: "",
|
confirmPassword: "",
|
||||||
|
|||||||
@ -20,16 +20,6 @@
|
|||||||
|
|
||||||
<el-divider></el-divider>
|
<el-divider></el-divider>
|
||||||
|
|
||||||
<div class="filter-bar">
|
|
||||||
<el-form inline>
|
|
||||||
<el-form-item label="租户筛选">
|
|
||||||
<el-select v-model="selectedTenantId" style="width: 220px" disabled>
|
|
||||||
<el-option :label="`当前租户(ID: ${selectedTenantId || '-'})`" :value="selectedTenantId" />
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- 用户列表表格 -->
|
<!-- 用户列表表格 -->
|
||||||
<el-table :data="users" style="width: 100%" v-loading="loading">
|
<el-table :data="users" style="width: 100%" v-loading="loading">
|
||||||
<el-table-column prop="id" label="ID" align="center" fixed="left" />
|
<el-table-column prop="id" label="ID" align="center" fixed="left" />
|
||||||
@ -94,9 +84,8 @@
|
|||||||
import { ref, onMounted } from "vue";
|
import { ref, onMounted } from "vue";
|
||||||
import { ElMessage, ElMessageBox } from "element-plus";
|
import { ElMessage, ElMessageBox } from "element-plus";
|
||||||
import { Plus, Refresh } from "@element-plus/icons-vue";
|
import { Plus, Refresh } from "@element-plus/icons-vue";
|
||||||
import { getTenantUsers, deleteUser } from "@/api/user";
|
import { getAllUsers, deleteUser } from "@/api/user";
|
||||||
import { getAllRoles } from "@/api/role";
|
import { getAllRoles } from "@/api/role";
|
||||||
import { useAuthStore } from "@/stores/auth";
|
|
||||||
import UserEditDialog from "./components/userEdit.vue";
|
import UserEditDialog from "./components/userEdit.vue";
|
||||||
import ChangePasswordDialog from "./components/changePassword.vue";
|
import ChangePasswordDialog from "./components/changePassword.vue";
|
||||||
import PreviewDialog from "./components/preview.vue";
|
import PreviewDialog from "./components/preview.vue";
|
||||||
@ -133,8 +122,6 @@ const total = ref(0);
|
|||||||
const users = ref<User[]>([]);
|
const users = ref<User[]>([]);
|
||||||
const roles = ref<Role[]>([]);
|
const roles = ref<Role[]>([]);
|
||||||
const loading = ref(false);
|
const loading = ref(false);
|
||||||
const authStore = useAuthStore();
|
|
||||||
const selectedTenantId = ref<number>(Number(authStore.user.tid || 0));
|
|
||||||
|
|
||||||
// 组件引用
|
// 组件引用
|
||||||
const userEditRef = ref();
|
const userEditRef = ref();
|
||||||
@ -188,12 +175,7 @@ function getRoleTagText(roles: Role[] | undefined, group_id: number): string {
|
|||||||
const fetchUsers = async () => {
|
const fetchUsers = async () => {
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
try {
|
try {
|
||||||
if (!selectedTenantId.value) {
|
const res = await getAllUsers();
|
||||||
users.value = [];
|
|
||||||
total.value = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const res = await getTenantUsers(selectedTenantId.value);
|
|
||||||
users.value = res?.data?.list || [];
|
users.value = res?.data?.list || [];
|
||||||
total.value = Number(res?.data?.total || 0);
|
total.value = Number(res?.data?.total || 0);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -275,7 +257,6 @@ const handleDelete = async (user: User) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
selectedTenantId.value = Number(authStore.user.tid || 0);
|
|
||||||
fetchUsers();
|
fetchUsers();
|
||||||
fetchRoles();
|
fetchRoles();
|
||||||
});
|
});
|
||||||
|
|||||||
@ -1,680 +1,224 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="home-container">
|
<div class="statistics-container">
|
||||||
<div class="home-top">
|
<el-row :gutter="20" class="data-overview">
|
||||||
<div class="toolbar">
|
<el-col :span="6" v-for="item in summaryData" :key="item.title">
|
||||||
<div class="toolbar-left">
|
<el-card shadow="hover" class="data-card">
|
||||||
<span class="system-name">系统管理平台</span>
|
<div class="card-content">
|
||||||
</div>
|
<div class="icon-box" :style="{ backgroundColor: item.color }">
|
||||||
<div class="toolbar-right">
|
<el-icon><component :is="item.icon" /></el-icon>
|
||||||
<el-tooltip content="刷新菜单" placement="bottom">
|
</div>
|
||||||
<el-button
|
<div class="text-box">
|
||||||
circle
|
<div class="title">{{ item.title }}</div>
|
||||||
:loading="refreshLoading"
|
<div class="value">{{ item.value.toLocaleString() }}</div>
|
||||||
class="toolbar-btn"
|
<div class="trend" :class="item.isUp ? 'up' : 'down'">
|
||||||
@click="handleRefreshMenus"
|
{{ item.isUp ? '↑' : '↓' }} {{ item.percentage }}%
|
||||||
>
|
<span>较上月</span>
|
||||||
<el-icon><RefreshRight /></el-icon>
|
|
||||||
</el-button>
|
|
||||||
</el-tooltip>
|
|
||||||
<el-tooltip
|
|
||||||
:content="
|
|
||||||
currentTheme === 'dark' ? '切换到亮色模式' : '切换到暗色模式'
|
|
||||||
"
|
|
||||||
placement="bottom"
|
|
||||||
>
|
|
||||||
<el-button
|
|
||||||
circle
|
|
||||||
:icon="themeIcon"
|
|
||||||
class="toolbar-btn"
|
|
||||||
@click="toggleTheme"
|
|
||||||
/>
|
|
||||||
</el-tooltip>
|
|
||||||
<el-dropdown trigger="click" @command="handleCommand">
|
|
||||||
<span class="user-dropdown-link">
|
|
||||||
<el-avatar :size="32" :src="userAvatar">
|
|
||||||
{{ userName?.charAt(0)?.toUpperCase() }}
|
|
||||||
</el-avatar>
|
|
||||||
<span class="user-name">{{ userName }}</span>
|
|
||||||
<el-icon><ArrowDown /></el-icon>
|
|
||||||
</span>
|
|
||||||
<template #dropdown>
|
|
||||||
<el-dropdown-menu>
|
|
||||||
<el-dropdown-item command="profile">
|
|
||||||
<el-icon><User /></el-icon>
|
|
||||||
<span>个人中心</span>
|
|
||||||
</el-dropdown-item>
|
|
||||||
<el-dropdown-item divided command="logout">
|
|
||||||
<el-icon><SwitchButton /></el-icon>
|
|
||||||
<span>退出登录</span>
|
|
||||||
</el-dropdown-item>
|
|
||||||
</el-dropdown-menu>
|
|
||||||
</template>
|
|
||||||
</el-dropdown>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="home-wrapper">
|
|
||||||
<div class="modules-section" v-if="moduleList.length > 0">
|
|
||||||
<!-- 功能模块 (type=1) -->
|
|
||||||
<div v-if="basicModules.length > 0" class="category-section">
|
|
||||||
<div class="category-title">功能模块</div>
|
|
||||||
<div class="module-grid">
|
|
||||||
<div
|
|
||||||
v-for="module in basicModules"
|
|
||||||
:key="module.path"
|
|
||||||
class="module-card"
|
|
||||||
@click="handleNavigate(module.path)"
|
|
||||||
>
|
|
||||||
<div class="card-header">
|
|
||||||
<span class="card-title">{{ module.name }}</span>
|
|
||||||
<div class="card-icon-wrapper" v-html="module.icon"></div>
|
|
||||||
</div>
|
|
||||||
<div class="card-divider"></div>
|
|
||||||
<div class="card-content">
|
|
||||||
<p class="card-desc">{{ module.description || "暂无描述" }}</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
<!-- 系统设置 (type=2) -->
|
<el-row :gutter="20" class="charts-row">
|
||||||
<div v-if="systemModules.length > 0" class="category-section">
|
<el-col :span="16">
|
||||||
<div class="category-title">系统设置</div>
|
<el-card shadow="hover" header="用户增长趋势">
|
||||||
<div class="module-grid">
|
<div ref="lineChartRef" class="chart-box"></div>
|
||||||
<div
|
</el-card>
|
||||||
v-for="module in systemModules"
|
</el-col>
|
||||||
:key="module.path"
|
<el-col :span="8">
|
||||||
class="module-card"
|
<el-card shadow="hover" header="用户等级分布">
|
||||||
@click="handleNavigate(module.path)"
|
<div ref="pieChartRef" class="chart-box"></div>
|
||||||
>
|
</el-card>
|
||||||
<div class="card-header">
|
</el-col>
|
||||||
<span class="card-title">{{ module.name }}</span>
|
</el-row>
|
||||||
<div class="card-icon-wrapper" v-html="module.icon"></div>
|
|
||||||
</div>
|
|
||||||
<div class="card-divider"></div>
|
|
||||||
<div class="card-content">
|
|
||||||
<p class="card-desc">{{ module.description || "暂无描述" }}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- 未分类 (type=0) -->
|
|
||||||
<div v-if="uncategorizedModules.length > 0" class="category-section">
|
|
||||||
<div class="category-title">未分类</div>
|
|
||||||
<div class="module-grid">
|
|
||||||
<div
|
|
||||||
v-for="module in uncategorizedModules"
|
|
||||||
:key="module.path"
|
|
||||||
class="module-card"
|
|
||||||
@click="handleNavigate(module.path)"
|
|
||||||
>
|
|
||||||
<div class="card-header">
|
|
||||||
<span class="card-title">{{ module.name }}</span>
|
|
||||||
<div class="card-icon-wrapper" v-html="module.icon"></div>
|
|
||||||
</div>
|
|
||||||
<div class="card-divider"></div>
|
|
||||||
<div class="card-content">
|
|
||||||
<p class="card-desc">{{ module.description || "暂无描述" }}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-else class="empty-state">
|
|
||||||
<el-icon :size="64" class="empty-icon"><Grid /></el-icon>
|
|
||||||
<p class="empty-text">暂无功能模块</p>
|
|
||||||
<p class="empty-tip">请联系管理员配置系统菜单</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, computed, onMounted } from "vue";
|
import { ref, onMounted, onUnmounted, shallowRef } from "vue";
|
||||||
import { useRouter } from "vue-router";
|
import * as echarts from "echarts";
|
||||||
import { ElMessage } from "element-plus";
|
import { User, Pointer, Connection, Histogram } from "@element-plus/icons-vue";
|
||||||
|
|
||||||
import {
|
interface SummaryItem {
|
||||||
ArrowDown,
|
title: string;
|
||||||
User,
|
value: number;
|
||||||
SwitchButton,
|
icon: any;
|
||||||
Grid,
|
color: string;
|
||||||
RefreshRight,
|
percentage: number;
|
||||||
Sunny,
|
isUp: boolean;
|
||||||
Moon,
|
|
||||||
} from "@element-plus/icons-vue";
|
|
||||||
|
|
||||||
import { getTenantList } from "@/api/modules";
|
|
||||||
import { useAuthStore } from "@/stores/auth";
|
|
||||||
import { useMenuStore } from "@/stores/menu";
|
|
||||||
|
|
||||||
interface ModuleItem {
|
|
||||||
id: number;
|
|
||||||
name: string;
|
|
||||||
code: string;
|
|
||||||
path: string;
|
|
||||||
icon: string;
|
|
||||||
description: string;
|
|
||||||
sort: number;
|
|
||||||
status: number;
|
|
||||||
type: number;
|
|
||||||
title?: string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const router = useRouter();
|
const lineChartRef = ref<HTMLElement | null>(null);
|
||||||
const authStore = useAuthStore();
|
const pieChartRef = ref<HTMLElement | null>(null);
|
||||||
const menuStore = useMenuStore();
|
const lineChartInstance = shallowRef<echarts.ECharts | null>(null);
|
||||||
|
const pieChartInstance = shallowRef<echarts.ECharts | null>(null);
|
||||||
|
|
||||||
// 根据type分组模块
|
const summaryData = ref<SummaryItem[]>([
|
||||||
const basicModules = computed(() =>
|
{
|
||||||
moduleList.value.filter((item) => item.type === 1)
|
title: "总用户数",
|
||||||
);
|
value: 12840,
|
||||||
const systemModules = computed(() =>
|
icon: User,
|
||||||
moduleList.value.filter((item) => item.type === 2)
|
color: "#3973FF",
|
||||||
);
|
percentage: 12,
|
||||||
const uncategorizedModules = computed(() =>
|
isUp: true,
|
||||||
moduleList.value.filter((item) => item.type === 0)
|
},
|
||||||
);
|
{
|
||||||
|
title: "今日新增",
|
||||||
|
value: 156,
|
||||||
|
icon: Pointer,
|
||||||
|
color: "#67C23A",
|
||||||
|
percentage: 5,
|
||||||
|
isUp: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "活跃用户",
|
||||||
|
value: 3420,
|
||||||
|
icon: Connection,
|
||||||
|
color: "#E6A23C",
|
||||||
|
percentage: 2,
|
||||||
|
isUp: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "留存率",
|
||||||
|
value: 85,
|
||||||
|
icon: Histogram,
|
||||||
|
color: "#F56C6C",
|
||||||
|
percentage: 1,
|
||||||
|
isUp: true,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
const moduleList = ref<ModuleItem[]>([]);
|
const initCharts = () => {
|
||||||
const refreshLoading = ref(false);
|
if (lineChartRef.value) {
|
||||||
|
lineChartInstance.value = echarts.init(lineChartRef.value);
|
||||||
const THEME_STORAGE_KEY = "element-plus-theme";
|
lineChartInstance.value.setOption({
|
||||||
const isDark = ref(false);
|
tooltip: { trigger: "axis" },
|
||||||
|
grid: { left: "3%", right: "4%", bottom: "3%", containLabel: true },
|
||||||
const initTheme = () => {
|
xAxis: {
|
||||||
const savedTheme = localStorage.getItem(THEME_STORAGE_KEY);
|
type: "category",
|
||||||
if (savedTheme) {
|
boundaryGap: false,
|
||||||
isDark.value = savedTheme === "dark";
|
data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
|
||||||
} else {
|
},
|
||||||
const prefersDark = window.matchMedia(
|
yAxis: { type: "value" },
|
||||||
"(prefers-color-scheme: dark)",
|
series: [
|
||||||
).matches;
|
{
|
||||||
isDark.value = prefersDark;
|
name: "新增用户",
|
||||||
|
type: "line",
|
||||||
|
smooth: true,
|
||||||
|
data: [120, 132, 101, 134, 90, 230, 210],
|
||||||
|
areaStyle: { opacity: 0.3 },
|
||||||
|
itemStyle: { color: "#3973FF" },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
}
|
}
|
||||||
applyTheme();
|
|
||||||
};
|
|
||||||
|
|
||||||
const applyTheme = () => {
|
if (pieChartRef.value) {
|
||||||
const htmlElement = document.documentElement;
|
pieChartInstance.value = echarts.init(pieChartRef.value);
|
||||||
if (isDark.value) {
|
pieChartInstance.value.setOption({
|
||||||
htmlElement.classList.add("dark");
|
tooltip: { trigger: "item" },
|
||||||
localStorage.setItem(THEME_STORAGE_KEY, "dark");
|
legend: { bottom: "0%", left: "center" },
|
||||||
} else {
|
series: [
|
||||||
htmlElement.classList.remove("dark");
|
{
|
||||||
localStorage.setItem(THEME_STORAGE_KEY, "light");
|
name: "等级分布",
|
||||||
|
type: "pie",
|
||||||
|
radius: ["40%", "70%"],
|
||||||
|
avoidLabelOverlap: false,
|
||||||
|
itemStyle: { borderRadius: 10, borderColor: "#fff", borderWidth: 2 },
|
||||||
|
label: { show: false },
|
||||||
|
data: [
|
||||||
|
{ value: 1048, name: "普通用户" },
|
||||||
|
{ value: 735, name: "VIP会员" },
|
||||||
|
{ value: 580, name: "超级管理员" },
|
||||||
|
{ value: 484, name: "运营人员" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const toggleTheme = () => {
|
const handleResize = () => {
|
||||||
isDark.value = !isDark.value;
|
lineChartInstance.value?.resize();
|
||||||
applyTheme();
|
pieChartInstance.value?.resize();
|
||||||
};
|
};
|
||||||
|
|
||||||
const currentTheme = computed(() => (isDark.value ? "dark" : "light"));
|
|
||||||
const themeIcon = computed(() => (isDark.value ? Sunny : Moon));
|
|
||||||
|
|
||||||
const userName = computed(
|
|
||||||
() => authStore.user?.name || authStore.user?.account || "用户",
|
|
||||||
);
|
|
||||||
const userAvatar = computed(() => authStore.user?.avatar || "");
|
|
||||||
|
|
||||||
// 处理导航跳转
|
|
||||||
function handleNavigate(path: string) {
|
|
||||||
if (path) router.push(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 刷新菜单
|
|
||||||
async function handleRefreshMenus() {
|
|
||||||
refreshLoading.value = true;
|
|
||||||
try {
|
|
||||||
await menuStore.refreshMenus();
|
|
||||||
ElMessage.success("菜单已刷新");
|
|
||||||
} catch {
|
|
||||||
ElMessage.error("刷新菜单失败");
|
|
||||||
} finally {
|
|
||||||
refreshLoading.value = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 处理用户操作命令(个人中心、退出登录)
|
|
||||||
async function handleCommand(command: string) {
|
|
||||||
switch (command) {
|
|
||||||
case "profile":
|
|
||||||
router.push("/user/userProfile");
|
|
||||||
break;
|
|
||||||
case "logout":
|
|
||||||
await handleLogout();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 处理退出登录逻辑
|
|
||||||
async function handleLogout() {
|
|
||||||
try {
|
|
||||||
const user = authStore.user;
|
|
||||||
if (user?.id) await authStore.logout(user.id);
|
|
||||||
} catch (error) {
|
|
||||||
console.error("退出登录接口调用失败:", error);
|
|
||||||
}
|
|
||||||
authStore.clearToken();
|
|
||||||
localStorage.removeItem("user");
|
|
||||||
sessionStorage.removeItem("user");
|
|
||||||
localStorage.removeItem("tenant");
|
|
||||||
sessionStorage.removeItem("tenant");
|
|
||||||
menuStore.resetMenus();
|
|
||||||
router.push("/login");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 加载模块列表
|
|
||||||
async function loadModules() {
|
|
||||||
try {
|
|
||||||
const res = await getTenantList();
|
|
||||||
if (res.code === 200) {
|
|
||||||
const list = res.data?.list || [];
|
|
||||||
const filteredList = list
|
|
||||||
.filter((item: ModuleItem) => item.status === 1 && item.is_show === 1)
|
|
||||||
.sort((a, b) => Number(a.sort) - Number(b.sort));
|
|
||||||
moduleList.value = filteredList
|
|
||||||
.map((item: ModuleItem) => {
|
|
||||||
const mapped = {
|
|
||||||
...item,
|
|
||||||
type: item.type ?? 0, // 默认为0(未分类)
|
|
||||||
title: item.name // 添加title字段用于显示分类标题
|
|
||||||
};
|
|
||||||
return mapped;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error("加载模块列表失败:", error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 组件挂载时加载模块列表
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
loadModules();
|
initCharts();
|
||||||
initTheme();
|
window.addEventListener("resize", handleResize);
|
||||||
|
});
|
||||||
|
|
||||||
|
onUnmounted(() => {
|
||||||
|
window.removeEventListener("resize", handleResize);
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="less">
|
<style scoped lang="less">
|
||||||
// 定义一些可复用的变量(可选,建议根据项目规范调整)
|
.statistics-container {
|
||||||
@primary-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
padding: 20px;
|
||||||
@bg-gradient: linear-gradient(135deg, #f5f7fa 0%, #e4e8eb 100%);
|
min-height: calc(100vh - 180px);
|
||||||
@text-main: #1a1a2e;
|
|
||||||
@text-regular: #606266;
|
|
||||||
|
|
||||||
.home-container {
|
.data-overview {
|
||||||
min-height: 100vh;
|
margin-bottom: 20px;
|
||||||
padding: 0;
|
|
||||||
|
|
||||||
.home-top {
|
.data-card {
|
||||||
background: #fff;
|
.card-content {
|
||||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
|
|
||||||
position: sticky;
|
|
||||||
top: 0;
|
|
||||||
z-index: 100;
|
|
||||||
|
|
||||||
.toolbar {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
max-width: 1400px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 12px 24px;
|
|
||||||
|
|
||||||
.toolbar-left {
|
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|
||||||
.system-name {
|
.icon-box {
|
||||||
font-size: 18px;
|
width: 56px;
|
||||||
font-weight: 600;
|
height: 56px;
|
||||||
color: @text-main;
|
border-radius: 12px;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.toolbar-right {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 12px;
|
|
||||||
|
|
||||||
.toolbar-btn {
|
|
||||||
background: #f5f7fa;
|
|
||||||
border-color: #e4e7ed;
|
|
||||||
color: @text-regular;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: #f0f2f5;
|
|
||||||
border-color: #c0c4cc;
|
|
||||||
color: #3973ff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.user-dropdown-link {
|
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 8px;
|
justify-content: center;
|
||||||
cursor: pointer;
|
margin-right: 15px;
|
||||||
padding: 4px 8px;
|
|
||||||
border-radius: 8px;
|
|
||||||
transition: background-color 0.3s;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: #f5f7fa;
|
|
||||||
}
|
|
||||||
|
|
||||||
.user-avatar {
|
|
||||||
width: 32px;
|
|
||||||
height: 32px;
|
|
||||||
border-radius: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.user-name {
|
|
||||||
font-size: 14px;
|
|
||||||
color: @text-regular;
|
|
||||||
max-width: 80px;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.home-wrapper {
|
|
||||||
max-width: 1400px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 40px 24px;
|
|
||||||
|
|
||||||
.welcome-section {
|
|
||||||
position: relative;
|
|
||||||
background: @primary-gradient;
|
|
||||||
border-radius: 20px;
|
|
||||||
padding: 48px 56px;
|
|
||||||
margin-bottom: 40px;
|
|
||||||
overflow: hidden;
|
|
||||||
box-shadow: 0 10px 40px rgba(102, 126, 234, 0.3);
|
|
||||||
|
|
||||||
.welcome-content {
|
|
||||||
position: relative;
|
|
||||||
z-index: 1;
|
|
||||||
|
|
||||||
.welcome-title {
|
|
||||||
font-size: 36px;
|
|
||||||
font-weight: 700;
|
|
||||||
color: #fff;
|
color: #fff;
|
||||||
margin: 0 0 12px 0;
|
font-size: 24px;
|
||||||
|
|
||||||
.greeting {
|
|
||||||
font-weight: 400;
|
|
||||||
opacity: 0.9;
|
|
||||||
}
|
|
||||||
|
|
||||||
.username {
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.welcome-subtitle {
|
.text-box {
|
||||||
font-size: 18px;
|
.title {
|
||||||
color: rgba(255, 255, 255, 0.9);
|
|
||||||
margin: 0 0 8px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.welcome-desc {
|
|
||||||
font-size: 14px;
|
|
||||||
color: rgba(255, 255, 255, 0.7);
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.welcome-decoration {
|
|
||||||
position: absolute;
|
|
||||||
right: 60px;
|
|
||||||
top: 50%;
|
|
||||||
transform: translateY(-50%);
|
|
||||||
|
|
||||||
.decoration-circle {
|
|
||||||
position: absolute;
|
|
||||||
border-radius: 50%;
|
|
||||||
background: rgba(255, 255, 255, 0.1);
|
|
||||||
|
|
||||||
&.circle-1 {
|
|
||||||
width: 200px;
|
|
||||||
height: 200px;
|
|
||||||
top: -80px;
|
|
||||||
right: -60px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.circle-2 {
|
|
||||||
width: 120px;
|
|
||||||
height: 120px;
|
|
||||||
bottom: -40px;
|
|
||||||
right: 120px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.circle-3 {
|
|
||||||
width: 60px;
|
|
||||||
height: 60px;
|
|
||||||
top: 20px;
|
|
||||||
right: -20px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.modules-section {
|
|
||||||
margin-top: 20px;
|
|
||||||
|
|
||||||
.category-section {
|
|
||||||
margin-bottom: 32px;
|
|
||||||
|
|
||||||
.category-title {
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: 600;
|
|
||||||
color: @text-main;
|
|
||||||
margin: 0 0 20px 0;
|
|
||||||
padding-left: 4px;
|
|
||||||
border-left: 4px solid #667eea;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.module-grid {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(5, 1fr);
|
|
||||||
gap: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.module-card {
|
|
||||||
height: 180px;
|
|
||||||
background: #fff;
|
|
||||||
border-radius: 12px;
|
|
||||||
padding: 30px;
|
|
||||||
cursor: pointer;
|
|
||||||
transition: all 0.3s ease;
|
|
||||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
|
|
||||||
border: 1px solid #e8e8e8;
|
|
||||||
|
|
||||||
.card-header {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
gap: 12px;
|
|
||||||
|
|
||||||
.card-icon-wrapper {
|
|
||||||
width: 30px;
|
|
||||||
height: 30px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
color: #3973ff;
|
|
||||||
font-size: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-title {
|
|
||||||
font-size: 18px;
|
|
||||||
font-weight: 600;
|
|
||||||
color: @text-main;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-divider {
|
|
||||||
border-bottom: 1px solid #dfdfdf;
|
|
||||||
margin: 15px 0;
|
|
||||||
transition: opacity 0.3s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-content {
|
|
||||||
.card-desc {
|
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
color: #909399;
|
color: #909399;
|
||||||
margin: 0;
|
|
||||||
line-height: 1.5;
|
|
||||||
display: -webkit-box;
|
|
||||||
-webkit-line-clamp: 3;
|
|
||||||
-webkit-box-orient: vertical;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
}
|
||||||
}
|
.value {
|
||||||
|
font-size: 24px;
|
||||||
&:hover {
|
font-weight: bold;
|
||||||
transform: translateY(-4px);
|
margin: 4px 0;
|
||||||
box-shadow: 0 8px 24px rgba(102, 126, 234, 0.15);
|
color: var(--el-text-color-primary);
|
||||||
background-color: #3973ff;
|
|
||||||
|
|
||||||
.card-title,
|
|
||||||
.card-desc {
|
|
||||||
color: #fff;
|
|
||||||
}
|
}
|
||||||
|
.trend {
|
||||||
.card-icon-wrapper {
|
font-size: 12px;
|
||||||
color: #fff;
|
&.up {
|
||||||
}
|
color: #67c23a;
|
||||||
|
|
||||||
.card-divider {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.empty-state {
|
|
||||||
text-align: center;
|
|
||||||
padding: 80px 20px;
|
|
||||||
|
|
||||||
.empty-icon {
|
|
||||||
color: #c0c4cc;
|
|
||||||
margin-bottom: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.empty-text {
|
|
||||||
font-size: 18px;
|
|
||||||
color: #606266;
|
|
||||||
margin: 0 0 8px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.empty-tip {
|
|
||||||
font-size: 14px;
|
|
||||||
color: #909399;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 1200px) {
|
|
||||||
.modules-section {
|
|
||||||
.module-grid {
|
|
||||||
grid-template-columns: repeat(3, 1fr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 992px) {
|
|
||||||
.modules-section {
|
|
||||||
.module-grid {
|
|
||||||
grid-template-columns: repeat(2, 1fr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
|
||||||
.welcome-section {
|
|
||||||
padding: 32px 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.welcome-title {
|
|
||||||
font-size: 28px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.welcome-decoration {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.modules-section {
|
|
||||||
.module-grid {
|
|
||||||
grid-template-columns: 1fr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
html.dark & {
|
|
||||||
.home-top {
|
|
||||||
background: #1a1a1a;
|
|
||||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
|
|
||||||
|
|
||||||
.toolbar {
|
|
||||||
.toolbar-left .system-name {
|
|
||||||
color: #e0e0e0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toolbar-right {
|
|
||||||
.toolbar-btn {
|
|
||||||
background: #2d2d2d;
|
|
||||||
border-color: #3d3d3d;
|
|
||||||
color: #b0b0b0;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: #3d3d3d;
|
|
||||||
border-color: #4d4d4d;
|
|
||||||
color: #3973ff;
|
|
||||||
}
|
}
|
||||||
}
|
&.down {
|
||||||
|
color: #f56c6c;
|
||||||
.user-dropdown-link {
|
|
||||||
&:hover {
|
|
||||||
background: #2d2d2d;
|
|
||||||
}
|
}
|
||||||
|
span {
|
||||||
.user-name {
|
color: #909399;
|
||||||
color: #b0b0b0;
|
margin-left: 4px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.modules-section {
|
.charts-row {
|
||||||
.module-card {
|
.chart-box {
|
||||||
background: #1a1a1a;
|
height: 350px;
|
||||||
border-color: #3d3d3d;
|
width: 100%;
|
||||||
|
|
||||||
.card-title {
|
|
||||||
color: #e0e0e0 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-desc {
|
|
||||||
color: #8c8c8c !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-divider {
|
|
||||||
border-color: #3d3d3d;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:deep(.el-card__header) {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 16px;
|
||||||
|
border-bottom: 1px solid #ebeef5;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -20,18 +20,13 @@
|
|||||||
<div class="login-panel">
|
<div class="login-panel">
|
||||||
<h2 class="login-title">欢迎登录</h2>
|
<h2 class="login-title">欢迎登录</h2>
|
||||||
<div class="login-desc">请填写您的账号信息</div>
|
<div class="login-desc">请填写您的账号信息</div>
|
||||||
<div class="mode-switch">
|
<div class="form-group icon-input-group">
|
||||||
<button class="mode-btn" :class="{ active: loginMode === 'password' }"
|
|
||||||
@click="switchMode('password')">账号密码登录</button>
|
|
||||||
<button class="mode-btn" :class="{ active: loginMode === 'sms' }" @click="switchMode('sms')">手机号验证码登录</button>
|
|
||||||
</div>
|
|
||||||
<div v-if="loginMode === 'password'" class="form-group icon-input-group">
|
|
||||||
<span class="input-icon">
|
<span class="input-icon">
|
||||||
<i class="fa-solid fa-user"></i>
|
<i class="fa-solid fa-user"></i>
|
||||||
</span>
|
</span>
|
||||||
<input v-model="account" type="text" placeholder="用户名" autocomplete="account" class="input input-with-icon" />
|
<input v-model="account" type="text" placeholder="用户名" autocomplete="account" class="input input-with-icon" />
|
||||||
</div>
|
</div>
|
||||||
<div v-if="loginMode === 'password'" class="form-group icon-input-group">
|
<div class="form-group icon-input-group">
|
||||||
<span class="input-icon">
|
<span class="input-icon">
|
||||||
<i class="fa-solid fa-lock"></i>
|
<i class="fa-solid fa-lock"></i>
|
||||||
</span>
|
</span>
|
||||||
@ -43,29 +38,14 @@
|
|||||||
<i v-else class="fa-solid fa-eye-slash"></i>
|
<i v-else class="fa-solid fa-eye-slash"></i>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="loginMode === 'sms'" class="form-group icon-input-group">
|
|
||||||
<span class="input-icon">
|
|
||||||
<i class="fa-solid fa-mobile-screen-button"></i>
|
|
||||||
</span>
|
|
||||||
<input v-model="phone" type="text" placeholder="手机号" autocomplete="tel" class="input input-with-icon" />
|
|
||||||
</div>
|
|
||||||
<div v-if="loginMode === 'sms'" class="form-group code-row">
|
|
||||||
<input v-model="smsCode" type="text" placeholder="短信验证码" class="input code-input" />
|
|
||||||
<button class="code-btn" :disabled="codeLoading || countdown > 0" @click="handleSendLoginCode">
|
|
||||||
{{ countdown > 0 ? `${countdown}s` : (codeLoading ? "发送中..." : "发送验证码") }}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- 极验验证码容器 -->
|
<!-- 极验验证码容器 -->
|
||||||
<div style="display: none;" v-if="showCaptchaContainer" class="geetest-container" ref="captchaContainer"></div>
|
<div style="display: none;" v-if="showCaptchaContainer" class="geetest-container" ref="captchaContainer"></div>
|
||||||
|
|
||||||
<div class="remember-me-row">
|
<div class="remember-me-row">
|
||||||
<label v-if="loginMode === 'password'" class="remember-me-label">
|
<label class="remember-me-label">
|
||||||
<input type="checkbox" v-model="rememberMe" class="remember-me-checkbox" @change="handleRememberMeChange" />
|
<input type="checkbox" v-model="rememberMe" class="remember-me-checkbox" @change="handleRememberMeChange" />
|
||||||
<span>记住我</span>
|
<span>记住我</span>
|
||||||
</label>
|
</label>
|
||||||
<span v-else></span>
|
|
||||||
<div class="action-links">
|
<div class="action-links">
|
||||||
<a class="forget-link" @click.prevent="goForget">忘记密码?</a>
|
<a class="forget-link" @click.prevent="goForget">忘记密码?</a>
|
||||||
</div>
|
</div>
|
||||||
@ -85,10 +65,10 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, onMounted, nextTick, onUnmounted } from "vue";
|
import { ref, onMounted, nextTick } from "vue";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
import { useAuthStore } from "@/stores/auth";
|
import { useAuthStore } from "@/stores/auth";
|
||||||
import { login, getOpenVerify, getGeetest4Infos, sendLoginCode, loginBySms } from "@/api/login";
|
import { login, getOpenVerify, getGeetest4Infos } from "@/api/login";
|
||||||
import "@/assets/js/gt4.js";
|
import "@/assets/js/gt4.js";
|
||||||
import { ElMessageBox, ElMessage } from "element-plus";
|
import { ElMessageBox, ElMessage } from "element-plus";
|
||||||
|
|
||||||
@ -96,17 +76,11 @@ const router = useRouter();
|
|||||||
const authStore = useAuthStore();
|
const authStore = useAuthStore();
|
||||||
|
|
||||||
// --- 表单数据 ---
|
// --- 表单数据 ---
|
||||||
const loginMode = ref<"password" | "sms">("password");
|
|
||||||
const account = ref("");
|
const account = ref("");
|
||||||
const password = ref("");
|
const password = ref("");
|
||||||
const phone = ref("");
|
|
||||||
const smsCode = ref("");
|
|
||||||
const passwordVisible = ref(false);
|
const passwordVisible = ref(false);
|
||||||
const rememberMe = ref(false);
|
const rememberMe = ref(false);
|
||||||
const loading = ref(false);
|
const loading = ref(false);
|
||||||
const codeLoading = ref(false);
|
|
||||||
const countdown = ref(0);
|
|
||||||
let countdownTimer: ReturnType<typeof setInterval> | null = null;
|
|
||||||
const errorMsg = ref("");
|
const errorMsg = ref("");
|
||||||
|
|
||||||
// --- 极验相关变量 ---
|
// --- 极验相关变量 ---
|
||||||
@ -141,24 +115,6 @@ const cleanCaptchaInstance = () => {
|
|||||||
|
|
||||||
// --- 执行登录请求 ---
|
// --- 执行登录请求 ---
|
||||||
const performLoginRequest = async () => {
|
const performLoginRequest = async () => {
|
||||||
if (loginMode.value === "sms") {
|
|
||||||
const res = await loginBySms({
|
|
||||||
phone: phone.value,
|
|
||||||
sms_code: smsCode.value,
|
|
||||||
});
|
|
||||||
if (res && res.code === 200) {
|
|
||||||
authStore.setLoginInfo(res.data);
|
|
||||||
const { useTabsStore } = await import("@/stores");
|
|
||||||
const tabsStore = useTabsStore();
|
|
||||||
tabsStore.resetTabs();
|
|
||||||
router.push({ path: "/home" });
|
|
||||||
ElMessage.success("登录成功!");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
errorMsg.value = res.msg || "登录失败";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const res = await login({
|
const res = await login({
|
||||||
account: account.value,
|
account: account.value,
|
||||||
password: password.value
|
password: password.value
|
||||||
@ -193,48 +149,6 @@ const performLoginRequest = async () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const switchMode = (mode: "password" | "sms") => {
|
|
||||||
loginMode.value = mode;
|
|
||||||
errorMsg.value = "";
|
|
||||||
};
|
|
||||||
|
|
||||||
const startCountdown = () => {
|
|
||||||
countdown.value = 60;
|
|
||||||
if (countdownTimer) clearInterval(countdownTimer);
|
|
||||||
countdownTimer = setInterval(() => {
|
|
||||||
countdown.value -= 1;
|
|
||||||
if (countdown.value <= 0) {
|
|
||||||
if (countdownTimer) clearInterval(countdownTimer);
|
|
||||||
countdownTimer = null;
|
|
||||||
}
|
|
||||||
}, 1000);
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleSendLoginCode = async () => {
|
|
||||||
if (codeLoading.value || countdown.value > 0) return;
|
|
||||||
if (!phone.value.trim()) {
|
|
||||||
errorMsg.value = "请输入手机号";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
codeLoading.value = true;
|
|
||||||
errorMsg.value = "";
|
|
||||||
try {
|
|
||||||
const res = await sendLoginCode({
|
|
||||||
phone: phone.value,
|
|
||||||
});
|
|
||||||
if (res && res.code === 200) {
|
|
||||||
ElMessage.success("验证码已发送");
|
|
||||||
startCountdown();
|
|
||||||
} else {
|
|
||||||
errorMsg.value = res?.msg || "发送验证码失败";
|
|
||||||
}
|
|
||||||
} catch (err: any) {
|
|
||||||
errorMsg.value = err?.response?.data?.msg || err?.message || "发送验证码失败";
|
|
||||||
} finally {
|
|
||||||
codeLoading.value = false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// --- 初始化极验4.0 ---
|
// --- 初始化极验4.0 ---
|
||||||
const startGeetest4 = async () => {
|
const startGeetest4 = async () => {
|
||||||
showCaptchaContainer.value = true;
|
showCaptchaContainer.value = true;
|
||||||
@ -343,50 +257,34 @@ const handleLogin = async () => {
|
|||||||
errorMsg.value = "";
|
errorMsg.value = "";
|
||||||
|
|
||||||
// 表单验证
|
// 表单验证
|
||||||
if (loginMode.value === "password") {
|
if (!account.value.trim()) {
|
||||||
if (!account.value.trim()) {
|
errorMsg.value = "请输入用户名";
|
||||||
errorMsg.value = "请输入用户名";
|
return;
|
||||||
return;
|
}
|
||||||
}
|
if (!password.value.trim()) {
|
||||||
if (!password.value.trim()) {
|
errorMsg.value = "请输入密码";
|
||||||
errorMsg.value = "请输入密码";
|
return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (!phone.value.trim()) {
|
|
||||||
errorMsg.value = "请输入手机号";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!smsCode.value.trim()) {
|
|
||||||
errorMsg.value = "请输入短信验证码";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (loading.value) return;
|
if (loading.value) return;
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (loginMode.value === "password") {
|
// 先判断是否开启验证
|
||||||
// 先判断是否开启验证
|
const verifyRes = await getOpenVerify();
|
||||||
const verifyRes = await getOpenVerify();
|
let openVerify = "0";
|
||||||
let openVerify = "0";
|
|
||||||
|
|
||||||
if (verifyRes && verifyRes.code === 200 && Array.isArray(verifyRes.data)) {
|
if (verifyRes && verifyRes.code === 200 && Array.isArray(verifyRes.data)) {
|
||||||
verifyRes.data.forEach((item: any) => {
|
verifyRes.data.forEach((item: any) => {
|
||||||
if (item.label === "openVerify") {
|
if (item.label === "openVerify") {
|
||||||
openVerify = item.value || "0";
|
openVerify = item.value || "0";
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果开启了验证,使用极验4.0
|
// 如果开启了验证,使用极验4.0
|
||||||
if (openVerify === "1") {
|
if (openVerify === "1") {
|
||||||
await startGeetest4();
|
await startGeetest4();
|
||||||
} else {
|
|
||||||
// 直接登录
|
|
||||||
await performLoginRequest();
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// 直接登录
|
// 直接登录
|
||||||
await performLoginRequest();
|
await performLoginRequest();
|
||||||
@ -429,10 +327,6 @@ onMounted(() => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
onUnmounted(() => {
|
|
||||||
if (countdownTimer) clearInterval(countdownTimer);
|
|
||||||
});
|
|
||||||
|
|
||||||
const goRegister = () => router.push("/register");
|
const goRegister = () => router.push("/register");
|
||||||
const goForget = () => router.push("/forget");
|
const goForget = () => router.push("/forget");
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -16,7 +16,19 @@
|
|||||||
placeholder="请选择父级菜单"
|
placeholder="请选择父级菜单"
|
||||||
clearable
|
clearable
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
/>
|
>
|
||||||
|
<template #default="{ node, data }">
|
||||||
|
<span>{{ data.title }}</span>
|
||||||
|
<el-tag
|
||||||
|
v-if="node?.level === 1"
|
||||||
|
size="small"
|
||||||
|
:type="getMenuSideTagType(data)"
|
||||||
|
style="margin-left: 8px"
|
||||||
|
>
|
||||||
|
{{ getMenuSideLabel(data) }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-cascader>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item label="菜单名称" prop="title">
|
<el-form-item label="菜单名称" prop="title">
|
||||||
@ -86,6 +98,14 @@
|
|||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="平台端显示" prop="is_platform">
|
||||||
|
<el-switch
|
||||||
|
v-model="currentMenu.is_platform"
|
||||||
|
:active-value="1"
|
||||||
|
:inactive-value="0"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item label="权限标识" prop="permission">
|
<el-form-item label="权限标识" prop="permission">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="currentMenu.permission"
|
v-model="currentMenu.permission"
|
||||||
@ -118,6 +138,7 @@ interface Menu {
|
|||||||
sort: number;
|
sort: number;
|
||||||
status: 0 | 1;
|
status: 0 | 1;
|
||||||
is_visible: 0 | 1;
|
is_visible: 0 | 1;
|
||||||
|
is_platform: 0 | 1;
|
||||||
type: 1 | 2 | 3;
|
type: 1 | 2 | 3;
|
||||||
permission: string;
|
permission: string;
|
||||||
children?: Menu[];
|
children?: Menu[];
|
||||||
@ -162,6 +183,7 @@ const currentMenu = ref<Partial<Menu>>({
|
|||||||
sort: 0,
|
sort: 0,
|
||||||
status: 1,
|
status: 1,
|
||||||
is_visible: 1,
|
is_visible: 1,
|
||||||
|
is_platform: 1,
|
||||||
type: 1,
|
type: 1,
|
||||||
permission: '',
|
permission: '',
|
||||||
});
|
});
|
||||||
@ -231,6 +253,7 @@ watch(() => props.menu, (newMenu) => {
|
|||||||
sort: 0,
|
sort: 0,
|
||||||
status: 1,
|
status: 1,
|
||||||
is_visible: 1,
|
is_visible: 1,
|
||||||
|
is_platform: 1,
|
||||||
type: 1,
|
type: 1,
|
||||||
permission: '',
|
permission: '',
|
||||||
};
|
};
|
||||||
@ -268,6 +291,7 @@ watch(() => props.visible, (newVisible) => {
|
|||||||
sort: 0,
|
sort: 0,
|
||||||
status: 1,
|
status: 1,
|
||||||
is_visible: 1,
|
is_visible: 1,
|
||||||
|
is_platform: 1,
|
||||||
type: 1,
|
type: 1,
|
||||||
permission: '',
|
permission: '',
|
||||||
};
|
};
|
||||||
@ -338,6 +362,14 @@ const cascaderProps = ref({
|
|||||||
emitpath: false,
|
emitpath: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const getMenuSideLabel = (menu: any) => {
|
||||||
|
return Number(menu?.is_platform) === 1 ? "平台端" : "租户端";
|
||||||
|
};
|
||||||
|
|
||||||
|
const getMenuSideTagType = (menu: any) => {
|
||||||
|
return Number(menu?.is_platform) === 1 ? "primary" : "warning";
|
||||||
|
};
|
||||||
|
|
||||||
// 监听菜单类型变化,自动清空不相关的字段
|
// 监听菜单类型变化,自动清空不相关的字段
|
||||||
watch(() => currentMenu.value.type, (newType, oldType) => {
|
watch(() => currentMenu.value.type, (newType, oldType) => {
|
||||||
if (newType === oldType) return; // 避免初始化时的触发
|
if (newType === oldType) return; // 避免初始化时的触发
|
||||||
|
|||||||
@ -95,6 +95,14 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
|
<el-table-column prop="is_platform" label="平台端" width="100" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-tag :type="scope.row.is_platform === 1 ? 'success' : 'info'">
|
||||||
|
{{ scope.row.is_platform === 1 ? "是" : "否" }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column prop="status" label="状态" width="100" align="center">
|
<el-table-column prop="status" label="状态" width="100" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-switch
|
<el-switch
|
||||||
@ -188,6 +196,8 @@ interface Menu {
|
|||||||
icon: string;
|
icon: string;
|
||||||
sort: number;
|
sort: number;
|
||||||
status: 0 | 1;
|
status: 0 | 1;
|
||||||
|
is_visible?: 0 | 1;
|
||||||
|
is_platform?: 0 | 1;
|
||||||
type: 1 | 2 | 3; // 1:目录 2:页面 3:接口
|
type: 1 | 2 | 3; // 1:目录 2:页面 3:接口
|
||||||
permission: string;
|
permission: string;
|
||||||
children?: Menu[];
|
children?: Menu[];
|
||||||
@ -212,6 +222,23 @@ const parentMenuOptions = ref<Menu[]>([]);
|
|||||||
|
|
||||||
let fetchMenusPromise: Promise<any> | null = null;
|
let fetchMenusPromise: Promise<any> | null = null;
|
||||||
|
|
||||||
|
// 菜单树递归排序:按 sort 升序,sort 相同按 id 升序
|
||||||
|
function sortMenuTree(menus: Menu[]): Menu[] {
|
||||||
|
return menus
|
||||||
|
.map((item) => ({
|
||||||
|
...item,
|
||||||
|
children: item.children ? sortMenuTree(item.children) : [],
|
||||||
|
}))
|
||||||
|
.sort((a, b) => {
|
||||||
|
const sortA = Number(a.sort ?? 999999);
|
||||||
|
const sortB = Number(b.sort ?? 999999);
|
||||||
|
if (sortA === sortB) {
|
||||||
|
return Number(a.id ?? 0) - Number(b.id ?? 0);
|
||||||
|
}
|
||||||
|
return sortA - sortB;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const fetchMenus = async () => {
|
const fetchMenus = async () => {
|
||||||
if (fetchMenusPromise) {
|
if (fetchMenusPromise) {
|
||||||
return fetchMenusPromise;
|
return fetchMenusPromise;
|
||||||
@ -223,7 +250,8 @@ const fetchMenus = async () => {
|
|||||||
try {
|
try {
|
||||||
const result = await getAllMenus();
|
const result = await getAllMenus();
|
||||||
if (result.code === 200) {
|
if (result.code === 200) {
|
||||||
menuTree.value = result.data;
|
const sortedMenus = sortMenuTree(result.data || []);
|
||||||
|
menuTree.value = sortedMenus;
|
||||||
parentMenuOptions.value = [
|
parentMenuOptions.value = [
|
||||||
{
|
{
|
||||||
id: 0,
|
id: 0,
|
||||||
@ -231,7 +259,7 @@ const fetchMenus = async () => {
|
|||||||
title: "顶级菜单",
|
title: "顶级菜单",
|
||||||
children: [],
|
children: [],
|
||||||
} as Menu,
|
} as Menu,
|
||||||
...result.data,
|
...sortedMenus,
|
||||||
];
|
];
|
||||||
} else {
|
} else {
|
||||||
ElMessage.error("获取菜单失败: " + result.message);
|
ElMessage.error("获取菜单失败: " + result.message);
|
||||||
@ -352,6 +380,8 @@ const handleAddSubMenu = (parentMenu: Menu) => {
|
|||||||
icon: "",
|
icon: "",
|
||||||
sort: 0,
|
sort: 0,
|
||||||
status: 1,
|
status: 1,
|
||||||
|
is_visible: 1,
|
||||||
|
is_platform: 1,
|
||||||
type: parentMenu.type === 2 ? 1 : parentMenu.type,
|
type: parentMenu.type === 2 ? 1 : parentMenu.type,
|
||||||
permission: "",
|
permission: "",
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user