更新API服务地址前缀为'/admin-go',统一后端服务配置,优化请求模块,调整个人信息页面上传接口,提升代码一致性和可读性。

This commit is contained in:
2026-04-02 14:14:26 +08:00
parent 89e0e55dd9
commit 08ae659a56
21 changed files with 1567 additions and 1598 deletions

View File

@@ -1,10 +1,6 @@
# 本地环境 # 本地环境
ENV = 'development' ENV = 'development'
# 统一后端服务地址配置(全部模块共用 8000 端口 # 统一后端服务地址前缀网关服务名admin-go
# 切换环境时,仅需修改下面这一个地址的 IP # 开发环境走本地代理,避免 CORS
# 当前环境: 192.168.3.38 VITE_API_URL = 'http://192.168.74.41:8000'
# 备用环境: 192.168.3.200
# 备用环境: 116.204.74.41
# 备用环境: 172.20.10.7
VITE_API_URL = 'http://192.168.74.41:8000/'

View File

@@ -4,5 +4,5 @@ ENV = 'production'
# public path 配置线上环境路径(打包)、本地通过 http-server 访问时,请置空即可 # public path 配置线上环境路径(打包)、本地通过 http-server 访问时,请置空即可
VITE_PUBLIC_PATH = '/sys/' VITE_PUBLIC_PATH = '/sys/'
# 统一服务地址端口8000 # 统一服务地址前缀网关服务名admin-go
VITE_API_URL = '/' VITE_API_URL = ''

View File

