fix: 对接登录接口

This commit is contained in:
Json_Lee 2025-05-05 00:53:03 +08:00
parent 8c2b88a7b9
commit ecc604ec6d
11 changed files with 1421 additions and 33 deletions

3
components.d.ts vendored
View File

@ -11,6 +11,9 @@ declare module 'vue' {
ElAside: typeof import('element-plus/es')['ElAside']
ElButton: typeof import('element-plus/es')['ElButton']
ElContainer: typeof import('element-plus/es')['ElContainer']
ElForm: typeof import('element-plus/es')['ElForm']
ElFormItem: typeof import('element-plus/es')['ElFormItem']
ElInput: typeof import('element-plus/es')['ElInput']
ElMain: typeof import('element-plus/es')['ElMain']
HelloWorld: typeof import('./src/components/HelloWorld.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']

View File

@ -13,11 +13,13 @@
},
"dependencies": {
"element-plus": "^2.9.8",
"hook-fetch": "^0.0.9-beta",
"hook-fetch": "^1.0.1",
"pinia": "^3.0.2",
"pinia-plugin-persistedstate": "^4.2.0",
"reset-css": "^5.0.2",
"vue": "^3.5.13",
"vue-router": "4",
"vue-element-plus-x": "^1.1.2-beta"
"vue-element-plus-x": "1.1.5-beta",
"vue-router": "4"
},
"devDependencies": {
"@antfu/eslint-config": "^4.12.0",

1224
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
import type { LoginDTO } from './types';
import type { LoginDTO, LoginVO } from './types';
import { post } from '@/utils/request';
export const login = (data: LoginDTO) => post('/auth/login', data);
export const login = (data: LoginDTO) => post<LoginVO>('/auth/login', data);

View File

@ -2,3 +2,117 @@ export interface LoginDTO {
username: string;
password: string;
}
export interface LoginVO {
access_token?: string;
token?: string;
userInfo?: LoginUser;
}
/**
* LoginUser
*/
export interface LoginUser {
/**
*
*/
avatar?: string;
/**
*
*/
browser?: string;
/**
* ID
*/
deptId?: number;
/**
*
*/
deptName?: string;
/**
*
*/
expireTime?: number;
/**
* IP地址
*/
ipaddr?: string;
/**
* id
*/
loginId?: string;
/**
*
*/
loginLocation?: string;
/**
*
*/
loginTime?: number;
/**
*
*/
menuPermission?: string[];
/**
*
*/
nickName?: string;
/**
*
*/
os?: string;
/**
* ID
*/
roleId?: number;
/**
*
*/
rolePermission?: string[];
/**
*
*/
roles?: RoleDTO[];
/**
* ID
*/
tenantId?: string;
/**
*
*/
token?: string;
/**
* ID
*/
userId?: number;
/**
*
*/
username?: string;
/**
*
*/
userType?: string;
}
/**
* RoleDTO
*/
export interface RoleDTO {
/**
* 12345
*/
dataScope?: string;
/**
* ID
*/
roleId?: number;
/**
*
*/
roleKey?: string;
/**
*
*/
roleName?: string;
}

View File

@ -1,10 +1,15 @@
import { ElMessage } from 'element-plus';
import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import './styles/index.scss';
import 'virtual:uno.css';
import 'element-plus/dist/index.css';
const app = createApp(App);
app.use(router);
app.use(ElMessage);
app.use(store);
app.mount('#app');

View File

@ -2,7 +2,11 @@
import type { LoginDTO } from '@/api/auth/types';
import type { FormInstance } from 'element-plus';
import { login } from '@/api';
import { useUserStore } from '@/store';
import { reactive, ref } from 'vue';
import { useRouter } from 'vue-router';
const userStore = useUserStore();
const formRef = ref<FormInstance>();
@ -10,11 +14,16 @@ const formModel = reactive<LoginDTO>({
username: '',
password: '',
});
const router = useRouter();
async function handleSubmit() {
try {
await formRef.value?.validate();
const _res = await login(formModel);
console.log(_res, 'res');
const res = await login(formModel);
console.log(res, 'res');
res.data.token && userStore.setToken(res.data.token);
res.data.userInfo && userStore.setUserInfo(res.data.userInfo);
router.replace('/');
}
catch (error) {
console.error('请求错误:', error);

View File

@ -1,11 +1,21 @@
import { createRouter, createWebHashHistory } from 'vue-router';
import type { RouteRecordRaw } from 'vue-router';
import {
createRouter,
createWebHashHistory,
} from 'vue-router';
import { jwtGuard } from './permissions';
const routes = [
const routes: Readonly<RouteRecordRaw>[] = [
{
path: '/',
component: () => import('@/layout/index.vue'),
children: [
{
path: '',
name: 'chatWithoutId',
component: () => import('@/pages/chat/index.vue'),
},
{
path: ':id',
name: 'chat',
@ -18,7 +28,7 @@ const routes = [
name: 'login',
component: () => import('@/pages/login/index.vue'),
},
];
] as const;
const router = createRouter({
history: createWebHashHistory(),

10
src/store/index.ts Normal file
View File

@ -0,0 +1,10 @@
import { createPinia } from 'pinia';
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
const store = createPinia();
store.use(piniaPluginPersistedstate);
export default store;
export * from './modules/user';

42
src/store/modules/user.ts Normal file
View File

@ -0,0 +1,42 @@
import type { LoginUser } from '@/api/auth/types';
import { defineStore } from 'pinia';
export const useUserStore = defineStore(
'user',
() => {
const token = ref<string>();
const setToken = (value: string) => {
token.value = value;
};
const clearToken = () => {
token.value = void 0;
};
const userInfo = ref<LoginUser>();
const setUserInfo = (value: LoginUser) => {
userInfo.value = value;
};
const clearUserInfo = () => {
userInfo.value = void 0;
};
const logout = () => {
// 如果需要调用接口,可以在这里调用
clearToken();
clearUserInfo();
};
return {
token,
setToken,
clearToken,
userInfo,
setUserInfo,
clearUserInfo,
logout,
};
},
{
persist: true,
},
);

View File

@ -1,4 +1,5 @@
import type { HookFetchPlugin } from 'hook-fetch';
import { ElMessage } from 'element-plus';
import hookFetch from 'hook-fetch';
import { sseTextDecoderPlugin } from 'hook-fetch/plugins';
@ -8,7 +9,7 @@ interface BaseResponse {
msg: string;
}
const instance = hookFetch.create<BaseResponse, unknown, 'data'>({
export const request = hookFetch.create<BaseResponse, 'data'>({
baseURL: 'https://web.pandarobot.chat/api',
headers: {
'Content-Type': 'application/json',
@ -24,18 +25,16 @@ function jwtPlugin(): HookFetchPlugin<BaseResponse> {
if (response.result?.code === 200) {
return response;
}
// alert(response.result?.msg);
ElMessage.error(response.result?.msg);
return Promise.reject(response);
},
};
}
instance.use(jwtPlugin());
request.use(jwtPlugin());
export const request = instance.request;
export const post = request.post;
export const post = instance.post;
export const get = request.get;
export const get = instance.get;
export default instance;
export default request;