feat:登录页面改造

This commit is contained in:
chenchun
2024-08-23 18:26:26 +08:00
parent 07c48479af
commit 5f402488d4
12 changed files with 88 additions and 32 deletions

View File

@@ -6,3 +6,16 @@ VITE_PUBLIC_PATH = /
# 开发环境路由历史模式Hash模式传"hash"、HTML5模式传"h5"、Hash模式带base参数传"hash,base参数"、HTML5模式带base参数传"h5,base参数" # 开发环境路由历史模式Hash模式传"hash"、HTML5模式传"h5"、Hash模式带base参数传"hash,base参数"、HTML5模式带base参数传"h5,base参数"
VITE_ROUTER_HISTORY = "hash" VITE_ROUTER_HISTORY = "hash"
# 开发环境
VITE_APP_BASE_API = '/dev-api'
# ws/开发环境
VITE_APP_BASE_WS = '/dev-ws'
#RBAC
# VITE_APP_BASE_URL='http://localhost:19001/api'
#长连接
VITE_APP_BASE_URL_WS='http://localhost:19001/hub'

View File

@@ -7,7 +7,13 @@ VITE_ROUTER_HISTORY = "hash"
# 是否在打包时使用cdn替换本地库 替换 true 不替换 false # 是否在打包时使用cdn替换本地库 替换 true 不替换 false
VITE_CDN = false VITE_CDN = false
# 生产环境
VITE_APP_BASE_API = '/prod-api'
# ws/开发环境
VITE_APP_BASE_WS = '/prod-ws'
# 是否启用gzip压缩或brotli压缩分两种情况删除原始文件和不删除原始文件 # 是否启用gzip压缩或brotli压缩分两种情况删除原始文件和不删除原始文件
# 压缩时不删除原始文件的配置gzip、brotli、both同时开启 gzip 与 brotli 压缩、none不开启压缩默认 # 压缩时不删除原始文件的配置gzip、brotli、both同时开启 gzip 与 brotli 压缩、none不开启压缩默认
# 压缩时删除原始文件的配置gzip-clear、brotli-clear、both-clear同时开启 gzip 与 brotli 压缩、none不开启压缩默认 # 压缩时删除原始文件的配置gzip-clear、brotli-clear、both-clear同时开启 gzip 与 brotli 压缩、none不开启压缩默认
VITE_COMPRESSION = "none" VITE_COMPRESSION = "none"

View File

