import type { Component as ComponentType } from 'vue'; import type { DictData } from '#/api/system/dict/dict-data-model'; import { h } from 'vue'; import { JsonPreview } from '@vben/common-ui'; import { AndroidIcon, BaiduIcon, ChromeIcon, DefaultBrowserIcon, DefaultOsIcon, DingtalkIcon, EdgeIcon, FirefoxIcon, IconifyIcon, IPhoneIcon, LinuxIcon, MicromessengerIcon, OperaIcon, OSXIcon, QuarkIcon, SafariIcon, SvgQQIcon, UcIcon, WindowsIcon, } from '@vben/icons'; import { Tag } from 'ant-design-vue'; import { DictTag } from '#/components/dict'; import { getDictOptions } from './dict'; /** * 渲染标签 * @param text 文字 * @param color 颜色 * @returns render */ function renderTag(text: string, color?: string) { return {text}; } /** * * @param tags 标签list * @param wrap 是否换行显示 * @param [gap] 间隔 * @returns render */ export function renderTags(tags: string[], wrap = false, gap = 1) { return (
{tags.map((tag, index) => { return
{renderTag(tag)}
; })}
); } /** * * @param json json对象 接受object/string类型 * @returns json预览 */ export function renderJsonPreview(json: any) { if (typeof json !== 'object' && typeof json !== 'string') { return {json}; } if (typeof json === 'object') { return ; } try { const obj = JSON.parse(json); // 基本数据类型可以被转为json if (typeof obj !== 'object') { return {obj}; } return ; } catch { return {json}; } } /** * iconify图标 * @param icon icon名称 * @returns render */ export function renderIcon(icon: string) { return ; } /** * httpMethod标签 * @param type method类型 * @returns render */ export function renderHttpMethodTag(type: string) { const method = type.toUpperCase(); const colors: { [key: string]: string } = { DELETE: 'red', GET: 'green', POST: 'blue', PUT: 'orange', }; const color = colors[method] ?? 'default'; const title = `${method}请求`; return {title}; } export function renderDictTag(value: number | string, dicts: DictData[]) { return ; } /** * render多个dictTag * @param value key数组 string[]类型 * @param dicts 字典数组 * @param wrap 是否需要换行显示 * @param [gap] 间隔 * @returns render */ export function renderDictTags( value: string[], dicts: DictData[], wrap = true, gap = 1, ) { if (!Array.isArray(value)) { return
{value}
; } return (
{value.map((item, index) => { return
{renderDictTag(item, dicts)}
; })}
); } /** * 显示字典标签 一般是table使用 * @param value 值 * @param dictName dictName * @returns tag */ export function renderDict(value: number | string, dictName: string) { const dictInfo = getDictOptions(dictName); return renderDictTag(value, dictInfo); } export function renderDictValue(value: number | string, dictName: string) { const dictInfo = getDictOptions(dictName); const matchedItem = dictInfo.find((item) => item.value == value); return matchedItem ? matchedItem.label : value; } export function renderIconSpan( icon: ComponentType, value: string, center = false, marginLeft = '2px', ) { const justifyCenter = center ? 'justify-center' : ''; return ( {h(icon)} {value} ); } const osOptions = [ { icon: WindowsIcon, value: 'windows' }, { icon: LinuxIcon, value: 'linux' }, { icon: OSXIcon, value: 'osx' }, { icon: AndroidIcon, value: 'android' }, { icon: IPhoneIcon, value: 'iphone' }, ]; /** * 浏览器图标 * cn.hutool.http.useragent -> browers */ const browserOptions = [ { icon: ChromeIcon, value: 'chrome' }, { icon: EdgeIcon, value: 'edge' }, { icon: FirefoxIcon, value: 'firefox' }, { icon: OperaIcon, value: 'opera' }, { icon: SafariIcon, value: 'safari' }, { icon: MicromessengerIcon, value: 'micromessenger' }, { icon: MicromessengerIcon, value: 'windowswechat' }, { icon: QuarkIcon, value: 'quark' }, { icon: MicromessengerIcon, value: 'wxwork' }, { icon: SvgQQIcon, value: 'qq' }, { icon: DingtalkIcon, value: 'dingtalk' }, { icon: UcIcon, value: 'uc' }, { icon: BaiduIcon, value: 'baidu' }, ]; export function renderOsIcon(os: string, center = false) { if (!os) { return; } let current = osOptions.find((item) => os.toLocaleLowerCase().includes(item.value), ); // windows要特殊处理 if (os.toLocaleLowerCase().includes('windows')) { current = osOptions[0]; } const icon = current ? current.icon : DefaultOsIcon; return renderIconSpan(icon, os, center, '5px'); } export function renderBrowserIcon(browser: string, center = false) { if (!browser) { return; } const current = browserOptions.find((item) => browser.toLocaleLowerCase().includes(item.value), ); const icon = current ? current.icon : DefaultBrowserIcon; return renderIconSpan(icon, browser, center, '5px'); }