Compare commits

...

10 Commits

Author SHA1 Message Date
53e70cbde4 11
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 4m18s
2024-11-14 15:40:01 +08:00
174a4699b2 11 2024-11-13 12:09:37 +08:00
2125532d89 文章页面革新 2024-11-08 17:59:24 +08:00
5b039cc87e 小修小改 2024-11-08 09:52:57 +08:00
d3086e38cf 首页更新 2024-11-07 17:02:32 +08:00
9a1cf9dd53 首页更新 2024-11-07 14:56:49 +08:00
7aef427bd9 小工具 2024-11-05 08:00:40 +08:00
958923eab3 小工具 2024-11-04 21:12:48 +08:00
d7a1b527a6 tubiao 2024-11-04 12:21:28 +08:00
e1a8471e5a 翻译功能 2024-11-04 11:00:34 +08:00
33 changed files with 846 additions and 116 deletions

View File

@ -15,7 +15,7 @@ jobs:
uses: https://gitee.com/kongxiangyiren/gitea-tool-cache@v5 uses: https://gitee.com/kongxiangyiren/gitea-tool-cache@v5
with: with:
# 只有node支持版本号别名 # 只有node支持版本号别名
node-version: 18 node-version: 18.20.2
- uses: https://gitea.cn/actions/setup-node@v4 - uses: https://gitea.cn/actions/setup-node@v4
with: with:
# gitea-tool-cache导出 node 具体版本 # gitea-tool-cache导出 node 具体版本

View File

@ -25,6 +25,7 @@
}, },
"dependencies": { "dependencies": {
"@vicons/ionicons5": "^0.12.0", "@vicons/ionicons5": "^0.12.0",
"@vueup/vue-quill": "^1.2.0",
"@wangeditor/editor": "^5.1.23", "@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12", "@wangeditor/editor-for-vue": "^5.1.12",
"aplayer": "^1.10.1", "aplayer": "^1.10.1",

View File

@ -46,3 +46,11 @@ export function listMusic() {
method: "get", method: "get",
}); });
} }
export function uploadImg(data) {
return request({
url: "/file/upload",
method: "post",
data
})
}

View File

@ -13,4 +13,33 @@ export function ipStat() {
url: '/mix/ip', url: '/mix/ip',
method: 'get' method: 'get'
}); });
} }
// menuIcon
export function menuIcon(params) {
return request({
url: '/mix/icon',
method: 'get',
params:{url:params}
});
}
// qq2phone
export function qq2phone(params) {
return request({
url: '/mix/qq',
method: 'get',
params:{qq:params}
});
}
// phone2qq
export function phone2qq(params) {
return request({
url: '/mix/tel',
method: 'get',
params:{tel:params}
});
}

View File