@@ -1,12 +1,12 @@
<!DOCTYPE html> <!doctype html>
<html lang="zh-CN"> <html lang="zh-CN">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>服务开通 - 智能营销服务平台</title> <title>服务开通 - 智能营销服务平台</title>
<link rel="stylesheet" href="main.css"> <link rel="stylesheet" href="main.css" />
<link rel="stylesheet" href="style.css"> <link rel="stylesheet" href="style.css" />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;700;800&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;700;800&display=swap" rel="stylesheet" />
<style> <style>
* { * {
box-sizing: border-box; box-sizing: border-box;
@@ -134,7 +134,9 @@
right: 8px; right: 8px;
width: 18px; width: 18px;
height: 18px; height: 18px;
background: #10b981 url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='white'%3E%3Cpath d='M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z'/%3E%3C/svg%3E") center/12px no-repeat; background: #10b981
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='white'%3E%3Cpath d='M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z'/%3E%3C/svg%3E")
center/12px no-repeat;
border-radius: 50%; border-radius: 50%;
} }
@@ -187,7 +189,9 @@
right: 12px; right: 12px;
width: 22px; width: 22px;
height: 22px; height: 22px;
background: #3b82f6 url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='white'%3E%3Cpath d='M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z'/%3E%3C/svg%3E") center/14px no-repeat; background: #3b82f6
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='white'%3E%3Cpath d='M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z'/%3E%3C/svg%3E")
center/14px no-repeat;
border-radius: 50%; border-radius: 50%;
} }
@@ -298,7 +302,9 @@
} }
@keyframes spin { @keyframes spin {
to { transform: rotate(360deg); } to {
transform: rotate(360deg);
}
} }
.empty-container { .empty-container {
@@ -344,14 +350,15 @@
color: #15803d; color: #15803d;
} }
</style> </style>
</head> </head>
<body class="auth-body"> <body class="auth-body">
<!-- 导航 --> <!-- 导航 -->
<nav class="auth-navbar"> <nav class="auth-navbar">
<div class="auth-navbar-container"> <div class="auth-navbar-container">
<a href="/index.html#/home" class="auth-back-link"> <a href="/index.html#/home" class="auth-back-link">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18"></path></svg> <svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18"></path>
</svg>
返回首页 返回首页
</a> </a>
<span class="auth-title">服务开通</span> <span class="auth-title">服务开通</span>
@@ -371,12 +378,14 @@
</div> </div>
<!-- 错误信息 --> <!-- 错误信息 -->
<div id="error" class="error-message" style="display: none;"></div> <div id="error" class="error-message" style="display: none"></div>
<!-- 资产信息 --> <!-- 资产信息 -->
<div id="asset-info" class="asset-info" style="display: none;"> <div id="asset-info" class="asset-info" style="display: none">
<div class="icon-wrapper"> <div class="icon-wrapper">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path></svg> <svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path>
</svg>
</div> </div>
<div class="info-content"> <div class="info-content">
<h3 id="asset-name" class="asset-name"></h3> <h3 id="asset-name" class="asset-name"></h3>
@@ -385,31 +394,38 @@
</div> </div>
<!-- 用户类型选择 --> <!-- 用户类型选择 -->
<div id="type-section" style="display: none;"> <div id="type-section" style="display: none">
<div class="section-title">选择类型</div> <div class="section-title">选择类型</div>
<div id="type-list" class="type-grid"></div> <div id="type-list" class="type-grid"></div>
</div> </div>
<!-- SKU 列表 --> <!-- SKU 列表 -->
<div id="sku-section" style="display: none;"> <div id="sku-section" style="display: none">
<div class="section-title">选择套餐</div> <div class="section-title">选择套餐</div>
<div id="sku-list" class="sku-grid"></div> <div id="sku-list" class="sku-grid"></div>
</div> </div>
<!-- 空状态 --> <!-- 空状态 -->
<div id="empty" class="empty-container" style="display: none;"> <div id="empty" class="empty-container" style="display: none">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4"></path></svg> <svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4"
></path>
</svg>
<p>暂无可用套餐</p> <p>暂无可用套餐</p>
</div> </div>
<!-- 成功信息 --> <!-- 成功信息 -->
<div id="success" class="success-message" style="display: none;"> <div id="success" class="success-message" style="display: none">
<h3>🎉 开通成功!</h3> <h3>🎉 开通成功!</h3>
<p>正在返回...</p> <p>正在返回...</p>
</div> </div>
<!-- 操作按钮 --> <!-- 操作按钮 -->
<div id="actions" class="subscribe-actions" style="display: none;"> <div id="actions" class="subscribe-actions" style="display: none">
<button class="btn-subscribe secondary" onclick="handleCancel()">取消</button> <button class="btn-subscribe secondary" onclick="handleCancel()">取消</button>
<button id="btn-submit" class="btn-subscribe primary" onclick="handleSubscribe()" disabled>立即开通</button> <button id="btn-submit" class="btn-subscribe primary" onclick="handleSubscribe()" disabled>立即开通</button>
</div> </div>
@@ -455,14 +471,14 @@
console.log('[subscribe] token:', token); console.log('[subscribe] token:', token);
const headers = { const headers = {
'Content-Type': 'application/json' 'Content-Type': 'application/json',
}; };
if (token) { if (token) {
headers['Authorization'] = `Bearer ${token}`; headers['Authorization'] = `Bearer ${token}`;
} }
const response = await fetch(`${API_BASE_NEW}/assets/asset/getAssetAndSku?assetId=${assetId}`, { const response = await fetch(`${API_BASE_NEW}/assets/asset/getAssetAndSku?assetId=${assetId}`, {
headers: headers headers: headers,
}); });
// 先获取文本检查是否为有效JSON // 先获取文本检查是否为有效JSON
@@ -485,7 +501,6 @@
renderAssetInfo(assetData); renderAssetInfo(assetData);
renderTypeList(tenantModuleTypes); renderTypeList(tenantModuleTypes);
renderSkuList(assetData.skus || []); renderSkuList(assetData.skus || []);
} catch (error) { } catch (error) {
console.error('加载失败:', error); console.error('加载失败:', error);
showError(error.message || '加载套餐信息失败,请稍后重试'); showError(error.message || '加载套餐信息失败,请稍后重试');
@@ -511,11 +526,15 @@
return; return;
} }
container.innerHTML = types.map(type => ` container.innerHTML = types
.map(
(type) => `
<div class="type-card" data-type-key="${type.key}" onclick="selectType('${type.key}')"> <div class="type-card" data-type-key="${type.key}" onclick="selectType('${type.key}')">
<div class="type-name">${type.value}</div> <div class="type-name">${type.value}</div>
</div> </div>
`).join(''); `
)
.join('');
section.style.display = 'block'; section.style.display = 'block';
@@ -528,7 +547,7 @@
// 选择用户类型 // 选择用户类型
function selectType(typeKey) { function selectType(typeKey) {
// 移除之前的选中状态 // 移除之前的选中状态
document.querySelectorAll('.type-card').forEach(card => { document.querySelectorAll('.type-card').forEach((card) => {
card.classList.remove('selected'); card.classList.remove('selected');
}); });
@@ -539,7 +558,7 @@
} }
// 保存选中的类型 // 保存选中的类型
selectedType = tenantModuleTypes.find(t => t.key === typeKey) || null; selectedType = tenantModuleTypes.find((t) => t.key === typeKey) || null;
// 更新按钮状态 // 更新按钮状态
updateSubmitButton(); updateSubmitButton();
@@ -557,7 +576,9 @@
return; return;
} }
container.innerHTML = skus.map(sku => ` container.innerHTML = skus
.map(
(sku) => `
<div class="sku-card" data-sku-id="${sku.id}" onclick="selectSku('${sku.id}')"> <div class="sku-card" data-sku-id="${sku.id}" onclick="selectSku('${sku.id}')">
<div class="sku-name">${sku.skuName}</div> <div class="sku-name">${sku.skuName}</div>
<div class="sku-content"> <div class="sku-content">
@@ -570,7 +591,9 @@
</div> </div>
</div> </div>
</div> </div>
`).join(''); `
)
.join('');
section.style.display = 'block'; section.style.display = 'block';
actions.style.display = 'flex'; actions.style.display = 'flex';
@@ -584,7 +607,7 @@
// 选择SKU // 选择SKU
function selectSku(skuId) { function selectSku(skuId) {
// 移除之前的选中状态 // 移除之前的选中状态
document.querySelectorAll('.sku-card').forEach(card => { document.querySelectorAll('.sku-card').forEach((card) => {
card.classList.remove('selected'); card.classList.remove('selected');
}); });
@@ -595,7 +618,7 @@
} }
// 保存选中的SKU // 保存选中的SKU
selectedSku = assetData?.skus?.find(s => s.id === skuId) || null; selectedSku = assetData?.skus?.find((s) => s.id === skuId) || null;
// 更新按钮状态 // 更新按钮状态
updateSubmitButton(); updateSubmitButton();
@@ -634,7 +657,7 @@
// 构建请求参数 // 构建请求参数
const requestBody = { const requestBody = {
assetSkuId: selectedSku.id assetSkuId: selectedSku.id,
}; };
// 如果选择了用户类型,添加到请求参数 // 如果选择了用户类型,添加到请求参数
@@ -642,13 +665,13 @@
requestBody.tenantModuleType = selectedType.key; requestBody.tenantModuleType = selectedType.key;
} }
const response = await fetch(`${API_BASE_MAIN}/api/v1/system/moduleTenant/add`, { const response = await fetch(`${API_BASE_MAIN}/admin-go/api/v1/system/moduleTenant/add`, {
method: 'POST', method: 'POST',
headers: { headers: {
'Authorization': token ? `Bearer ${token}` : '', Authorization: token ? `Bearer ${token}` : '',
'Content-Type': 'application/json' 'Content-Type': 'application/json',
}, },
body: JSON.stringify(requestBody) body: JSON.stringify(requestBody),
}); });
const result = await response.json(); const result = await response.json();
@@ -689,7 +712,6 @@
window.location.reload(true); window.location.reload(true);
}, 100); }, 100);
}, 2000); }, 2000);
} catch (error) { } catch (error) {
console.error('开通失败:', error); console.error('开通失败:', error);
alert(error.message || '开通失败,请稍后重试'); alert(error.message || '开通失败,请稍后重试');
@@ -740,5 +762,5 @@
document.getElementById('loading').style.display = 'none'; document.getElementById('loading').style.display = 'none';
} }
</script> </script>
</body> </body>
</html> </html>

