Browse Source

修改基本参数

v1
超级管理员 3 years ago
parent
commit
3b4b91439b
  1. 1
      .env.development
  2. 1
      .env.production
  3. 35
      src/api/auth/index.ts
  4. 14
      src/api/auth/types.ts
  5. 22
      src/store/modules/user.ts
  6. 2111
      src/types/auto-imports.d.ts
  7. 101
      src/types/components.d.ts
  8. 34
      src/utils/request.ts
  9. 20
      src/views/login/index.vue
  10. 3
      vite.config.ts

1
.env.development

@ -6,3 +6,4 @@ NODE_ENV='development'
VITE_APP_TITLE = '恒信高科'
VITE_APP_PORT = 16666
VITE_APP_BASE_API = '/dev-api'
VITE_APP_BASE_URL ='http://myvuetest.net'

1
.env.production

@ -3,3 +3,4 @@
VITE_APP_TITLE = '恒信高科'
VITE_APP_PORT = 16666
VITE_APP_BASE_API = '/prod-api'
VITE_APP_BASE_URL ='http://ginadmin.hxgk.group'

35
src/api/auth/index.ts

@ -1,6 +1,6 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { CaptchaResult, LoginData, LoginResult } from './types';
import request from "@/utils/request";
import { AxiosPromise } from "axios";
import { CaptchaResult, LoginData, LoginResult } from "./types";
/**
* API
@ -10,9 +10,16 @@ import { CaptchaResult, LoginData, LoginResult } from './types';
*/
export function loginApi(data: LoginData): AxiosPromise<LoginResult> {
return request({
url: '/api/v1/auth/login',
method: 'post',
params: data
url: "/api/v1/auth/login",
method: "post",
params: data,
});
}
export function loginApiIng(data: LoginData): AxiosPromise<LoginResult> {
return request({
url: "/base/login",
method: "post",
data: data,
});
}
@ -21,19 +28,23 @@ export function loginApi(data: LoginData): AxiosPromise<LoginResult> {
*/
export function logoutApi() {
return request({
url: '/api/v1/auth/logout',
method: 'delete'
url: "/api/v1/auth/logout",
method: "delete",
});
}
/**
*
*/
export function getCaptchaApi(): AxiosPromise<CaptchaResult> {
return request({
url: '/api/v1/auth/captcha',
method: 'get'
url: "/api/v1/auth/captcha",
method: "get",
});
}
export function getCaptchaApiIng(): AxiosPromise<CaptchaResult> {
return request({
url: "/base/captcha",
method: "post",
});
}

14
src/api/auth/types.ts

@ -20,6 +20,8 @@ export interface LoginData {
*
*/
verifyCode?: string;
captcha?: string;
captchaId?: string;
}
/**
@ -42,6 +44,9 @@ export interface LoginResult {
* token
*/
tokenType?: string;
key?: string;
token?: string;
}
/**
@ -56,5 +61,12 @@ export interface CaptchaResult {
* Base64字符串
*/
verifyCodeBase64: string;
/**
* key
*/
captchaid: string;
/**
* Base64字符串
*/
picPath: string;
}

22
src/store/modules/user.ts

