This commit is contained in:
lq
2025-06-21 15:31:21 +08:00
parent 23945a58de
commit 4f118047c4
6 changed files with 106 additions and 22 deletions

View File

@ -26,7 +26,7 @@ export const fetchLogOut = (params = {}) => {
// 导出一个名为fetchProfileInfo的函数用于获取用户信息 // 导出一个名为fetchProfileInfo的函数用于获取用户信息
export const fetchProfileInfo = (params = {}) => { export const fetchProfileInfo = (params = {}) => {
// 使用Http.put方法向/v1/me接口发送put请求并将params作为参数传递 // 使用Http.put方法向/v1/me接口发送put请求并将params作为参数传递
return Http.put('/v1/me', params); return Http.get('/v1/me', params);
}; };
// 导出一个函数,用于获取编辑手机号的验证码 // 导出一个函数,用于获取编辑手机号的验证码

View File

@ -30,14 +30,7 @@ export default function setupUserLoginInfoGuard(router: Router) {
} }
} else { } else {
clearAllLocalStorage(); clearAllLocalStorage();
// todo 跳转回登录鉴权页当前为mock路由地址 next({ name: 'UserLogin' }); // 添加缺失的next调用
next({
name: 'auth',
query: {
redirect: to.name,
...to.query,
} as LocationQueryRaw,
});
} }
}); });
} }

View File

@ -1,29 +1,92 @@
import { defineStore } from 'pinia'; import { defineStore } from 'pinia';
interface UserInfo {
id: number;
name: string;
head_image: String;
current_enterprise_id: number;
mobile: string;
// 添加其他用户属性...
}
interface CompanyInfo {
id: number;
name: string;
// 添加其他公司属性...
}
interface UserState { interface UserState {
token: String; token: string;
userInfo: UserInfo | null;
companyInfo: CompanyInfo | null;
} }
export const useUserStore = defineStore('user', { export const useUserStore = defineStore('user', {
state: (): UserState => ({ state: (): UserState => ({
token: localStorage.getItem('accessToken') || '', token: localStorage.getItem('accessToken') || '',
userInfo: null,
companyInfo: null,
}), }),
getters: {},
actions: { actions: {
setToken(token: String) { setToken(token: String) {
const _token = `Bearer ${token}`; const _token = `Bearer ${token}`;
this.token = _token; this.token = _token;
localStorage.setItem('accessToken', _token); localStorage.setItem('accessToken', _token);
}, },
// 存储用户信息
setUserInfo(userInfo: UserInfo | null) {
this.userInfo = userInfo;
if (userInfo) {
localStorage.setItem('userInfo', JSON.stringify(userInfo));
} else {
localStorage.removeItem('userInfo');
}
},
// 获取用户信息
getUserInfo(): UserInfo | null {
const userInfoStr = localStorage.getItem('userInfo');
if (userInfoStr) {
try {
return JSON.parse(userInfoStr);
} catch (error) {
console.error('解析用户信息失败:', error);
return null;
}
}
return null;
},
// 存储公司信息
setCompanyInfo(companyInfo: CompanyInfo | null) {
this.companyInfo = companyInfo;
if (companyInfo) {
localStorage.setItem('companyInfo', JSON.stringify(companyInfo));
} else {
localStorage.removeItem('companyInfo');
}
},
// 获取公司信息
getCompanyInfo(): CompanyInfo | null {
const companyInfoStr = localStorage.getItem('companyInfo');
if (companyInfoStr) {
try {
return JSON.parse(companyInfoStr);
} catch (error) {
console.error('解析公司信息失败:', error);
return null;
}
}
return null;
},
// 删除 token
deleteToken() { deleteToken() {
this.token = ''; this.token = '';
localStorage.removeItem('accessToken'); localStorage.removeItem('accessToken');
}, },
async getUserInfo() {
// todo 调用获取用户信息接口当前用mock数据表示
// AMessage.success(`当前用户角色为ENTERPRISE`);
},
}, },
}); });