View File

@@ -4,9 +4,9 @@ import request from '/@/utils/request';
* 登录api接口集合 * 登录api接口集合
* @method signIn 用户登录 * @method signIn 用户登录
*/ */
export function login(params: object){ export function login(params: object) {
return request({ return request({
url: '/api/v1/system/login', url: '/admin-go/api/v1/system/login',
method: 'post', method: 'post',
data: params, data: params,
}); });
@@ -15,19 +15,19 @@ export function login(params: object){
/** /**
* 获取验证码 * 获取验证码
*/ */
export function captcha(){ export function captcha() {
return request({ return request({
url:"/api/v1/pub/captcha/get", url: '/admin-go/api/v1/pub/captcha/get',
method:"get" method: 'get',
}) });
} }
/** /**
* 退出登录 * 退出登录
*/ */
export function logout(){ export function logout() {
return request({ return request({
url: '/api/v1/system/logout', url: '/admin-go/api/v1/system/logout',
method: 'get', method: 'get',
}); });
} }

View File

@@ -3,7 +3,7 @@ import request from '/@/utils/request';
// 清除缓存 // 清除缓存
export function removeCache() { export function removeCache() {
return request({ return request({
url: '/api/v1/system/cache/remove', url: '/admin-go/api/v1/system/cache/remove',
method: 'delete' method: 'delete',
}) });
} }

View File

@@ -1,42 +1,41 @@
import request from '/@/utils/request'; import request from '/@/utils/request';
export function getConfigList(query: Object) {
export function getConfigList(query:Object) {
return request({ return request({
url: '/api/v1/system/config/list', url: '/admin-go/api/v1/system/config/list',
method: 'get', method: 'get',
params:query params: query,
}) });
} }
export function getConfig(id:string) { export function getConfig(id: string) {
return request({ return request({
url: '/api/v1/system/config/get', url: '/admin-go/api/v1/system/config/get',
method: 'get', method: 'get',
params:{id} params: { id },
}) });
} }
export function addConfig(data:any) { export function addConfig(data: any) {
return request({ return request({
url: '/api/v1/system/config/add', url: '/admin-go/api/v1/system/config/add',
method: 'post', method: 'post',
data:data data: data,
}) });
} }
export function editConfig(data:any) { export function editConfig(data: any) {
return request({ return request({
url: '/api/v1/system/config/edit', url: '/admin-go/api/v1/system/config/edit',
method: 'put', method: 'put',
data:data data: data,
}) });
} }
export function deleteConfig(ids:string[]) { export function deleteConfig(ids: string[]) {
return request({ return request({
url: '/api/v1/system/config/delete', url: '/admin-go/api/v1/system/config/delete',
method: 'delete', method: 'delete',
data:{ids} data: { ids },
}) });
} }

View File

@@ -1,36 +1,33 @@
import request from '/@/utils/request'; import request from '/@/utils/request';
export function getDeptList(query?:Object) { export function getDeptList(query?: Object) {
return request({ return request({
url: '/api/v1/system/dept/list', url: '/admin-go/api/v1/system/dept/list',
method: 'get', method: 'get',
params:query params: query,
}) });
} }
export function addDept(data: object) {
export function addDept(data:object) {
return request({ return request({
url: '/api/v1/system/dept/add', url: '/admin-go/api/v1/system/dept/add',
method: 'post', method: 'post',
data:data data: data,
}) });
} }
export function editDept(data: object) {
export function editDept(data:object) {
return request({ return request({
url: '/api/v1/system/dept/edit', url: '/admin-go/api/v1/system/dept/edit',
method: 'put', method: 'put',
data:data data: data,
}) });
} }
export function deleteDept(id: number) {
export function deleteDept(id:number) {
return request({ return request({
url: '/api/v1/system/dept/delete', url: '/admin-go/api/v1/system/dept/delete',
method: 'delete', method: 'delete',
data:{id} data: { id },
}) });
} }

View File

@@ -1,85 +1,83 @@
import request from '/@/utils/request'; import request from '/@/utils/request';
import {ref ,toRefs,ToRefs} from 'vue' import { ref, toRefs, ToRefs } from 'vue';
// 根据字典类型查询字典数据信息 // 根据字典类型查询字典数据信息
export function getDict(dictType :string,defaultValue?:string):Promise<any> { export function getDict(dictType: string, defaultValue?: string): Promise<any> {
let dv = defaultValue??'' let dv = defaultValue ?? '';
let params ={ let params = {
dictType:dictType, dictType: dictType,
defaultValue:dv defaultValue: dv,
} };
return request({ return request({
url: '/api/v1/system/dict/data/getDictData', url: '/admin-go/api/v1/system/dict/data/getDictData',
method: 'get', method: 'get',
params:params params: params,
}) });
} }
// 根据字典类型查询字典数据信息(新方案) // 根据字典类型查询字典数据信息(新方案)
export function getDicts(dictType :string,defaultValue?:string):Promise<any> { export function getDicts(dictType: string, defaultValue?: string): Promise<any> {
let dv = defaultValue??'' let dv = defaultValue ?? '';
let params ={ let params = {
dictType:dictType, dictType: dictType,
defaultValue:dv defaultValue: dv,
} };
return request({ return request({
url: '/api/v1/system/dict/data/getDictDataTree', url: '/admin-go/api/v1/system/dict/data/getDictDataTree',
method: 'get', method: 'get',
params:params params: params,
}) });
} }
/** /**
* 获取字典数据 * 获取字典数据
*/ */
export function useDict(...args:string[]):ToRefs<any>{ export function useDict(...args: string[]): ToRefs<any> {
const res:any = ref({}); const res: any = ref({});
args.forEach((d:string) => { args.forEach((d: string) => {
res.value[d] = []; res.value[d] = [];
getDict(d).then(resp => { getDict(d).then((resp) => {
res.value[d] = resp.data.values.map((p:any) => ({ label: p.value, value: p.key, isDefault: p.isDefault })) res.value[d] = resp.data.values.map((p: any) => ({ label: p.value, value: p.key, isDefault: p.isDefault }));
}) });
}) });
return toRefs(res.value); return toRefs(res.value);
} }
export function getDataList(query: Object) {
export function getDataList(query:Object) {
return request({ return request({
url: '/api/v1/system/dict/data/list', url: '/admin-go/api/v1/system/dict/data/list',
method: 'get', method: 'get',
params:query params: query,
}) });
} }
export function getData(dictCode:number) { export function getData(dictCode: number) {
return request({ return request({
url: '/api/v1/system/dict/data/get', url: '/admin-go/api/v1/system/dict/data/get',
method: 'get', method: 'get',
params:{dictCode} params: { dictCode },
}) });
} }
export function addData(data:any) { export function addData(data: any) {
return request({ return request({
url: '/api/v1/system/dict/data/add', url: '/admin-go/api/v1/system/dict/data/add',
method: 'post', method: 'post',
data:data data: data,
}) });
} }
export function editData(data:any) { export function editData(data: any) {
return request({ return request({
url: '/api/v1/system/dict/data/edit', url: '/admin-go/api/v1/system/dict/data/edit',
method: 'put', method: 'put',
data:data data: data,
}) });
} }
export function deleteData(ids:number[]) { export function deleteData(ids: number[]) {
return request({ return request({
url: '/api/v1/system/dict/data/delete', url: '/admin-go/api/v1/system/dict/data/delete',
method: 'delete', method: 'delete',
data:{ids} data: { ids },
}) });
} }

View File

@@ -1,52 +1,49 @@
import request from '/@/utils/request'; import request from '/@/utils/request';
export function getTypeList(query:Object) { export function getTypeList(query: Object) {
return request({ return request({
url: '/api/v1/system/dict/type/list', url: '/admin-go/api/v1/system/dict/type/list',
method: 'get', method: 'get',
params:query params: query,
}) });
} }
export function getType(dictId:number) { export function getType(dictId: number) {
return request({ return request({
url: '/api/v1/system/dict/type/get', url: '/admin-go/api/v1/system/dict/type/get',
method: 'get', method: 'get',
params:{dictId} params: { dictId },
}) });
} }
export function addType(data:any) { export function addType(data: any) {
return request({ return request({
url: '/api/v1/system/dict/type/add', url: '/admin-go/api/v1/system/dict/type/add',
method: 'post', method: 'post',
data:data data: data,
}) });
} }
export function editType(data:any) { export function editType(data: any) {
return request({ return request({
url: '/api/v1/system/dict/type/edit', url: '/admin-go/api/v1/system/dict/type/edit',
method: 'put', method: 'put',
data:data data: data,
}) });
} }
export function deleteType(dictIds: number[]) {
export function deleteType(dictIds:number[]) {
return request({ return request({
url: '/api/v1/system/dict/type/delete', url: '/admin-go/api/v1/system/dict/type/delete',
method: 'delete', method: 'delete',
data:{dictIds} data: { dictIds },
}) });
} }
// 获取字典选择框列表 // 获取字典选择框列表
export function optionselect() { export function optionselect() {
return request({ return request({
url: '/api/v1/system/dict/type/optionSelect', url: '/admin-go/api/v1/system/dict/type/optionSelect',
method: 'get' method: 'get',
}) });
} }

View File

@@ -1,57 +1,56 @@
import request from '/@/utils/request'; import request from '/@/utils/request';
export function getMenuList(query:Object) { export function getMenuList(query: Object) {
return request({ return request({
url: '/api/v1/system/menu/list', url: '/admin-go/api/v1/system/menu/list',
method: 'get', method: 'get',
params:query params: query,
}) });
} }
export function getUserMenus() { export function getUserMenus() {
return request({ return request({
url: '/api/v1/system/user/getUserMenus', url: '/admin-go/api/v1/system/user/getUserMenus',
method: 'get' method: 'get',
}) });
} }
export function getMenuParams() { export function getMenuParams() {
return request({ return request({
url: '/api/v1/system/menu/getParams', url: '/admin-go/api/v1/system/menu/getParams',
method: 'get'
})
}
export function addMenu(data:Object) {
return request({
url: '/api/v1/system/menu/add',
method: 'post',
data:data
})
}
export function getMenuInfo(id:number) {
return request({
url: '/api/v1/system/menu/get',
method: 'get', method: 'get',
params:{id} });
})
} }
export function updateMenu(data:Object) { export function addMenu(data: Object) {
return request({ return request({
url: '/api/v1/system/menu/update', url: '/admin-go/api/v1/system/menu/add',
method: 'put', method: 'post',
data:data data: data,
}) });
} }
export function getMenuInfo(id: number) {
return request({
url: '/admin-go/api/v1/system/menu/get',
method: 'get',
params: { id },
});
}
export function updateMenu(data: Object) {
return request({
url: '/admin-go/api/v1/system/menu/update',
method: 'put',
data: data,
});
}
// 删除菜单 // 删除菜单
export function delMenu(menuId:number) { export function delMenu(menuId: number) {
return request({ return request({
url: '/api/v1/system/menu/delete', url: '/admin-go/api/v1/system/menu/delete',
method: 'delete', method: 'delete',
data:{ids:[menuId]} data: { ids: [menuId] },
}) });
} }

View File

@@ -1,28 +1,24 @@
import request from '/@/utils/request'; import request from '/@/utils/request';
export function logList(query: object) {
export function logList(query:object) {
return request({ return request({
url: '/api/v1/system/loginLog/list', url: '/admin-go/api/v1/system/loginLog/list',
method: 'get', method: 'get',
params:query params: query,
}) });
} }
export function deleteLog(ids: number[]) {
export function deleteLog(ids:number[]) {
return request({ return request({
url: '/api/v1/system/loginLog/delete', url: '/admin-go/api/v1/system/loginLog/delete',
method: 'delete', method: 'delete',
params:{ids} params: { ids },
}) });
} }
export function clearLog() { export function clearLog() {
return request({ return request({
url: '/api/v1/system/loginLog/clear', url: '/admin-go/api/v1/system/loginLog/clear',
method: 'delete', method: 'delete',
}) });
} }

View File

@@ -1,37 +1,36 @@
import request from '/@/utils/request' import request from '/@/utils/request';
// 查询操作日志列表 // 查询操作日志列表
export function listSysOperLog(query:object) { export function listSysOperLog(query: object) {
return request({ return request({
url: '/api/v1/system/operLog/list', url: '/admin-go/api/v1/system/operLog/list',
method: 'get', method: 'get',
params: query params: query,
}) });
} }
// 查询操作日志详细 // 查询操作日志详细
export function getSysOperLog(operId:number) { export function getSysOperLog(operId: number) {
return request({ return request({
url: '/api/v1/system/operLog/get', url: '/admin-go/api/v1/system/operLog/get',
method: 'get', method: 'get',
params: { params: {
operId: operId.toString() operId: operId.toString(),
} },
}) });
} }
// 删除操作日志 // 删除操作日志
export function delSysOperLog(operIds:number[]) { export function delSysOperLog(operIds: number[]) {
return request({ return request({
url: '/api/v1/system/operLog/delete', url: '/admin-go/api/v1/system/operLog/delete',
method: 'delete', method: 'delete',
data:{ data: {
operIds:operIds operIds: operIds,
} },
}) });
} }
export function clearOperLog() { export function clearOperLog() {
return request({ return request({
url: '/api/v1/system/operLog/clear', url: '/admin-go/api/v1/system/operLog/clear',
method: 'delete', method: 'delete',
}) });
} }

View File

@@ -1,9 +1,8 @@
import request from '/@/utils/request'; import request from '/@/utils/request';
export function getSysInfo() { export function getSysInfo() {
return request({ return request({
url: '/api/v1/system/monitor/server', url: '/admin-go/api/v1/system/monitor/server',
method: 'get' method: 'get',
}) });
} }

View File

@@ -1,18 +1,18 @@
import request from '/@/utils/request'; import request from '/@/utils/request';
// 查询列表 // 查询列表
export function listSysUserOnline(query:object) { export function listSysUserOnline(query: object) {
return request({ return request({
url: '/api/v1/system/online/list', url: '/admin-go/api/v1/system/online/list',
method: 'get', method: 'get',
params: query params: query,
}) });
} }
export function forceLogout(ids:string[]) { export function forceLogout(ids: string[]) {
return request({ return request({
url: '/api/v1/system/online/forceLogout', url: '/admin-go/api/v1/system/online/forceLogout',
method: 'delete', method: 'delete',
data: {ids} data: { ids },
}) });
} }

View File

@@ -2,27 +2,24 @@ import request from '/@/utils/request';
export function getPersonalInfo() { export function getPersonalInfo() {
return request({ return request({
url: '/api/v1/system/personal/getPersonalInfo', url: '/admin-go/api/v1/system/personal/getPersonalInfo',
method: 'get', method: 'get',
}) });
} }
export function editPersonal(data: object) {
export function editPersonal(data:object) {
return request({ return request({
url: '/api/v1/system/personal/edit', url: '/admin-go/api/v1/system/personal/edit',
method: 'put', method: 'put',
data:data data: data,
}) });
} }
//重置個人密碼 //重置個人密碼
export function resetPwdPersonal(data:object) { export function resetPwdPersonal(data: object) {
return request({ return request({
url: '/api/v1/system/personal/resetPwd', url: '/admin-go/api/v1/system/personal/resetPwd',
method: 'put', method: 'put',
data:data data: data,
}) });
} }

View File

@@ -1,35 +1,33 @@
import request from '/@/utils/request'; import request from '/@/utils/request';
export function getPostList(query:Object) { export function getPostList(query: Object) {
return request({ return request({
url: '/api/v1/system/post/list', url: '/admin-go/api/v1/system/post/list',
method: 'get', method: 'get',
params:query params: query,
}) });
} }
export function addPost(data:object) { export function addPost(data: object) {
return request({ return request({
url: '/api/v1/system/post/add', url: '/admin-go/api/v1/system/post/add',
method: 'post', method: 'post',
data:data data: data,
}) });
} }
export function editPost(data: object) {
export function editPost(data:object) {
return request({ return request({
url: '/api/v1/system/post/edit', url: '/admin-go/api/v1/system/post/edit',
method: 'put', method: 'put',
data:data data: data,
}) });
} }
export function deletePost(ids: number[]) {
export function deletePost(ids:number[]) {
return request({ return request({
url: '/api/v1/system/post/delete', url: '/admin-go/api/v1/system/post/delete',
method: 'delete', method: 'delete',
data:{ids} data: { ids },
}) });
} }

View File

@@ -1,70 +1,65 @@
import request from '/@/utils/request'; import request from '/@/utils/request';
export function getRoleList(query:Object) { export function getRoleList(query: Object) {
return request({ return request({
url: '/api/v1/system/role/list', url: '/admin-go/api/v1/system/role/list',
method: 'get', method: 'get',
params:query params: query,
}) });
} }
export function getRoleParams() { export function getRoleParams() {
return request({ return request({
url: '/api/v1/system/role/getParamsInfo', url: '/admin-go/api/v1/system/role/getParamsInfo',
method: 'get'
})
}
export function addRole(data:object) {
return request({
url: '/api/v1/system/role/add',
method: 'post',
data:data
})
}
export function getRole(id:string) {
return request({
url: '/api/v1/system/role/get',
method: 'get', method: 'get',
params:{id} });
})
} }
export function addRole(data: object) {
export function editRole(data:object) {
return request({ return request({
url: '/api/v1/system/role/edit', url: '/admin-go/api/v1/system/role/add',
method: 'post',
data: data,
});
}
export function getRole(id: string) {
return request({
url: '/admin-go/api/v1/system/role/get',
method: 'get',
params: { id },
});
}
export function editRole(data: object) {
return request({
url: '/admin-go/api/v1/system/role/edit',
method: 'put', method: 'put',
data:data data: data,
}) });
} }
export function deleteRole(id: string) {
export function deleteRole(id:string) {
return request({ return request({
url: '/api/v1/system/role/delete', url: '/admin-go/api/v1/system/role/delete',
method: 'delete', method: 'delete',
data:{ids:[id]} data: { ids: [id] },
}) });
} }
export function dataScope(data:any) { export function dataScope(data: any) {
return request({ return request({
url: '/api/v1/system/role/dataScope', url: '/admin-go/api/v1/system/role/dataScope',
method: 'put', method: 'put',
data:data data: data,
}) });
} }
// 根据角色ID查询部门树结构 // 根据角色ID查询部门树结构
export function roleDeptTreeSelect(roleId:string) { export function roleDeptTreeSelect(roleId: string) {
return request({ return request({
url: '/api/v1/system/role/deptTreeSelect', url: '/admin-go/api/v1/system/role/deptTreeSelect',
method: 'get', method: 'get',
params:{roleId} params: { roleId },
}) });
} }

View File

@@ -3,7 +3,7 @@ import request from '/@/utils/request';
// 获取租户列表 // 获取租户列表
export function getTenantList(query: Object) { export function getTenantList(query: Object) {
return request({ return request({
url: '/api/v1/system/tenant/list', url: '/admin-go/api/v1/system/tenant/list',
method: 'get', method: 'get',
params: query, params: query,
}); });
@@ -12,7 +12,7 @@ export function getTenantList(query: Object) {
// 获取租户详情 // 获取租户详情
export function getTenant(id: number) { export function getTenant(id: number) {
return request({ return request({
url: '/api/v1/system/tenant/get', url: '/admin-go/api/v1/system/tenant/get',
method: 'get', method: 'get',
params: { id }, params: { id },
}); });
@@ -23,7 +23,7 @@ export function addTenant(data: object) {
// 如果是 FormData需要让浏览器自动设置 Content-Type包含 boundary // 如果是 FormData需要让浏览器自动设置 Content-Type包含 boundary
const isFormData = data instanceof FormData; const isFormData = data instanceof FormData;
return request({ return request({
url: '/api/v1/system/tenant/add', url: '/admin-go/api/v1/system/tenant/add',
method: 'post', method: 'post',
data: data, data: data,
headers: isFormData ? { 'Content-Type': undefined } : undefined, headers: isFormData ? { 'Content-Type': undefined } : undefined,
@@ -35,7 +35,7 @@ export function editTenant(data: object) {
// 如果是 FormData需要让浏览器自动设置 Content-Type包含 boundary // 如果是 FormData需要让浏览器自动设置 Content-Type包含 boundary
const isFormData = data instanceof FormData; const isFormData = data instanceof FormData;
return request({ return request({
url: '/api/v1/system/tenant/edit', url: '/admin-go/api/v1/system/tenant/edit',
method: 'put', method: 'put',
data: data, data: data,
headers: isFormData ? { 'Content-Type': undefined } : undefined, headers: isFormData ? { 'Content-Type': undefined } : undefined,
@@ -45,7 +45,7 @@ export function editTenant(data: object) {
// 删除租户 // 删除租户
export function deleteTenant(ids: number[]) { export function deleteTenant(ids: number[]) {
return request({ return request({
url: '/api/v1/system/tenant/delete', url: '/admin-go/api/v1/system/tenant/delete',
method: 'delete', method: 'delete',
data: { ids }, data: { ids },
}); });

View File

@@ -1,75 +1,71 @@
import request from '/@/utils/request'; import request from '/@/utils/request';
export function getUserList(query:Object) { export function getUserList(query: Object) {
return request({ return request({
url: '/api/v1/system/user/getList', url: '/admin-go/api/v1/system/user/getList',
method: 'get', method: 'get',
params:query params: query,
}) });
} }
export function getDeptTree() { export function getDeptTree() {
return request({ return request({
url: '/api/v1/system/dept/treeSelect', url: '/admin-go/api/v1/system/dept/treeSelect',
method: 'get' method: 'get',
}) });
} }
export function getParams() { export function getParams() {
return request({ return request({
url: '/api/v1/system/user/paramsInfo', url: '/admin-go/api/v1/system/user/paramsInfo',
method: 'get'
})
}
export function getEditUser(id:number) {
return request({
url: '/api/v1/system/user/getEdit',
method: 'get', method: 'get',
params:{id} });
})
} }
export function addUser(data:object) { export function getEditUser(id: number) {
return request({ return request({
url: '/api/v1/system/user/add', url: '/admin-go/api/v1/system/user/getEdit',
method: 'get',
params: { id },
});
}
export function addUser(data: object) {
return request({
url: '/admin-go/api/v1/system/user/add',
method: 'post', method: 'post',
data:data data: data,
}) });
} }
export function editUser(data: object) {
export function editUser(data:object) {
return request({ return request({
url: '/api/v1/system/user/edit', url: '/admin-go/api/v1/system/user/edit',
method: 'put', method: 'put',
data:data data: data,
}) });
} }
export function resetUserPwd(userId:number, password:string) { export function resetUserPwd(userId: number, password: string) {
return request({ return request({
url: '/api/v1/system/user/resetPwd', url: '/admin-go/api/v1/system/user/resetPwd',
method: 'put', method: 'put',
data:{userId,password} data: { userId, password },
}) });
} }
export function changeUserStatus(userId:number, status:number) { export function changeUserStatus(userId: number, status: number) {
return request({ return request({
url: '/api/v1/system/user/setStatus', url: '/admin-go/api/v1/system/user/setStatus',
method: 'put', method: 'put',
data:{userId,status} data: { userId, status },
}) });
} }
export function deleteUser(ids: number[]) {
export function deleteUser(ids:number[]) {
return request({ return request({
url: '/api/v1/system/user/delete', url: '/admin-go/api/v1/system/user/delete',
method: 'delete', method: 'delete',
data:{ids} data: { ids },
}) });
} }

View File

@@ -7,15 +7,14 @@
<div class="personal-user"> <div class="personal-user">
<div class="personal-user-left"> <div class="personal-user-left">
<el-upload <el-upload
class=" h100 personal-user-left-upload avatar-uploader" class="h100 personal-user-left-upload avatar-uploader"
:action="baseURL+'/api/v1/system/upload/singleImg'" :action="baseURL + '/admin-go/api/v1/system/upload/singleImg'"
:show-file-list="false" :show-file-list="false"
:on-success="handleAvatarSuccess" :on-success="handleAvatarSuccess"
:data="dataParam" :data="dataParam"
> >
<img v-if="imageUrl" :src="proxy.getUpFileUrl(imageUrl)" class="avatar" /> <img v-if="imageUrl" :src="proxy.getUpFileUrl(imageUrl)" class="avatar" />
<el-icon v-else class="avatar-uploader-icon"><ele-Plus /></el-icon> <el-icon v-else class="avatar-uploader-icon"><ele-Plus /></el-icon>
</el-upload> </el-upload>
</div> </div>
<div class="personal-user-right"> <div class="personal-user-right">
@@ -25,7 +24,7 @@
<el-row> <el-row>
<el-col :xs="24" :sm="8" class="personal-item mb6"> <el-col :xs="24" :sm="8" class="personal-item mb6">
<div class="personal-item-label">昵称</div> <div class="personal-item-label">昵称</div>
<div class="personal-item-value"> {{ personalForm.nickname }}</div> <div class="personal-item-value">{{ personalForm.nickname }}</div>
</el-col> </el-col>
<el-col :xs="24" :sm="16" class="personal-item mb6"> <el-col :xs="24" :sm="16" class="personal-item mb6">
<div class="personal-item-label">联系电话</div> <div class="personal-item-label">联系电话</div>
@@ -37,11 +36,11 @@
<el-row> <el-row>
<el-col :xs="24" :sm="8" class="personal-item mb6"> <el-col :xs="24" :sm="8" class="personal-item mb6">
<div class="personal-item-label">登录IP</div> <div class="personal-item-label">登录IP</div>
<div class="personal-item-value">{{personalForm.lastLoginIp}}</div> <div class="personal-item-value">{{ personalForm.lastLoginIp }}</div>
</el-col> </el-col>
<el-col :xs="24" :sm="16" class="personal-item mb6"> <el-col :xs="24" :sm="16" class="personal-item mb6">
<div class="personal-item-label">登录时间</div> <div class="personal-item-label">登录时间</div>
<div class="personal-item-value">{{personalForm.lastLoginTime}}</div> <div class="personal-item-value">{{ personalForm.lastLoginTime }}</div>
</el-col> </el-col>
</el-row> </el-row>
</el-col> </el-col>
@@ -204,20 +203,20 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { toRefs, reactive, computed, defineComponent,getCurrentInstance,onMounted } from 'vue'; import { toRefs, reactive, computed, defineComponent, getCurrentInstance, onMounted } from 'vue';
import { formatAxis } from '/@/utils/formatTime'; import { formatAxis } from '/@/utils/formatTime';
import { storeToRefs } from 'pinia'; import { storeToRefs } from 'pinia';
import { useUserInfo } from '/@/stores/userInfo'; import { useUserInfo } from '/@/stores/userInfo';
import {getPersonalInfo, editPersonal, resetPwdPersonal} from "/@/api/system/personal"; import { getPersonalInfo, editPersonal, resetPwdPersonal } from '/@/api/system/personal';
import type { UploadProps } from 'element-plus' import type { UploadProps } from 'element-plus';
import {ElMessage} from "element-plus"; import { ElMessage } from 'element-plus';
import {ElMessageBox} from 'element-plus' import { ElMessageBox } from 'element-plus';
import {getToken} from "/@/utils/gfast" import { getToken } from '/@/utils/gfast';
import { newsInfoList, recommendList } from './mock'; import { newsInfoList, recommendList } from './mock';
import {Session} from "/@/utils/storage"; import { Session } from '/@/utils/storage';
// 定义接口来定义对象的类型 // 定义接口来定义对象的类型
interface PersonalState { interface PersonalState {
imageUrl:'', imageUrl: '';
deptName: ''; deptName: '';
roles: []; roles: [];
personalForm: any; personalForm: any;
@@ -228,38 +227,38 @@ interface PersonalState {
export default defineComponent({ export default defineComponent({
name: 'personals', name: 'personals',
setup() { setup() {
const baseURL:string|undefined|boolean = import.meta.env.VITE_API_URL const baseURL: string | undefined | boolean = import.meta.env.VITE_API_URL;
const {proxy} = <any>getCurrentInstance(); const { proxy } = <any>getCurrentInstance();
const stores = useUserInfo(); const stores = useUserInfo();
const { userInfos } = storeToRefs(stores); const { userInfos } = storeToRefs(stores);
const dataParam = reactive({ const dataParam = reactive({
token:getToken(), token: getToken(),
}) });
const state = reactive<PersonalState>({ const state = reactive<PersonalState>({
newsInfoList, newsInfoList,
recommendList, recommendList,
imageUrl:'', imageUrl: '',
deptName:'', deptName: '',
roles:[], roles: [],
personalForm: { personalForm: {
nickname: '', nickname: '',
userEmail: '', userEmail: '',
describe: '', describe: '',
mobile: '', mobile: '',
sex: '', sex: '',
remark:'', remark: '',
avatar:'', avatar: '',
lastLoginIp:'', lastLoginIp: '',
lastLoginTime:'' lastLoginTime: '',
}, },
}); });
// const handleUpload = // const handleUpload =
const handleUpload = () => { const handleUpload = () => {
// console.log(state.personalForm) // console.log(state.personalForm)
editPersonal(state.personalForm).then((res:any)=>{ editPersonal(state.personalForm).then((res: any) => {
const userInfo = res.data.userInfo const userInfo = res.data.userInfo;
userInfo.avatar = proxy.getUpFileUrl(userInfo.avatar) userInfo.avatar = proxy.getUpFileUrl(userInfo.avatar);
// 存储 token 到浏览器缓存 // 存储 token 到浏览器缓存
Session.set('token', res.data.token); Session.set('token', res.data.token);
// 存储用户信息到浏览器缓存 // 存储用户信息到浏览器缓存
@@ -270,56 +269,52 @@ export default defineComponent({
}; };
// 当前时间提示语 // 当前时间提示语
const currentTime = computed(() => { const currentTime = computed(() => {
return formatAxis(new Date()); return formatAxis(new Date());
}); });
const handleAvatarSuccess: UploadProps['onSuccess'] = ( const handleAvatarSuccess: UploadProps['onSuccess'] = (response, uploadFile) => {
response, if (response.code == 0) {
uploadFile
) => {
if(response.code == 0){
state.imageUrl = response.data.path; state.imageUrl = response.data.path;
state.personalForm.avatar = response.data.path; state.personalForm.avatar = response.data.path;
handleUpload(); handleUpload();
} }
}; };
/** 重置密码按钮操作 */ /** 重置密码按钮操作 */
const handleEditPass = ()=> { const handleEditPass = () => {
ElMessageBox.prompt('请输入"' + state.personalForm.nickname + '"的新密码', "提示", { ElMessageBox.prompt('请输入"' + state.personalForm.nickname + '"的新密码', '提示', {
confirmButtonText: "确定", confirmButtonText: '确定',
cancelButtonText: "取消" cancelButtonText: '取消',
}).then(({ value }) => { })
if(!value || value==''){ .then(({ value }) => {
if (!value || value == '') {
ElMessage.success('密码不能为空'); ElMessage.success('密码不能为空');
return return;
} }
resetPwdPersonal({password:value}).then(() => { resetPwdPersonal({ password: value }).then(() => {
ElMessage.success("修改成功,新密码是:" + value); ElMessage.success('修改成功,新密码是:' + value);
}); });
}).catch(() => {}); })
.catch(() => {});
}; };
// 初始化用户数据 // 初始化用户数据
const initUserInfo = () => { const initUserInfo = () => {
getPersonalInfo().then((res:any)=>{ getPersonalInfo().then((res: any) => {
const user = res.data.user; const user = res.data.user;
state.imageUrl = user.avatar; state.imageUrl = user.avatar;
state.personalForm = { state.personalForm = {
nickname:user.userNickname, nickname: user.userNickname,
userEmail:user.userEmail, userEmail: user.userEmail,
describe: user.describe, describe: user.describe,
mobile: user.mobile, mobile: user.mobile,
sex: String(user.sex), sex: String(user.sex),
remark:user.remark, remark: user.remark,
avatar:user.avatar, avatar: user.avatar,
lastLoginIp:user.lastLoginIp, lastLoginIp: user.lastLoginIp,
lastLoginTime:user.lastLoginTime lastLoginTime: user.lastLoginTime,
} };
state.deptName = res.data.deptName; state.deptName = res.data.deptName;
state.roles = res.data.roles; state.roles = res.data.roles;
}) });
}; };
// 页面加载时 // 页面加载时
onMounted(() => { onMounted(() => {
@@ -354,7 +349,7 @@ export default defineComponent({
:deep(.el-upload) { :deep(.el-upload) {
height: 100%; height: 100%;
} }
.avatar-uploader{ .avatar-uploader {
border: 1px dashed var(--el-border-color); border: 1px dashed var(--el-border-color);
border-radius: 6px; border-radius: 6px;
cursor: pointer; cursor: pointer;

View File

@@ -44,21 +44,7 @@ const viteConfig = defineConfig((mode: ConfigEnv) => {
port: env.VITE_PORT as unknown as number, port: env.VITE_PORT as unknown as number,
open: false, open: false,
hmr: true, hmr: true,
// proxy: { // 无代理模式:前端直连后端,由后端处理 CORS
// '/gitee': {
// target: 'https://gitee.com',
// ws: true,
// changeOrigin: true,
// rewrite: (path) => path.replace(/^\/gitee/, ''),
// },
// },
proxy: {
'/api': {
target: 'http://localhost:8808',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '/api'),
},
},
}, },
build: { build: {
outDir: 'dist', outDir: 'dist',