@ -1,6 +1,6 @@
import { defineStore } from "pinia";
import { loginApi, logoutApi } from "@/api/auth";
import { loginApi, logoutApi, loginApiIng } from "@/api/auth";
import { getUserInfo } from "@/api/user";
import { resetRouter } from "@/router";
import { store } from "@/store";
@ -12,12 +12,13 @@ import { useStorage } from "@vueuse/core";
export const useUserStore = defineStore("user", () => {
// state
const token = useStorage("accessToken", "");
const tokenIng = useStorage("accessToken", "");
const nickname = ref("");
const avatar = ref("");
const roles = ref<Array<string>>([]); // 用户角色编码集合 → 判断路由权限
const perms = ref<Array<string>>([]); // 用户权限编码集合 → 判断按钮权限
const userKey = useStorage("userKey", "");
const userToken = useStorage("userToken", "");
/**
*
*
@ -26,10 +27,13 @@ export const useUserStore = defineStore("user", () => {
*/
function login(loginData: LoginData) {
return new Promise<void>((resolve, reject) => {
loginApi(loginData)
loginApiIng(loginData)
.then((response) => {
const { tokenType, accessToken } = response.data;
token.value = tokenType + " " + accessToken; // Bearer eyJhbGciOiJIUzI1NiJ9.xxx.xxx
console.log("登录调用--->", response.data);
const { tokenType, accessToken, key, token } = response.data;
tokenIng.value = key + " " + token; // Bearer eyJhbGciOiJIUzI1NiJ9.xxx.xxx
userKey.value = key;
userToken.value = token;
resolve();
})
.catch((error) => {
@ -79,14 +83,16 @@ export const useUserStore = defineStore("user", () => {
// 重置
function resetToken() {
token.value = "";
tokenIng.value = "";
nickname.value = "";
avatar.value = "";
roles.value = [];
perms.value = [];
}
return {
token,
tokenIng,
userKey,
userToken,
nickname,
avatar,
roles,

2111
src/types/auto-imports.d.ts

File diff suppressed because it is too large

101
src/types/components.d.ts

@ -1,80 +1,35 @@
// generated by unplugin-vue-components
// We suggest you to commit this file into source control
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// Generated by unplugin-vue-components
// Read more: https://github.com/vuejs/core/pull/3399
import '@vue/runtime-core'
export {}
export {};
declare module '@vue/runtime-core' {
declare module "@vue/runtime-core" {
export interface GlobalComponents {
Breadcrumb: typeof import('./../components/Breadcrumb/index.vue')['default']
ElAlert: typeof import('element-plus/es')['ElAlert']
ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
ElButton: typeof import('element-plus/es')['ElButton']
ElCard: typeof import('element-plus/es')['ElCard']
ElCol: typeof import('element-plus/es')['ElCol']
ElDialog: typeof import('element-plus/es')['ElDialog']
ElDivider: typeof import('element-plus/es')['ElDivider']
ElDropdown: typeof import('element-plus/es')['ElDropdown']
ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
ElForm: typeof import('element-plus/es')['ElForm']
ElFormItem: typeof import('element-plus/es')['ElFormItem']
ElIcon: typeof import('element-plus/es')['ElIcon']
ElInput: typeof import('element-plus/es')['ElInput']
ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
ElLink: typeof import('element-plus/es')['ElLink']
ElMenu: typeof import('element-plus/es')['ElMenu']
ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
ElOption: typeof import('element-plus/es')['ElOption']
ElPagination: typeof import('element-plus/es')['ElPagination']
ElPopover: typeof import('element-plus/es')['ElPopover']
ElRadio: typeof import('element-plus/es')['ElRadio']
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
ElRow: typeof import('element-plus/es')['ElRow']
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
ElSelect: typeof import('element-plus/es')['ElSelect']
ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
ElSwitch: typeof import('element-plus/es')['ElSwitch']
ElTable: typeof import('element-plus/es')['ElTable']
ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
ElTag: typeof import('element-plus/es')['ElTag']
ElTooltip: typeof import('element-plus/es')['ElTooltip']
ElTree: typeof import('element-plus/es')['ElTree']
ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
ElUpload: typeof import('element-plus/es')['ElUpload']
GithubCorner: typeof import('./../components/GithubCorner/index.vue')['default']
Hamburger: typeof import('./../components/Hamburger/index.vue')['default']
IconSelect: typeof import('./../components/IconSelect/index.vue')['default']
IEpCaretBottom: typeof import('~icons/ep/caret-bottom')['default']
IEpCaretTop: typeof import('~icons/ep/caret-top')['default']
IEpClose: typeof import('~icons/ep/close')['default']
IEpCollection: typeof import('~icons/ep/collection')['default']
IEpDelete: typeof import('~icons/ep/delete')['default']
IEpDownload: typeof import('~icons/ep/download')['default']
IEpEdit: typeof import('~icons/ep/edit')['default']
IEpPlus: typeof import('~icons/ep/plus')['default']
IEpPosition: typeof import('~icons/ep/position')['default']
IEpRefresh: typeof import('~icons/ep/refresh')['default']
IEpRefreshLeft: typeof import('~icons/ep/refresh-left')['default']
IEpSearch: typeof import('~icons/ep/search')['default']
IEpSetting: typeof import('~icons/ep/setting')['default']
IEpTop: typeof import('~icons/ep/top')['default']
IEpUploadFilled: typeof import('~icons/ep/upload-filled')['default']
LangSelect: typeof import('./../components/LangSelect/index.vue')['default']
MultiUpload: typeof import('./../components/Upload/MultiUpload.vue')['default']
Pagination: typeof import('./../components/Pagination/index.vue')['default']
RightPanel: typeof import('./../components/RightPanel/index.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
Screenfull: typeof import('./../components/Screenfull/index.vue')['default']
SingleUpload: typeof import('./../components/Upload/SingleUpload.vue')['default']
SizeSelect: typeof import('./../components/SizeSelect/index.vue')['default']
SvgIcon: typeof import('./../components/SvgIcon/index.vue')['default']
WangEditor: typeof import('./../components/WangEditor/index.vue')['default']
}
export interface ComponentCustomProperties {
vLoading: typeof import('element-plus/es')['ElLoadingDirective']
Breadcrumb: typeof import("./../components/Breadcrumb/index.vue")["default"];
ElButton: typeof import("element-plus/es")["ElButton"];
ElDropdown: typeof import("element-plus/es")["ElDropdown"];
ElDropdownItem: typeof import("element-plus/es")["ElDropdownItem"];
ElDropdownMenu: typeof import("element-plus/es")["ElDropdownMenu"];
ElForm: typeof import("element-plus/es")["ElForm"];
ElFormItem: typeof import("element-plus/es")["ElFormItem"];
ElInput: typeof import("element-plus/es")["ElInput"];
ElTooltip: typeof import("element-plus/es")["ElTooltip"];
GithubCorner: typeof import("./../components/GithubCorner/index.vue")["default"];
Hamburger: typeof import("./../components/Hamburger/index.vue")["default"];
IconSelect: typeof import("./../components/IconSelect/index.vue")["default"];
LangSelect: typeof import("./../components/LangSelect/index.vue")["default"];
MultiUpload: typeof import("./../components/Upload/MultiUpload.vue")["default"];
Pagination: typeof import("./../components/Pagination/index.vue")["default"];
RightPanel: typeof import("./../components/RightPanel/index.vue")["default"];
RouterLink: typeof import("vue-router")["RouterLink"];
RouterView: typeof import("vue-router")["RouterView"];
SingleUpload: typeof import("./../components/Upload/SingleUpload.vue")["default"];
SizeSelect: typeof import("./../components/SizeSelect/index.vue")["default"];
SvgIcon: typeof import("./../components/SvgIcon/index.vue")["default"];
WangEditor: typeof import("./../components/WangEditor/index.vue")["default"];
}
}

34
src/utils/request.ts

@ -1,19 +1,25 @@
import axios, { InternalAxiosRequestConfig, AxiosResponse } from 'axios';
import { useUserStoreHook } from '@/store/modules/user';
import axios, { InternalAxiosRequestConfig, AxiosResponse } from "axios";
import { useUserStoreHook } from "@/store/modules/user";
// 创建 axios 实例
const service = axios.create({
baseURL: import.meta.env.VITE_APP_BASE_API,
timeout: 50000,
headers: { 'Content-Type': 'application/json;charset=utf-8' }
headers: { "Content-Type": "application/json;charset=utf-8" },
});
// 请求拦截器
service.interceptors.request.use(
(config: InternalAxiosRequestConfig) => {
const userStore = useUserStoreHook();
if (userStore.token) {
config.headers.Authorization = userStore.token;
if (userStore.tokenIng) {
config.headers.Authorization = userStore.tokenIng;
}
if (userStore.userKey) {
config.headers["user-key"] = userStore.userKey;
}
if (userStore.userToken) {
config.headers["user-token"] = userStore.userToken;
}
return config;
},
@ -26,7 +32,7 @@ service.interceptors.request.use(
service.interceptors.response.use(
(response: AxiosResponse) => {
const { code, msg } = response.data;
if (code === '00000') {
if (code === 0) {
return response.data;
}
// 响应数据为二进制流处理(Excel导出)
@ -34,23 +40,23 @@ service.interceptors.response.use(
return response;
}
ElMessage.error(msg || '系统出错');
return Promise.reject(new Error(msg || 'Error'));
ElMessage.error(msg || "系统出错");
return Promise.reject(new Error(msg || "Error"));
},
(error: any) => {
if (error.response.data) {
const { code, msg } = error.response.data;
// token 过期,重新登录
if (code === 'A0230') {
ElMessageBox.confirm('当前页面已失效,请重新登录', '提示', {
confirmButtonText: '确定',
type: 'warning'
if (code === "A0230") {
ElMessageBox.confirm("当前页面已失效,请重新登录", "提示", {
confirmButtonText: "确定",
type: "warning",
}).then(() => {
localStorage.clear();
window.location.href = '/';
window.location.href = "/";
});
} else {
ElMessage.error(msg || '系统出错');
ElMessage.error(msg || "系统出错");
}
}
return Promise.reject(error.message);

20
src/views/login/index.vue

@ -54,12 +54,12 @@
</el-tooltip>
<!-- 验证码 -->
<el-form-item prop="verifyCode">
<el-form-item prop="captcha">
<span class="p-2 text-white">
<svg-icon icon-class="verify_code" />
</span>
<el-input
v-model="loginData.verifyCode"
v-model="loginData.captcha"
auto-complete="off"
:placeholder="$t('login.verifyCode')"
class="w-[60%]"
@ -99,7 +99,7 @@ import { useUserStore } from "@/store/modules/user";
// API
import { LocationQuery, LocationQueryValue, useRoute } from "vue-router";
import { getCaptchaApi } from "@/api/auth";
import { getCaptchaApi, getCaptchaApiIng } from "@/api/auth";
import { LoginData } from "@/api/auth/types";
const userStore = useUserStore();
@ -128,7 +128,7 @@ const captchaBase64 = ref();
const loginFormRef = ref(ElForm);
const loginData = ref<LoginData>({
username: "admin",
username: "300450",
password: "123456",
});
@ -143,7 +143,7 @@ const loginRules = {
*/
function passwordValidator(rule: any, value: any, callback: any) {
if (value.length < 6) {
callback(new Error("The password can not be less than 6 digits"));
callback(new Error("密码不能少于6位"));
} else {
callback();
}
@ -161,10 +161,11 @@ function checkCapslock(e: any) {
* 获取验证码
*/
function getCaptcha() {
getCaptchaApi().then(({ data }) => {
const { verifyCodeBase64, verifyCodeKey } = data;
loginData.value.verifyCodeKey = verifyCodeKey;
captchaBase64.value = verifyCodeBase64;
getCaptchaApiIng().then(({ data }) => {
const { verifyCodeBase64, verifyCodeKey, captchaid, picPath } = data;
loginData.value.verifyCodeKey = captchaid;
loginData.value.captchaId = captchaid;
captchaBase64.value = picPath;
});
}
@ -233,6 +234,7 @@ onMounted(() => {
width: 120px;
height: 48px;
cursor: pointer;
background-color: #fff;
}
}
}

3
vite.config.ts

@ -43,7 +43,8 @@ export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
proxy: {
// 反向代理解决跨域
[env.VITE_APP_BASE_API]: {
target: "http://vapi.youlai.tech", // 线上接口地址
target: env.VITE_APP_BASE_URL,
// target: "http://vapi.youlai.tech", // 线上接口地址
// target: 'http://localhost:8989', // 本地接口地址 , 后端工程仓库地址:https://gitee.com/youlaiorg/youlai-boot
changeOrigin: true,
rewrite: (path) =>

Loading…
Cancel
Save