添加银行和政府端小程序

This commit is contained in:
2025-09-19 17:52:28 +08:00
parent e9f182f2d3
commit eb3c4604d3
318 changed files with 147971 additions and 2999 deletions

View File

@@ -0,0 +1,176 @@
/**
* 格式化工具函数
*/
/**
* 格式化日期时间
* @param {Date|string|number} date - 日期
* @param {string} format - 格式字符串
* @returns {string} 格式化后的日期字符串
*/
export function formatDateTime(date, format = 'YYYY-MM-DD HH:mm:ss') {
if (!date) return ''
const d = new Date(date)
if (isNaN(d.getTime())) return ''
const year = d.getFullYear()
const month = String(d.getMonth() + 1).padStart(2, '0')
const day = String(d.getDate()).padStart(2, '0')
const hours = String(d.getHours()).padStart(2, '0')
const minutes = String(d.getMinutes()).padStart(2, '0')
const seconds = String(d.getSeconds()).padStart(2, '0')
return format
.replace('YYYY', year)
.replace('MM', month)
.replace('DD', day)
.replace('HH', hours)
.replace('mm', minutes)
.replace('ss', seconds)
}
/**
* 格式化日期
* @param {Date|string|number} date - 日期
* @returns {string} 格式化后的日期字符串
*/
export function formatDate(date) {
return formatDateTime(date, 'YYYY-MM-DD')
}
/**
* 格式化时间
* @param {Date|string|number} date - 日期
* @returns {string} 格式化后的时间字符串
*/
export function formatTime(date) {
return formatDateTime(date, 'HH:mm:ss')
}
/**
* 格式化数字
* @param {number} num - 数字
* @param {number} decimals - 小数位数
* @returns {string} 格式化后的数字字符串
*/
export function formatNumber(num, decimals = 0) {
if (typeof num !== 'number' || isNaN(num)) return '0'
return num.toLocaleString('zh-CN', {
minimumFractionDigits: decimals,
maximumFractionDigits: decimals
})
}
/**
* 格式化文件大小
* @param {number} bytes - 字节数
* @returns {string} 格式化后的文件大小字符串
*/
export function formatFileSize(bytes) {
if (bytes === 0) return '0 B'
const k = 1024
const sizes = ['B', 'KB', 'MB', 'GB', 'TB']
const i = Math.floor(Math.log(bytes) / Math.log(k))
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
}
/**
* 格式化百分比
* @param {number} value - 数值
* @param {number} total - 总数
* @param {number} decimals - 小数位数
* @returns {string} 格式化后的百分比字符串
*/
export function formatPercentage(value, total, decimals = 1) {
if (!total || total === 0) return '0%'
const percentage = (value / total) * 100
return percentage.toFixed(decimals) + '%'
}
/**
* 格式化货币
* @param {number} amount - 金额
* @param {string} currency - 货币符号
* @returns {string} 格式化后的货币字符串
*/
export function formatCurrency(amount, currency = '¥') {
if (typeof amount !== 'number' || isNaN(amount)) return currency + '0.00'
return currency + amount.toLocaleString('zh-CN', {
minimumFractionDigits: 2,
maximumFractionDigits: 2
})
}
/**
* 格式化相对时间
* @param {Date|string|number} date - 日期
* @returns {string} 相对时间字符串
*/
export function formatRelativeTime(date) {
if (!date) return ''
const now = new Date()
const target = new Date(date)
const diff = now - target
const minute = 60 * 1000
const hour = 60 * minute
const day = 24 * hour
const week = 7 * day
const month = 30 * day
const year = 365 * day
if (diff < minute) {
return '刚刚'
} else if (diff < hour) {
return Math.floor(diff / minute) + '分钟前'
} else if (diff < day) {
return Math.floor(diff / hour) + '小时前'
} else if (diff < week) {
return Math.floor(diff / day) + '天前'
} else if (diff < month) {
return Math.floor(diff / week) + '周前'
} else if (diff < year) {
return Math.floor(diff / month) + '个月前'
} else {
return Math.floor(diff / year) + '年前'
}
}
/**
* 格式化手机号
* @param {string} phone - 手机号
* @returns {string} 格式化后的手机号
*/
export function formatPhone(phone) {
if (!phone) return ''
const cleaned = phone.replace(/\D/g, '')
if (cleaned.length === 11) {
return cleaned.replace(/(\d{3})(\d{4})(\d{4})/, '$1-$2-$3')
}
return phone
}
/**
* 格式化身份证号
* @param {string} idCard - 身份证号
* @returns {string} 格式化后的身份证号
*/
export function formatIdCard(idCard) {
if (!idCard) return ''
const cleaned = idCard.replace(/\D/g, '')
if (cleaned.length === 18) {
return cleaned.replace(/(\d{6})(\d{8})(\d{4})/, '$1-$2-$3')
}
return idCard
}

View File

@@ -7,6 +7,12 @@ import { usePermissionStore } from '@/stores/permission'
// 检查单个权限
export function hasPermission(permission) {
const permissionStore = usePermissionStore()
// 超级管理员和管理员拥有所有权限
if (permissionStore.hasRole('super_admin') || permissionStore.hasRole('admin')) {
return true
}
return permissionStore.hasPermission(permission)
}
@@ -114,6 +120,9 @@ export const permissionMixin = {
* 权限常量
*/
export const PERMISSIONS = {
// 工作台
DASHBOARD_VIEW: 'dashboard:view',
// 养殖场管理
FARM_VIEW: 'farm:view',
FARM_CREATE: 'farm:create',
@@ -219,6 +228,11 @@ export const ROLES = {
* 权限组合
*/
export const PERMISSION_GROUPS = {
// 工作台权限组
DASHBOARD_MANAGEMENT: [
PERMISSIONS.DASHBOARD_VIEW
],
// 养殖场管理权限组
FARM_MANAGEMENT: [
PERMISSIONS.FARM_VIEW,
@@ -340,6 +354,7 @@ export const PERMISSION_GROUPS = {
*/
export const ROLE_PERMISSIONS = {
[ROLES.SUPER_ADMIN]: [
...PERMISSION_GROUPS.DASHBOARD_MANAGEMENT,
...PERMISSION_GROUPS.FARM_MANAGEMENT,
...PERMISSION_GROUPS.DEVICE_MANAGEMENT,
...PERMISSION_GROUPS.MONITOR_MANAGEMENT,
@@ -356,6 +371,7 @@ export const ROLE_PERMISSIONS = {
],
[ROLES.ADMIN]: [
...PERMISSION_GROUPS.DASHBOARD_MANAGEMENT,
...PERMISSION_GROUPS.FARM_MANAGEMENT,
...PERMISSION_GROUPS.DEVICE_MANAGEMENT,
...PERMISSION_GROUPS.MONITOR_MANAGEMENT,
@@ -453,6 +469,9 @@ export function isPermissionInGroup(permission, group) {
*/
export function formatPermissionName(permission) {
const permissionNames = {
// 工作台
'dashboard:view': '查看工作台',
// 养殖场管理
'farm:view': '查看养殖场',
'farm:create': '新增养殖场',

View File

@@ -3,7 +3,7 @@
*/
import axios from 'axios'
import { message, Modal } from 'ant-design-vue'
import { useUserStore } from '@/stores/user'
import { useAuthStore } from '@/stores/auth'
import { useNotificationStore } from '@/stores/notification'
import router from '@/router'
@@ -19,11 +19,11 @@ const request = axios.create({
// 请求拦截器
request.interceptors.request.use(
(config) => {
const userStore = useUserStore()
const authStore = useAuthStore()
// 添加认证token
if (userStore.token) {
config.headers.Authorization = `Bearer ${userStore.token}`
if (authStore.token) {
config.headers.Authorization = `Bearer ${authStore.token}`
}
// 添加请求ID用于追踪
@@ -182,7 +182,7 @@ request.interceptors.response.use(
* 处理未授权错误
*/
function handleUnauthorized() {
const userStore = useUserStore()
const authStore = useAuthStore()
Modal.confirm({
title: '登录已过期',
@@ -190,7 +190,7 @@ function handleUnauthorized() {
okText: '重新登录',
cancelText: '取消',
onOk() {
userStore.logout()
authStore.logout()
router.push('/login')
}
})