Merge branch 'master' of https://github.com/youlaitech/vue3-element-admin
Former-commit-id: 448a48eeb9924e685373c198225c9ea06db73331
This commit is contained in:
@@ -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("切换语言成功!");
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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")}`,
|
||||||
|
// },
|
||||||
|
// ],
|
||||||
|
// });
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 密码校验器
|
* 密码校验器
|
||||||
|
|||||||
Reference in New Issue
Block a user