View File

@ -16,6 +16,8 @@ export async function handleUserLogin() {
handleUserHome(); handleUserHome();
} }
// 首页 // 首页
export function handleUserHome() { export function handleUserHome() {
router.push({ name: 'Home' }); router.push({ name: 'Home' });

View File

@ -522,6 +522,12 @@ function reset() {
const emit = defineEmits(['submit']); const emit = defineEmits(['submit']);
</script> </script>
<script>
export default {
name: 'PuzzleVerification',
};
</script>
<style lang="scss" scoped> <style lang="scss" scoped>
.vue-puzzle-vcode { .vue-puzzle-vcode {
position: fixed; position: fixed;

View File

@ -121,7 +121,7 @@
<script setup lang="ts"> <script setup lang="ts">
import PuzzleVerification from './components/PuzzleVerification.vue'; import PuzzleVerification from './components/PuzzleVerification.vue';
import { fetchLoginCaptCha, fetchAuthorizationsCaptcha } from '@/api/all/login'; import { fetchLoginCaptCha, fetchAuthorizationsCaptcha, fetchProfileInfo } from '@/api/all/login';
import { ref, reactive, onUnmounted, computed } from 'vue'; import { ref, reactive, onUnmounted, computed } from 'vue';
import { useUserStore } from '@/stores'; import { useUserStore } from '@/stores';
import { handleUserLogin } from '@/utils/user'; import { handleUserLogin } from '@/utils/user';
@ -137,10 +137,10 @@ const visible = ref(false);
const hasGetCode = ref(false); const hasGetCode = ref(false);
const submitting = ref(false); const submitting = ref(false);
const hasCheck = ref(false); const hasCheck = ref(false);
const mobileNumber = ref('13616544933'); const mobileNumber = ref('');
const selectedAccount = ref(0); const selectedAccount = ref(0);
const accounts = ref([{ name: '灵机用户291094' }, { name: '灵机用户291094' }]); const accounts = ref([]);
const loginForm = reactive({ const loginForm = reactive({
mobile: '', mobile: '',
@ -213,6 +213,7 @@ const clearError = (field: string) => {
const handleOk = () => { const handleOk = () => {
visible.value = false; visible.value = false;
handleUserLogin();
}; };
const handleCancel = () => { const handleCancel = () => {
@ -254,6 +255,27 @@ const handleVerificationSubmit = async () => {
} }
}; };
// 获取用户信息
const getProfileInfo = async () => {
const { code, data } = await fetchProfileInfo();
if (code === 200) {
userStore.setUserInfo(data);
let enterprises = data['enterprises'];
mobileNumber.value = data['mobile'];
accounts.value = enterprises;
if (enterprises.length > 0) {
if (enterprises.length == 1) {
let enterprise = enterprises[0];
userStore.setCompanyInfo(enterprise);
handleUserLogin();
} else {
// 多个企业时候需要弹窗让用户选择企业
visible.value = true;
}
}
}
};
// 提交表单 // 提交表单
const handleSubmit = async () => { const handleSubmit = async () => {
if (disabledSubmitBtn.value) return; if (disabledSubmitBtn.value) return;
@ -268,15 +290,13 @@ const handleSubmit = async () => {
} }
submitting.value = true; submitting.value = true;
const { code, data } = await fetchAuthorizationsCaptcha(loginForm); const { code, data } = await fetchAuthorizationsCaptcha(loginForm);
if (code === 200) { if (code === 200) {
// 处理登录成功逻辑 // 处理登录成功逻辑
AMessage.success(isLogin.value ? '登录成功' : '注册成功'); AMessage.success(isLogin.value ? '登录成功' : '注册成功');
userStore.setToken(data.access_token); userStore.setToken(data.access_token);
getProfileInfo();
handleUserLogin();
} }
} catch (error) { } catch (error) {
// 错误信息会显示在输入框下方 // 错误信息会显示在输入框下方