feat: 登录提示语根据语言设置&&主题颜色保存

Former-commit-id: d31b3c6adc4e620b4509e46119c43e64b53e48ad
This commit is contained in:
april
2023-09-26 18:24:04 +08:00
parent 4e8d9f744d
commit 07f189f585
6 changed files with 93 additions and 12 deletions

View File

@@ -9,7 +9,7 @@ const { locale } = useI18n();
function handleLanguageChange(lang: string) { function handleLanguageChange(lang: string) {
locale.value = lang; locale.value = lang;
appStore.changeLanguage(lang); appStore.changeLanguage(lang);
if (lang == "en") { if (lang === "en") {
ElMessage.success("Switch Language Successful!"); ElMessage.success("Switch Language Successful!");
} else { } else {
ElMessage.success("切换语言成功!"); ElMessage.success("切换语言成功!");

View File

@@ -76,14 +76,21 @@ const themeColors = ref<string[]>([
*/ */
function changeThemeColor(color: string) { function changeThemeColor(color: string) {
document.documentElement.style.setProperty("--el-color-primary", color); document.documentElement.style.setProperty("--el-color-primary", color);
// settingsStore.changeSetting({ key: "layout", value: color }); settingsStore.changeSetting({ key: "themeColor", value: color });
} }
const currentThemeColor = computed(() => {
return settingsStore.themeColor;
});
onMounted(() => { onMounted(() => {
window.document.body.setAttribute("layout", settingsStore.layout); window.document.body.setAttribute("layout", settingsStore.layout);
const theme = const theme =
localStorage.getItem("vueuse-color-scheme") || defaultSettings.theme; localStorage.getItem("vueuse-color-scheme") || defaultSettings.theme;
localStorage.setItem("vueuse-color-scheme", theme); localStorage.setItem("vueuse-color-scheme", theme);
document.documentElement.style.setProperty(
"--el-color-primary",
settingsStore.themeColor
);
}); });
</script> </script>
@@ -126,10 +133,12 @@ onMounted(() => {
<li <li
v-for="(color, index) in themeColors" v-for="(color, index) in themeColors"
:key="index" :key="index"
class="inline-block w-[30px] h-[30px] cursor-pointer" class="inline-block w-[30px] h-[30px] cursor-pointer theme-wrap"
:style="{ background: color }" :style="{ background: color }"
@click="changeThemeColor(color)" @click="changeThemeColor(color)"
></li> >
<i-ep-check v-show="color === currentThemeColor" />
</li>
</ul> </ul>
<el-divider>导航设置</el-divider> <el-divider>导航设置</el-divider>
@@ -240,5 +249,12 @@ onMounted(() => {
box-shadow: 0 0 1px #888; box-shadow: 0 0 1px #888;
} }
} }
.theme-wrap {
display: flex;
align-items: center;
justify-content: center;
color: #fff;
}
} }
</style> </style>

View File

@@ -121,7 +121,8 @@ function isFirstView() {
try { try {
return ( return (
(selectedTag.value as TagView).fullPath === "/dashboard" || (selectedTag.value as TagView).fullPath === "/dashboard" ||
(selectedTag.value as TagView).fullPath === tagsViewStore.visitedViews[1].fullPath (selectedTag.value as TagView).fullPath ===
tagsViewStore.visitedViews[1].fullPath
); );
} catch (err) { } catch (err) {
return false; return false;

View File

@@ -40,6 +40,11 @@ interface DefaultSettings {
* 语言( zh-cn| en) * 语言( zh-cn| en)
*/ */
language: string; language: string;
/**
* 主题颜色
*/
themeColor: string;
} }
const defaultSettings: DefaultSettings = { const defaultSettings: DefaultSettings = {
@@ -52,6 +57,7 @@ const defaultSettings: DefaultSettings = {
theme: "light", // 默认暗黑模式 theme: "light", // 默认暗黑模式
size: "default", size: "default",
language: "zh-cn", language: "zh-cn",
themeColor: "#409EFF",
}; };
export default defaultSettings; export default defaultSettings;

View File

@@ -14,7 +14,10 @@ export const useSettingsStore = defineStore("setting", () => {
); );
const layout = useStorage<string>("layout", defaultSettings.layout); const layout = useStorage<string>("layout", defaultSettings.layout);
const themeColor = useStorage<string>(
"themeColor",
defaultSettings.themeColor
);
// actions // actions
function changeSetting(param: { key: string; value: any }) { function changeSetting(param: { key: string; value: any }) {
const { key, value } = param; const { key, value } = param;
@@ -34,6 +37,9 @@ export const useSettingsStore = defineStore("setting", () => {
case "layout": case "layout":
layout.value = value; layout.value = value;
break; break;
case "themeColor":
themeColor.value = value;
break;
} }
} }
@@ -43,6 +49,7 @@ export const useSettingsStore = defineStore("setting", () => {
fixedHeader, fixedHeader,
sidebarLogo, sidebarLogo,
layout, layout,
themeColor,
changeSetting, changeSetting,
}; };
}); });

View File

@@ -39,7 +39,7 @@
<el-input <el-input
v-model="loginData.password" v-model="loginData.password"
class="flex-1" class="flex-1"
placeholder="密码" :placeholder="$t('login.password')"
:type="passwordVisible === false ? 'password' : 'input'" :type="passwordVisible === false ? 'password' : 'input'"
size="large" size="large"
name="password" name="password"
@@ -92,18 +92,21 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { useI18n } from "vue-i18n";
import router from "@/router"; import router from "@/router";
import LangSelect from "@/components/LangSelect/index.vue"; import LangSelect from "@/components/LangSelect/index.vue";
import SvgIcon from "@/components/SvgIcon/index.vue"; import SvgIcon from "@/components/SvgIcon/index.vue";
// 状态管理依赖 // 状态管理依赖
import { useUserStore } from "@/store/modules/user"; import { useUserStore } from "@/store/modules/user";
import { useAppStore } from "@/store/modules/app";
// API依赖 // API依赖
import { LocationQuery, LocationQueryValue, useRoute } from "vue-router"; import { LocationQuery, LocationQueryValue, useRoute } from "vue-router";
import { getCaptchaApi } from "@/api/auth"; import { getCaptchaApi } from "@/api/auth";
import { LoginData } from "@/api/auth/types"; import { LoginData } from "@/api/auth/types";
const appStore = useAppStore();
const userStore = useUserStore(); const userStore = useUserStore();
const route = useRoute(); const route = useRoute();
@@ -134,11 +137,59 @@ const loginData = ref<LoginData>({
password: "123456", password: "123456",
}); });
const loginRules = { const { t } = useI18n();
username: [{ required: true, trigger: "blur" }],
password: [{ required: true, trigger: "blur", validator: passwordValidator }], const loginRules = computed(() => {
verifyCode: [{ required: true, trigger: "blur" }], const prefix = appStore.language === "en" ? "Please enter " : "请输入";
}; return {
username: [
{
required: true,
trigger: "blur",
message: `${prefix}${t("login.username")}`,
},
],
password: [
{
required: true,
trigger: "blur",
validator: passwordValidator,
message: `${prefix}${t("login.password")}`,
},
],
verifyCode: [
{
required: true,
trigger: "blur",
message: `${prefix}${t("login.verifyCode")}`,
},
],
};
});
// const loginRules = reactive({
// username: [
// {
// required: true,
// trigger: "blur",
// message: `请输入${t("login.username")}`,
// },
// ],
// password: [
// {
// required: true,
// trigger: "blur",
// validator: passwordValidator,
// message: `请输入${t("login.password")}`,
// },
// ],
// verifyCode: [
// {
// required: true,
// trigger: "blur",
// message: `请输入${t("login.verifyCode")}`,
// },
// ],
// });
/** /**
* 密码校验器 * 密码校验器