同步操作将从 飞致云/SQLBot 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
import dayjs from 'dayjs'import { useCache } from '@/utils/useCache'import colorFunctions from 'less/lib/less/functions/color.js'import colorTree from 'less/lib/less/tree/color.js'const { wsCache } = useCache()const getCheckDate = (timestamp: any) => {if (!timestamp) return falseconst dt = new Date(timestamp)if (isNaN(dt.getTime())) return falsereturn dt}export const datetimeFormat = (timestamp: any) => {const dt = getCheckDate(timestamp)if (!dt) return timestampconst y = dt.getFullYear()const m = (dt.getMonth() + 1 + '').padStart(2, '0')const d = (dt.getDate() + '').padStart(2, '0')const hh = (dt.getHours() + '').padStart(2, '0')const mm = (dt.getMinutes() + '').padStart(2, '0')const ss = (dt.getSeconds() + '').padStart(2, '0')return `${y}-${m}-${d}${hh}:${mm}:${ss}`}/**** string: only accept ISO 8601, example: '2018-04-04T16:00:00.000Z'* number: timestamp* @param time*/export function getDate(time?: Date | string | number) {if (!time) return undefinedif (time instanceof Date) return timeif (typeof time === 'string') {return dayjs(time).toDate()}return new Date(time)}export const getBrowserLocale = () => {const language = navigator.languageif (!language) {return 'zh-CN'}if (language.startsWith('en')) {return 'en'}if (language.toLowerCase().startsWith('zh')) {const temp = language.toLowerCase().replace('_', '-')return temp === 'zh' ? 'zh-CN' : temp === 'zh-cn' ? 'zh-CN' : 'zh-TW'}return language}export const getLocale = () => {return wsCache.get('user.language') || getBrowserLocale() || 'zh-CN'}export const setSize = (size: any) => {let data = ''const _size = Number.parseFloat(size)if (_size < 1 * 1024) {//如果小于0.1KB转化成Bdata = _size.toFixed(2) + 'B'} else if (_size < 1 * 1024 * 1024) {//如果小于0.1MB转化成KBdata = (_size / 1024).toFixed(2) + 'KB'} else if (_size < 1 * 1024 * 1024 * 1024) {//如果小于0.1GB转化成MBdata = (_size / (1024 * 1024)).toFixed(2) + 'MB'} else {//其他转化成GBdata = (_size / (1024 * 1024 * 1024)).toFixed(2) + 'GB'}const size_str = data + ''const len = size_str.indexOf('.')const dec = size_str.substr(len + 1, 2)if (dec == '00') {//当小数点后为00时 去掉小数部分return size_str.substring(0, len) + size_str.substr(len + 3, 2)}return size_str}export const isInIframe = () => {try {return window.top !== window.self} catch (error) {console.error(error)return true}}export const isBtnShow = (val: string) => {if (!val || val === '0') {return true} else if (val === '1') {return false} else {return !isInIframe()}}export const toLoginPage = (fullPath: string) => {if (!fullPath || fullPath === '/') {return {path: '/login',}}return {path: '/login',query: { redirect: fullPath },}}export const toLoginSuccess = (router: any) => {const redirect = router?.currentRoute?.value?.query?.redirectconst redirectPath = Array.isArray(redirect) ? redirect[0] : redirect || '/chat'router.push(redirectPath as string)}export const getCurrentRouter = () => {const hash = location.hashif (!hash) return nullreturn hash.replace('#/login?redirect=', '')}export const setTitle = (title?: string) => {document.title = title || 'SQLBot'}function rgbToHex(r: any, g: any, b: any) {// 确保数值在0-255范围内r = Math.max(0, Math.min(255, r))g = Math.max(0, Math.min(255, g))b = Math.max(0, Math.min(255, b))// 转换为16进制并补零const hexR = r.toString(16).padStart(2, '0')const hexG = g.toString(16).padStart(2, '0')const hexB = b.toString(16).padStart(2, '0')return `#${hexR}${hexG}${hexB}`.toUpperCase()}function rgbaToHex(r: any, g: any, b: any, a: any) {// 处理RGB部分const hexR = Math.max(0, Math.min(255, r)).toString(16).padStart(2, '0')const hexG = Math.max(0, Math.min(255, g)).toString(16).padStart(2, '0')const hexB = Math.max(0, Math.min(255, b)).toString(16).padStart(2, '0')// 处理透明度(可选)const hexA =a !== undefined? Math.round(Math.max(0, Math.min(1, a)) * 255).toString(16).padStart(2, '0'): ''return `#${hexR}${hexG}${hexB}${hexA}`.toUpperCase()}export function colorStringToHex(colorStr: any) {if (colorStr.startsWith('#')) return colorStr// 提取颜色值const rgbRegex =/^(rgb|rgba)\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)$/const match = colorStr.match(rgbRegex)if (!match) return nullconst r = parseInt(match[2])const g = parseInt(match[3])const b = parseInt(match[4])const a = match[5] ? parseFloat(match[5]) : undefinedreturn a !== undefined ? rgbaToHex(r, g, b, a) : rgbToHex(r, g, b)}export const setCurrentColor = (color: any, element: HTMLElement = document.documentElement) => {const currentColor = colorStringToHex(color) as anyif (!currentColor) {return}element.style.setProperty('--ed-color-primary', currentColor)element.style.setProperty('--van-blue', currentColor)element.style.setProperty('--ed-color-primary-light-5',colorFunctions.mix(new colorTree('ffffff'), new colorTree(currentColor.substr(1)), { value: 40 }).toRGB())element.style.setProperty('--ed-color-primary-light-3',colorFunctions.mix(new colorTree('ffffff'), new colorTree(currentColor.substr(1)), { value: 15 }).toRGB())element.style.setProperty('--ed-color-primary-60',colorFunctions.mix(new colorTree('ffffff'), new colorTree(currentColor.substr(1)), { value: 60 }).toRGB())element.style.setProperty('--ed-color-primary-80',colorFunctions.mix(new colorTree('ffffff'), new colorTree(currentColor.substr(1)), { value: 80 }).toRGB())element.style.setProperty('--ed-color-primary-15-d',colorFunctions.mix(new colorTree('000000'), new colorTree(currentColor.substr(1)), { value: 15 }).toRGB())element.style.setProperty('--ed-color-primary-1a', `${currentColor}1a`)element.style.setProperty('--ed-color-primary-14', `${currentColor}14`)element.style.setProperty('--ed-color-primary-33', `${currentColor}33`)element.style.setProperty('--ed-color-primary-99', `${currentColor}99`)element.style.setProperty('--ed-color-primary-dark-2',colorFunctions.mix(new colorTree('000000'), new colorTree(currentColor.substr(1)), { value: 15 }).toRGB())}export const getQueryString = (name: string) => {const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i')const r = window.location.search.substr(1).match(reg)if (r != null) {return unescape(r[2])}return null}export const getUrlParams = () => {const urlParams = new URLSearchParams(window.location.search) as anyreturn Object.fromEntries(urlParams)}export const isLarkPlatform = () => {return !!getQueryString('state') && !!getQueryString('code')}export const isPlatform = () => {const state = getQueryString('state')const platformArray = ['wecom', 'dingtalk', 'lark']return (!!state &&!!getQueryString('code') &&platformArray.some((item: string) => state.includes(item)))}export const isPlatformClient = () => {return !!getQueryString('client') || getQueryString('state')?.includes('client')}/* export const checkPlatform = () => {const flagArray = ['/casbi', 'oidcbi']const pathname = window.location.pathnameif (!flagArray.some((flag) => pathname.includes(flag)) &&!isLarkPlatform() &&!isPlatformClient()) {return cleanPlatformFlag()}return true}export const cleanPlatformFlag = () => {const platformKey = 'out_auth_platform'wsCache.delete(platformKey)return false} */export function isTablet() {const userAgent = navigator.userAgentconst tabletRegex = /iPad|Silk|Galaxy Tab|PlayBook|BlackBerry|(tablet|ipad|playbook)/ireturn tabletRegex.test(userAgent)}export function isMobile() {return (navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i) && !isTablet())}export const getSQLBotAddr = (portEnd?: boolean) => {const addr = location.origin + location.pathnameif (!portEnd || !addr.endsWith('/')) {return addr}return addr.substring(0, addr.length - 1)}export const formatArg = (text: string) => {if (!text) {return false}const mappingArray = ['true', 'false', '1', '0']const match = mappingArray.some((item: string) => {return item === text.toLocaleLowerCase()})if (!match) {return text}try {return JSON.parse(text)} catch (e: any) {console.warn(e)return text}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。