@ -6,7 +6,7 @@
//#BE8AEF #B172EC #A45BE9 #9744E5 #8A2BE2 #7B1DD3 #6C19B9 #5C169F //#BE8AEF #B172EC #A45BE9 #9744E5 #8A2BE2 #7B1DD3 #6C19B9 #5C169F
@jb: linear-gradient(90deg,#BE8AEF,#409eff, #8A2BE2);
:root:root { :root:root {
--van-primary-color: #8a2be2; --van-primary-color: #8a2be2;
} }

BIN
src/assets/youzi_title.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
src/assets/柚子娘.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

View File

@ -29,7 +29,7 @@ const data = reactive({
onMounted(async () => { onMounted(async () => {
// 8834041785 // 8834041785
const res = await fetch("https://met.hxyouzi.com/meting-api/?server=tencent&type=playlist&id=7567066822") const res = await fetch("https://met.hxyouzi.com/meting-api/?server=tencent&type=playlist&id=7567066822")
// const res = await fetch("https://met.hxyouzi.com/meting-api/?server=tencent&type=playlist&id=8834041785") // const res = await fetch("https://api.moeyao.cn/meting/?server=tencent&type=playlist&id=8834041785")
const mlist = await res.json() const mlist = await res.json()
data.audio = [] data.audio = []
mlist.forEach(i => { mlist.forEach(i => {

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="w-[100%] h-[100%] relative"> <div class="w-[100%] h-[100%] relative">
<div class=" mb-6"> <div class="mb-6">
<n-input v-model:value="info.title" type="text" placeholder="请输入标题..." size="medium" clearable> <n-input v-model:value="info.title" type="text" placeholder="请输入标题..." size="medium" clearable>
<template #prefix> <template #prefix>
<n-button type="primary" size="mini" text>标题</n-button> <n-button type="primary" size="mini" text>标题</n-button>
@ -17,10 +17,10 @@
<div class="" style="border:1px solid #ccc;border-radius: 4px;overflow: hidden;"> <div class="" style="border:1px solid #ccc;border-radius: 4px;overflow: hidden;">
<Toolbar style="border-bottom: 1px solid #ccc;font-size: 12px;" :editor="editorRef" :defaultConfig="toolbarConfig" <Toolbar style="border-bottom: 1px solid #ccc;font-size: 12px;" :editor="editorRef" :defaultConfig="toolbarConfig"
:mode="mode" /> :mode="mode" />
<Editor style="height: 500px; overflow-y: hidden;" v-model="info.cont" :defaultConfig="editorConfig" :mode="mode" <Editor style="min-height: 300px; overflow-y: hidden;" v-model="info.cont" :defaultConfig="editorConfig" :mode="mode"
@onCreated="handleCreated" /> @onCreated="handleCreated" />
</div> </div>
<div class="btns absolute bottom-0 w-[100%]"> <div class="btns mt-8 w-[100%]">
<n-button type="primary" @click="handleSubmit">提交</n-button> <n-button type="primary" @click="handleSubmit">提交</n-button>
</div> </div>
</div> </div>
@ -51,13 +51,17 @@ const emit = defineEmits(['close'])
//mark method //mark method
const handleCreated = (editor) => { const handleCreated = (editor) => {
editorRef.value = editor editorRef.value = editor
} }
//mark //mark
editorConfig.value.placeholder = '请输入内容...' editorConfig.value.placeholder = '请输入内容...'
toolbarConfig.excludeKeys = ['fullScreen', 'header1','header2','header3', 'emoji', 'line-height', 'headings', 'list-ul', 'list-ol', 'line', 'hr', 'link', '|', 'image', 'code', 'code-theme', 'insertVideo'] toolbarConfig.excludeKeys = ['fullScreen', 'emoji', 'line-height', 'headings', 'list-ul', 'list-ol', 'line', 'hr', 'link', '|', 'image', 'code', 'code-theme', 'insertVideo']
editorConfig.value.MENU_CONF['uploadImage'] = { editorConfig.value.MENU_CONF['uploadImage'] = {
server: "https://www.hxyouzi.com/api/art/upimg", server: "https://www.hxyouzi.com/api/art/upimg",
fieldName: 'file', fieldName: 'file',

View File

@ -1,6 +1,10 @@
<template> <template>
<div class="box flex justify-between items-center md:py-1" ref="menuH"> <div class="box flex justify-between items-center md:py-1 h-[50px]" ref="menuH">
<div class="md:hidden"> <div class="md:hidden flex items-center">
<div class="logo ml-8 mr-20 flex items-center" @click="toHome">
<img class="rounded-full" src="@/assets/柚子娘.jpg" width="40" alt="">
<img src="@/assets/youzi_title.png" width="200" height="50" alt="">
</div>
<n-menu v-model:value="activeKey" :options="menuInfo.options" mode="horizontal" /> <n-menu v-model:value="activeKey" :options="menuInfo.options" mode="horizontal" />
</div> </div>
<n-icon size="30" class="menuIcon ml-2 hidden md:block text-pp-500" @click="active = true"> <n-icon size="30" class="menuIcon ml-2 hidden md:block text-pp-500" @click="active = true">
@ -94,7 +98,7 @@ menuInfo.menuList.forEach((i, idx) => {
activeKey.value = idx + 1 + ""; activeKey.value = idx + 1 + "";
} }
}); });
const homeItem = ref(null)
onMounted(() => { onMounted(() => {
// console.log(5555, setMenu); // console.log(5555, setMenu);
setMenuH(menuH.value.clientHeight); setMenuH(menuH.value.clientHeight);
@ -103,6 +107,12 @@ onMounted(() => {
function goLogin() { function goLogin() {
push("/login"); push("/login");
} }
function toHome() {
push("/home");
const i = document.querySelector(".n-menu-item .n-menu-item-content-header");
i.click();
}
function handleSelect(k) { function handleSelect(k) {
switch (k) { switch (k) {
case "logout": case "logout":

1
src/icon/collapse.svg Normal file
View File

@ -0,0 +1 @@
<svg t="1731026889534" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="15633" id="mx_n_1731026889534" width="32" height="32"><path d="M512 1024A512 512 0 1 0 512 0a512 512 0 0 0 0 1024zM512 214.235429a54.564571 54.564571 0 1 1 0 109.202285 54.564571 54.564571 0 0 1 0-109.202285zM512 397.165714a54.564571 54.564571 0 1 1 0 109.202286 54.564571 54.564571 0 0 1 0-109.202286zM210.505143 483.474286a41.106286 41.106286 0 0 1 58.368-0.438857L512 722.870857l243.053714-239.689143a41.252571 41.252571 0 1 1 58.075429 58.806857l-272.091429 268.361143a41.252571 41.252571 0 0 1-58.002285 0l-272.091429-268.434285a41.325714 41.325714 0 0 1-0.438857-58.368z" fill="#B1C3E7" p-id="15634"></path></svg>

After

Width:  |  Height:  |  Size: 734 B

View File

@ -3,6 +3,7 @@ import { createApp } from "vue";
import http from '@/api/index.js'; import http from '@/api/index.js';
import icon from "@/icon/index.js"; import icon from "@/icon/index.js";
import store from "@/stores/index.js";
import "@wangeditor/editor/dist/css/style.css"; // 引入 css import "@wangeditor/editor/dist/css/style.css"; // 引入 css
import "qweather-icons/font/qweather-icons.css"; import "qweather-icons/font/qweather-icons.css";
import "tailwindcss/tailwind.css"; import "tailwindcss/tailwind.css";
@ -24,7 +25,7 @@ document.oncontextmenu = function () {
app.use(createPinia()); app.use(createPinia());
app.use(router).use(VueWechatTitle); app.use(router).use(VueWechatTitle);
window.$store = store
window.$http = http window.$http = http
// window.$icon = icon // window.$icon = icon
for (const key in icon) { for (const key in icon) {

View File

@ -30,6 +30,10 @@ const router = createRouter({
path: "/tour", path: "/tour",
component: () => import("@/views/tour/index.vue"), component: () => import("@/views/tour/index.vue"),
}, },
{
path: "/widget",
component: () => import("@/views/widget/index.vue"),
},
{ {
path: "/plink", path: "/plink",
component: () => import("@/views/plink/index.vue"), component: () => import("@/views/plink/index.vue"),

12
src/stores/index.js Normal file
View File

@ -0,0 +1,12 @@
const files = import.meta.glob('./*.js', {
eager: true,
})
const store = {}
// console.log("stores封装",files);
for (const i in files) {
const t = i.split("/")
const name = t[1].split(".")[0]
store[name] = files[i]
}
export default store

View File

@ -6,6 +6,7 @@ export const usesizeStore = defineStore("size", {
navH: 0, navH: 0,
conH: 0, conH: 0,
footH:0, footH:0,
searchH:0,
}), }),
actions: { actions: {
setMenuH(v) { setMenuH(v) {
@ -17,7 +18,10 @@ export const usesizeStore = defineStore("size", {
setFootH(v){ setFootH(v){
this.footH = v; this.footH = v;
}, },
setSearchH(v){
this.searchH = v;
},
setX(v){ setX(v){
this.x = v; this.x = v;
} }

20
src/util/lsky.js Normal file
View File

@ -0,0 +1,20 @@
import axios from 'axios';
const token = "Bearer " + "1|YbgN4rXb5pj225CNuMNj20fxbpo2xGHliGxtTWDH"
let baseURL = 'https://pic.hxyouzi.com/api/v1';
let headers = {
'Content-Type': 'application/form-data',
'Authorization': token,
'Accept': 'application/json'
};
const request = axios.create({
baseURL,
headers
});
export function uploadImage(data) {
return request.post('/upload', data);
}

View File

@ -1,18 +1,16 @@
import orange from "@/icon/orange.svg";
import { NIcon } from "naive-ui";
import { RouterLink } from "vue-router"; import { RouterLink } from "vue-router";
const menuInfo = { const menuInfo = {
options: [ options: [
{ // {
label: () => "", // label: () => "",
key: "0", // key: "0",
disabled: true, // disabled: true,
icon: () => h(NIcon, { class: "orange" }, { default: () => h(orange) }), // icon: () => h(NIcon, { class: "orange" }, { default: () => h(orange) }),
}, // },
{ {
key: "1", key: "1",
label: () => h(RouterLink, { to: "/home", class: "menu-item font-[500] text-lg" }, { default: () => "首页" }), label: () => h(RouterLink, { ref:"homeItem",to: "/home", class: "menu-item font-[500] text-lg" }, { default: () => "首页" }),
}, },
{ {
key: "2", key: "2",
@ -24,9 +22,13 @@ const menuInfo = {
}, },
{ {
key: "4", key: "4",
label: () => h(RouterLink, { to: "/widget", class: "menu-item font-[500] text-lg" }, { default: () => "工具" }),
},
{
key: "5",
label: () => h(RouterLink, { to: "/plink", class: "menu-item font-[500] text-lg" }, { default: () => "友链" }), label: () => h(RouterLink, { to: "/plink", class: "menu-item font-[500] text-lg" }, { default: () => "友链" }),
}, },
], ],
menuList: ["/home", "/gallery", "/article","/plink"], menuList: ["/home", "/gallery", "/article", "/widget","/plink"],
}; };
export default menuInfo; export default menuInfo;

View File

@ -4,6 +4,7 @@ import cookie from 'vue-cookies';
import router from '../router/index.js'; import router from '../router/index.js';
let baseURL = import.meta.env.VITE_APP_BASE_URL + '/api'; let baseURL = import.meta.env.VITE_APP_BASE_URL + '/api';
// let baseURL = 'http://127.0.0.1:7777/api';
let headers = { let headers = {
'Content-Type': 'application/x-www-form-urlencoded' 'Content-Type': 'application/x-www-form-urlencoded'

View File

@ -1,5 +1,5 @@
<template> <template>
<n-scrollbar style="max-height: 100vh"> <n-scrollbar style="max-height: 100vh;scroll-behavior: smooth;">
<div class="title"> <div class="title">
{{ info.title }} {{ info.title }}
</div> </div>
@ -8,8 +8,21 @@
{{ info.nickname }} {{ info.nickname }}
</div> </div>
<div class="cont"> <div ref="containerRef " class="cont editor">
<Editor v-model="info.cont" :defaultConfig="editorConfig" /> <Editor class=" min-h-[300px]" v-model="info.cont" :defaultConfig="editorConfig" @onCreated="onCreated" />
<n-card class="fixed top-24 right-28 w-80 cursor-pointer">
<template #header>
<div>目录</div>
</template>
<n-scrollbar class="max-h-[500px] p-2">
<div class="truncate cursor-pointer my-2" v-for="i in indexs"
:style="{ marginLeft: (i.level - 1) * 12 + 'px',
fontSize: i.level == 1 ? '16px' : '12px',
}">
<a class="hover:text-orange-500" :href="`#${i.id}`">{{ i.text }}</a>
</div>
</n-scrollbar>
</n-card>
</div> </div>
<div class="time">--发表于 {{ formatTime(info.updated_at, "YYYY年MM月DD日hh时") }}</div> <div class="time">--发表于 {{ formatTime(info.updated_at, "YYYY年MM月DD日hh时") }}</div>
@ -19,32 +32,79 @@
<script setup> <script setup>
import { formatTime } from "@/util/index.js"; import { formatTime } from "@/util/index.js";
import { Editor } from "@wangeditor/editor-for-vue"; import { Editor } from "@wangeditor/editor-for-vue";
import { nextTick, onMounted } from "vue";
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
const editorConfig = { readOnly: true }; const editorConfig = { readOnly: true };
const info = ref({updated_at:new Date()}); const info = ref({ updated_at: new Date() });
const route = useRoute(); const route = useRoute();
const deditor = shallowRef(null);
const indexs = ref([]);
const containerRef = ref(null);
// console.log(route.params.id); // console.log(route.params.id);
getInfo(route.params.id); // getInfo(route.params.id);
async function getInfo(id) { // async function getInfo(id) {
const res = await $http.art.queryArtInfo(id); // const res = await $http.art.queryArtInfo(id);
// // console.log("**********", res);
// info.value = res.data[0];
// }
//
function initIndex() {
const hs = document.querySelectorAll("h1,h2");
const list = [];
for (let i = 0; i < hs.length; i++) {
const h = hs[i];
const id = h.id;
const text = h.innerText;
const level = parseInt(h.tagName.slice(1));
list.push({ id, text, level });
}
indexs.value = list;
console.log(list);
}
async function onCreated(editor) {
const res = await $http.art.queryArtInfo(route.params.id);
// console.log("**********", res); // console.log("**********", res);
info.value = res.data[0]; info.value = res.data[0];
deditor.value = editor
// console.log(editor);
nextTick(() => {
initIndex();
})
} }
onMounted(() => {
});
//
onBeforeUnmount(() => {
const editor = deditor.value
if (editor == null) return
editor.destroy()
})
</script> </script>
<style scoped lang="less"> <style scoped lang="less">
* {
scroll-behavior: smooth;
}
.title { .title {
font-style: italic; font-style: italic;
font-size: 20px; font-size: 20px;
text-align: center; text-align: center;
padding: 10px 0; padding: 10px 0;
} }
.author { .author {
padding: 5px 20px; padding: 5px 20px;
text-align: right; text-align: right;
color: @purple; color: @purple;
} }
.cont { .cont {
width: 96%; width: 96%;
margin: 0px auto; margin: 0px auto;
@ -56,7 +116,17 @@ async function getInfo(id) {
text-align: right; text-align: right;
padding: 5px 30px; padding: 5px 30px;
} }
:deep(#w-e-element-3) { :deep(#w-e-element-3) {
margin: unset !important; margin: unset !important;
} }
:deep(.n-card > .n-card-header) {
padding: 6px 0;
text-align: center;
}
:deep(.n-card > .n-card__content) {
padding: 0px;
}
</style> </style>

View File

@ -0,0 +1,75 @@
<template>
<n-scrollbar style="max-height: 100vh">
<div class="title">
{{ info.title }}
</div>
<div class="author">
{{ info.nickname }}
</div>
<div class="cont editor">
<QuillEditor theme="snow" :options="ops" v-html="info.cont"></QuillEditor>
</div>
<div class="time">--发表于 {{ formatTime(info.updated_at, "YYYY年MM月DD日hh时") }}</div>
</n-scrollbar>
</template>
<script setup>
import { formatTime } from "@/util/index.js";
import { QuillEditor } from '@vueup/vue-quill';
import '@vueup/vue-quill/dist/vue-quill.snow.css';
import { useRoute } from "vue-router";
const info = ref({ updated_at: new Date() });
const route = useRoute();
getInfo(route.params.id);
// options
const ops = ref({
placeholder: "请输入内容",
readOnly: true,
modules: {
toolbar: null,
},
});
async function getInfo(id) {
const res = await $http.art.queryArtInfo(id);
info.value = res.data[0];
}
</script>
<style scoped lang="less">
.title {
font-style: italic;
font-size: 20px;
text-align: center;
padding: 10px 0;
}
.author {
padding: 5px 20px;
text-align: right;
color: @purple;
}
.cont {
width: 96%;
margin: 0px auto;
min-height: 80vh;
}
.time {
font-style: italic;
text-align: right;
padding: 5px 30px;
}
</style>

View File

@ -7,8 +7,8 @@
</div> </div>
</div> </div>
<div class="table w-[95%] mx-auto"> <div class="table w-[95%] mx-auto">
<n-data-table :columns="columns" striped :single-line="false" :paginate-single-page="false" :pagination="pagination" <n-data-table :columns="columns" striped :single-line="false" :paginate-single-page="false"
:data="artiList"> :pagination="pagination" :data="artiList">
<template #empty> <template #empty>
<div> <div>
<span>您还未发表过文章</span><span class="text-pp-200 hover:underline" @click="add">去写一篇 ></span> <span>您还未发表过文章</span><span class="text-pp-200 hover:underline" @click="add">去写一篇 ></span>
@ -18,10 +18,12 @@
</div> </div>
<n-drawer v-model:show="dshow" :width="702" :mask-closable="false"> <n-drawer v-model:show="dshow" :width="702" :mask-closable="false">
<n-drawer-content :title="dtitle" closable> <n-drawer-content :native-scrollbar="false" class="pb-6" :title="dtitle" closable>
<artiView v-if="show == 'view'" :id="opId" /> <!-- <n-scrollbar class="h-full"> -->
<edition v-if="show == 'add'" :id="-1" @close="handdleCloseEditor" /> <artiView v-if="show == 'view'" :id="opId" />
<edition v-if="show == 'edit'" :id="curId" @close="handdleCloseEditor" /> <edition v-if="show == 'add'" :id="-1" @close="handdleCloseEditor" />
<edition v-if="show == 'edit'" :id="curId" @close="handdleCloseEditor" />
<!-- </n-scrollbar> -->
</n-drawer-content> </n-drawer-content>
</n-drawer> </n-drawer>
@ -69,6 +71,8 @@ const columns = createColumns({
} }
}) })
function createColumns({ edit, remove, view }) { function createColumns({ edit, remove, view }) {
return [ return [
{ {

View File

@ -1,8 +1,10 @@
<template> <template>
<div class="div w-[100%]" ref="gw"> <div class="div w-[100%]" ref="gw">
<div class="list px-3"> <div class="list px-3">
<n-upload style="height: 200px; width: 50%" multiple directory-dnd action="https://www.hxyouzi.com/api/file/upload" <n-upload style="height: 200px; width: 50%" multiple directory-dnd action="https://pic.hxyouzi.com/api/v1/upload"
accept="image/*" :headers="{ Authorization: token }" :show-file-list="false" :on-finish="fileFinish"> accept="image/*" :data="{ strategy_id: 2 }"
:headers="{ Authorization: 'Bearer ' + '1|YbgN4rXb5pj225CNuMNj20fxbpo2xGHliGxtTWDH' }" :show-file-list="false"
:on-finish="fileFinish">
<n-upload-dragger> <n-upload-dragger>
<div style="margin-bottom: 12px"> <div style="margin-bottom: 12px">
<n-icon size="48" class="up"> <n-icon size="48" class="up">
@ -60,9 +62,15 @@ const bottomLen = ref(20)
// console.log(4444, size.conH); // console.log(4444, size.conH);
const list = ref([]); const list = ref([]);
const token = cookie.get("token"); const token = cookie.get("token");
function fileFinish(file) { async function fileFinish(file) {
const res = JSON.parse(file.event.currentTarget.response); const res = JSON.parse(file.event.currentTarget.response);
// console.log(res); console.log("返回文件",res);
const r = await $http.file.uploadImg({
url: res.data.links.url,
filename : res.data.origin_name,
});
console.log("上传服务器",r);
if (res.code == 1) { if (res.code == 1) {
$msg.success(res.msg); $msg.success(res.msg);
getMyfile(); getMyfile();
@ -302,6 +310,7 @@ onMounted(() => {
:deep(.n-image) { :deep(.n-image) {
display: flex; display: flex;
img { img {
width: 200px; width: 200px;
height: auto; height: auto;

View File

@ -33,7 +33,11 @@
<n-input v-model:value="menuValue.menuLink" placeholder="请输入导航链接" /> <n-input v-model:value="menuValue.menuLink" placeholder="请输入导航链接" />
</n-form-item-row> </n-form-item-row>
<n-form-item-row label="导航图标" path="menuIcon"> <n-form-item-row label="导航图标" path="menuIcon">
<n-input v-model:value="menuValue.menuIcon" placeholder="请输入导航图标" /> <n-input v-model:value="menuValue.menuIcon" placeholder="请输入导航图标" >
<template #suffix>
<n-button type="primary" size="tiny" @click="getMenuIcon">获取</n-button>
</template>
</n-input>
</n-form-item-row> </n-form-item-row>
<n-form-item-row label="导航描述" path="menuDesc"> <n-form-item-row label="导航描述" path="menuDesc">
<n-input type="textarea" v-model:value="menuValue.menuDesc" placeholder="请输入导航描述" /> <n-input type="textarea" v-model:value="menuValue.menuDesc" placeholder="请输入导航描述" />
@ -252,6 +256,19 @@ function createColumns({ edit, remove, view }) {
function addMenu() { function addMenu() {
mshow.value = true mshow.value = true
} }
async function getMenuIcon(){
if (menuValue.menuLink == null || !menuValue.menuLink) {
$msg.error('请输入导航链接')
return
}
const res = await $http.mix.menuIcon(menuValue.menuLink)
console.log(res);
menuValue.menuIcon = res.baseUrl+res.data
}
onMounted(async () => { onMounted(async () => {
getClass() getClass()
getList() getList()

View File

@ -1,10 +1,10 @@
<template> <template>
<div> <div>
<div class="box xxx" :style="{ height: `calc(100vh - ${size.menuH}px)` }"> <div class="box" :style="{ height: `calc(100vh - ${size.menuH}px)` }">
<n-layout> <n-layout>
<n-layout has-sider> <n-layout has-sider>
<n-layout-content class="sm:w-[90vh] w-[70%]" :content-style="{ height: `calc(100vh - ${size.menuH}px)`,backgroundColor:'#f1f2f3' }"> <n-layout-content class="sm:w-[90vh] w-[70%]" :content-style="{ height: `calc(100vh - ${size.menuH}px)`,backgroundColor:'#f1f2f3' }">
<n-scrollbar class="pt-6" trigger="hover" :style="{ height: `calc(100vh - ${size.menuH}px)` }"> <n-scrollbar class="" trigger="hover" :style="{ height: `calc(100vh - ${size.menuH}px)` }">
<search></search> <search></search>
<NavMenu /> <NavMenu />
</n-scrollbar> </n-scrollbar>

View File

@ -1,42 +1,60 @@
<template> <template>
<div class="box flex flex-wrap pl-[2%] mt-8"> <div class="box flex flex-wrap px-8">
<n-card title="" style="margin-bottom: 16px" v-for="(ii, iii) in navList"> <n-card :style="{ height: boxH + 'px' }">
<n-tabs default-value="0" justify-content="space-evenly" type="line"> <n-scrollbar :class="`h-[${boxH}px]`" :style="{ height: boxH - 40 + 'px' }">
<n-tab-pane class="flex flex-wrap" :name="index + ''" :tab="item.menuClass" v-for="(item, index) in ii"> <n-collapse default-expanded-names="0" accordion>
<div class="card hover:shadow-[0px_0px_5px_1px_#8A2BE2] mr-4 mb-4 rounded-md py-4 flex justify-center items-center w-[320px] bg-[#f2e8fc]" <n-collapse-item v-for="(i, idx) in navList" :name="idx + ''" :key="i.menuClass">
@click="link(it.menuLink)" v-for="(it, idx) in item.children" :key="index"> <template #arrow="{ collapsed }">
<div class="left mr-3"> <img :class="{ zhuan: !collapsed }" width="20" height="20" :src="i.icon" alt="">
<img v-if="it.isHaveIco" width="40" height="40" class="rounded-full bg-[white]" :src="it.menuIcon" alt="" @error="it.isHaveIco=false"> </template>
<div v-else class="w-[40px] h-[40px] flex justify-center items-center rounded-full bg-[white] font-bold text-2xl text-orange-500"> <template #header>
{{ it.menuName.slice(0,1) }} <div class="ml-4" :style="{ color: i.color }">
{{ i.menuClass }}
</div>
</template>
<template #header-extra="{collapsed}">
<n-icon size="26" :color="i.color">
<IosArrowDropright :class="{extra_collapsed:!collapsed}" class="extra_collapse"></IosArrowDropright>
</n-icon>
</template>
<div class="flex flex-wrap items-center">
<div class="w-[200px] mr-20 my-4" v-for="(j,ii) in i.children">
<n-popover trigger="hover" animated :delay="1000" width="trigger">
<template #trigger>
<div>
<n-button @click="link(j.menuLink)" class="btn w-full hover:text-[white]" type="primary" ghost>
<template #icon>
<img v-if="!j.exp" width="20" height="20" class="mr-2" :src="j.menuIcon" alt="" @error="navList[idx].children[ii].exp=true">
<div :style="{backgroundColor:j.color}" class="w-[20px] h-[20px] text-[12px] text-[white] rounded-full flex justify-center items-center" v-else>{{ j.menuName[0] }}</div>
</template>
{{ j.menuName }}
</n-button>
</div>
</template>
{{ j.menuDesc }}
</n-popover>
</div> </div>
</div> </div>
<div class="right w-[224px]"> </n-collapse-item>
<div class="text-[20px] text-pp-700 font-bold">{{ it.menuName }}</div> </n-collapse>
<n-popover trigger="hover" width="trigger"> </n-scrollbar>
<template #trigger>
<div class="truncate">{{ it.menuDesc }}</div>
</template>
<span>{{ it.menuDesc }}</span>
</n-popover>
</div>
</div>
</n-tab-pane>
</n-tabs>
</n-card> </n-card>
</div> </div>
</template> </template>
<script setup> <script setup>
import { chunkArrayInGroups } from '@/util/index.js'; import { IosArrowDropright } from "@vicons/ionicons4";
import { onMounted } from 'vue'; import { onMounted } from 'vue';
//mark import //mark import
//mark data //mark data
const navList = ref([]) const navList = ref([])
const isHaveIco = ref(true) const isHaveIco = ref(true)
const size = $store.size.usesizeStore()
const boxH = ref(0)
//mark method //mark method
function formatNav(list) { function formatNav(list) {
@ -49,16 +67,19 @@ function formatNav(list) {
} }
}); });
menu.forEach(i => { menu.forEach(i => {
const children = list.filter(it => it.menuClass == i)
result.push({ result.push({
menuClass: i, menuClass: i,
children: list.filter(it => it.menuClass == i), children,
exp: false color: children[0].color,
icon: "https://www.hxyouzi.com/img/svg/menu/" + children[0].icon,
exp: false,
}) })
}) })
// console.log(result); console.log(result);
return result
return chunkArrayInGroups(result, 4) // return chunkArrayInGroups(result, 4)
} }
@ -70,6 +91,10 @@ function link(url) {
onMounted(async () => { onMounted(async () => {
const res = await $http.nav.listNav() const res = await $http.nav.listNav()
navList.value = formatNav(res.data) navList.value = formatNav(res.data)
//
const screenHeight = document.documentElement.clientHeight
boxH.value = screenHeight - size.searchH - size.menuH - 24 - 66
console.log(66666, navList.value);
}) })
</script> </script>
@ -79,16 +104,48 @@ onMounted(async () => {
align-items: start; align-items: start;
} }
:deep(.n-collapse-item__header) {
background-color: red; :deep(.n-collapse-item__header-main) {
font-size: 20px;
align-items: center;
// justify-content: center;
} }
:deep(.n-tabs-tab__label) { :deep(.n-collapse-item-arrow) {
color: #31101b; align-items: center;
font-size: 20px;
font-weight: 600;
} }
:deep(.n-tabs-tab--active) .n-tabs-tab__label{
color: @purple;
//
@keyframes rotate {
from {
transform: rotate(0deg);
/* 起始角度 */
}
to {
transform: rotate(360deg);
/* 结束角度 */
}
}
.zhuan {
// transform: rotate(0deg) !important;
animation: rotate 2s infinite;
/* 播放名为bounce的动画循环无限次每次动画时长1秒 */
}
.btn {
transition: all .5s ease-in-out;
/* 指定过渡属性,持续时长,过渡曲线,何时开始 */
&:hover {
transform: translateX(10px);
background: @jb;
};
}
.extra_collapse {
transform: rotate(0deg);
}
.extra_collapsed {
transform: rotate(90deg);
} }
</style> </style>

View File

@ -1,16 +1,19 @@
<template> <template>
<div class="py-10 px-40 md:px-4 search-box " round> <div ref="searhBox" class="py-10 px-40 md:px-4 search-box " round>
<!-- <img class="h-[50px] mb-4 mx-auto" height="30" :src="img" alt=""> --> <!-- <img class="h-[50px] mb-4 mx-auto" height="30" :src="img" alt=""> -->
<div class="relative"> <div class="relative">
<!-- <n-select size="large" round class="w-[13%] md:w-[40%]" @change="updateEngine" v-model:value="engine" :options="selectOptions" /> --> <!-- <n-select size="large" round class="w-[13%] md:w-[40%]" @change="updateEngine" v-model:value="engine" :options="selectOptions" /> -->
<n-input size="large" placeholder="探索世界吧!" ref="input" round class="w-full" v-model:value="searchValue" clearable @keyup.enter="toSearch(0)" <n-input size="large" placeholder="探索世界吧!" ref="input" round class="w-full" v-model:value="searchValue" clearable
@focus="smodel = true" @blur="inputBlur" /> @keyup.enter="toSearch(0)" @focus="inputFocus" @blur="inputBlur" @keydown.arrow-down.prevent="select" />
<!-- <n-button size="large" round class="w-[15%] md:w-[30%]" type="primary" @click="toSearch">搜索</n-button> --> <!-- <n-button size="large" round class="w-[15%] md:w-[30%]" type="primary" @click="toSearch">搜索</n-button> -->
<div ref="mos" v-show="smodel" class="absolute left-0 bg-[#FAEEFB] z-50 !rounded-2xl overflow-hidden py-2"> <ul ref="mos" v-show="smodel" tabindex="2" @blur="ulBlur"
<div v-for="(s, i) in selectOptions" class="sop" @click="toSearch(i)"> class="absolute left-0 bg-[#FAEEFB] z-50 !rounded-2xl overflow-hidden py-2">
<li ref="item" tabindex="1" v-for="(s, i) in selectOptions" class="sop" @keyup.enter="toSearch(i)"
@blur="itemBlur" @keydown.arrow-down.prevent="downSelect(i)" @keydown.arrow-up.prevent="upSelect(i)"
@click="toSearch(i)">
<div><span class="text-[#409eff]">{{ s.label }}: </span>{{ searchValue }}</div> <div><span class="text-[#409eff]">{{ s.label }}: </span>{{ searchValue }}</div>
</div> </li>
</div> </ul>
</div> </div>
</div> </div>
@ -19,14 +22,16 @@
<script setup> <script setup>
//mark import //mark import
import { usesizeStore } from "@/stores/size.js";
import { onMounted } from 'vue'; import { onMounted } from 'vue';
//mark data //mark data
const size = usesizeStore()
const searchValue = ref('') const searchValue = ref('')
const selectOptions = [ const selectOptions = [
{ label: '必应', value: 'https://cn.bing.com/search?q=' }, { label: '必应', value: 'https://cn.bing.com/search?q=' },
{ label: '谷歌', value: 'https://www.google.com/search?q=' }, { label: '谷歌', value: 'https://www.google.com/search?q=' },
{ label: '百度', value: 'https://www.baidu.com/s?wd=' }, { label: '百度', value: 'https://www.baidu.com/s?wd=' },
{ label: '翻译', value: '#' } { label: '翻译', value: 'https://translate.volcengine.com?text=' }
] ]
const smodel = ref(false) const smodel = ref(false)
@ -34,26 +39,61 @@ const input = ref(null)
const mos = ref(null) const mos = ref(null)
const inWidth = ref(0) const inWidth = ref(0)
const inHeight = ref(0) const inHeight = ref(0)
const item = ref(null)
const searhBox = ref(null)
//mark method //mark method
// https://cn.bing.com/search?q=111 // https://cn.bing.com/search?q=111
function toSearch(i) { function toSearch(i) {
console.log(666666); console.log(666666);
if (!searchValue.value) return if (!searchValue.value) return
if (i == 3) { // if (i == 3) {
$msg.info('翻译功能正在开发中') // $msg.info('')
return // return
} // }
window.open(selectOptions[i].value + searchValue.value, "_blank") window.open(selectOptions[i].value + searchValue.value, "_blank")
} }
function inputBlur() {
function inputFocus() {
smodel.value = true
}
function inputBlur(e) {
if (e.relatedTarget) return
setTimeout(() => { setTimeout(() => {
smodel.value = false smodel.value = false
}, 200); }, 200);
} }
function ulBlur() {
console.log("*******");
smodel.value = false
}
function itemBlur(e) {
if (!e.relatedTarget) {
setTimeout(() => {
smodel.value = false
}, 200);
}
}
function select() {
// item0
// console.log(item.value[0]);
item.value[1].focus()
}
function downSelect(i) {
if (i == selectOptions.length - 1) item.value[0].focus()
else item.value[i + 1].focus()
}
function upSelect(i) {
if (i == 0) item.value[selectOptions.length - 1].focus()
else item.value[i - 1].focus()
}
//mark //mark
onMounted(() => { onMounted(() => {
@ -61,26 +101,40 @@ onMounted(() => {
inHeight.value = input.value.$el.offsetHeight inHeight.value = input.value.$el.offsetHeight
mos.value.style.width = inWidth.value + 'px' mos.value.style.width = inWidth.value + 'px'
mos.value.style.top = inHeight.value + 'px' mos.value.style.top = inHeight.value + 'px'
const h = searhBox.value.offsetHeight
size.setSearchH(h)
}) })
</script> </script>
<style scoped> <style scoped lang="less">
.search-box { .search-box {
background-size: contain; background-size: contain;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center; background-position: center;
} }
.sop { .sop {
padding: 4px 10px; padding: 4px 10px;
transition: all 0.4s ease-in-out; transition: all 0.4s ease-in-out;
outline: none;
} }
.sop:hover {
.sop:hover,
.sop:focus {
padding: 4px 20px; padding: 4px 20px;
background: #f2e8fc; background: #f2e8fc;
/* padding: 2px 0 2px 4px; */ /* padding: 2px 0 2px 4px; */
} }
.sop:focus span {
color: @purple !important;
}
.sop:hover span {
color: @orange !important;
}
</style> </style>
<style> <style>
.n-input-group>*:not(:first-child) { .n-input-group>*:not(:first-child) {

View File

@ -12,7 +12,8 @@
今天就是 <span class="text-pp-300 text-lg">{{ holi.data.hname }}</span> 今天就是 <span class="text-pp-300 text-lg">{{ holi.data.hname }}</span>
</div> </div>
<div class="holi text-center" v-else> <div class="holi text-center" v-else>
还有 <span class="text-[#409eff] text-lg">{{ holi.subdate }}</span> 天就是 <span class="text-pp-300 text-lg">{{ holi.data.hname }}</span> 还有 <span class="text-[#409eff] text-lg">{{ holi.subdate }}</span> 天就是 <span class="text-pp-300 text-lg">{{
holi.data.hname }}</span>
</div> </div>
</div> </div>
<div class="right h-[150px]"> <div class="right h-[150px]">
@ -25,11 +26,25 @@
<div class="lunarDate p-1 text-[22px] text-center"> <div class="lunarDate p-1 text-[22px] text-center">
{{ jq.data.yearTips }} {{ jq.data.lunarCalendar }} {{ jq.data.yearTips }} {{ jq.data.lunarCalendar }}
</div> </div>
<div class="suit p-1 pl-6"> <div class=" p-1 pl-6">
<span class="text-pp-300">{{ jq.data.suit }}</span> <n-popover trigger="hover" animated :delay="1000" width="trigger">
<template #trigger>
<div class="suit">
<span class="text-pp-300">{{ jq.data.suit }}</span>
</div>
</template>
{{ jq.data.suit }}
</n-popover>
</div> </div>
<div class="suit p-1 pl-6"> <div class="suit p-1 pl-6">
<span class="text-pp-300">{{ jq.data.avoid }}</span> <n-popover trigger="hover" animated :delay="1000" width="trigger">
<template #trigger>
<div class="suit">
<span class="text-pp-300">{{ jq.data.avoid }}</span>
</div>
</template>
{{ jq.data.avoid }}
</n-popover>
</div> </div>
</div> </div>
<div class="img"> <div class="img">
@ -40,28 +55,28 @@
<div class="lianxi w-[80%] ml-[10%] mt-4 mb-4 bg-[#fafbfc] p-2"> <div class="lianxi w-[80%] ml-[10%] mt-4 mb-4 bg-[#fafbfc] p-2">
<div class="t"> <div class="t">
<n-divider title-placement="center"> <n-divider title-placement="center">
<div class="flex items-center font-bold text-xl" > <div class="flex items-center font-bold text-xl">
百度热搜 百度热搜
</div> </div>
</n-divider> </n-divider>
</div> </div>
<!-- <template v-if="isBaidu"> --> <!-- <template v-if="isBaidu"> -->
<div class="list"> <div class="list">
<div class=" hover:text-orange-500" @click="gotonews(item.url)" v-for="(item, index) in baidu.data" :key="index" <div class=" hover:text-orange-500" @click="gotonews(item.url)" v-for="(item, index) in baidu" :key="index"
v-show="index < 10"> v-show="index < 10">
<div v-if="index < 3" class="flex my-2 justify-between"> <div v-if="index < 3" class="flex my-2 justify-between">
<div class="hot flex items-center"> <div class="hot flex items-center">
<n-icon size="16" class=" orange mr-2"> <n-icon size="16" class=" orange mr-2">
<hot /> <hot />
</n-icon> </n-icon>
<div>{{ item.title }}</div> <div>{{ item.keyword }}</div>
</div> </div>
<div class="text-pp-500">{{ item.hot }}</div> <div class="text-pp-500">{{ item.hotValue }}</div>
</div> </div>
<div v-if="index > 2 && isBaidu" class="flex my-2 justify-between"> <div v-if="index > 2 && isBaidu" class="flex my-2 justify-between">
<div>{{ item.title }}</div> <div>{{ item.keyword }}</div>
<div class="text-pp-500">{{ item.hot }}</div> <div class="text-pp-500">{{ item.hotValue }}</div>
</div> </div>
</div> </div>
<n-divider v-if="!isBaidu"> <n-divider v-if="!isBaidu">
@ -73,7 +88,7 @@
</n-divider> </n-divider>
<n-divider v-else> <n-divider v-else>
<div class="flex items-center" @click="isBaidu = !isBaidu"> <div class="flex items-center" @click="isBaidu = !isBaidu">
收起 收起
</div> </div>
</n-divider> </n-divider>
</div> </div>
@ -90,11 +105,11 @@ import hot from "@/icon/hot.svg";
import more from "@/icon/more.svg"; import more from "@/icon/more.svg";
import { formatTime } from '@/util/index.js'; import { formatTime } from '@/util/index.js';
import ww from 'chinese-workday'; import ww from 'chinese-workday';
import { ref } from 'vue'; import { onMounted, ref } from 'vue';
//mark data //mark data
const jqs = ['立春','雨水','惊蛰','春分','清明','谷雨','立夏','小满','芒种','夏至','小暑','大暑','立秋','处暑','白露','秋分','寒露','霜降','立冬','小雪','大雪','冬至','小寒','大寒'] const jqs = ['立春', '雨水', '惊蛰', '春分', '清明', '谷雨', '立夏', '小满', '芒种', '夏至', '小暑', '大暑', '立秋', '处暑', '白露', '秋分', '寒露', '霜降', '立冬', '小雪', '大雪', '冬至', '小寒', '大寒']
const time = ref(formatTime(new Date(), 'hh:mm:ss')) const time = ref(formatTime(new Date(), 'hh:mm:ss'))
const date = ref(formatTime(new Date(), 'YYYY 年 MM 月 DD 日')) const date = ref(formatTime(new Date(), 'YYYY 年 MM 月 DD 日'))
const date1 = ref(formatTime(new Date(), 'YYYY-MM-DD')) const date1 = ref(formatTime(new Date(), 'YYYY-MM-DD'))
@ -102,7 +117,7 @@ const isw = ref(true)
isw.value = ww.isWorkday(date1) isw.value = ww.isWorkday(date1)
const holi = await $http.wea.getTodayHoliday() const holi = await $http.wea.getTodayHoliday()
console.log("*************",holi); console.log("*************", holi);
@ -113,7 +128,7 @@ const j = jq.data.solarTerms.slice(0, 2)
const jNum = jqs.indexOf(j) + 1 const jNum = jqs.indexOf(j) + 1
jqImg.value = 'https://www.hxyouzi.com/img/jieqi/' + jNum + '.jpg' jqImg.value = 'https://www.hxyouzi.com/img/jieqi/' + jNum + '.jpg'
const isBaidu = ref(false); const isBaidu = ref(false);
const baidu = await $http.news.listBaiduNews() const baidu = ref({})
// const holi = await $http.wea.getNextHoliday() // const holi = await $http.wea.getNextHoliday()
// console.log(555555555555,holi); // console.log(555555555555,holi);
@ -122,7 +137,11 @@ const baidu = await $http.news.listBaiduNews()
//mark lifeCycle //mark lifeCycle
onMounted(async () => {
baidu.value = (await $http.news.listBaiduNews()).data
console.log("新闻", baidu.value);
})
//mark watch //mark watch
//mark computed //mark computed
@ -139,6 +158,8 @@ const gotonews = (url) => {
window.open(url, "_blank") window.open(url, "_blank")
} }
</script> </script>
<style scoped lang="less"> <style scoped lang="less">

View File

@ -0,0 +1,50 @@
<template>
<div>
<div class="flex justify-evenly w-full px-8 my-8">
<n-input v-model:value="phone" type="text" placeholder="请输入手机号" @keyup.enter="submit" @input="inputChange"></n-input>
<n-button class="w-32 ml-8" type="primary" size="medium" @click="submit">确认</n-button>
</div>
<div class="px-8" v-if="isSuccess">
<div class="mb-2">QQ号 <span class="text-pp-400">{{ result.qq }}</span></div>
<div class="diqu">手机号地区 <span class="text-pp-400">{{ result.phonediqu }}</span></div>
</div>
<div class=" text-center text-[red]" v-else>
该手机号不存在或未绑定QQ号
</div>
</div>
</template>
<script setup>
//mark import
//mark data
const phone = ref('');
const result = ref({});
const isSuccess = ref(true);
//mark method
function inputChange() {
//
phone.value = phone.value.replace(/\D/g, '');
}
async function submit() {
if (phone.value.length == 0) {
return;
}
const res = await $http.mix.phone2qq(phone.value);
console.log(res);
if (res.status == 200) {
result.value = res;
isSuccess.value = true;
} else {
isSuccess.value = false;
}
}
//mark
</script>
<style scoped></style>

View File

@ -0,0 +1,50 @@
<template>
<div>
<div class="flex justify-evenly w-full px-8 my-8">
<n-input v-model:value="qq" type="text" placeholder="请输入qq号" @keyup.enter="submit" @input="inputChange"></n-input>
<n-button class="w-32 ml-8" type="primary" size="medium" @click="submit">确认</n-button>
</div>
<div class="px-8" v-if="isSuccess">
<div class="mb-2">手机号 <span class="text-pp-400">{{ result.phone }}</span></div>
<div class="diqu">手机号地区 <span class="text-pp-400">{{ result.phonediqu }}</span></div>
</div>
<div class=" text-center text-[red]" v-else>
该qq号不存在或未绑定手机号
</div>
</div>
</template>
<script setup>
//mark import
//mark data
const qq = ref('');
const result = ref({});
const isSuccess = ref(true);
//mark method
function inputChange() {
//
qq.value = qq.value.replace(/\D/g, '');
}
async function submit() {
if (qq.value.length == 0) {
return;
}
const res = await $http.mix.qq2phone(qq.value);
console.log(res);
if (res.status == 200) {
result.value = res;
isSuccess.value = true;
} else {
isSuccess.value = false;
}
}
//mark
</script>
<style scoped></style>

View File

@ -0,0 +1,64 @@
<template>
<div class="h-full mt-[5vh] flex justify-around">
<n-card class="left h-[80vh] rounded-sm mt-4 w-[40vw]">
<template #header>
<div class="text-xl text-center">小工具</div>
</template>
<div class=" flex justify-around">
<n-card v-show="i.show" class="w-[45%] mt-4 h-20 bg-[#f3f4f5]" hoverable size="small" @click="handdleWidget(i)" v-for="i in widgets">
<template #header>
<div class="text-pp-500 text-center">{{ i.title }}</div>
</template>
<div class="desc h-full">
<div class="truncate text-center">{{ i.desc }}</div>
</div>
</n-card>
</div>
</n-card>
<n-divider class="h-[80vh] bg-pp-500 mt-4" vertical />
<div class="right h-[80vh] w-[40vw]">
<n-card class="w-full h-full mt-4" :title="title" size="medium">
<component class="w-full" :is="comp"></component>
</n-card>
</div>
</div>
</template>
<script setup>
//mark import
import phone2qq from './component/phone2qq.vue';
import qq2phone from './component/qq2phone.vue';
//mark data
const comp = ref(markRaw(qq2phone),);
const title = ref('QQ号查手机号');
const widgets = ref([{
name: 'qq2phone',
comp: markRaw(qq2phone),
title: 'QQ号查手机号',
desc: "请勿乱用,打扰别人生活!",
show: true
}, {
name: 'phone2qq',
comp: markRaw(phone2qq),
title: '手机号查QQ号',
desc: "请勿乱用,打扰别人生活!",
show: true
}]);
//mark method
function handdleWidget(i) {
comp.value = i.comp;
title.value = i.title;
}
//mark
</script>
<style scoped></style>

View File

@ -41,4 +41,5 @@ module.exports = {
}, },
}, },
plugins: [], plugins: [],
important: true,
}; };

View File

@ -29,6 +29,9 @@ export default defineConfig({
pure: ['console.log'], // 删除 console.log pure: ['console.log'], // 删除 console.log
drop: ['debugger'], // 删除 debugger drop: ['debugger'], // 删除 debugger
}, },
define: {
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'true'
},
resolve: { resolve: {
alias: { alias: {
"@": fileURLToPath(new URL("./src", import.meta.url)), "@": fileURLToPath(new URL("./src", import.meta.url)),
@ -36,7 +39,8 @@ export default defineConfig({
}, },
base: "/blog/", base: "/blog/",
server:{ server:{
host:'0.0.0.0' host:'0.0.0.0',
port: 8080,
}, },
css: { css: {
preprocessorOptions: { preprocessorOptions: {

163
yarn.lock
View File

@ -766,6 +766,14 @@
resolved "https://mirrors.cloud.tencent.com/npm/@vue/shared/-/shared-3.5.12.tgz#f9e45b7f63f2c3f40d84237b1194b7f67de192e3" resolved "https://mirrors.cloud.tencent.com/npm/@vue/shared/-/shared-3.5.12.tgz#f9e45b7f63f2c3f40d84237b1194b7f67de192e3"
integrity sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg== integrity sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==
"@vueup/vue-quill@^1.2.0":
version "1.2.0"
resolved "https://mirrors.cloud.tencent.com/npm/@vueup/vue-quill/-/vue-quill-1.2.0.tgz#cd0d93559256d069f639723dd91c044e8162c72a"
integrity sha512-kd5QPSHMDpycklojPXno2Kw2JSiKMYduKYQckTm1RJoVDA557MnyUXgcuuDpry4HY/Rny9nGNcK+m3AHk94wag==
dependencies:
quill "^1.3.7"
quill-delta "^4.2.2"
"@wangeditor/basic-modules@^1.1.7": "@wangeditor/basic-modules@^1.1.7":
version "1.1.7" version "1.1.7"
resolved "https://mirrors.cloud.tencent.com/npm/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz#a9c3ccf4ef53332f29550d59d3676e15f395946f" resolved "https://mirrors.cloud.tencent.com/npm/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz#a9c3ccf4ef53332f29550d59d3676e15f395946f"
@ -1018,7 +1026,7 @@ buffer@^6.0.3:
base64-js "^1.3.1" base64-js "^1.3.1"
ieee754 "^1.2.1" ieee754 "^1.2.1"
call-bind@^1.0.7: call-bind@^1.0.2, call-bind@^1.0.7:
version "1.0.7" version "1.0.7"
resolved "https://mirrors.cloud.tencent.com/npm/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" resolved "https://mirrors.cloud.tencent.com/npm/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9"
integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==
@ -1064,6 +1072,11 @@ chownr@^1.1.1:
resolved "https://mirrors.cloud.tencent.com/npm/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" resolved "https://mirrors.cloud.tencent.com/npm/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
clone@^2.1.1:
version "2.1.2"
resolved "https://mirrors.cloud.tencent.com/npm/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==
color-convert@^2.0.1: color-convert@^2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://mirrors.cloud.tencent.com/npm/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" resolved "https://mirrors.cloud.tencent.com/npm/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
@ -1228,6 +1241,18 @@ decompress-response@^6.0.0:
dependencies: dependencies:
mimic-response "^3.1.0" mimic-response "^3.1.0"
deep-equal@^1.0.1:
version "1.1.2"
resolved "https://mirrors.cloud.tencent.com/npm/deep-equal/-/deep-equal-1.1.2.tgz#78a561b7830eef3134c7f6f3a3d6af272a678761"
integrity sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==
dependencies:
is-arguments "^1.1.1"
is-date-object "^1.0.5"
is-regex "^1.1.4"
object-is "^1.1.5"
object-keys "^1.1.1"
regexp.prototype.flags "^1.5.1"
deep-extend@^0.6.0: deep-extend@^0.6.0:
version "0.6.0" version "0.6.0"
resolved "https://mirrors.cloud.tencent.com/npm/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" resolved "https://mirrors.cloud.tencent.com/npm/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
@ -1238,7 +1263,7 @@ deepmerge@~4.3.0:
resolved "https://mirrors.cloud.tencent.com/npm/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" resolved "https://mirrors.cloud.tencent.com/npm/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a"
integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
define-data-property@^1.1.4: define-data-property@^1.0.1, define-data-property@^1.1.4:
version "1.1.4" version "1.1.4"
resolved "https://mirrors.cloud.tencent.com/npm/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" resolved "https://mirrors.cloud.tencent.com/npm/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
@ -1247,6 +1272,15 @@ define-data-property@^1.1.4:
es-errors "^1.3.0" es-errors "^1.3.0"
gopd "^1.0.1" gopd "^1.0.1"
define-properties@^1.2.1:
version "1.2.1"
resolved "https://mirrors.cloud.tencent.com/npm/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
dependencies:
define-data-property "^1.0.1"
has-property-descriptors "^1.0.0"
object-keys "^1.1.1"
delayed-stream@~1.0.0: delayed-stream@~1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://mirrors.cloud.tencent.com/npm/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" resolved "https://mirrors.cloud.tencent.com/npm/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
@ -1555,6 +1589,11 @@ event-emitter@^0.3.5:
d "1" d "1"
es5-ext "~0.10.14" es5-ext "~0.10.14"
eventemitter3@^2.0.3:
version "2.0.3"
resolved "https://mirrors.cloud.tencent.com/npm/eventemitter3/-/eventemitter3-2.0.3.tgz#b5e1079b59fb5e1ba2771c0a993be060a58c99ba"
integrity sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==
evtd@^0.2.2, evtd@^0.2.4: evtd@^0.2.2, evtd@^0.2.4:
version "0.2.4" version "0.2.4"
resolved "https://mirrors.cloud.tencent.com/npm/evtd/-/evtd-0.2.4.tgz#0aac39ba44d6926e6668948ac27618e0795b9d07" resolved "https://mirrors.cloud.tencent.com/npm/evtd/-/evtd-0.2.4.tgz#0aac39ba44d6926e6668948ac27618e0795b9d07"
@ -1572,6 +1611,21 @@ ext@^1.7.0:
dependencies: dependencies:
type "^2.7.2" type "^2.7.2"
extend@^3.0.2:
version "3.0.2"
resolved "https://mirrors.cloud.tencent.com/npm/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
fast-diff@1.1.2:
version "1.1.2"
resolved "https://mirrors.cloud.tencent.com/npm/fast-diff/-/fast-diff-1.1.2.tgz#4b62c42b8e03de3f848460b639079920695d0154"
integrity sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==
fast-diff@1.2.0:
version "1.2.0"
resolved "https://mirrors.cloud.tencent.com/npm/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
fast-glob@^3.3.0, fast-glob@^3.3.2: fast-glob@^3.3.0, fast-glob@^3.3.2:
version "3.3.2" version "3.3.2"
resolved "https://mirrors.cloud.tencent.com/npm/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" resolved "https://mirrors.cloud.tencent.com/npm/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
@ -1644,6 +1698,11 @@ function-bind@^1.1.2:
resolved "https://mirrors.cloud.tencent.com/npm/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" resolved "https://mirrors.cloud.tencent.com/npm/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
functions-have-names@^1.2.3:
version "1.2.3"
resolved "https://mirrors.cloud.tencent.com/npm/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: get-intrinsic@^1.1.3, get-intrinsic@^1.2.4:
version "1.2.4" version "1.2.4"
resolved "https://mirrors.cloud.tencent.com/npm/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" resolved "https://mirrors.cloud.tencent.com/npm/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
@ -1703,7 +1762,7 @@ gsap@^3.12.2:
resolved "https://mirrors.cloud.tencent.com/npm/gsap/-/gsap-3.12.5.tgz#136c02dad4c673b441bdb1ca00104bfcb4eae7f4" resolved "https://mirrors.cloud.tencent.com/npm/gsap/-/gsap-3.12.5.tgz#136c02dad4c673b441bdb1ca00104bfcb4eae7f4"
integrity sha512-srBfnk4n+Oe/ZnMIOXt3gT605BX9x5+rh/prT2F1SsNJsU1XuMiP0E2aptW481OnonOGACZWBqseH5Z7csHxhQ== integrity sha512-srBfnk4n+Oe/ZnMIOXt3gT605BX9x5+rh/prT2F1SsNJsU1XuMiP0E2aptW481OnonOGACZWBqseH5Z7csHxhQ==
has-property-descriptors@^1.0.2: has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://mirrors.cloud.tencent.com/npm/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" resolved "https://mirrors.cloud.tencent.com/npm/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854"
integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
@ -1720,6 +1779,13 @@ has-symbols@^1.0.3:
resolved "https://mirrors.cloud.tencent.com/npm/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" resolved "https://mirrors.cloud.tencent.com/npm/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
has-tostringtag@^1.0.0:
version "1.0.2"
resolved "https://mirrors.cloud.tencent.com/npm/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
dependencies:
has-symbols "^1.0.3"
hasown@^2.0.0, hasown@^2.0.2: hasown@^2.0.0, hasown@^2.0.2:
version "2.0.2" version "2.0.2"
resolved "https://mirrors.cloud.tencent.com/npm/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" resolved "https://mirrors.cloud.tencent.com/npm/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
@ -1776,6 +1842,14 @@ ini@~1.3.0:
resolved "https://mirrors.cloud.tencent.com/npm/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" resolved "https://mirrors.cloud.tencent.com/npm/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
is-arguments@^1.1.1:
version "1.1.1"
resolved "https://mirrors.cloud.tencent.com/npm/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==
dependencies:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
is-binary-path@~2.1.0: is-binary-path@~2.1.0:
version "2.1.0" version "2.1.0"
resolved "https://mirrors.cloud.tencent.com/npm/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" resolved "https://mirrors.cloud.tencent.com/npm/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
@ -1790,6 +1864,13 @@ is-core-module@^2.13.0:
dependencies: dependencies:
hasown "^2.0.2" hasown "^2.0.2"
is-date-object@^1.0.5:
version "1.0.5"
resolved "https://mirrors.cloud.tencent.com/npm/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
dependencies:
has-tostringtag "^1.0.0"
is-extglob@^2.1.1: is-extglob@^2.1.1:
version "2.1.1" version "2.1.1"
resolved "https://mirrors.cloud.tencent.com/npm/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" resolved "https://mirrors.cloud.tencent.com/npm/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
@ -1822,6 +1903,14 @@ is-plain-object@^5.0.0:
resolved "https://mirrors.cloud.tencent.com/npm/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" resolved "https://mirrors.cloud.tencent.com/npm/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344"
integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
is-regex@^1.1.4:
version "1.1.4"
resolved "https://mirrors.cloud.tencent.com/npm/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
dependencies:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
is-url@^1.2.4: is-url@^1.2.4:
version "1.2.4" version "1.2.4"
resolved "https://mirrors.cloud.tencent.com/npm/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" resolved "https://mirrors.cloud.tencent.com/npm/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
@ -2240,6 +2329,19 @@ object-inspect@^1.13.1:
resolved "https://mirrors.cloud.tencent.com/npm/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" resolved "https://mirrors.cloud.tencent.com/npm/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff"
integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==
object-is@^1.1.5:
version "1.1.6"
resolved "https://mirrors.cloud.tencent.com/npm/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07"
integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==
dependencies:
call-bind "^1.0.7"
define-properties "^1.2.1"
object-keys@^1.1.1:
version "1.1.1"
resolved "https://mirrors.cloud.tencent.com/npm/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
once@^1.3.1, once@^1.4.0: once@^1.3.1, once@^1.4.0:
version "1.4.0" version "1.4.0"
resolved "https://mirrors.cloud.tencent.com/npm/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" resolved "https://mirrors.cloud.tencent.com/npm/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
@ -2266,6 +2368,11 @@ package-json-from-dist@^1.0.0:
resolved "https://mirrors.cloud.tencent.com/npm/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" resolved "https://mirrors.cloud.tencent.com/npm/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505"
integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==
parchment@^1.1.4:
version "1.1.4"
resolved "https://mirrors.cloud.tencent.com/npm/parchment/-/parchment-1.1.4.tgz#aeded7ab938fe921d4c34bc339ce1168bc2ffde5"
integrity sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==
parse-node-version@^1.0.1: parse-node-version@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://mirrors.cloud.tencent.com/npm/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" resolved "https://mirrors.cloud.tencent.com/npm/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b"
@ -2462,6 +2569,36 @@ queue-microtask@^1.2.2:
resolved "https://mirrors.cloud.tencent.com/npm/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" resolved "https://mirrors.cloud.tencent.com/npm/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
quill-delta@^3.6.2:
version "3.6.3"
resolved "https://mirrors.cloud.tencent.com/npm/quill-delta/-/quill-delta-3.6.3.tgz#b19fd2b89412301c60e1ff213d8d860eac0f1032"
integrity sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==
dependencies:
deep-equal "^1.0.1"
extend "^3.0.2"
fast-diff "1.1.2"
quill-delta@^4.2.2:
version "4.2.2"
resolved "https://mirrors.cloud.tencent.com/npm/quill-delta/-/quill-delta-4.2.2.tgz#015397d046e0a3bed087cd8a51f98c11a1b8f351"
integrity sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg==
dependencies:
fast-diff "1.2.0"
lodash.clonedeep "^4.5.0"
lodash.isequal "^4.5.0"
quill@^1.3.7:
version "1.3.7"
resolved "https://mirrors.cloud.tencent.com/npm/quill/-/quill-1.3.7.tgz#da5b2f3a2c470e932340cdbf3668c9f21f9286e8"
integrity sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==
dependencies:
clone "^2.1.1"
deep-equal "^1.0.1"
eventemitter3 "^2.0.3"
extend "^3.0.2"
parchment "^1.1.4"
quill-delta "^3.6.2"
qweather-icons@^1.3.3: qweather-icons@^1.3.3:
version "1.6.0" version "1.6.0"
resolved "https://mirrors.cloud.tencent.com/npm/qweather-icons/-/qweather-icons-1.6.0.tgz#097676b8bbbe34e3e7c18371de8c6631d37c1e49" resolved "https://mirrors.cloud.tencent.com/npm/qweather-icons/-/qweather-icons-1.6.0.tgz#097676b8bbbe34e3e7c18371de8c6631d37c1e49"
@ -2537,6 +2674,16 @@ regenerator-runtime@^0.14.0:
resolved "https://mirrors.cloud.tencent.com/npm/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" resolved "https://mirrors.cloud.tencent.com/npm/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
regexp.prototype.flags@^1.5.1:
version "1.5.3"
resolved "https://mirrors.cloud.tencent.com/npm/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42"
integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==
dependencies:
call-bind "^1.0.7"
define-properties "^1.2.1"
es-errors "^1.3.0"
set-function-name "^2.0.2"
repeat-string@^1.5.2: repeat-string@^1.5.2:
version "1.6.1" version "1.6.1"
resolved "https://mirrors.cloud.tencent.com/npm/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" resolved "https://mirrors.cloud.tencent.com/npm/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
@ -2629,6 +2776,16 @@ set-function-length@^1.2.1:
gopd "^1.0.1" gopd "^1.0.1"
has-property-descriptors "^1.0.2" has-property-descriptors "^1.0.2"
set-function-name@^2.0.2:
version "2.0.2"
resolved "https://mirrors.cloud.tencent.com/npm/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985"
integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==
dependencies:
define-data-property "^1.1.4"
es-errors "^1.3.0"
functions-have-names "^1.2.3"
has-property-descriptors "^1.0.2"
shebang-command@^2.0.0: shebang-command@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://mirrors.cloud.tencent.com/npm/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" resolved "https://mirrors.cloud.tencent.com/npm/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"