dev
This commit is contained in:
@@ -14,6 +14,6 @@ export const getImageURL = (image: string) => {
|
||||
return `${baseURL}${image}`
|
||||
}
|
||||
|
||||
export const getLocalImageURL = (url:string)=>{
|
||||
export const getLocalImageURL = (url: string) => {
|
||||
return new URL(url, import.meta.url).href
|
||||
}
|
||||
|
||||
+91
-86
@@ -2,9 +2,9 @@ export function in_range(num: number, start: number, end: number) {
|
||||
return start <= num && num <= end
|
||||
}
|
||||
|
||||
export function to_percent(num?: number, defaultValue: number = 0, suffix = "", withPlus = false) {
|
||||
export function to_percent(num?: number, defaultValue: number = 0, suffix = '', withPlus = false) {
|
||||
num = num ?? defaultValue
|
||||
return (num > 0 && withPlus ? "+" : "") + num?.multiply(100).round(2).toString().concat(suffix)
|
||||
return (num > 0 && withPlus ? '+' : '') + num?.multiply(100).round(2).toString().concat(suffix)
|
||||
}
|
||||
|
||||
export function get_num(num?: number, defaultValue: number = 0) {
|
||||
@@ -13,14 +13,14 @@ export function get_num(num?: number, defaultValue: number = 0) {
|
||||
|
||||
export function format_string(str: string, params: any = {}, ...args: any[]) {
|
||||
let num = 0
|
||||
str = str.replace(/{}/g, match => {
|
||||
str = str.replace(/{}/g, (match) => {
|
||||
return args[num++] ?? match
|
||||
})
|
||||
str = str.replace(/{\d+}/g, match => {
|
||||
str = str.replace(/{\d+}/g, (match) => {
|
||||
const i = Number.parseInt(match.slice(1, -1))
|
||||
return args[i] ?? match
|
||||
})
|
||||
str = str.replace(/{\w+}/g, match => {
|
||||
str = str.replace(/{\w+}/g, (match) => {
|
||||
const name = match.slice(1, -1)
|
||||
return params[name] ?? match
|
||||
})
|
||||
@@ -29,11 +29,11 @@ export function format_string(str: string, params: any = {}, ...args: any[]) {
|
||||
|
||||
export function format_bytes(bytes: number, decimals = 2) {
|
||||
if (bytes === 0) {
|
||||
return "0 Bytes"
|
||||
return '0 Bytes'
|
||||
}
|
||||
const k = 1024
|
||||
const dm = decimals < 0 ? 0 : decimals
|
||||
const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]
|
||||
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
|
||||
|
||||
const i = Math.floor(Math.log(bytes) / Math.log(k))
|
||||
|
||||
@@ -58,14 +58,14 @@ export function cartesian<T = any>(...arr: T[][]): T[][] {
|
||||
return arr.reduce(
|
||||
(a, b) => {
|
||||
const ret: T[][] = []
|
||||
a.forEach(a => {
|
||||
b.forEach(b => {
|
||||
a.forEach((a) => {
|
||||
b.forEach((b) => {
|
||||
ret.push(a.concat([b]))
|
||||
})
|
||||
})
|
||||
return ret
|
||||
},
|
||||
[[]] as T[][]
|
||||
[[]] as T[][],
|
||||
)
|
||||
}
|
||||
|
||||
@@ -95,7 +95,7 @@ export function debounce_last(func: Function, wait: number) {
|
||||
}
|
||||
|
||||
export function padding(num: number | string, length: number): string {
|
||||
if ((`${num}`).length >= length) {
|
||||
if (`${num}`.length >= length) {
|
||||
return `${num}`
|
||||
}
|
||||
return padding(`0${num}`, length)
|
||||
@@ -106,7 +106,10 @@ export function format_float(f: number, digit: number = 2) {
|
||||
return (f * m).round(10) / m
|
||||
}
|
||||
|
||||
export function mapRecord<T extends keyof any, K>(status: Record<T, K>, callback: (value: K, key: T) => K) {
|
||||
export function mapRecord<T extends keyof any, K>(
|
||||
status: Record<T, K>,
|
||||
callback: (value: K, key: T) => K,
|
||||
) {
|
||||
const new_status = {} as Record<T, K>
|
||||
for (const key in status) {
|
||||
const value = callback(status[key], key)
|
||||
@@ -117,7 +120,7 @@ export function mapRecord<T extends keyof any, K>(status: Record<T, K>, callback
|
||||
return new_status
|
||||
}
|
||||
|
||||
Array.prototype.max = function<T>(callback: (t: T) => number): [number, T | undefined] {
|
||||
Array.prototype.max = function <T>(callback: (t: T) => number): [number, T | undefined] {
|
||||
let rs: [number, T | undefined] = [-1, undefined]
|
||||
let max = -1
|
||||
for (let i = 0; i < this.length; i++) {
|
||||
@@ -131,7 +134,7 @@ Array.prototype.max = function<T>(callback: (t: T) => number): [number, T | unde
|
||||
return rs
|
||||
}
|
||||
|
||||
Array.prototype.min = function<T>(callback: (t: T) => number): [number, T | undefined] {
|
||||
Array.prototype.min = function <T>(callback: (t: T) => number): [number, T | undefined] {
|
||||
let rs: [number, T | undefined] = [-1, undefined]
|
||||
let min = -1
|
||||
for (let i = 0; i < this.length; i++) {
|
||||
@@ -172,19 +175,19 @@ export function toObj(data: any): any {
|
||||
const temp = {}
|
||||
for (const key in data) {
|
||||
try {
|
||||
if (typeof data[key] === "number" || typeof data[key] === "string") {
|
||||
if (typeof data[key] === 'number' || typeof data[key] === 'string') {
|
||||
Object.defineProperty(temp, key, {
|
||||
value: data[key],
|
||||
writable: true,
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
configurable: true,
|
||||
})
|
||||
} else {
|
||||
Object.defineProperty(temp, key, {
|
||||
value: RecordToObj(data[key]),
|
||||
writable: true,
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
configurable: true,
|
||||
})
|
||||
}
|
||||
} catch {
|
||||
@@ -192,7 +195,7 @@ export function toObj(data: any): any {
|
||||
value: data[key],
|
||||
writable: true,
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
configurable: true,
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -202,7 +205,7 @@ export function toObj(data: any): any {
|
||||
export function toMap(data: any, except: string[] = []) {
|
||||
const temp = {}
|
||||
for (const key in data) {
|
||||
if (typeof data[key] === "object" && data[key].constructor != Array && !except.includes(key)) {
|
||||
if (typeof data[key] === 'object' && data[key].constructor != Array && !except.includes(key)) {
|
||||
// 需要转换部分,不能是Array,也会被转换
|
||||
const sub = {}
|
||||
for (const subkey in data[key]) {
|
||||
@@ -210,21 +213,21 @@ export function toMap(data: any, except: string[] = []) {
|
||||
value: new Map(Object.entries(data[key][subkey])),
|
||||
writable: true,
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
configurable: true,
|
||||
})
|
||||
}
|
||||
Object.defineProperty(temp, key, {
|
||||
value: sub,
|
||||
writable: true,
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
configurable: true,
|
||||
})
|
||||
} else {
|
||||
Object.defineProperty(temp, key, {
|
||||
value: data[key],
|
||||
writable: true,
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
configurable: true,
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -238,28 +241,31 @@ export function RecordToObj(todo: Record<string, Map<any, any>>) {
|
||||
value: Object.fromEntries(todo[key]),
|
||||
writable: true,
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
configurable: true,
|
||||
})
|
||||
}
|
||||
return temp
|
||||
}
|
||||
|
||||
export function getUuid() {
|
||||
if (typeof crypto === "object") {
|
||||
if (typeof crypto.randomUUID === "function") {
|
||||
if (typeof crypto === 'object') {
|
||||
if (typeof crypto.randomUUID === 'function') {
|
||||
return crypto.randomUUID()
|
||||
}
|
||||
if (typeof crypto.getRandomValues === "function" && typeof Uint8Array === "function") {
|
||||
if (typeof crypto.getRandomValues === 'function' && typeof Uint8Array === 'function') {
|
||||
const callback = (c: any) => {
|
||||
const num = Number(c)
|
||||
return (num ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (num / 4)))).toString(16)
|
||||
return (num ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (num / 4)))).toString(
|
||||
16,
|
||||
)
|
||||
}
|
||||
return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, callback)
|
||||
return '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, callback)
|
||||
}
|
||||
}
|
||||
let timestamp = new Date().getTime()
|
||||
let perforNow = (typeof performance !== "undefined" && performance.now && performance.now() * 1000) || 0
|
||||
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, c => {
|
||||
let perforNow =
|
||||
(typeof performance !== 'undefined' && performance.now && performance.now() * 1000) || 0
|
||||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
||||
let random = Math.random() * 16
|
||||
if (timestamp > 0) {
|
||||
random = Math.trunc((timestamp + random) % 16)
|
||||
@@ -268,90 +274,89 @@ export function getUuid() {
|
||||
random = Math.trunc((perforNow + random) % 16)
|
||||
perforNow = Math.floor(perforNow / 16)
|
||||
}
|
||||
return (c === "x" ? random : (random & 0x3) | 0x8).toString(16)
|
||||
return (c === 'x' ? random : (random & 0x3) | 0x8).toString(16)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
export function rarityClass(type: string) {
|
||||
switch (type) {
|
||||
case "太初":
|
||||
return "primeval"
|
||||
case "史诗":
|
||||
return "epic"
|
||||
case "神话":
|
||||
return "myth"
|
||||
case "智慧产物":
|
||||
return "epic"
|
||||
case "神器":
|
||||
return "artifact"
|
||||
case "稀有":
|
||||
return "rare"
|
||||
case "传说":
|
||||
return "legend"
|
||||
case "勇者":
|
||||
return "chronicle"
|
||||
case "高级":
|
||||
return "advanced"
|
||||
case '太初':
|
||||
return 'primeval'
|
||||
case '史诗':
|
||||
return 'epic'
|
||||
case '神话':
|
||||
return 'myth'
|
||||
case '智慧产物':
|
||||
return 'epic'
|
||||
case '神器':
|
||||
return 'artifact'
|
||||
case '稀有':
|
||||
return 'rare'
|
||||
case '传说':
|
||||
return 'legend'
|
||||
case '勇者':
|
||||
return 'chronicle'
|
||||
case '高级':
|
||||
return 'advanced'
|
||||
default:
|
||||
return "epic"
|
||||
return 'epic'
|
||||
}
|
||||
}
|
||||
|
||||
export function formatAttr(type:string,value:number){
|
||||
switch(type){
|
||||
case "STR":
|
||||
export function formatAttr(type: string, value: number) {
|
||||
switch (type) {
|
||||
case 'STR':
|
||||
return `力量 ${value}`
|
||||
case "INT":
|
||||
case 'INT':
|
||||
return `智力 ${value}`
|
||||
case "Vitality":
|
||||
case 'Vitality':
|
||||
return `体力 ${value}`
|
||||
case "Spirit":
|
||||
case 'Spirit':
|
||||
return `精神 ${value}`
|
||||
case "AtkP":
|
||||
case 'AtkP':
|
||||
return `物理攻击力 ${value}`
|
||||
case "AtkM":
|
||||
case 'AtkM':
|
||||
return `魔法攻击力 ${value}`
|
||||
case "AtkI":
|
||||
case 'AtkI':
|
||||
return `独立攻击力 ${value}`
|
||||
case "SkillAttack":
|
||||
case 'SkillAttack':
|
||||
return `技能伤害 +${(value * 100).toFixed(2)}%`
|
||||
case "Attack":
|
||||
return `攻击强化 +${(value).toFixed(1)}%`
|
||||
case "Buffer":
|
||||
return `增益量 ${(value)}`
|
||||
case 'Attack':
|
||||
return `攻击强化 +${value.toFixed(1)}%`
|
||||
case 'Buffer':
|
||||
return `增益量 ${value}`
|
||||
default:
|
||||
return `${type} ${value}`
|
||||
}
|
||||
}
|
||||
|
||||
export const decrypt = (encryptedData: string) => {
|
||||
try {
|
||||
encryptedData = decodeURIComponent(encryptedData)
|
||||
.split('')
|
||||
.map((a) => {
|
||||
if (a == '=') {
|
||||
return a
|
||||
} else {
|
||||
return String.fromCharCode(a.charCodeAt(0) - 1)
|
||||
}
|
||||
})
|
||||
.join('')
|
||||
const decryptedData = atob(encryptedData)
|
||||
|
||||
export const decrypt = (encryptedData:string)=>{
|
||||
try{
|
||||
encryptedData = decodeURIComponent(encryptedData).split("").map(a=>{
|
||||
if(a=='='){
|
||||
return a
|
||||
}
|
||||
else{
|
||||
return String.fromCharCode(a.charCodeAt(0) - 1)
|
||||
}
|
||||
}).join("")
|
||||
const decryptedData = atob(encryptedData);
|
||||
|
||||
const len = decryptedData.length;
|
||||
const decryptedBinaryOffset = decryptedData.slice(0, len-13);
|
||||
const decryptedTimestamp = decryptedData.slice(len-13, len);
|
||||
const len = decryptedData.length
|
||||
const decryptedBinaryOffset = decryptedData.slice(0, len - 13)
|
||||
const decryptedTimestamp = decryptedData.slice(len - 13, len)
|
||||
|
||||
return {
|
||||
uid:parseInt(decryptedBinaryOffset,2),
|
||||
time:parseInt(decryptedTimestamp)
|
||||
uid: parseInt(decryptedBinaryOffset, 2),
|
||||
time: parseInt(decryptedTimestamp),
|
||||
}
|
||||
}
|
||||
catch(e){
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
return {
|
||||
uid:-1,
|
||||
time:0
|
||||
uid: -1,
|
||||
time: 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+40
-28
@@ -1,8 +1,8 @@
|
||||
import type { MaybeRef } from "@vueuse/core"
|
||||
import querystring from "query-string"
|
||||
import { h, isRef } from "vue"
|
||||
import { useRouter } from "vue-router"
|
||||
import { useDialog } from "@/components/hooks/dialog"
|
||||
import type { MaybeRef } from '@vueuse/core'
|
||||
import querystring from 'query-string'
|
||||
import { h, isRef } from 'vue'
|
||||
import { useRouter } from 'vue-router'
|
||||
import { useDialog } from '@/components/hooks/dialog'
|
||||
|
||||
interface UseOpenOption {
|
||||
/*
|
||||
@@ -16,7 +16,7 @@ interface UseOpenOption {
|
||||
/**
|
||||
* 是否打开新页面
|
||||
*/
|
||||
target?: "_blank" | "_self" | false
|
||||
target?: '_blank' | '_self' | false
|
||||
|
||||
title?: string
|
||||
}
|
||||
@@ -25,13 +25,27 @@ export function useOpenWindow(opt?: UseOpenOption & { immediate?: boolean }) {
|
||||
const { show, close, randomId } = useDialog()
|
||||
const router = useRouter()
|
||||
|
||||
return async (maybeUrl: MaybeRef<string> | (() => string), { width = 0, height = 0, target = "_self", query = {}, title = "DNF计算器 & Colg", scale = 1.0 }: UseOpenOption = {}) => {
|
||||
let url = isRef(maybeUrl) ? maybeUrl.value : typeof maybeUrl === "function" ? maybeUrl() : maybeUrl
|
||||
return async (
|
||||
maybeUrl: MaybeRef<string> | (() => string),
|
||||
{
|
||||
width = 0,
|
||||
height = 0,
|
||||
target = '_self',
|
||||
query = {},
|
||||
title = 'DNF计算器 & Colg',
|
||||
scale = 1.0,
|
||||
}: UseOpenOption = {},
|
||||
) => {
|
||||
let url = isRef(maybeUrl)
|
||||
? maybeUrl.value
|
||||
: typeof maybeUrl === 'function'
|
||||
? maybeUrl()
|
||||
: maybeUrl
|
||||
if (!url) {
|
||||
return
|
||||
}
|
||||
|
||||
if (url.startsWith("/")) {
|
||||
if (url.startsWith('/')) {
|
||||
url = router.resolve(url).href
|
||||
}
|
||||
query.r = `${Math.random()}`
|
||||
@@ -40,50 +54,48 @@ export function useOpenWindow(opt?: UseOpenOption & { immediate?: boolean }) {
|
||||
let _target = target
|
||||
if (!_target) {
|
||||
const rs = await show({
|
||||
content: "请确认打开新页面的方式",
|
||||
okButton: "当前窗口",
|
||||
rejectButton: "新窗口",
|
||||
content: '请确认打开新页面的方式',
|
||||
okButton: '当前窗口',
|
||||
rejectButton: '新窗口',
|
||||
cancelButton: true,
|
||||
defaultStatus: "cancel"
|
||||
defaultStatus: 'cancel',
|
||||
})
|
||||
if (rs.isOk) {
|
||||
_target = "_self"
|
||||
_target = '_self'
|
||||
} else if (rs.isReject) {
|
||||
_target = "_blank"
|
||||
_target = '_blank'
|
||||
}
|
||||
}
|
||||
|
||||
if (_target == "_blank" || width * height < 1) {
|
||||
window.open(url, _target as string)
|
||||
|
||||
} else if (_target == "_self") {
|
||||
|
||||
if (_target == '_blank' || width * height < 1) {
|
||||
window.open(url, _target as string)
|
||||
} else if (_target == '_self') {
|
||||
const id = randomId()
|
||||
const onClose = (e: MessageEvent) => {
|
||||
if (e.data == "close") {
|
||||
if (e.data == 'close') {
|
||||
close(id)
|
||||
}
|
||||
}
|
||||
window.addEventListener("message", onClose)
|
||||
window.addEventListener('message', onClose)
|
||||
const temp = await show({
|
||||
id,
|
||||
header: title,
|
||||
mask: true,
|
||||
scale,
|
||||
content() {
|
||||
return h("iframe", {
|
||||
return h('iframe', {
|
||||
name: Math.random().toString(36).slice(2),
|
||||
referrerpolicy: "no-referrer",
|
||||
referrerpolicy: 'no-referrer',
|
||||
frameborder: 0,
|
||||
src: url,
|
||||
style: {
|
||||
width: `${width}px`,
|
||||
height: `${height}px`
|
||||
}
|
||||
height: `${height}px`,
|
||||
},
|
||||
})
|
||||
}
|
||||
},
|
||||
})
|
||||
window.removeEventListener("message", onClose)
|
||||
window.removeEventListener('message', onClose)
|
||||
return temp
|
||||
}
|
||||
} catch (err) {
|
||||
|
||||
Reference in New Issue
Block a user