From f31c30116a301b889a854c02fe6768554a95dda3 Mon Sep 17 00:00:00 2001 From: funjia <13429193897@163.com> Date: Sat, 3 May 2025 19:51:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=AF=B9=E6=8E=A5=E4=BA=86strapi=20?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components.d.ts | 3 +- package.json | 2 +- server/config.example.yml | 11 +- server/package.json | 5 +- server/routers/anki/employee.mjs | 173 ------------------------- server/routers/dynamic.mjs | 182 +++++++++++---------------- server/routers/employee.mjs | 19 +++ server/routers/questionAnswer.mjs | 142 +++++++++++++++++++++ server/yarn.lock | 133 ++++++++++++++++++++ src/common/api/index.ts | 10 +- src/components/DynamicTags.vue | 38 ++++-- src/components/SystemMenu.vue | 4 +- src/consts/dataDict.ts | 6 +- src/containers/viewModel/DataDict.ts | 38 ++++-- src/containers/viewModel/Plugin.ts | 74 +++++++++-- src/containers/viewModel/QA.ts | 87 +++++++------ yarn.lock | 4 +- 17 files changed, 562 insertions(+), 369 deletions(-) delete mode 100644 server/routers/anki/employee.mjs create mode 100644 server/routers/employee.mjs create mode 100644 server/routers/questionAnswer.mjs diff --git a/components.d.ts b/components.d.ts index 3aa815c..91ddd29 100644 --- a/components.d.ts +++ b/components.d.ts @@ -23,8 +23,9 @@ declare module '@vue/runtime-core' { ElLink: typeof import('element-plus/es')['ElLink'] ElMenu: typeof import('element-plus/es')['ElMenu'] ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] + ElOption: typeof import('element-plus/es')['ElOption'] ElRow: typeof import('element-plus/es')['ElRow'] - ElTag: typeof import('element-plus/es')['ElTag'] + ElSelect: typeof import('element-plus/es')['ElSelect'] ImgPreview: typeof import('./src/components/ImgPreview.vue')['default'] Layout: typeof import('./src/components/Layout.vue')['default'] ObjectRect: typeof import('./src/components/ObjectRect.vue')['default'] diff --git a/package.json b/package.json index 658e705..b6870f7 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "element-plus": "2.1.10", "funjialib": "git+http://git.funjia.top/funjia/FunJiaLib_Package.git", "funjiaui": "git+http://git.funjia.top/funjia/FunjiaUI_Vue.git#v1.1.2", - "funjia-axios": "git+http://git.funjia.top/funjia/funjia-axios.git", + "funjia-axios": "git+http://git.funjia.top/funjia/funjia-axios.git#v1.0.0", "html-print-element": "^0.0.5", "html2pdf.js": "^0.10.2", "js-cookie": "^3.0.1", diff --git a/server/config.example.yml b/server/config.example.yml index a645dec..8c0e55b 100644 --- a/server/config.example.yml +++ b/server/config.example.yml @@ -1,8 +1,9 @@ +path: D:\funjia-server\ db: # 数据库配置 - db: &db E:\sourceCode\2025\funjia-admin-template-vue\server\db\db.json - resourceDB: &resourceDB E:\sourceCode\2025\funjia-admin-template-vue\server\db\resourceDB.json - backupDB: &backupDB E:\sourceCode\2025\funjia-admin-template-vue\server\db\backupDB.json - logDB: &logDB E:\sourceCode\2025\funjia-admin-template-vue\server\db\logDB.json + db: &db db.json + resourceDB: &resourceDB resourceDB.json + backupDB: &backupDB backupDB.json + logDB: &logDB logDB.json dbBak: # 数据库备份配置 - # original: *db @@ -19,4 +20,4 @@ dbBak: # 数据库备份配置 - # original: *logDB dest: F:/sourceCode/2022/compute-cms/bak/logDB - category: logDB + category: logDB \ No newline at end of file diff --git a/server/package.json b/server/package.json index 256f934..6155afd 100644 --- a/server/package.json +++ b/server/package.json @@ -24,9 +24,10 @@ "node-cron": "^3.0.1", "uuid": "^8.3.2", "yaml": "^2.1.1", - "funjia-server":"git+http://git.funjia.top/funjia/funjia-server.git" + "funjia-server": "git+http://git.funjia.top/funjia/funjia-server.git", + "qs": "^6.14.0" }, "devDependencies": { "vite": "^6.0.7" } -} +} \ No newline at end of file diff --git a/server/routers/anki/employee.mjs b/server/routers/anki/employee.mjs deleted file mode 100644 index 95357a1..0000000 --- a/server/routers/anki/employee.mjs +++ /dev/null @@ -1,173 +0,0 @@ -import cuid from "cuid"; -// import getDb from "../dbServer.mjs"; -import _ from "lodash"; - -import { getDb } from "funjia-server/lib/funjia-server.mjs"; -const getEmployee = (router) => { - - router.post('/api/employee/list', async (ctx) => { - // 设置头类型, 如果不设置,会直接下载该页面 - ctx.type = 'application/json'; - const db = await getDb(); - const body = ctx.request.body; - const data = db.data?.employee?.filter((item) => { - let isMatch = true; - for (let field in body) { - if (["page", "pageSize"].includes(field)) { - continue; - } - - if (typeof (item[field]) == "string") { - isMatch = item[field]?.indexOf?.(body[field]) > -1; - } else if (typeof (item[field]) == "number") { - isMatch = item[field] == body[field]; - } - if (!isMatch) - break; - } - return isMatch; - }); - - const { - page, - pageSize - } = body; - let batchData = data; - if (page && pageSize) { - batchData = data.slice((page - 1) * pageSize, page * pageSize); - } - - ctx.body = { - code: 0, - data: batchData || [], - total: data.length - }; - }); - - router.get('/api/employee', async (ctx) => { - // 设置头类型, 如果不设置,会直接下载该页面 - ctx.type = 'application/json'; - const db = await getDb(); - const data = db.data.employee; - const query = ctx.request.query; - console.log("参数:", query, ctx.request.body, ctx.query); - let detail = {}; - if (query.id && data) { - detail = data.find((item) => { - return item.id == query.id; - }); - } - - ctx.body = { - code: 0, - data: detail || {} - }; - }); - - router.post('/api/employee/add', async (ctx) => { - ctx.type = 'application/json'; - const db = await getDb(); - - // You can also use this syntax if you prefer - if (!db.data?.employee) - db.data.employee = []; - const { - employee - } = db.data; - const data = ctx.request.body; - console.log("add:", data); - data.id = cuid(); - data.createTime = new Date(); - employee.push(data) - // Write db.data content to db.json - await db.write() - - ctx.body = { - code: 0, - }; - }); - - router.post('/api/employee/upd', async (ctx) => { - ctx.type = 'application/json'; - const db = await getDb(); - - // You can also use this syntax if you prefer - if (!db.data?.employee) - db.data = { - employee: [] - } - const { - employee - } = db.data; - const data = ctx.request.body; - const id = data.id; - console.log("数据Id:", id); - if (id && employee) { - const currentDetail = employee.find(item => item.id == id); - if (currentDetail) { - _.merge(currentDetail, data); - } - // Write db.data content to db.json - await db.write() - } - - ctx.body = { - code: 0, - }; - }); - - router.post('/api/employee/delete', async (ctx) => { - ctx.type = 'application/json'; - const db = await getDb(); - - // You can also use this syntax if you prefer - if (!db.data?.employee) - db.data = { - employee: [] - } - let { - employee - } = db.data; - const data = ctx.request.body; - const ids = data.ids; - if (ids?.length > 0 && employee) { - let id = null; - for (let i = 0; i < ids.length; i++) { - id = ids[i]; - const idx = employee.findIndex(item => item.id == id); - if (idx != -1) { - employee.splice(idx, 1); - } - } - // Write db.data content to db.json - await db.write() - } - - ctx.body = { - code: 0, - }; - }); - - router.post('/api/employee/login', async (ctx) => { - // 设置头类型, 如果不设置,会直接下载该页面 - ctx.type = 'application/json'; - const db = await getDb(); - const data = db.data.employee; - const params = ctx.request.body; - let detail = {}; - if (data) { - detail = data.find((item) => { - return item.userName == params.userName && item.pwd == params.pwd; - }); - } - - const code = detail ? 0 : 1; - - ctx.body = { - code, - data: detail || {} - }; - }); -} - -export default getEmployee; \ No newline at end of file diff --git a/server/routers/dynamic.mjs b/server/routers/dynamic.mjs index f70dd2c..9c0172b 100644 --- a/server/routers/dynamic.mjs +++ b/server/routers/dynamic.mjs @@ -1,157 +1,119 @@ import cuid from "cuid"; // import getDb from "../dbServer.mjs"; -import {getDb} from "funjia-server/lib/funjia-server.mjs"; +import { ConfigHelper } from "funjia-server"; import _ from "lodash"; - +const headers = { + 'content-type': 'application/json' +} const getDynamic = (router) => { - + const url = ConfigHelper.config.server.url + "/api"; router.post('/api/dynamic/list/:tableName', async (ctx) => { // 设置头类型, 如果不设置,会直接下载该页面 ctx.type = 'application/json'; - const db = await getDb(); - const body = ctx.request.body; - const data = db.data[ctx.params.tableName]?.filter((item) => { - let isMatch = true; - for (let field in body) { - if (["page", "pageSize"].includes(field)) { - continue; - } - - if (typeof (item[field]) == "string") { - isMatch = item[field]?.indexOf?.(body[field]) > -1; - } else if (typeof (item[field]) == "number") { - isMatch = item[field] == body[field]; - } - if (!isMatch) - break; - } - return isMatch; - }); - - const { - page, - pageSize - } = body; - let batchData = data; - if (page && pageSize) { - batchData = data.slice((page - 1) * pageSize, page * pageSize); - } - + const params = ctx.params, + tableName = params.tableName; + const res = await fetch(`${url}/${_.kebabCase(tableName)}s`, { + headers, + // body:JSON.parse({}) + }) + const data = await res.json(); + // console.log(data); ctx.body = { code: 0, - data: batchData || [], - total: data.length + data: data.data.map(item => { + return { ...item, id: item.documentId } + }), + total: data.meta.pagination.total }; }); - router.get('/api/dynamic/:tableName', async (ctx) => { // 设置头类型, 如果不设置,会直接下载该页面 - ctx.type = 'application/json'; - const db = await getDb(); - const data = db.data[ctx.params.tableName]; - const query = ctx.request.query; - console.log("参数:", query, ctx.request.body, ctx.query); - let detail = {}; - if (query.id && data) { - detail = data.find((item) => { - return item.id == query.id; - }); - } - + ctx.type = 'application/json'; + const params = ctx.params, + tableName = params.tableName, + query = ctx.request.query, + id = query.id; + const res = await fetch(`${url}/${_.kebabCase(tableName)}s/` + id, { + headers, + // body:JSON.parse({}) + }) + const data = await res.json(); + data.data.id = data.data.documentId; ctx.body = { code: 0, - data: detail || {} + data: data.data }; }); - router.post('/api/dynamic/add/:tableName', async (ctx) => { - ctx.type = 'application/json'; - const tableName=ctx.params.tableName; + ctx.type = 'application/json'; + const tableName = ctx.params.tableName; + const body = ctx.request.body; + delete body.id; + delete body.documentId; - const db = await getDb(); + const res = await fetch(`${url}/${_.kebabCase(tableName)}s`, { + method: "post", + headers, + body: JSON.stringify({ data: ctx.request.body }) + }); - // You can also use this syntax if you prefer - if (!db.data[tableName]) - db.data[tableName] = []; - - const dynamic = db.data[tableName]; - const data = ctx.request.body; - console.log("add:", data); - data.id = cuid(); - data.createTime = new Date(); - dynamic.push(data) - // Write db.data content to db.json - await db.write() + const data = await res.json(); + // console.log(data); ctx.body = { code: 0, }; }); - router.post('/api/dynamic/upd/:tableName', async (ctx) => { ctx.type = 'application/json'; - const tableName=ctx.params.tableName; + const tableName = ctx.params.tableName; + const body = ctx.request.body; + const documentId = body.id;// body.documentId; + delete body.id; + delete body.documentId; + // delete body.jsonValue; - const db = await getDb(); + const putData = JSON.stringify({ data: body }); + // console.log(putData, documentId, tableName,`${url}/${_.kebabCase(tableName)}s/`); + const res = await fetch(`${url}/${_.kebabCase(tableName)}s/` + documentId, { + method: "PUT", + headers, + body: putData + }) - // You can also use this syntax if you prefer - if (!db.data[tableName]) - db.data = { - dynamic: [] - } - - const dynamic = db.data[tableName]; - - const data = ctx.request.body; - const id = data.id; - console.log("数据Id:", id); - if (id && dynamic) { - const currentDetail = dynamic.find(item => item.id == id); - if (currentDetail) { - _.merge(currentDetail, data); - } - // Write db.data content to db.json - await db.write() - } + await res.text(); + // const data = await res.json(); + // console.log(data); ctx.body = { code: 0, }; }); - router.post('/api/dynamic/delete/:tableName', async (ctx) => { ctx.type = 'application/json'; - const tableName=ctx.params.tableName; - - const db = await getDb(); - - // You can also use this syntax if you prefer - if (!db.data[tableName]) - db.data = { - [tableName]: [] - } - - const dynamic = db.data[tableName]; - + const tableName = ctx.params.tableName; const data = ctx.request.body; const ids = data.ids; - if (ids?.length > 0 && dynamic) { - let id = null; - for (let i = 0; i < ids.length; i++) { - id = ids[i]; - const idx = dynamic.findIndex(item => item.id == id); - if (idx != -1) { - dynamic.splice(idx, 1); - } - } - // Write db.data content to db.json - await db.write() + + for (const id of ids) { + await deleteData(tableName, id); } + ids.forEach((id) => { + deleteData(tableName, id); + }) + ctx.body = { code: 0, }; }); + + } +const deleteData = async (tableName, id) => { + return fetch(`${url}/${_.kebabCase(tableName)}s/${id}`, { + method: "delete" + }) +} export default getDynamic; \ No newline at end of file diff --git a/server/routers/employee.mjs b/server/routers/employee.mjs new file mode 100644 index 0000000..404705d --- /dev/null +++ b/server/routers/employee.mjs @@ -0,0 +1,19 @@ +import _ from "lodash"; +import { ConfigHelper } from "funjia-server"; +const getEmployee = (router) => { + router.post('/api/employee/login', async (ctx) => { + const url = ConfigHelper.config.server.url + "/api"; + + // 设置头类型, 如果不设置,会直接下载该页面 + ctx.type = 'application/json'; + const params = ctx.request.body; + + const res = await fetch(`${url}/employees?filters[userName][$eq]=${params.userName}&filters[pwd][$eq]=${params.pwd}`, { + method: 'GET' + }) + + const data = await res.json(); + ctx.body = { code: data.data.length > 0 ? 0 : 1, data: data.data?.[0] } + }); +} +export default getEmployee; \ No newline at end of file diff --git a/server/routers/questionAnswer.mjs b/server/routers/questionAnswer.mjs new file mode 100644 index 0000000..c4a787f --- /dev/null +++ b/server/routers/questionAnswer.mjs @@ -0,0 +1,142 @@ +import _ from "lodash"; +import qs from "qs"; +import { ConfigHelper } from "funjia-server"; +// https://docs.strapi.io/cms/api/graphql#filters +const headers = { + 'content-type': 'application/json' +} + +const getQuestionAnswer = (router) => { + const fullUrl = ConfigHelper.config.server.url + "/api"; + + router.post('/api/questionAnswer/list', async (ctx) => { + // 设置头类型, 如果不设置,会直接下载该页面 + ctx.type = 'application/json'; + const params = ctx.request.body; + + const url = buildUrl(`${fullUrl}/question-answers`, { + pagination: { + page: params.page, + pageSize: params.pageSize, + }, + populate: 'tags', + sort: "id:desc", + filters: params.filters + }); + + const res = await fetch(url, { + method: 'GET', + }) + + const data = await res.json(), + ctxData = data.data.map(item => { + return { ...item, id: item.documentId } + }); + ctx.body = { + code: ctxData.length > 0 ? 0 : 1, data: ctxData, + total: data.meta.pagination.total + } + }); + + router.get('/api/questionAnswer', async (ctx) => { + // 设置头类型, 如果不设置,会直接下载该页面 + ctx.type = 'application/json'; + const params = ctx.params, + tableName = params.tableName, + query = ctx.request.query, + id = query.id; + + const url = buildUrl(`${fullUrl}/question-answers/${id}`, { + populate: 'tags' + }); + const res = await fetch(url, { + // headers, + // body:JSON.parse({}) + }) + const data = await res.json(); + const ctxData = data.data; + ctxData.id = ctxData?.documentId; + // console.log(ctxData.tags); + ctxData.tags = ctxData.tags.map(item => item.documentId); + ctx.body = { + code: 0, + data: ctxData + }; + }); + + router.post('/api/questionAnswer/add', async (ctx) => { + ctx.type = 'application/json'; + const body = ctx.request.body; + delete body.id; + delete body.documentId; + + const res = await fetch(`${fullUrl}/question-answers`, { + method: "post", + headers, + body: JSON.stringify({ data: ctx.request.body }) + }); + + const data = await res.json(); + // console.log(data); + + ctx.body = { + code: 0, + }; + }); + + router.post('/api/questionAnswer/upd', async (ctx) => { + ctx.type = 'application/json'; + // const tableName = ctx.params.tableName; + const body = ctx.request.body; + const documentId = body.id;// body.documentId; + delete body.id; + delete body.documentId; + // delete body.tags; + + const putData = JSON.stringify({ data: body }); + // console.log(putData, documentId); + const res = await fetch(`${fullUrl}/question-answers/` + documentId, { + method: "PUT", + headers, + body: putData + }) + + const data = await res.json(); + // console.log(data); + ctx.body = { + code: 0, + }; + }); + + router.post('/api/questionAnswer/delete', async (ctx) => { + ctx.type = 'application/json'; + const tableName = 'questionAnswer'; + const data = ctx.request.body; + const ids = data.ids; + + for (const id of ids) { + await deleteData(tableName, id); + } + + ids.forEach((id) => { + deleteData(tableName, id); + }) + + ctx.body = { + code: 0, + }; + }); + + const deleteData = async (tableName, id) => { + return fetch(`${fullUrl}/${_.kebabCase(tableName)}s/${id}`, { + method: "delete" + }) + } +} + +export default getQuestionAnswer; + + +function buildUrl(baseUrl, params) { + return baseUrl + "?" + qs.stringify(params); +} diff --git a/server/yarn.lock b/server/yarn.lock index 39b6dd9..411bde0 100644 --- a/server/yarn.lock +++ b/server/yarn.lock @@ -562,6 +562,14 @@ cache-content-type@^1.0.0: mime-types "^2.1.18" ylru "^1.2.0" +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + call-bind@^1.0.0: version "1.0.2" resolved "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -570,6 +578,14 @@ call-bind@^1.0.0: function-bind "^1.1.1" get-intrinsic "^1.0.2" +call-bound@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + co-body@^5.1.1: version "5.2.0" resolved "https://registry.npmmirror.com/co-body/-/co-body-5.2.0.tgz#5a0a658c46029131e0e3a306f67647302f71c124" @@ -696,6 +712,15 @@ destroy@^1.0.4: resolved "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -711,6 +736,23 @@ entities@^4.5.0: resolved "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + esbuild@^0.24.2: version "0.24.2" resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.24.2.tgz#b5b55bee7de017bff5fb8a4e3e44f2ebe2c3567d" @@ -826,6 +868,35 @@ get-intrinsic@^1.0.2: has "^1.0.3" has-symbols "^1.0.1" +get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.2.11" resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" @@ -841,6 +912,11 @@ has-symbols@^1.0.1, has-symbols@^1.0.2: resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + has-tostringtag@^1.0.0: version "1.0.0" resolved "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" @@ -1103,6 +1179,11 @@ magic-string@^0.30.17: dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -1209,6 +1290,11 @@ object-assign@^4.1.1: resolved "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + object-inspect@^1.9.0: version "1.12.0" resolved "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" @@ -1294,6 +1380,13 @@ punycode@^2.1.0: resolved "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +qs@^6.14.0: + version "6.14.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" + integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== + dependencies: + side-channel "^1.1.0" + qs@^6.4.0: version "6.10.3" resolved "https://registry.npmmirror.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" @@ -1406,6 +1499,35 @@ setprototypeof@1.2.0: resolved "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -1415,6 +1537,17 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + source-map-js@^1.2.0, source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" diff --git a/src/common/api/index.ts b/src/common/api/index.ts index 4559223..338378a 100644 --- a/src/common/api/index.ts +++ b/src/common/api/index.ts @@ -210,7 +210,7 @@ export const deleteNotice = (params: any): Promise => { * 获取QA列表 */ export const getQAList = (params: any): Promise => { - return axios.post("/api/QA/list", params); + return axios.post("/api/questionAnswer/list", params); }; @@ -218,28 +218,28 @@ export const getQAList = (params: any): Promise => { * 获取QA详情 */ export const getQA = (params: any): Promise => { - return axios.get("/api/QA", { params }); + return axios.get("/api/questionAnswer", { params }); }; /** * 添加QA */ export const addQA = (params: any): Promise => { - return axios.post("/api/QA/add", params); + return axios.post("/api/questionAnswer/add", params); }; /** * 修改QA */ export const updateQA = (params: any): Promise => { - return axios.post("/api/QA/upd", params); + return axios.post("/api/questionAnswer/upd", params); }; /** * 删除QA */ export const deleteQA = (params: any): Promise => { - return axios.post("/api/QA/delete", params); + return axios.post("/api/questionAnswer/delete", params); }; /** diff --git a/src/components/DynamicTags.vue b/src/components/DynamicTags.vue index a59abec..1959819 100644 --- a/src/components/DynamicTags.vue +++ b/src/components/DynamicTags.vue @@ -1,13 +1,8 @@ - + - \ No newline at end of file + +const getData = async () => { + const params = { + page: 1, + pageSize: 999 + } + const data = await api.getDynamicList(params, 'tag'); + tags.value = data.data; +} + +const tagsChange = (value) => { + emits('update:modelValue', value); +} + \ No newline at end of file diff --git a/src/components/SystemMenu.vue b/src/components/SystemMenu.vue index 06668ab..111ebe7 100644 --- a/src/components/SystemMenu.vue +++ b/src/components/SystemMenu.vue @@ -71,9 +71,9 @@ const goTo = (url) => { const getMenuJson = async () => { const { data: dataDict } = await api.getDynamic({ id: MENU_JSON }, "dataDict"); - if (dataDict?.value) { + if (dataDict?.jsonValue) { try { - menuJson.value = JSON.parse(dataDict.value); + menuJson.value =dataDict.jsonValue; } catch (error) { console.log(error); } diff --git a/src/consts/dataDict.ts b/src/consts/dataDict.ts index ea47408..4256a08 100644 --- a/src/consts/dataDict.ts +++ b/src/consts/dataDict.ts @@ -1,6 +1,6 @@ // 接口地址 -export const RECORD_URL = "clyx9ba3a0000qwrb2mjd25sd" +export const RECORD_URL = 'ikpro0cj515jl5k3a70gf1en' // 菜单项 -export const MENU_JSON = "clyzxul91000mqorb1w503q2o" +export const MENU_JSON = 'y8gmh2uydvd9a93sza4fsgz7' // 系统名称 -export const SYSTEM_TITLE = "cm64rpfik0000egrb3x33hbhj" \ No newline at end of file +export const SYSTEM_TITLE = 'nrz580ahvnblm3yl85db9uv5' \ No newline at end of file diff --git a/src/containers/viewModel/DataDict.ts b/src/containers/viewModel/DataDict.ts index 2577cd9..902198b 100644 --- a/src/containers/viewModel/DataDict.ts +++ b/src/containers/viewModel/DataDict.ts @@ -1,11 +1,12 @@ import 'reflect-metadata'; -import { UmTableForm, +import { + UmTableForm, TableColumnPropertyDecorator as tcpd, TableFormColumnPropertyDecorator as tfcpd, TableColumnMethodDecorator as tcmd, TableSearchFormPropertyDecorator as tsfpd - } from "funjiaui"; +} from "funjiaui"; import * as api from "@/common/api" // 数据字典 const tableName = "dataDict"; @@ -27,18 +28,26 @@ export default class DataDict { // 操作列宽度 static operateWidth = "140px"; - @tcpd({ "lang": "", "def": "数据", minWidth: 120 }) - @tfcpd({ "lang": "", "def": "id", fieldType: "primaryKey" }) - id: number = 0; + // @tcpd({ "lang": "", "def": "", minWidth: 120 }) + @tfcpd({ "lang": "", "def": "", fieldType: "primaryKey" }) + id: string = ""; + + @tcpd({ "lang": "", "def": "文档id", minWidth: 120 }) + @tfcpd({ "lang": "", "def": "文档id", fieldType: "primaryKey" }) + documentId: string = ""; @tcpd({ "lang": "", "def": "唯一标识", minWidth: 120 }) @tfcpd({ "lang": "", "def": "唯一标识", fieldType: "string", rule: [{ "type": "require", message: "不能为空" }] }) unionKey: string = "" @tcpd({ "lang": "", "def": "数据", minWidth: 120 }) - @tfcpd({ "lang": "", "def": "数据", fieldType: "string", rule: [{ "type": "require", message: "不能为空" }] }) + @tfcpd({ "lang": "", "def": "数据", fieldType: "string" }) value: string = "" + // @tcpd({ "lang": "", "def": "json数据", minWidth: 120 }) + @tfcpd({ "lang": "", "def": "json数据", fieldType: "string" }) + jsonValue: string = "" + @tcpd({ "lang": "", "def": "描述", minWidth: 120 }) @tfcpd({ "lang": "", "def": "描述", fieldType: "string", rule: [{ "type": "require", message: "不能为空" }] }) desc: string = "" @@ -67,8 +76,13 @@ export default class DataDict { * 获取详情数据 */ @tcmd({ "value": { "type": "edit", "es": "onBefore", "dialogContent": UmTableForm, "dialogTitle": "编辑" } }) - getDetail = async (rowId: number, r, meta) => { + getDetail = async function (rowId: number, r, meta) { + // const rowData = arguments[3].find(item => item.id == rowId); + console.log(arguments); const { data } = await api.getDynamic({ id: rowId }, tableName); + if (data && data.jsonValue) { + data.jsonValue = JSON.stringify(data.jsonValue); + } return data; } @@ -81,7 +95,11 @@ export default class DataDict { } }) onEdit = async (params: any) => { - const { code, msg } = await api.updateDynamic({ ...params, unionKey: params.unionKey.toUpperCase() }, tableName); + const jsonValue = params.jsonValue; + const { code, msg } = await api.updateDynamic({ + ...params, unionKey: params.unionKey.toUpperCase(), + jsonValue: jsonValue ? JSON.parse(jsonValue) : null + }, tableName); if (code != 0) { return { code: 1, message: msg }; } @@ -108,7 +126,9 @@ export default class DataDict { } @tcmd({ "key": "table:toolbar", "value": { "type": "批量删除", "priority": 5, "es": "onAfter", "dialogContent": "确定要删除选择的数据吗?" } }) - onMutilDel = async (ids: any[]) => { + onMutilDel = async function (ids: any[]) { + // console.log(arguments) + // return; const { code, msg } = await api.deleteDynamic({ ids }, tableName); if (code != 0) { return { code: 1, message: msg }; diff --git a/src/containers/viewModel/Plugin.ts b/src/containers/viewModel/Plugin.ts index 6cf20f0..40589e9 100644 --- a/src/containers/viewModel/Plugin.ts +++ b/src/containers/viewModel/Plugin.ts @@ -11,9 +11,11 @@ import * as api from "@/common/api" import { h, ref } from 'vue'; import SingleUpload from '@/components/SingleUpload.vue'; import axios from 'axios'; +import DataDict from './DataDict'; +import { MENU_JSON } from '@/consts/dataDict'; // 插件模块 -const tableName = "plugin"; +const tableName = "systemPlugin"; const isShow = (rowData: any) => { if (rowData?.source_add_type == "1") { @@ -32,9 +34,12 @@ export default class Plugin2 { // 操作列宽度 static operateWidth = "140px"; - @tfcpd({ "lang": "", "def": "id", fieldType: "primaryKey" }) + // @tfcpd({ "lang": "", "def": "id", fieldType: "primaryKey" }) id: number = 0; + @tfcpd({ "lang": "", "def": "id", fieldType: "primaryKey" }) + documentId: number = 0; + questionId: string = "" @tcpd({ "lang": "", "def": "名称", minWidth: 120 }) @@ -45,11 +50,22 @@ export default class Plugin2 { @tfcpd({ "lang": "", "def": "描述", fieldType: "string", rule: [{ "type": "require", message: "不能为空" }] }) desc: string = "" + + // @tcpd({ "lang": "", "def": "菜单名称", minWidth: 120 }) + @tfcpd({ "lang": "", "def": "菜单名称", fieldType: "string" }) + menuName: string = "" + + @tfcpd({ "lang": "", "def": "路由地址", fieldType: "string" }) + menuRoute: string = "/app/dynamicTable/notice/cm9jv4p8q000304nk351t14lj/通知" + + @tfcpd({ "lang": "", "def": "菜单排序", fieldType: "string" }) + menuSort: number = 9 + @tcpd({ "lang": "", "def": "插件脚本绝对地址", minWidth: 120 }) @tfcpd({ - "lang": "", "def": "插件脚本绝对地址", component: function (props) { + "lang": "", "def": "插件脚本绝对地址", component: function (props) { const value = ref(); - const that = this; + const that = this; return h(SingleUpload, { modelValue: value, "onFileChange": async (data) => { @@ -64,9 +80,9 @@ export default class Plugin2 { } }) }, - rule: [{ "type": "require", message: "不能为空" }] + ruless: [{ "type": "require", message: "不能为空" }] }) - pluginUrl: string = "" + url: string = "" @tcmd({ "key": "table:searchFormMethod", "value": { "type": "getList", "es": "onAfter" } }) getList = async (params: any) => { @@ -80,11 +96,55 @@ export default class Plugin2 { } }) onAdd = async (data: any) => { - const { code, msg } = await api.addDynamic({ ...data }, tableName); + const formData = { + id: data.id, + documentId: data.documentId, + name: data.name, + desc: data.desc, + url: data.url + }; + const { code, msg } = await api.addDynamic({ ...formData }, tableName); if (code != 0) { return { code: 1, message: msg }; } else { + // 更新系统菜单 + const menuId = data.id; + const dd = new DataDict(); + dd.id = MENU_JSON; + const menuData = await dd.getDetail(dd.id, null, null); + const jsonValueStr = menuData.jsonValue; + const initMenuRoteInfo = (mri) => { + mri.name = data.menuName; + mri.route = data.menuRoute; + mri.sort = data.menuSort; + } + + const jsonValue = jsonValueStr ? JSON.parse(jsonValueStr) : []; + // debugger; + let menuInfo = jsonValue.find(item => item.pluginId == menuId) + if (menuInfo) { + // 更新路由信息 + initMenuRoteInfo(menuInfo); + } + else { + // 新增路由信息 + menuInfo = {}; + initMenuRoteInfo(menuInfo); + jsonValue.push(menuInfo); + } + + // menuData.jsonValue = JSON.stringify(jsonValue); + const editData = { + jsonValue: JSON.stringify(jsonValue), + desc: menuData.desc, + value: menuData.value, + id: menuData.id, + documentId: menuData.documentId, + unionKey: menuData.unionKey + }; + + await dd.onEdit(editData); return { code: 0 }; } } diff --git a/src/containers/viewModel/QA.ts b/src/containers/viewModel/QA.ts index 3f3c98a..5517eb7 100644 --- a/src/containers/viewModel/QA.ts +++ b/src/containers/viewModel/QA.ts @@ -8,12 +8,13 @@ import 'reflect-metadata'; import * as api from "@/common/api" // import UmTableForm from '@/components/UmTable/UmTableForm.vue'; -import { UmTableForm, +import { + UmTableForm, TableColumnPropertyDecorator as tcpd, TableFormColumnPropertyDecorator as tfcpd, TableColumnMethodDecorator as tcmd, TOperateType, TableSearchFormPropertyDecorator as tsfpd - } from "funjiaui"; +} from "funjiaui"; // import { // TableColumnPropertyDecorator as tcpd, // TableFormColumnPropertyDecorator as tfcpd, @@ -32,7 +33,9 @@ export default class QA { @tfcpd({ "lang": "", "def": "id", fieldType: "primaryKey" }) id: number = 0; - @tsfpd({ lang: "", "def": "题目" }) + @tsfpd({ lang: "", "def": "关键字" }) + keyword: string = ""; + @tcpd({ "lang": "", "def": "题目", minWidth: 120 }) @tfcpd({ "lang": "", "def": "题目", rule: [{ "type": "require", message: "不能为空" }], component: Codemirror }) question: string = ""; @@ -41,49 +44,47 @@ export default class QA { @tfcpd({ "lang": "", "def": "答案", component: Codemirror, width: 300 }) answer: string = ""; - @tcpd({ "lang": "", "def": "标签", minWidth: 120 }) + @tcpd({ + "lang": "", "def": "标签", minWidth: 120, columnRender: function (props) { + console.log(arguments); + const rowData = arguments[2]; + return rowData.tags.map(item => { return item.name }).join(",") + } + }) @tfcpd({ "lang": "", "def": "标签", component: DynamicTags, width: 300 }) @tsfpd({ lang: "", "def": "标签", fieldType: "select", async getData() { + const params = { + page: 1, + pageSize: 999 + } + const data = await api.getDynamicList(params, 'tag'); + console.log(data.data); return { - data: [{ - label: "vue3", - value: "vue3" - }, { - label: "react", - value: "react" - }, { - label: "js", - value: "js" - }, { - label: "html", - value: "html" - }, { - label: "css", - value: "css" - }, { - label: "webpack", - value: "webpack" - }, { - label: "微信小程序", - value: "微信小程序" - }, { - label: "typescript", - value: "typescript" - }, { - label: "boss_vue", - value: "boss_vue" - }, { - label: "高频_css", - value: "高频_css" - }] + data: (data?.data || [])?.map(item => { + return { + label: item.name, + value: item.documentId + }; + }) } } }) - tag: string[] = []; + tags: string[] = []; @tcmd({ "key": "table:searchFormMethod", "value": { "type": "getList", "es": "onAfter" } }) getList = async (params: any) => { + const ky = params.keyword || undefined; + params.filters = { + $or: [ + { + question: { + $containsi: ky + } + }, + { tags: { documentId: { $eq: params.tags || undefined } } } + ] + }; return await api.getQAList(params); } @@ -181,6 +182,20 @@ export default class QA { } } + @tcmd({ "key": "table:toolbar", "value": { "type": "批量删除", "priority": 5, "es": "onAfter", "dialogContent": "确定要删除选择的数据吗?" } }) + onMutilDel = async function (ids: any[]) { + // console.log(arguments) + // return; + const { code, msg } = await api.deleteQA({ ids }); + if (code != 0) { + return { code: 1, message: msg }; + } + else { + return { code: 0 }; + } + } + + // @tcmd({ // "key": "table:toolbar", "value": { // "type": "添加", "priority": 1, "es": "onAfter", "dialogContent": UmTableForm, "dialogTitle": "增加", "dialogWidth": 650 diff --git a/yarn.lock b/yarn.lock index f6dbd39..651bbe6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1273,9 +1273,9 @@ function-bind@^1.1.2: resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -"funjia-axios@git+http://git.funjia.top/funjia/funjia-axios.git": +"funjia-axios@git+http://git.funjia.top/funjia/funjia-axios.git#v1.0.0": version "0.0.1" - resolved "git+http://git.funjia.top/funjia/funjia-axios.git#b76323800995e88c6fcd3ede5a87ff62f0ff0a9d" + resolved "git+http://git.funjia.top/funjia/funjia-axios.git#cde7b6f0c3c83e3d13efb71f1966661c03a8bf70" dependencies: axios "^0.26.1" js-cookie "^3.0.1"