diff --git a/src/assets/images/login-box-bg.svg b/src/assets/images/login-box-bg.svg
new file mode 100644
index 0000000..ab10040
--- /dev/null
+++ b/src/assets/images/login-box-bg.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/images/logo_left.png b/src/assets/images/logo_left.png
new file mode 100644
index 0000000..732b387
Binary files /dev/null and b/src/assets/images/logo_left.png differ
diff --git a/src/assets/images/logo_right.png b/src/assets/images/logo_right.png
new file mode 100644
index 0000000..e014fa1
Binary files /dev/null and b/src/assets/images/logo_right.png differ
diff --git a/src/views/login.vue b/src/views/login.vue
index 9de4ea0..4bfa247 100644
--- a/src/views/login.vue
+++ b/src/views/login.vue
@@ -1,65 +1,111 @@
-
- {{ title }}
-
-
+
+
+

+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
![]()
-
-
- 记住密码
-
-
- 登 录
- 登 录 中...
-
-
- 立即注册
-
-
-
+
{{ title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
![]()
+
+
+
记住密码
+
+
+ 登 录
+ 登 录 中...
+
+
+ 立即注册
+
+
+
+
+
+
@@ -68,7 +114,8 @@
import { getCodeImg } from "@/api/login";
import Cookies from "js-cookie";
import { encrypt, decrypt } from "@/utils/jsencrypt";
-import useUserStore from '@/store/modules/user'
+import useUserStore from "@/store/modules/user";
+import { View, Hide } from "@element-plus/icons-vue";
const title = import.meta.env.VITE_APP_TITLE;
const userStore = useUserStore();
@@ -81,7 +128,7 @@ const loginForm = ref({
password: "admin123",
rememberMe: false,
code: "",
- uuid: ""
+ uuid: "",
});
const codeUrl = ref("");
@@ -91,31 +138,41 @@ const captchaEnabled = ref(true);
// 注册开关
const register = ref(false);
const redirect = ref(undefined);
+// 密码显示/隐藏
+const showPassword = ref(false);
// 动态验证规则
const loginRules = computed(() => {
const rules = {
username: [{ required: true, trigger: "blur", message: "请输入您的账号" }],
- password: [{ required: true, trigger: "blur", message: "请输入您的密码" }]
+ password: [{ required: true, trigger: "blur", message: "请输入您的密码" }],
};
if (captchaEnabled.value) {
- rules.code = [{ required: true, trigger: "change", message: "请输入验证码" }];
+ rules.code = [
+ { required: true, trigger: "change", message: "请输入验证码" },
+ ];
}
return rules;
});
-watch(route, (newRoute) => {
+watch(
+ route,
+ (newRoute) => {
redirect.value = newRoute.query && newRoute.query.redirect;
-}, { immediate: true });
+ },
+ { immediate: true }
+);
function handleLogin() {
- proxy.$refs.loginRef.validate(valid => {
+ 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("password", encrypt(loginForm.value.password), {
+ expires: 30,
+ });
Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 });
} else {
// 否则移除
@@ -124,29 +181,33 @@ function handleLogin() {
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];
+ 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();
}
- 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;
+ 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;
@@ -160,11 +221,16 @@ function getCookie() {
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)
+ password:
+ password === undefined ? loginForm.value.password : decrypt(password),
+ rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
};
}
+function togglePasswordVisibility() {
+ showPassword.value = !showPassword.value;
+}
+
getCode();
getCookie();
@@ -172,49 +238,232 @@ getCookie();
diff --git a/src/views/order/intention/search.vue b/src/views/order/intention/search.vue
index d66b1e9..23db402 100644
--- a/src/views/order/intention/search.vue
+++ b/src/views/order/intention/search.vue
@@ -422,7 +422,6 @@ import {
compare,
} from "@/api/order";
import { ElMessage, ElEmpty, ElDialog } from "element-plus";
-import { Search, RefreshLeft, Microphone } from "@element-plus/icons-vue";
const { proxy } = getCurrentInstance();
const { display_field } = proxy.useDict("display_field");
@@ -613,7 +612,7 @@ const onHeaderDrop = (targetIndex) => {
const compareTableData = ref([]);
const diffFieldKeys = ref(new Set());
-const getItemKey = (item) => item?.id ?? item?.partNumber ?? item?.uuid ?? "";
+const getItemKey = (item) => item?.id ?? item?.uuid ?? item?.partNumber ?? "";
const getDictLabel = (dictRef, value) => {
if (!dictRef) return null;
@@ -1537,7 +1536,7 @@ const fetchDifferenceRecommendations = async () => {
const fetchCompareTable = async () => {
const idList = selectedCompareList.value
- .map((item) => item.id || item.partNumber)
+ .map((item) => item.uuid || item.partNumber)
.filter(Boolean);
const ids = idList.join(",");
if (!ids) {