后台界面

1. 演示帐号动态配置
2. vite 动态加载异常问题修复
This commit is contained in:
tak 2025-07-04 14:17:03 +08:00
parent c9af5ae093
commit 6f8761756a
4 changed files with 78 additions and 51 deletions

View File

@ -11,7 +11,7 @@ VITE_DROP_CONSOLE=true
# 跨域代理可以配置多个请注意不要换行如果是公网运行请改成公网IP:服务端运行端口
#VITE_PROXY = [["/appApi","http://localhost:8001"],["/upload","http://localhost:8001/upload"]]
VITE_PROXY=[["/admin","http://localhost:8000/admin"]]
VITE_PROXY=[["/admin","http://api-breeding.dap.5gfd.com.cn/admin"]]
# API 接口地址
VITE_GLOB_API_URL=
@ -24,3 +24,10 @@ VITE_GLOB_IMG_URL=
# 接口前缀
VITE_GLOB_API_URL_PREFIX=/admin
# 快速登录账号密码配置,没有配置则不开启快速登录
## 格式为 [["账号名称","账号密码","角色名称"],["账号名称","账号密码"],["账号名称"]]
## 帐号名称不能为空,密码为空则和帐号名称相同
## 角色名称可选,如果不填写则默认使用账号名称作为角色名称
## 账号名称和角色名称可以重复,账号名称和密码可以重复
VITE_APP_DEMO_ACCOUNT=[["admin","123456","超管"],["test","123456","管理员"],["ameng","123456","租户"],["abai","123456","商户"],["asong","123456","用户"]]

View File

@ -34,7 +34,7 @@ export function wrapperEnv(envConf: Recordable): ViteEnv {
} catch (error) {}
}
ret[envName] = realName;
process.env[envName] = realName;
// process.env[envName] = realName;
}
return ret;
}

43
web/src/debug/account.ts Normal file
View File

@ -0,0 +1,43 @@
import { isArray } from "@/utils/is";
interface Account {
/**
*
*/
name: string;
/**
*
*/
username: string;
/**
*
*/
password: string;
}
/**
*
* @returns {[]Account}
*/
export function getDemoAccounts() {
let envConf = import.meta.env.VITE_APP_DEMO_ACCOUNT || "";
// 帐号密码一样
// [["username"],["username","password"],["username","password","name"]]
try {
let accounts = JSON.parse(envConf);
if (accounts && isArray(accounts)) {
return accounts.map((item: String[]) => {
let [username = "", password = "", name = ""] = item;
username = username;
password = password || username;
name = name || username;
return {
name,
username,
password,
} as Account;
});
}
} catch (error) {}
return [] as Account[];
}

View File

@ -1,60 +1,37 @@
<template>
<n-space :vertical="true">
<n-divider>演示角色登录</n-divider>
<n-space justify="center">
<n-button
v-for="item in accounts"
:key="item.username"
type="primary"
@click="login(item.username, item.password)"
>
{{ item.label }}
</n-button>
<template v-if="accounts && accounts.length > 0">
<n-space :vertical="true">
<n-divider>演示角色登录</n-divider>
<n-space justify="center">
<n-button
v-for="item in accounts"
:key="item.username"
type="primary"
@click="login(item.username, item.password)"
>
{{ item.name }}
</n-button>
</n-space>
<n-space justify="center" class="mt-2">
<n-text depth="3">SaaS系统多租户多应用设计</n-text>
</n-space>
</n-space>
<n-space justify="center" class="mt-2">
<n-text depth="3">SaaS系统多租户多应用设计</n-text>
</n-space>
</n-space>
</template>
</template>
<script lang="ts" setup>
interface Emits {
(e: 'login', param: { username: string; password: string }): void;
}
import { getDemoAccounts } from "@/debug/account";
interface Emits {
(e: "login", param: { username: string; password: string }): void;
}
const emit = defineEmits<Emits>();
const emit = defineEmits<Emits>();
const accounts = [
{
label: '超管',
username: 'admin',
password: '123456',
},
{
label: '管理员',
username: 'test',
password: '123456',
},
{
label: '租户',
username: 'ameng',
password: '123456',
},
{
label: '商户',
username: 'abai',
password: '123456',
},
{
label: '用户',
username: 'asong',
password: '123456',
},
];
const accounts = getDemoAccounts();
function login(username: string, password: string) {
emit('login', { username, password });
}
function login(username: string, password: string) {
emit("login", { username, password });
}
</script>
<style scoped></style>