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'] ElAside: typeof import('element-plus/es')['ElAside']
ElButton: typeof import('element-plus/es')['ElButton'] ElButton: typeof import('element-plus/es')['ElButton']
ElContainer: typeof import('element-plus/es')['ElContainer'] 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'] ElMain: typeof import('element-plus/es')['ElMain']
HelloWorld: typeof import('./src/components/HelloWorld.vue')['default'] HelloWorld: typeof import('./src/components/HelloWorld.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink'] RouterLink: typeof import('vue-router')['RouterLink']

View File

@ -13,11 +13,13 @@
}, },
"dependencies": { "dependencies": {
"element-plus": "^2.9.8", "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", "reset-css": "^5.0.2",
"vue": "^3.5.13", "vue": "^3.5.13",
"vue-router": "4", "vue-element-plus-x": "1.1.5-beta",
"vue-element-plus-x": "^1.1.2-beta" "vue-router": "4"
}, },
"devDependencies": { "devDependencies": {
"@antfu/eslint-config": "^4.12.0", "@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'; 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; username: string;
password: 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 { createApp } from 'vue';
import App from './App.vue'; import App from './App.vue';
import router from './router'; import router from './router';
import store from './store';
import './styles/index.scss'; import './styles/index.scss';
import 'virtual:uno.css'; import 'virtual:uno.css';
import 'element-plus/dist/index.css';
const app = createApp(App); const app = createApp(App);
app.use(router); app.use(router);
app.use(ElMessage);
app.use(store);
app.mount('#app'); app.mount('#app');

View File

@ -2,7 +2,11 @@
import type { LoginDTO } from '@/api/auth/types'; import type { LoginDTO } from '@/api/auth/types';
import type { FormInstance } from 'element-plus'; import type { FormInstance } from 'element-plus';
import { login } from '@/api'; import { login } from '@/api';
import { useUserStore } from '@/store';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { useRouter } from 'vue-router';
const userStore = useUserStore();
const formRef = ref<FormInstance>(); const formRef = ref<FormInstance>();
@ -10,11 +14,16 @@ const formModel = reactive<LoginDTO>({
username: '', username: '',
password: '', password: '',
}); });
const router = useRouter();
async function handleSubmit() { async function handleSubmit() {
try { try {
await formRef.value?.validate(); await formRef.value?.validate();
const _res = await login(formModel); const res = await login(formModel);
console.log(_res, 'res'); console.log(res, 'res');
res.data.token && userStore.setToken(res.data.token);
res.data.userInfo && userStore.setUserInfo(res.data.userInfo);
router.replace('/');
} }
catch (error) { catch (error) {
console.error('请求错误:', 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'; import { jwtGuard } from './permissions';
const routes = [ const routes: Readonly<RouteRecordRaw>[] = [
{ {
path: '/', path: '/',
component: () => import('@/layout/index.vue'), component: () => import('@/layout/index.vue'),
children: [ children: [
{
path: '',
name: 'chatWithoutId',
component: () => import('@/pages/chat/index.vue'),
},
{ {
path: ':id', path: ':id',
name: 'chat', name: 'chat',
@ -18,7 +28,7 @@ const routes = [
name: 'login', name: 'login',
component: () => import('@/pages/login/index.vue'), component: () => import('@/pages/login/index.vue'),
}, },
]; ] as const;
const router = createRouter({ const router = createRouter({
history: createWebHashHistory(), 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 type { HookFetchPlugin } from 'hook-fetch';
import { ElMessage } from 'element-plus';
import hookFetch from 'hook-fetch'; import hookFetch from 'hook-fetch';
import { sseTextDecoderPlugin } from 'hook-fetch/plugins'; import { sseTextDecoderPlugin } from 'hook-fetch/plugins';
@ -8,7 +9,7 @@ interface BaseResponse {
msg: string; msg: string;
} }
const instance = hookFetch.create<BaseResponse, unknown, 'data'>({ export const request = hookFetch.create<BaseResponse, 'data'>({
baseURL: 'https://web.pandarobot.chat/api', baseURL: 'https://web.pandarobot.chat/api',
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
@ -24,18 +25,16 @@ function jwtPlugin(): HookFetchPlugin<BaseResponse> {
if (response.result?.code === 200) { if (response.result?.code === 200) {
return response; return response;
} }
// alert(response.result?.msg); ElMessage.error(response.result?.msg);
return Promise.reject(response); 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 request;
export default instance;