@@ -56,7 +56,11 @@ const wrapperEnv = (envConf: Recordable): ViteEnv => {
VITE_ROUTER_HISTORY: "", VITE_ROUTER_HISTORY: "",
VITE_CDN: false, VITE_CDN: false,
VITE_HIDE_HOME: "false", VITE_HIDE_HOME: "false",
VITE_COMPRESSION: "none" VITE_COMPRESSION: "none",
VITE_APP_BASE_API: "",
VITE_APP_BASE_URL: "",
VITE_APP_BASE_URL_WS: "",
VITE_APP_BASE_WS: ""
}; };
for (const envName of Object.keys(envConf)) { for (const envName of Object.keys(envConf)) {

View File

@@ -322,7 +322,7 @@ const tabsRouter = {
export default defineFakeRoute([ export default defineFakeRoute([
{ {
url: "/get-async-routes", url: `/dev-api/get-async-routes`,
method: "get", method: "get",
response: () => { response: () => {
return { return {

View File

@@ -1,5 +1,12 @@
import { http } from "@/utils/http"; import { http } from "@/utils/http";
export type imageCaptcha = {
//uuid
uuid: string; // 使用字符串表示 Guid
//验证码图片字节数值
img: Uint8Array | null;
};
export type UserResult = { export type UserResult = {
success: boolean; success: boolean;
data: { data: {
@@ -70,7 +77,12 @@ type ResultTable = {
/** 登录 */ /** 登录 */
export const getLogin = (data?: object) => { export const getLogin = (data?: object) => {
return http.request<UserResult>("post", "/login", { data }); return http.request<UserResult>("post", "/account/login", { data });
};
/** 获取验证码 */
export const getCodeImg = () => {
return http.request<imageCaptcha>("get", "/account/captcha-image");
}; };
/** 刷新`token` */ /** 刷新`token` */

View File

@@ -16,6 +16,7 @@ import { useUserStoreHook } from "@/store/modules/user";
// 相关配置请参考www.axios-js.com/zh-cn/docs/#axios-request-config-1 // 相关配置请参考www.axios-js.com/zh-cn/docs/#axios-request-config-1
const defaultConfig: AxiosRequestConfig = { const defaultConfig: AxiosRequestConfig = {
baseURL: import.meta.env.VITE_APP_BASE_API,
// 请求超时时间 // 请求超时时间
timeout: 10000, timeout: 10000,
headers: { headers: {

View File

@@ -24,6 +24,7 @@ import { ref, toRaw, reactive, watch, computed } from "vue";
import { useRenderIcon } from "@/components/ReIcon/src/hooks"; import { useRenderIcon } from "@/components/ReIcon/src/hooks";
import { useTranslationLang } from "@/layout/hooks/useTranslationLang"; import { useTranslationLang } from "@/layout/hooks/useTranslationLang";
import { useDataThemeChange } from "@/layout/hooks/useDataThemeChange"; import { useDataThemeChange } from "@/layout/hooks/useDataThemeChange";
import { getCodeImg } from "@/api/user";
import dayIcon from "@/assets/svg/day.svg?component"; import dayIcon from "@/assets/svg/day.svg?component";
import darkIcon from "@/assets/svg/dark.svg?component"; import darkIcon from "@/assets/svg/dark.svg?component";
@@ -37,6 +38,7 @@ defineOptions({
name: "Login" name: "Login"
}); });
const codeUrl = ref("");
const imgCode = ref(""); const imgCode = ref("");
const loginDay = ref(7); const loginDay = ref(7);
const router = useRouter(); const router = useRouter();
@@ -57,18 +59,30 @@ const { title, getDropdownItemStyle, getDropdownItemClass } = useNav();
const { locale, translationCh, translationEn } = useTranslationLang(); const { locale, translationCh, translationEn } = useTranslationLang();
const ruleForm = reactive({ const ruleForm = reactive({
username: "admin", username: "cc",
password: "admin123", password: "123456",
verifyCode: "" verifyCode: "",
uuid: ""
}); });
//获取验证码
const getCode = () => {
getCodeImg().then(res => {
codeUrl.value = "data:image/gif;base64," + res.img;
ruleForm.uuid = res.uuid;
});
};
const onLogin = async (formEl: FormInstance | undefined) => { const onLogin = async (formEl: FormInstance | undefined) => {
if (!formEl) return; if (!formEl) return;
await formEl.validate(valid => { await formEl.validate(valid => {
if (valid) { if (valid) {
loading.value = true; loading.value = true;
useUserStoreHook() useUserStoreHook()
.loginByUsername({ username: ruleForm.username, password: "admin123" }) .loginByUsername({
username: ruleForm.username,
password: ruleForm.password
})
.then(res => { .then(res => {
if (res.success) { if (res.success) {
// 获取后端路由 // 获取后端路由
@@ -114,6 +128,7 @@ watch(checked, bool => {
watch(loginDay, value => { watch(loginDay, value => {
useUserStoreHook().SET_LOGINDAY(value); useUserStoreHook().SET_LOGINDAY(value);
}); });
getCode();
</script> </script>
<template> <template>
@@ -224,7 +239,12 @@ watch(loginDay, value => {
:prefix-icon="useRenderIcon('ri:shield-keyhole-line')" :prefix-icon="useRenderIcon('ri:shield-keyhole-line')"
> >
<template v-slot:append> <template v-slot:append>
<ReImageVerify v-model:code="imgCode" /> 11 {{codeUrl}}
<img
:src="codeUrl"
class="login-code-img"
@click="getCode"
/>
</template> </template>
</el-input> </el-input>
</el-form-item> </el-form-item>

View File

@@ -9,7 +9,7 @@ export const REGEXP_SIX = /^\d{6}$/;
/** 密码正则密码格式应为8-18位数字、字母、符号的任意两种组合 */ /** 密码正则密码格式应为8-18位数字、字母、符号的任意两种组合 */
export const REGEXP_PWD = export const REGEXP_PWD =
/^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)]|[()])+$)(?!^.*[\u4E00-\u9FA5].*$)([^(0-9a-zA-Z)]|[()]|[a-z]|[A-Z]|[0-9]){8,18}$/; /^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)]|[()])+$)(?!^.*[\u4E00-\u9FA5].*$)([^(0-9a-zA-Z)]|[()]|[a-z]|[A-Z]|[0-9]){6,18}$/;
/** 登录校验 */ /** 登录校验 */
const loginRules = reactive<FormRules>({ const loginRules = reactive<FormRules>({

View File

@@ -70,6 +70,10 @@ declare global {
VITE_CDN: boolean; VITE_CDN: boolean;
VITE_HIDE_HOME: string; VITE_HIDE_HOME: string;
VITE_COMPRESSION: ViteCompression; VITE_COMPRESSION: ViteCompression;
VITE_APP_BASE_API: string;
VITE_APP_BASE_WS:string;
VITE_APP_BASE_URL:string;
VITE_APP_BASE_URL_WS:string;
} }
/** /**

View File

@@ -10,7 +10,8 @@ import {
} from "./build/utils"; } from "./build/utils";
export default ({ mode }: ConfigEnv): UserConfigExport => { export default ({ mode }: ConfigEnv): UserConfigExport => {
const { VITE_CDN, VITE_PORT, VITE_COMPRESSION, VITE_PUBLIC_PATH } = // eslint-disable-next-line
const { VITE_CDN, VITE_PORT, VITE_COMPRESSION, VITE_PUBLIC_PATH,VITE_APP_BASE_URL,VITE_APP_BASE_URL_WS } =
wrapperEnv(loadEnv(mode, root)); wrapperEnv(loadEnv(mode, root));
return { return {
base: VITE_PUBLIC_PATH, base: VITE_PUBLIC_PATH,
@@ -24,7 +25,21 @@ export default ({ mode }: ConfigEnv): UserConfigExport => {
port: VITE_PORT, port: VITE_PORT,
host: "0.0.0.0", host: "0.0.0.0",
// 本地跨域代理 https://cn.vitejs.dev/config/server-options.html#server-proxy // 本地跨域代理 https://cn.vitejs.dev/config/server-options.html#server-proxy
proxy: {}, proxy: {
// https://cn.vitejs.dev/config/#server-proxy
"/dev-api": {
target: VITE_APP_BASE_URL,
changeOrigin: true,
rewrite: p => p.replace(/^\/dev-api/, "")
},
"/dev-ws": {
target: VITE_APP_BASE_URL_WS,
changeOrigin: true,
rewrite: p => p.replace(/^\/dev-ws/, ""),
ws: true
}
},
// 预热文件以提前转换和缓存结果,降低启动期间的初始页面加载时长并防止转换瀑布 // 预热文件以提前转换和缓存结果,降低启动期间的初始页面加载时长并防止转换瀑布
warmup: { warmup: {
clientFiles: ["./index.html", "./src/{views,components}/*"] clientFiles: ["./index.html", "./src/{views,components}/*"]

View File

@@ -10,13 +10,8 @@ VITE_APP_BASE_API = '/dev-api'
# ws/开发环境 # ws/开发环境
VITE_APP_BASE_WS = '/dev-ws' VITE_APP_BASE_WS = '/dev-ws'
#BBS
VITE_APP_BASE_URL='http://localhost:19001/api/app' VITE_APP_BASE_URL='http://localhost:19001/api/app'
#RBAC
# VITE_APP_BASE_URL='http://localhost:19001/api'
#长连接 #长连接
VITE_APP_BASE_URL_WS='http://localhost:19001/hub' VITE_APP_BASE_URL_WS='http://localhost:19001/hub'

View File

@@ -22,21 +22,7 @@ const service = axios.create({
timeout: 10000, timeout: 10000,
//处理批零参数 //处理批零参数
paramsSerializer:params => { paramsSerializer:params => {
// return qs.stringify(params,{indices:false})
// console.log(params,"params")
// if(params.id!=undefined)
// {
// if(Array.isArray(params.id) )
// {
// return "id="+params.id.join("&id=")
// }
// else
// {
// return "id="+params.id;
// }
// }
// return request.param(params);
return qs.stringify(params, {arrayFormat: 'repeat'}); return qs.stringify(params, {arrayFormat: 'repeat'});
}, },