Commit 861403fd by 吴春元

登录页面调试,其他修改

parent 60a0a033
......@@ -14,7 +14,7 @@ export function login(
uuid,
};
return request({
url: "/login",
url: "/auth/login",
headers: {
isToken: false,
repeatSubmit: false,
......@@ -27,7 +27,7 @@ export function login(
// 注册方法
export function register(data: any) {
return request({
url: "/register",
url: "/auth/register",
headers: {
isToken: false,
},
......@@ -39,7 +39,7 @@ export function register(data: any) {
// 获取用户详细信息
export function getInfo() {
return request({
url: "/getInfo",
url: "/system/user/getInfo",
method: "get",
});
}
......@@ -48,7 +48,7 @@ export function getInfo() {
export function logout() {
return request({
url: "/auth/logout",
method: "post",
method: "delete",
});
}
......
@use "./_variables.scss" as vars;
// 深蓝色主题变量
$dark-blue-primary: #1890FF; // 主蓝色
$dark-blue-bg: #001529; // 深蓝背景
$dark-blue-secondary: #003a8c; // 次级蓝色
$dark-blue-border: #004d99; // 边框蓝色
$white-text: #FFFFFF; // 白色文字
$light-gray-text: #D9D9D9; // 浅灰色文字
$blue-hover: #40a9ff; // 悬停蓝色
$dark-blue-primary: #1890ff; // 主蓝色
$dark-blue-bg: #001529; // 深蓝背景
$dark-blue-secondary: #003a8c; // 次级蓝色
$dark-blue-border: #004d99; // 边框蓝色
$white-text: #ffffff; // 白色文字
$light-gray-text: #d9d9d9; // 浅灰色文字
$blue-hover: #40a9ff; // 悬停蓝色
// 全局深蓝色主题
:root {
......@@ -18,31 +17,31 @@ $blue-hover: #40a9ff; // 悬停蓝色
--el-color-warning: #faad14;
--el-color-danger: #f5222d;
--el-color-info: #{$dark-blue-secondary};
// 文字颜色 - 全部设置为白色或浅色
--el-text-color-primary: #{$white-text};
--el-text-color-regular: #{$light-gray-text};
--el-text-color-secondary: #{$light-gray-text};
--el-text-color-placeholder: #8c8c8c;
// 背景颜色 - 深蓝色
--el-bg-color: #{$dark-blue-bg};
--el-bg-color-page: #000d19;
--el-bg-color-overlay: #001529;
// 边框颜色
--el-border-color: #{$dark-blue-border};
--el-border-color-light: #004d99;
--el-border-color-lighter: #0050b3;
--el-border-color-extra-light: #096dd9;
// 填充颜色
--el-fill-color: #003a8c;
--el-fill-color-light: #002766;
--el-fill-color-lighter: #001d66;
--el-fill-color-extra-light: #001d66;
--el-fill-color-blank: transparent;
// 遮罩层
--el-mask-color: rgba(0, 0, 0, 0.45);
--el-mask-color-extra-light: rgba(0, 0, 0, 0.3);
......@@ -65,11 +64,11 @@ $blue-hover: #40a9ff; // 悬停蓝色
--el-input-focus-border-color: #{$dark-blue-primary};
--el-input-width: 100%;
--el-input-height: 32px;
.el-input__wrapper {
background-color: var(--el-input-bg-color);
}
.el-input__inner {
color: #{$white-text};
}
......@@ -104,7 +103,7 @@ $blue-hover: #40a9ff; // 悬停蓝色
--el-select-input-height: 32px;
--el-select-input-border-radius: 4px;
--el-select-input-bg-color: #002766;
.el-select__wrapper {
background-color: var(--el-select-input-bg-color);
}
......@@ -123,13 +122,31 @@ $blue-hover: #40a9ff; // 悬停蓝色
--el-cascader-node-color-disabled: #666;
--el-cascader-color-empty: #666;
--el-cascader-tag-background: #003a8c;
.el-cascader__dropdown {
background-color: #001529;
border: 1px solid var(--el-border-color);
}
}
// 选择器组件 - 深蓝色主题
.el-cascader .el-input {
--el-input-text-color: var(--el-text-color-regular);
--el-input-border: var(--el-border);
--el-input-hover-border: var(--el-border-color-hover);
--el-input-focus-border: var(--el-color-primary);
--el-input-transparent-border: 0 0 0 1px transparent inset;
--el-input-border-color: var(--el-border-color);
--el-input-border-radius: var(--el-border-radius-base);
--el-input-bg-color: #002766;
--el-input-icon-color: var(--el-text-color-placeholder);
--el-input-placeholder-color: var(--el-text-color-placeholder);
--el-input-hover-border-color: var(--el-border-color-hover);
--el-input-clear-hover-color: var(--el-text-color-secondary);
--el-input-focus-border-color: var(--el-color-primary);
--el-input-width: 100%;
}
// 表格组件 - 深蓝色主题
.el-table {
--el-table-border-color: var(--el-border-color);
......@@ -143,7 +160,7 @@ $blue-hover: #40a9ff; // 悬停蓝色
--el-table-bg-color: #001529;
--el-table-tr-bg-color: #001529;
--el-table-expanded-cell-bg-color: #001529;
th.el-table__cell {
background-color: var(--el-table-header-bg-color);
}
......@@ -170,7 +187,7 @@ $blue-hover: #40a9ff; // 悬停蓝色
--el-dialog-title-text-color: #{$white-text};
--el-dialog-content-text-color: #{$white-text};
--el-dialog-close-icon-color: #{$light-gray-text};
.el-dialog__header {
border-bottom: 1px solid var(--el-border-color);
}
......@@ -218,4 +235,4 @@ $blue-hover: #40a9ff; // 悬停蓝色
::-webkit-scrollbar-thumb:hover {
background: #{$dark-blue-primary};
}
\ No newline at end of file
}
import { login, logout, getInfo } from '@/api/login'
import { getToken, setToken, removeToken } from '@/utils/auth'
import { defineStore } from 'pinia'
import { login, logout, getInfo } from "@/api/login";
import { getToken, setToken, removeToken } from "@/utils/auth";
import { defineStore } from "pinia";
const useUserStore = defineStore(
'user',
{
state: (): any => ({
token: getToken(),
id: '',
name: '',
avatar: '',
roles: [],
permissions: []
}),
actions: {
// 登录
login(userInfo: any) {
const username = userInfo.username.trim()
const password = userInfo.password
const code = userInfo.code
const uuid = userInfo.uuid
return new Promise((resolve, reject) => {
login(username, password, code, uuid).then((res: any) => {
setToken(res.token)
this.token = res.token
resolve(res)
}).catch(error => {
reject(error)
const useUserStore = defineStore("user", {
state: (): any => ({
token: getToken(),
id: "",
name: "",
avatar: "",
roles: [],
permissions: [],
}),
actions: {
// 登录
login(userInfo: any) {
const username = userInfo.username.trim();
const password = userInfo.password;
const code = userInfo.code;
const uuid = userInfo.uuid;
return new Promise((resolve, reject) => {
login(username, password, code, uuid)
.then((res: any) => {
setToken(res.data.access_token);
this.token = res.data.access_token;
resolve(res);
})
})
},
// 获取用户信息
getInfo() {
return new Promise((resolve, reject) => {
getInfo().then((res: any) => {
const user = res.user
.catch((error) => {
reject(error);
});
});
},
// 获取用户信息
getInfo() {
return new Promise((resolve, reject) => {
getInfo()
.then((res: any) => {
const user = res.user;
const avatar = import.meta.env.VITE_APP_BASE_API + user.avatar;
if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组
this.roles = res.roles
this.permissions = res.permissions
if (res.roles && res.roles.length > 0) {
// 验证返回的roles是否是一个非空数组
this.roles = res.roles;
this.permissions = res.permissions;
} else {
this.roles = ['ROLE_DEFAULT']
this.roles = ["ROLE_DEFAULT"];
}
this.id = user.userId
this.name = user.userName
this.avatar = avatar
resolve(res)
}).catch(error => {
reject(error)
this.id = user.userId;
this.name = user.userName;
this.avatar = avatar;
resolve(res);
})
})
},
// 退出系统
logOut() {
return new Promise((resolve, reject)=> {
logout().then(() => {
this.token = ''
this.roles = []
this.permissions = []
removeToken()
resolve(true)
}).catch(error => {
reject(error)
.catch((error) => {
reject(error);
});
});
},
// 退出系统
logOut() {
return new Promise((resolve, reject) => {
logout()
.then(() => {
this.token = "";
this.roles = [];
this.permissions = [];
removeToken();
resolve(true);
})
})
}
}
})
.catch((error) => {
reject(error);
});
});
},
},
});
export default useUserStore
export default useUserStore;
import axios from 'axios'
import { ElNotification , ElMessageBox, ElMessage, ElLoading } from 'element-plus'
import { getToken } from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import { tansParams, blobValidate } from '@/utils/ruoyi'
import cache from '@/plugins/cache'
import useUserStore from '@/store/modules/user'
import axios from "axios";
import {
ElNotification,
ElMessageBox,
ElMessage,
ElLoading,
} from "element-plus";
import { getToken } from "@/utils/auth";
import errorCode from "@/utils/errorCode";
import { tansParams, blobValidate } from "@/utils/ruoyi";
import cache from "@/plugins/cache";
import useUserStore from "@/store/modules/user";
let downloadLoadingInstance;
// 是否显示重新登录
export let isRelogin = { show: false };
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";
// 创建axios实例
const service = axios.create({
// axios中请求配置有baseURL选项,表示请求URL公共部分
baseURL: import.meta.env.VITE_APP_BASE_API,
// 超时
timeout: 100000
})
timeout: 100000,
});
// request拦截器
service.interceptors.request.use(config => {
// 是否需要设置 token
const isToken = (config.headers || {}).isToken === false
// 是否需要防止数据重复提交
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
if (getToken() && !isToken) {
config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
}
// get请求映射params参数
if (config.method === 'get' && config.params) {
let url = config.url + '?' + tansParams(config.params);
url = url.slice(0, -1);
config.params = {};
config.url = url;
}
if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
const requestObj = {
url: config.url,
data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
time: new Date().getTime()
service.interceptors.request.use(
(config) => {
// 是否需要设置 token
const isToken = (config.headers || {}).isToken === false;
// 是否需要防止数据重复提交
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
if (getToken() && !isToken) {
console.log("getToken()-----" + getToken());
config.headers["Authorization"] = "Bearer " + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
}
const requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小
const limitSize = 5 * 1024 * 1024; // 限制存放数据5M
if (requestSize >= limitSize) {
console.warn(`[${config.url}]: ` + '请求数据大小超出允许的5M限制,无法进行防重复提交验证。')
return config;
// debugger;
// get请求映射params参数
if (config.method === "get" && config.params) {
let url = config.url + "?" + tansParams(config.params);
url = url.slice(0, -1);
config.params = {};
config.url = url;
}
const sessionObj = cache.session.getJSON('sessionObj')
if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
cache.session.setJSON('sessionObj', requestObj)
} else {
const s_url = sessionObj.url; // 请求地址
const s_data = sessionObj.data; // 请求数据
const s_time = sessionObj.time; // 请求时间
const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
const message = '数据正在处理,请勿重复提交';
console.warn(`[${s_url}]: ` + message)
return Promise.reject(new Error(message))
if (
!isRepeatSubmit &&
(config.method === "post" || config.method === "put")
) {
const requestObj = {
url: config.url,
data:
typeof config.data === "object"
? JSON.stringify(config.data)
: config.data,
time: new Date().getTime(),
};
const requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小
const limitSize = 5 * 1024 * 1024; // 限制存放数据5M
if (requestSize >= limitSize) {
console.warn(
`[${config.url}]: ` +
"请求数据大小超出允许的5M限制,无法进行防重复提交验证。"
);
return config;
}
const sessionObj = cache.session.getJSON("sessionObj");
if (
sessionObj === undefined ||
sessionObj === null ||
sessionObj === ""
) {
cache.session.setJSON("sessionObj", requestObj);
} else {
cache.session.setJSON('sessionObj', requestObj)
const s_url = sessionObj.url; // 请求地址
const s_data = sessionObj.data; // 请求数据
const s_time = sessionObj.time; // 请求时间
const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
if (
s_data === requestObj.data &&
requestObj.time - s_time < interval &&
s_url === requestObj.url
) {
const message = "数据正在处理,请勿重复提交";
console.warn(`[${s_url}]: ` + message);
return Promise.reject(new Error(message));
} else {
cache.session.setJSON("sessionObj", requestObj);
}
}
}
return config;
},
(error) => {
console.log(error);
Promise.reject(error);
}
return config
}, error => {
console.log(error)
Promise.reject(error)
})
);
// 响应拦截器
service.interceptors.response.use(res => {
service.interceptors.response.use(
(res) => {
// 未设置状态码则默认成功状态
const code = res.data.code || 200;
// 获取错误信息
const msg = (code in errorCode ? errorCode[code as keyof typeof errorCode] : undefined) || res.data.msg || errorCode['default']
const msg =
(code in errorCode
? errorCode[code as keyof typeof errorCode]
: undefined) ||
res.data.msg ||
errorCode["default"];
// 二进制数据则直接返回
if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
return res.data
if (
res.request.responseType === "blob" ||
res.request.responseType === "arraybuffer"
) {
return res.data;
}
if (code === 401) {
if (!isRelogin.show) {
isRelogin.show = true;
ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
isRelogin.show = false;
useUserStore().logOut().then(() => {
location.href = '/index';
ElMessageBox.confirm(
"登录状态已过期,您可以继续留在该页面,或者重新登录",
"系统提示",
{
confirmButtonText: "重新登录",
cancelButtonText: "取消",
type: "warning",
}
)
.then(() => {
isRelogin.show = false;
useUserStore()
.logOut()
.then(() => {
location.href = "/index";
});
})
}).catch(() => {
isRelogin.show = false;
});
}
return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
.catch(() => {
isRelogin.show = false;
});
}
return Promise.reject("无效的会话,或者会话已过期,请重新登录。");
} else if (code === 500) {
ElMessage({ message: msg, type: 'error' })
return Promise.reject(new Error(msg))
ElMessage({ message: msg, type: "error" });
return Promise.reject(new Error(msg));
} else if (code === 601) {
ElMessage({ message: msg, type: 'warning' })
return Promise.reject(new Error(msg))
ElMessage({ message: msg, type: "warning" });
return Promise.reject(new Error(msg));
} else if (code !== 200) {
ElNotification.error({ title: msg })
return Promise.reject('error')
ElNotification.error({ title: msg });
return Promise.reject("error");
} else {
return Promise.resolve(res.data)
return Promise.resolve(res.data);
}
},
error => {
console.log('err' + error)
(error) => {
console.log("err" + error);
let { message } = error;
if (message == "Network Error") {
message = "后端接口连接异常";
......@@ -116,9 +164,9 @@ service.interceptors.response.use(res => {
} else if (message.includes("Request failed with status code")) {
message = "系统接口" + message.substr(message.length - 3) + "异常";
}
ElMessage({ message: message, type: 'error', duration: 5 * 1000 })
return Promise.reject(error)
ElMessage({ message: message, type: "error", duration: 5 * 1000 });
return Promise.reject(error);
}
)
);
export default service
export default service;
......@@ -57,47 +57,6 @@
</div>
</el-col>
</el-row>
<!-- <div class="w-[454px] flex flex-col">
<ContainerWrap title="总览数据">
<DataInfo class="!h-[280px]" />
</ContainerWrap>
<ContainerWrap title="各公司隧道统计">
<TunnelStatusNum class="!h-[250px]" />
</ContainerWrap>
<ContainerWrap title="各隧道施工进度" class="flex-grow">
<ConstructionProgress />
</ContainerWrap>
</div>
<div class="flex-grow flex flex-col items-center h-full relative">
<div class="absolute top-[46px] right-0 z-50">
<el-cascader
placeholder="请选择机构"
:options="officeTree"
v-model="selectedOffice"
clearable
filterable
:show-all-levels="false"
:props="{
expandTrigger: 'hover',
multiple: false,
checkStrictly: true,
}"
@change="handleOfficeChange"
>
</el-cascader>
</div>
</div>
<div class="w-[454px] flex flex-col h-full">
<ContainerWrap title="设备统计" class="!h-fit">
<DeviceInfo />
</ContainerWrap>
<ContainerWrap title="视频监控" class="flex-grow !h-0">
<template #header-right>
<el-button type="primary" size="small" link>查看更多>></el-button>
</template>
<VideoControls />
</ContainerWrap>
</div> -->
</div>
<el-dialog
v-model="dialogVisible"
......@@ -174,7 +133,7 @@ import Alert7Days from "./components/Alert7Days.vue";
import MapEcharts from "./components/MapEcharts.vue";
import DeployProject from "./components/DeployProject.vue";
import SubsidiaryCompanyEquipment from "./components/SubsidiaryCompanyEquipment.vue";
import Map from "./components/Map.vue";
// import Map from "./components/Map.vue";
import { ref, onMounted, onUnmounted } from "vue";
import { eventBus } from "@/eventBus";
......
<template>
<div class="login flex-col pb-10">
<h3 class="text-5xl font-bold text-center mb-10">
{{ AppSetting.projectName }}
</h3>
<el-form
ref="loginRef"
:model="loginForm"
:rules="loginRules"
class="login-form"
>
<h3 class="title">用户登录</h3>
<el-form-item prop="username">
<el-input
v-model="loginForm.username"
type="text"
size="large"
auto-complete="off"
placeholder="请输入账号"
>
<template #prefix>
<el-icon color="#fff"><Avatar /></el-icon>
</template>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
type="password"
size="large"
auto-complete="off"
placeholder="请输入密码"
@keyup.enter="handleLogin"
>
<template #prefix
><el-icon color="#fff"><Lock /></el-icon
></template>
</el-input>
</el-form-item>
<el-form-item prop="code" v-if="captchaEnabled">
<el-input
v-model="loginForm.code"
size="large"
auto-complete="off"
placeholder="验证码"
style="width: 63%"
@keyup.enter="handleLogin"
>
<template #prefix
><el-icon color="#fff"><Opportunity /></el-icon
></template>
</el-input>
<div class="login-code">
<img :src="codeUrl" @click="getCode" class="login-code-img" />
</div>
</el-form-item>
<el-checkbox
v-model="loginForm.rememberMe"
style="margin: 0px 0px 10px 0px"
>记住密码</el-checkbox
>
<el-form-item style="width: 100%" class="pb-18">
<el-button
:loading="loading"
size="large"
type="primary"
style="width: 100%; height: 35px; border: 0px solid #4491fc"
color="#2261BA"
@click.prevent="handleLogin"
>
<span v-if="!loading">登 录</span>
<span v-else>登 录 中...</span>
</el-button>
<div style="float: right" v-if="register">
<router-link class="link-type" :to="'/register'"
>立即注册</router-link
>
</div>
</el-form-item>
</el-form>
<!-- 底部 -->
<div class="el-login-footer">
<span>Copyright © 2018-2024 ruoyi.vip All Rights Reserved.</span>
</div>
</div>
</template>
<script setup>
import { getCodeImg } from "@/api/login";
import Cookies from "js-cookie";
import { encrypt, decrypt } from "@/utils/jsencrypt";
import useUserStore from "@/store/modules/user";
import { AppSetting } from "@/setting";
const userStore = useUserStore();
const route = useRoute();
const router = useRouter();
const { proxy } = getCurrentInstance();
const loginForm = ref({
username: "admin",
password: "admin123",
rememberMe: false,
code: "",
uuid: "",
});
const loginRules = {
username: [{ required: true, trigger: "blur", message: "请输入您的账号" }],
password: [{ required: true, trigger: "blur", message: "请输入您的密码" }],
code: [{ required: true, trigger: "change", message: "请输入验证码" }],
};
const codeUrl = ref("");
const loading = ref(false);
// 验证码开关
const captchaEnabled = ref(true);
// 注册开关
const register = ref(false);
const redirect = ref(undefined);
watch(
route,
(newRoute) => {
redirect.value = newRoute.query && newRoute.query.redirect;
},
{ immediate: true }
);
function handleLogin() {
proxy.$refs.loginRef.validate((valid) => {
if (valid) {
loading.value = true;
// 勾选了需要记住密码设置在 cookie 中设置记住用户名和密码
if (loginForm.value.rememberMe) {
Cookies.set("username", loginForm.value.username, { expires: 30 });
Cookies.set("password", encrypt(loginForm.value.password), {
expires: 30,
});
Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 });
} else {
// 否则移除
Cookies.remove("username");
Cookies.remove("password");
Cookies.remove("rememberMe");
}
// 调用action的登录方法
userStore
.login(loginForm.value)
.then(() => {
const query = route.query;
const otherQueryParams = Object.keys(query).reduce((acc, cur) => {
if (cur !== "redirect") {
acc[cur] = query[cur];
}
return acc;
}, {});
router.push({ path: redirect.value || "/", query: otherQueryParams });
})
.catch(() => {
loading.value = false;
// 重新获取验证码
if (captchaEnabled.value) {
getCode();
}
});
}
});
}
function getCode() {
getCodeImg().then((res) => {
captchaEnabled.value =
res.captchaEnabled === undefined ? true : res.captchaEnabled;
if (captchaEnabled.value) {
codeUrl.value = "data:image/gif;base64," + res.img;
loginForm.value.uuid = res.uuid;
}
});
}
function getCookie() {
const username = Cookies.get("username");
const password = Cookies.get("password");
const rememberMe = Cookies.get("rememberMe");
loginForm.value = {
username: username === undefined ? loginForm.value.username : username,
password:
password === undefined ? loginForm.value.password : decrypt(password),
rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
};
}
getCode();
getCookie();
</script>
<style lang="scss" scoped>
.login {
display: flex;
justify-content: center;
align-items: center;
height: 100%;
background-image: url("@/assets/images/login-background.jpg");
background-size: 100% 100%;
}
.title {
margin: 60px auto 10px auto;
text-align: center;
font-weight: 500;
color: #fff;
}
.login-form {
border-radius: 6px;
// background: #ffffff;
background-image: url("@/assets/images/login-center-bg1.png");
background-size: 100% 100%;
width: 700px;
padding: 20px 220px 5px 220px;
.el-input {
height: 35px;
input {
height: 35px;
}
}
.input-icon {
height: 39px;
width: 14px;
margin-left: 0px;
}
}
.login-tip {
font-size: 13px;
text-align: center;
color: #bfbfbf;
}
.login-code {
width: 33%;
height: 40px;
float: right;
img {
cursor: pointer;
vertical-align: middle;
}
}
.el-login-footer {
height: 40px;
line-height: 40px;
position: fixed;
bottom: 0;
width: 100%;
text-align: center;
color: #fff;
font-family: Arial;
font-size: 12px;
letter-spacing: 1px;
}
.login-code-img {
height: 40px;
padding-left: 12px;
}
:deep(.el-form-item) {
display: flex;
// --font-size: 14px;
margin-bottom: 13px;
}
:deep(.el-input .el-input__inner) {
color: #fff;
// background: yellow !important;
// border: 0px solid rgba(255, 255, 255, 0.3);
}
:deep(.el-input--large .el-input__wrapper) {
// padding: 1px 15px;
background-color: #163054;
// box-shadow: 0 0 0 0px #2261ba inset !important; /* 可选:修改边框颜色 */
box-shadow: 0px 2px 4px rgba(79, 151, 214, 0.33);
// border: 0px solid rgba(255, 255, 255, 0.3);
}
:deep(.el-input__inner) {
// background-color: rgba(22, 48, 84, 0.6);
}
</style>
......@@ -52,10 +52,10 @@ export default defineConfig({
host: "0.0.0.0",
port: 8080,
proxy: {
"/api": {
"/dev-api": {
target: "http://192.168.19.166:8081",
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ""),
rewrite: (path) => path.replace(/^\/dev-api/, ""),
},
},
},
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment