Merge branch 'master' of https://gitee.com/yudaocode/yudao-ui-admin-vue3 into feature/iot

# Conflicts:
#	pnpm-lock.yaml
#	src/utils/index.ts
This commit is contained in:
YunaiV
2025-03-16 23:45:34 +08:00
195 changed files with 11125 additions and 5167 deletions

View File

@ -457,3 +457,9 @@ export const BpmProcessInstanceStatus = {
REJECT: 3, // 审批不通过
CANCEL: 4 // 已取消
}
export const BpmAutoApproveType = {
NONE: 0, // 不自动通过
APPROVE_ALL: 1, // 仅审批一次,后续重复的审批节点均自动通过
APPROVE_SEQUENT: 2, // 仅针对连续审批的节点自动通过
}

View File

@ -219,6 +219,7 @@ export enum DICT_TYPE {
// ========== AI - 人工智能模块 ==========
AI_PLATFORM = 'ai_platform', // AI 平台
AI_MODEL_TYPE = 'ai_model_type', // AI 模型类型
AI_IMAGE_STATUS = 'ai_image_status', // AI 图片状态
AI_MUSIC_STATUS = 'ai_music_status', // AI 音乐状态
AI_GENERATE_MODE = 'ai_generate_mode', // AI 生成模式

View File

@ -33,6 +33,10 @@ const download = {
markdown: (data: Blob, fileName: string) => {
download0(data, fileName, 'text/markdown')
},
// 下载 Json 方法
json: (data: Blob, fileName: string) => {
download0(data, fileName, 'application/json')
},
// 下载图片(允许跨域)
image: ({
url,
@ -65,6 +69,31 @@ const download = {
a.download = 'image.png'
a.click()
}
},
base64ToFile: (base64: any, fileName: string) => {
// 将base64按照 , 进行分割 将前缀 与后续内容分隔开
const data = base64.split(',')
// 利用正则表达式 从前缀中获取图片的类型信息image/png、image/jpeg、image/webp等
const type = data[0].match(/:(.*?);/)[1]
// 从图片的类型信息中 获取具体的文件格式后缀png、jpeg、webp
const suffix = type.split('/')[1]
// 使用atob()对base64数据进行解码 结果是一个文件数据流 以字符串的格式输出
const bstr = window.atob(data[1])
// 获取解码结果字符串的长度
let n = bstr.length
// 根据解码结果字符串的长度创建一个等长的整形数字数组
// 但在创建时 所有元素初始值都为 0
const u8arr = new Uint8Array(n)
// 将整形数组的每个元素填充为解码结果字符串对应位置字符的UTF-16 编码单元
while (n--) {
// charCodeAt():获取给定索引处字符对应的 UTF-16 代码单元
u8arr[n] = bstr.charCodeAt(n)
}
// 将File文件对象返回给方法的调用者
return new File([u8arr], `${fileName}.${suffix}`, {
type: type
})
}
}

View File

@ -11,7 +11,7 @@ export const encodeConf = (designerRef: object) => {
// 编码表单 Fields
export const encodeFields = (designerRef: object) => {
// @ts-ignore
const rule = designerRef.value.getRule()
const rule = JSON.parse(designerRef.value.getJson())
const fields: string[] = []
rule.forEach((item) => {
fields.push(JSON.stringify(item))

View File

@ -130,6 +130,64 @@ export function generateRandomStr(length: number): string {
return result
}
/**
* 根据支持的文件类型生成 accept 属性值
*
* @param supportedFileTypes 支持的文件类型数组,如 ['PDF', 'DOC', 'DOCX']
* @returns 用于文件上传组件 accept 属性的字符串
*/
export const generateAcceptedFileTypes = (supportedFileTypes: string[]): string => {
const allowedExtensions = supportedFileTypes.map((ext) => ext.toLowerCase())
const mimeTypes: string[] = []
// 添加常见的 MIME 类型映射
if (allowedExtensions.includes('txt')) {
mimeTypes.push('text/plain')
}
if (allowedExtensions.includes('pdf')) {
mimeTypes.push('application/pdf')
}
if (allowedExtensions.includes('html') || allowedExtensions.includes('htm')) {
mimeTypes.push('text/html')
}
if (allowedExtensions.includes('csv')) {
mimeTypes.push('text/csv')
}
if (allowedExtensions.includes('xlsx') || allowedExtensions.includes('xls')) {
mimeTypes.push('application/vnd.ms-excel')
mimeTypes.push('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
}
if (allowedExtensions.includes('docx') || allowedExtensions.includes('doc')) {
mimeTypes.push('application/msword')
mimeTypes.push('application/vnd.openxmlformats-officedocument.wordprocessingml.document')
}
if (allowedExtensions.includes('pptx') || allowedExtensions.includes('ppt')) {
mimeTypes.push('application/vnd.ms-powerpoint')
mimeTypes.push('application/vnd.openxmlformats-officedocument.presentationml.presentation')
}
if (allowedExtensions.includes('xml')) {
mimeTypes.push('application/xml')
mimeTypes.push('text/xml')
}
if (allowedExtensions.includes('md') || allowedExtensions.includes('markdown')) {
mimeTypes.push('text/markdown')
}
if (allowedExtensions.includes('epub')) {
mimeTypes.push('application/epub+zip')
}
if (allowedExtensions.includes('eml')) {
mimeTypes.push('message/rfc822')
}
if (allowedExtensions.includes('msg')) {
mimeTypes.push('application/vnd.ms-outlook')
}
// 添加文件扩展名
const extensions = allowedExtensions.map((ext) => `.${ext}`)
return [...mimeTypes, ...extensions].join(',')
}
/**
* 首字母大写
*/
@ -463,3 +521,18 @@ export function jsonParse(str: string) {
return ''
}
}
/**
* 截取字符串
*
* @param str 字符串
* @param start 开始位置
* @param end 结束位置
*/
export const subString = (str: string, start: number, end: number) => {
if (str.length > end) {
return str.slice(start, end)
}
return str
}

View File

@ -1,4 +1,6 @@
import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
import {hasPermission} from "@/directives/permission/hasPermi";
const { t } = useI18n() // 国际化
@ -7,21 +9,8 @@ const { t } = useI18n() // 国际化
* @param {Array} value 校验值
* @returns {Boolean}
*/
export function checkPermi(value: string[]) {
if (value && value instanceof Array && value.length > 0) {
const { wsCache } = useCache()
const permissionDatas = value
const all_permission = '*:*:*'
const userInfo = wsCache.get(CACHE_KEY.USER)
const permissions = userInfo?.permissions || []
const hasPermission = permissions.some((permission: string) => {
return all_permission === permission || permissionDatas.includes(permission)
})
return !!hasPermission
} else {
console.error(t('permission.hasPermission'))
return false
}
export function checkPermi(permission: string[]) {
return hasPermission(permission)
}
/**

View File

@ -100,6 +100,9 @@ export const generateRoute = (routes: AppCustomRouteRecordRaw[]): AppRouteRecord
//处理顶级非目录路由
if (!route.children && route.parentId == 0 && route.component) {
data.component = Layout
data.meta = {
hidden: meta.hidden,
}
data.name = toCamelCase(route.path, true) + 'Parent'
data.redirect = ''
meta.alwaysShow = true