明树Git Lab

Commit 778dd172 authored by yangyajing's avatar yangyajing

资源库对接

parent 7e4f239c
Pipeline #104379 passed with stage
in 13 seconds
import axios from "axios";
import { ElMessage } from "element-plus";
import windowConfig from "@/window";
import { useUserStore } from "@/stores/user.js";
axios.interceptors.request.use(function (config) {
let token = "8681f75e775447f7903708c55a35634e";
const userStore = useUserStore();
let token = userStore.authToken || localStorage.getItem("authToken") || "";
if (token) {
config.headers.Authorization = token;
}
......
......@@ -73,8 +73,11 @@
</template>
<script setup>
import { computed, h, resolveComponent } from "vue";
import { computed, onMounted, getCurrentInstance } from "vue";
import { useRouter, useRoute } from "vue-router";
import { useUserStore } from "@/stores/user.js";
const userStore = useUserStore();
const { proxy } = getCurrentInstance();
const router = useRouter();
......@@ -87,14 +90,30 @@ const menuRoutes = computed(() => {
(route) => !route.meta || route.meta.showInMenu !== false
);
});
// 获取资源库数据
const getResourceData = () => {
proxy.$post({
url: "/api/resource/listResourceAll",
data: {},
callback: (data) => {
sessionStorage.setItem("resourceData", JSON.stringify(data));
}
});
};
onMounted(() => {
getResourceData();
});
// 处理退出登录
const handleLogout = () => {
// 清除登录状态
localStorage.removeItem("token");
// 跳转到登录页
router.push("/login");
proxy.$post({
url: "/api/user/logout",
data: {},
callback: (data) => {
userStore.clearUseInfo();
router.replace("/login");
}
})
};
</script>
......
import { createRouter, createWebHashHistory } from 'vue-router'
import MainLayout from '@/layouts/MainLayout.vue'
import { useUserStore } from "@/stores/user.js";
const routes = [
{
path: '/login',
name: 'login',
component: () => import('@/views/login/index.vue'),
meta: { requiresAuth: false }
meta: { nopermission: true }
},
{
path: '/',
name: '首页',
redirect: '/homePage',
component: MainLayout,
meta: { requiresAuth: true },
children: [
{
path: '/homePage',
......@@ -136,14 +136,20 @@ const router = createRouter({
// 路由守卫 - 登录验证
router.beforeEach((to, from, next) => {
const isAuthenticated = localStorage.getItem('token') // 检查登录状态
if (to.meta.requiresAuth && !isAuthenticated) {
const userStore = useUserStore();
let token = userStore.authToken || localStorage.getItem("authToken") || "";
if (!token) {
if (to.path === '/login' || to.meta.nopermission) {
next();
} else {
next('/login')
} else if (to.path === '/login' && isAuthenticated) {
next('/')
}
} else {
next()
if (to.path === "/login") {
next("/");
} else {
next();
}
}
})
......
import { defineStore } from "pinia";
export const useProjectStore = defineStore('project', {
state: () => ({
params: {}
}),
actions: {
setParams(data) {
this.params = { ...this.params, ...data }
}
}
})
\ No newline at end of file
import { defineStore } from "pinia";
export const useUserStore = defineStore('user', {
state: () => ({
userInfo: null,
authToken: ""
}),
actions: {
setUseInfo(data) {
this.userInfo = data;
this.authToken = data.token;
localStorage.setItem("authToken", data.token);
},
clearUserInfo () {
this.userInfo = null;
this.authToken = "";
localStorage.removeItem("authToken");
}
}
})
\ No newline at end of file
......@@ -1149,8 +1149,6 @@ const selectContentBtn = (item) => {
}
debounceTimer = setTimeout(() => {
selectedContentBtn.value = item.key;
// selectedContentName.value = item.name;
// sessionStorage.setItem("selectedContentBtn", selectedContentName.key);
if (item.key === "jianshe") {
nextTick(()=> {
initProgressPie();
......@@ -1257,9 +1255,7 @@ const toggleFullscreen = () => {
isFullscreen.value = !isFullscreen.value;
};
// 页面初始化时设置sessionStorage
onMounted(() => {
sessionStorage.setItem("selectedContentBtn", selectedContentName.key);
window.addEventListener("resize", resizeEcharts);
});
onUnmounted(() => {
......
......@@ -12,10 +12,10 @@
labelPosition="top"
@keydown.enter="handleLogin"
>
<el-form-item label="用户名" prop="username">
<el-form-item label="用户名" prop="mobile">
<el-input
:prefix-icon="User"
v-model="loginForm.username"
v-model="loginForm.mobile"
placeholder="请输入用户名"
prefix-icon="el-icon-user"
></el-input>
......@@ -45,51 +45,62 @@
</template>
<script setup>
import { ref } from "vue";
import { ref, getCurrentInstance } from "vue";
import { useRouter } from "vue-router";
import { User, Lock } from "@element-plus/icons-vue";
import { useUserStore } from "@/stores/user.js";
const userStore = useUserStore();
const { proxy } = getCurrentInstance();
const router = useRouter();
const loginFormRef = ref();
const loading = ref(false);
const captchaSrc = ref("https://picsum.photos/120/40"); // 模拟验证码图片
// 登录表单数据
const loginForm = ref({
username: "admin",
password: "",
captcha: "",
mobile: "",
password: ""
});
// 表单验证规则
const loginRules = ref({
username: [
{ required: true, message: "请输入用户名", trigger: "blur" },
{ min: 3, max: 20, message: "长度在 3 到 20 个字符", trigger: "blur" },
mobile: [
{ required: true, message: "请输入用户名", trigger: "blur" }
],
password: [
{ required: true, message: "请输入密码", trigger: "blur" },
{ min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" },
{ required: true, message: "请输入密码", trigger: "blur" }
],
});
// 处理登录
const handleLogin = async () => {
try {
await loginFormRef.value?.validate();
loading.value = true;
setTimeout(() => {
// 登录成功后设置token
const mockToken = "mock-jwt-token";
localStorage.setItem("token", mockToken);
loading.value = false;
// 跳转到首页
router.push("/");
}, 1000);
} catch (error) {
console.error("登录失败:", error);
loading.value = false;
}
loginFormRef.value?.validate(valid => {
if (valid) {
proxy.$post({
url: "/api/user/login",
data: loginForm.value,
callback: (data) => {
userStore.setUseInfo(data);
router.replace("/");
}
})
}
})
// try {
// await loginFormRef.value?.validate();
// loading.value = true;
// setTimeout(() => {
// // 登录成功后设置token
// const mockToken = "mock-jwt-token";
// localStorage.setItem("token", mockToken);
// loading.value = false;
// // 跳转到首页
// router.push("/");
// }, 1000);
// } catch (error) {
// console.error("登录失败:", error);
// loading.value = false;
// }
};
</script>
......@@ -106,7 +117,7 @@ const handleLogin = async () => {
.login-header {
color: #fff;
font-size: 24px;
font-size: 42px;
font-weight: bold;
padding-left: 20px;
margin: 0 20px;
......@@ -114,7 +125,8 @@ const handleLogin = async () => {
display: flex;
justify-content: left;
align-items: center;
height: 50px;
height: 60px;
line-height: 60px;
background: linear-gradient(
to right,
rgba(0, 0, 0, 0.3),
......@@ -131,7 +143,7 @@ const handleLogin = async () => {
transform: translateY(-50%);
padding: 15px;
box-sizing: border-box;
width: 350px;
width: 375px;
height: 350px;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.5);
border-radius: 8px;
......@@ -160,7 +172,7 @@ const handleLogin = async () => {
.company-logo {
width: 100%;
height: 30px;
height: 45px;
display: flex;
flex-direction: column;
align-items: center;
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -75,10 +75,8 @@
<script setup>
import { reactive, ref, onMounted, computed, getCurrentInstance } from "vue";
import { useRouter } from "vue-router";
import { useProjectStore } from "@/stores/project.js";
import { ElMessage, ElMessageBox } from "element-plus";
import CommonTable from "@/components/common/commonTable.vue";
const projectStore = useProjectStore();
const router = useRouter();
const { proxy } = getCurrentInstance();
......
......@@ -34,10 +34,8 @@
<script setup>
import { reactive, ref, onMounted, computed, getCurrentInstance } from "vue";
import { useRouter } from "vue-router";
import { useProjectStore } from "@/stores/project.js";
import { ElMessage, ElMessageBox } from "element-plus";
import CommonTable from "@/components/common/commonTable.vue";
const projectStore = useProjectStore();
const router = useRouter();
const { proxy } = getCurrentInstance();
......
......@@ -33,10 +33,8 @@
<script setup>
import { reactive, ref, onMounted, computed, getCurrentInstance } from "vue";
import { useRouter } from "vue-router";
import { useProjectStore } from "@/stores/project.js";
import { ElMessage, ElMessageBox } from "element-plus";
import CommonTable from "@/components/common/commonTable.vue";
const projectStore = useProjectStore();
const router = useRouter();
const { proxy } = getCurrentInstance();
......
......@@ -35,10 +35,8 @@
<script setup>
import { reactive, ref, onMounted, computed, getCurrentInstance } from "vue";
import { useRouter } from "vue-router";
import { useProjectStore } from "@/stores/project.js";
import { ElMessage, ElMessageBox } from "element-plus";
import CommonTable from "@/components/common/commonTable.vue";
const projectStore = useProjectStore();
const router = useRouter();
const { proxy } = getCurrentInstance();
......
......@@ -40,10 +40,8 @@
<script setup>
import { reactive, ref, onMounted, computed, getCurrentInstance } from "vue";
import { useRouter } from "vue-router";
import { useProjectStore } from "@/stores/project.js";
import { ElMessage, ElMessageBox } from "element-plus";
import CommonTable from "@/components/common/commonTable.vue";
const projectStore = useProjectStore();
const router = useRouter();
const { proxy } = getCurrentInstance();
......
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