初始化代码

This commit is contained in:
yiqiuyang
2025-09-03 18:05:48 +08:00
parent e5712b2e97
commit 4414fe517b
70 changed files with 2404 additions and 9 deletions
+152
View File
@@ -0,0 +1,152 @@
import Cookies from 'js-cookie'
const SystemType = 'protal'
// Cookie键名常量
const COOKIE_KEYS = {
TOKEN: `${SystemType}-Server-Token`,
USER_TENANT_INFO: `${SystemType}-User-TenantInfo`,
USER_ID: `${SystemType}-UserId`,
LOGIN_TOKEN: `${SystemType}-Login-Token`,
USERNAME: `${SystemType}-Username`,
PASSWORD: `${SystemType}-Password`,
REMEMBER_ME: `${SystemType}-RememberMe`,
}
// 默认Cookie选项
const DEFAULT_COOKIE_OPTIONS = {
expires: 30, // 30天过期
}
// 请求接口token
export function getToken() {
return Cookies.get(COOKIE_KEYS.TOKEN)
}
export function setToken(token) {
return Cookies.set(COOKIE_KEYS.TOKEN, token)
}
export function removeToken() {
return Cookies.remove(COOKIE_KEYS.TOKEN)
}
// 用户扩展数据
export function getUserTenantInfo() {
return Cookies.get(COOKIE_KEYS.USER_TENANT_INFO)
}
export function setUserTenantInfo(tenantInfo) {
return Cookies.set(COOKIE_KEYS.USER_TENANT_INFO, tenantInfo)
}
export function removeUserTenantInfo() {
return Cookies.remove(COOKIE_KEYS.USER_TENANT_INFO)
}
// userId缓存
export function setUserId(userId) {
return Cookies.set(COOKIE_KEYS.USER_ID, userId)
}
export function removeUserId() {
return Cookies.remove(COOKIE_KEYS.USER_ID)
}
// 登陆token缓存
export function getLoginToken() {
return Cookies.get(COOKIE_KEYS.LOGIN_TOKEN)
}
export function setLoginToken(token) {
return Cookies.set(COOKIE_KEYS.LOGIN_TOKEN, token)
}
export function removeLoginToken() {
return Cookies.remove(COOKIE_KEYS.LOGIN_TOKEN)
}
// 用户账号密码缓存
export function getUsernameToken() {
return Cookies.get(COOKIE_KEYS.USERNAME)
}
export function setUsernameToken(token) {
return Cookies.set(COOKIE_KEYS.USERNAME, token, DEFAULT_COOKIE_OPTIONS)
}
export function removeUsernameToken() {
return Cookies.remove(COOKIE_KEYS.USERNAME)
}
export function getPasswordToken() {
return Cookies.get(COOKIE_KEYS.PASSWORD)
}
export function setPasswordToken(token) {
return Cookies.set(COOKIE_KEYS.PASSWORD, token, DEFAULT_COOKIE_OPTIONS)
}
export function removePasswordToken() {
return Cookies.remove(COOKIE_KEYS.PASSWORD)
}
export function getRememberMeToken() {
return Cookies.get(COOKIE_KEYS.REMEMBER_ME)
}
export function setRememberMeToken(token) {
return Cookies.set(COOKIE_KEYS.REMEMBER_ME, token, DEFAULT_COOKIE_OPTIONS)
}
export function removeRememberMeToken() {
return Cookies.remove(COOKIE_KEYS.REMEMBER_ME)
}
// 清空所有用户相关缓存
export function clearAllUserData() {
removeToken()
removeUserTenantInfo()
removeUserId()
removeLoginToken()
removeUsernameToken()
removePasswordToken()
removeRememberMeToken()
}
// 获取所有用户信息
export function getAllUserInfo() {
return {
token: getToken(),
userTenantInfo: getUserTenantInfo(),
userId: Cookies.get(COOKIE_KEYS.USER_ID),
loginToken: getLoginToken(),
username: getUsernameToken(),
rememberMe: getRememberMeToken(),
}
}
export default {
getToken,
setToken,
removeToken,
getUserTenantInfo,
setUserTenantInfo,
removeUserTenantInfo,
setUserId,
removeUserId,
getLoginToken,
setLoginToken,
removeLoginToken,
getUsernameToken,
setUsernameToken,
removeUsernameToken,
getPasswordToken,
setPasswordToken,
removePasswordToken,
getRememberMeToken,
setRememberMeToken,
removeRememberMeToken,
clearAllUserData,
getAllUserInfo,
}
+36
View File
@@ -0,0 +1,36 @@
/**
* 根据屏幕宽度自适应计算字体大小(基于1920设计稿)
* @param {number} res - 设计稿上的原始尺寸
* @returns {number} 自适应后的尺寸
*/
export function fontSize(res) {
let clientWidth =
window.innerWidth ||
document.documentElement.clientWidth ||
document.body.clientWidth
if (!clientWidth) return
let fontSize = clientWidth / 1920
return res * fontSize
}
/**
* 生成随机背景色
* @param {String} type 'hex' | 'rgb' 输出格式,默认 hex
* @returns {String} '#RRGGBB' 或 'rgb(r,g,b)'
* @example randomBgColor()
*/
export function randomBgColor(type = 'hex') {
if (type === 'rgb') {
const r = Math.floor(Math.random() * 256)
const g = Math.floor(Math.random() * 256)
const b = Math.floor(Math.random() * 256)
return `rgb(${r},${g},${b})`
}
// 默认 hex
return (
'#' +
Math.floor(Math.random() * 0xffffff)
.toString(16)
.padStart(6, '0')
)
}
+42
View File
@@ -0,0 +1,42 @@
// rem等比适配配置
// 基准大小
const baseSize = 16
// 设计稿宽度
const designWidth = 1920
// 最大缩放比例
const maxScale = 2
// 设置 rem 函数
function setRem() {
// 当前页面宽度相对于设计稿宽度的缩放比例
const scale = document.documentElement.clientWidth / designWidth
// 设置页面根节点字体大小(最高放大比例为maxScale)
document.documentElement.style.fontSize =
baseSize * Math.min(scale, maxScale) + 'px'
}
// 根据设计稿尺寸计算实际尺寸
export function fontSize(res) {
const clientWidth =
window.innerWidth ||
document.documentElement.clientWidth ||
document.body.clientWidth
if (!clientWidth) return res
const scale = clientWidth / designWidth
return res * Math.min(scale, maxScale)
}
// 初始化rem配置
export function initRem() {
setRem()
// 改变窗口大小时重新设置 rem
window.addEventListener('resize', setRem)
}
// 移除rem监听(可选,用于清理)
export function removeRemListener() {
window.removeEventListener('resize', setRem)
}
// 自动初始化(如果需要在导入时自动初始化)
// initRem()
+134
View File
@@ -0,0 +1,134 @@
/**
* axios 封装
*/
import axios from 'axios'
import {ElMessage, ElMessageBox} from 'element-plus'
import {tansParams} from '@/utils/index'
import {getToken, removeToken, removeUserTenantInfo} from '@/utils/auth'
// 配置基础URL
const baseURL = window.config?.baseUrl || 'http://work.rangutech.cn:9131'
// 设置默认请求头
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建axios实例
const service = axios.create({
baseURL,
timeout: 10000, // 添加合理的超时时间
})
// 请求拦截器
service.interceptors.request.use(
(config) => {
// 是否需要设置 token
const isToken = (config.headers || {}).isToken === false
// 添加token到请求头
if (getToken() && !isToken) {
config.headers.Authorization = `Bearer ${getToken()}`
}
// GET请求参数处理
if (config.method?.toLowerCase() === 'get' && config.params) {
const urlParams = tansParams(config.params)
config.url = `${config.url}?${urlParams}`
config.params = {}
}
return config
},
(error) => {
console.error('Request error:', error)
return Promise.reject(error)
}
)
// 响应拦截器
service.interceptors.response.use(
(response) => {
const {data, config} = response
// 处理二进制数据响应
if (
config.responseType === 'blob' ||
config.responseType === 'arraybuffer'
) {
return data
}
// 正常响应处理
if (response.status === 200) {
return data
}
// 异常响应处理
return Promise.reject(response)
},
(error) => {
const {config, response, message} = error
console.error('Response error:', {config, response, message})
// 处理认证错误
if (response && [401, 471, 472].includes(response.status)) {
handleAuthError(config, response)
return Promise.reject(error)
}
// 处理网络错误
handleNetworkError(message)
return Promise.reject(error)
}
)
/**
* 处理认证错误
*/
function handleAuthError(config, response) {
const excludeUrls = ['/Token/Logout', '/Token/Access']
if (!excludeUrls.includes(config.url)) {
ElMessageBox.confirm(
'登录状态已过期,您可以继续留在该页面,或者重新登录',
'系统提示',
{
confirmButtonText: '重新登录',
cancelButtonText: '取消',
type: 'warning',
}
)
.then(() => {
removeToken()
removeUserTenantInfo()
// 这里需要导入store
// store.dispatch('LogOut').then(() => {});
window.location.reload() // 简单重载页面
})
.catch(() => {
// 用户取消操作
})
}
}
/**
* 处理网络错误
*/
function handleNetworkError(message) {
let errorMsg = message
if (message === 'Network Error') {
errorMsg = '网络连接异常,请检查网络设置'
} else if (message.includes('timeout')) {
errorMsg = '请求超时,请稍后重试'
}
ElMessage({
message: errorMsg,
type: 'error',
duration: 5 * 1000,
})
}
export default service