文档智能助手的前端

master
linlnf 8 months ago
parent 3c0646ea92
commit 23e207952a

@ -229,7 +229,7 @@ voc|form-data|string|必填|"" (示例内容在 storage/app/test/A13_221.txt 中
---|---|---|---|---
doc|form-data|string|必填|""
background|form-data|string||""
type|form-data|string|必填|"abstract"/"decorate"/"sequel_writing"/"rewrite_wrong"/"translate"
type|form-data|string|必填|"summary"/"decoration"/"correction"/"extension"/"translation"
> 返回示例:
```json
{

@ -16,7 +16,7 @@ type DocRefine struct {
Background string `form:"background" json:"background" `
}
var Types = []string{"abstract", "decorate", "sequel_writing", "rewrite_wrong", "translate"}
var Types = []string{"summary", "decoration", "extension", "correction", "translation"}
func (d DocRefine) CheckParams(context *gin.Context) {
if err := context.ShouldBind(&d); err != nil {
@ -24,6 +24,7 @@ func (d DocRefine) CheckParams(context *gin.Context) {
response.ValidatorError(context, err)
return
}
// 判断是否在类型中
t := d.Type
isExit := false

@ -2,7 +2,6 @@ package ai_model_cli
import (
"context"
"fmt"
"goskeleton/app/global/variable"
"strings"
@ -25,18 +24,17 @@ func RequestQianFan(cont *gin.Context) (r bool, c interface{}) {
b := strings.TrimSpace(cont.PostForm("background"))
d := strings.TrimSpace(cont.PostForm("doc"))
switch t {
case "abstract":
case "summary":
message = "请在这个背景下:" + b + "\n对下文进行概括不要改变原有语言" + d
case "decorate":
case "decoration":
message = "请在这个背景下:" + b + "\n对下文进行润色不要改变原有语言" + d
case "sequel_writing":
case "extension":
message = "请在这个背景下:" + b + "\n对下文进行续写不要改变原有语言" + d
case "rewrite_wrong":
case "correction":
message = "请在这个背景下:" + b + "\n对下文进行改错不要改变原有语言" + d
case "translate":
case "translation":
message = "请在这个背景下:" + b + "\n对下文进行翻译" + d
}
resp, _ := chat.Do(
context.TODO(),
&qianfan.ChatCompletionRequest{
@ -45,6 +43,5 @@ func RequestQianFan(cont *gin.Context) (r bool, c interface{}) {
},
},
)
fmt.Println(resp.Result)
return true, gin.H{"new_doc": resp.Result}
}

@ -19,6 +19,7 @@
"html-docx-js-typescript": "^0.1.5",
"jquery": "^3.7.1",
"jwt-decode": "^4.0.0",
"mitt": "^3.0.1",
"vue": "^3.2.13",
"vue-router": "^4.0.3",
"vuex": "^4.0.0"
@ -4548,6 +4549,7 @@
"version": "1.0.7",
"resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz",
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
"dev": true,
"dependencies": {
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
@ -5665,6 +5667,7 @@
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz",
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
"dev": true,
"dependencies": {
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
@ -6014,6 +6017,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz",
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
"dev": true,
"dependencies": {
"get-intrinsic": "^1.2.4"
},
@ -6025,6 +6029,7 @@
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"dev": true,
"engines": {
"node": ">= 0.4"
}
@ -7009,6 +7014,7 @@
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@ -7041,6 +7047,7 @@
"version": "1.2.4",
"resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"dev": true,
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
@ -7139,6 +7146,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz",
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"dev": true,
"dependencies": {
"get-intrinsic": "^1.1.3"
},
@ -7186,6 +7194,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
"dev": true,
"dependencies": {
"es-define-property": "^1.0.0"
},
@ -7197,6 +7206,7 @@
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.3.tgz",
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
@ -7208,6 +7218,7 @@
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
@ -7225,6 +7236,7 @@
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.2"
},
@ -8656,6 +8668,11 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
"node_modules/mitt": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
"integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="
},
"node_modules/mkdirp": {
"version": "0.5.6",
"resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz",
@ -8907,6 +8924,7 @@
"version": "1.13.2",
"resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.2.tgz",
"integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
@ -10062,6 +10080,7 @@
"version": "6.13.0",
"resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.0.tgz",
"integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
"dev": true,
"dependencies": {
"side-channel": "^1.0.6"
},
@ -10656,6 +10675,7 @@
"version": "1.2.2",
"resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz",
"integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
"dev": true,
"dependencies": {
"define-data-property": "^1.1.4",
"es-errors": "^1.3.0",
@ -10725,6 +10745,7 @@
"version": "1.0.6",
"resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.6.tgz",
"integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.7",
"es-errors": "^1.3.0",
@ -11704,23 +11725,6 @@
"punycode": "^2.1.0"
}
},
"node_modules/url": {
"version": "0.11.4",
"resolved": "https://registry.npmmirror.com/url/-/url-0.11.4.tgz",
"integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==",
"dependencies": {
"punycode": "^1.4.1",
"qs": "^6.12.3"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/url/node_modules/punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmmirror.com/punycode/-/punycode-1.4.1.tgz",
"integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",

@ -19,6 +19,7 @@
"html-docx-js-typescript": "^0.1.5",
"jquery": "^3.7.1",
"jwt-decode": "^4.0.0",
"mitt": "^3.0.1",
"vue": "^3.2.13",
"vue-router": "^4.0.3",
"vuex": "^4.0.0"

@ -84,7 +84,7 @@ import {
getUserConfigFromBackend,
saveData
} from './utils';
import mitt from 'mitt';
// 导出为docx插件
function exportWord(){
const pageContent = getPageContent();
@ -197,9 +197,56 @@ class Export2PDF extends Plugin {
}
}
// 智能润色插件
class Translation extends Plugin {
init() {
// 智能润色发送消息
function sendDORMsg(type, fullText) {
// 获取选中的文本,用来进行后续操作
const selectionText = window.getSelection().toString();
if (selectionText.trim() === '') return;
const formData = new FormData();
formData.append('doc', selectionText);
formData.append('background', fullText);
formData.append('type', type);
const requestOptions= {
method: 'POST',
body: formData
};
console.log("formData:", formData);
const store = window.store;
const res = {oldContent:selectionText, newContent:'...'};
store.commit('setCurrentTag', type);
store.commit('addContentToTag', {tag:type, newContent:res});
const index = store.getters.getCurrentindex;
console.log("index", index);
emitter.emit('show-refine-doc-sidebar', type);
fetch("/web_api/admin/ai_doc/doc_refine", requestOptions)
.then(response => {
if (!response.ok) {
throw new Error("请求出错");
}
// 根据返回的数据格式进行相应处理这里假设返回的数据是JSON格式所以使用response.json()解析
return response.json();
})
.then(data => {
// console.log("useStore", store);
const newRes = {oldContent:selectionText, newContent:data.data.new_doc};
store.commit('changeContentForTag', {tag:type, index:index, newContent:newRes});
emitter.emit('show-refine-doc-sidebar', type);
})
.catch(error => {
console.error("POST请求出错", error);
});
}
class RefineDoc extends Plugin {
init() {
// console.log('Translation initialized!');
this.editor.ui.componentFactory.add('translate', (locale) => {
@ -253,19 +300,14 @@ class Translation extends Plugin {
addListToDropdown(dropdownView, items);
dropdownView.on('execute', (eventInfo) => {
const { id, label } = eventInfo.source;
// 获取选中的文本,用来进行后续操作
const selectionText = window.getSelection().toString();
if (id === 'summary') {
// this.editor.execute('ExportToWord');
console.log('Object (en):', label, selectionText);
}
});
const id = eventInfo.source.id;
sendDORMsg(id, '');
});
return dropdownView;
});
}
}
return dropdownView;
});
}
}
// 侧边栏按钮
class ToggleSideBar extends Plugin {
@ -448,7 +490,7 @@ function setConfig() {
TodoList,
Underline,
Undo,
Export2Word, Translation, Export2PDF, ToggleSideBar, SaveButton
Export2Word, RefineDoc, Export2PDF, ToggleSideBar, SaveButton
],
balloonToolbar: ['bold', 'italic', '|', 'link', 'insertImage', '|', 'bulletedList', 'numberedList'],
//自定义设置字体
@ -585,4 +627,6 @@ function setConfig() {
translations: [translations]
}
}
export { Export2Word, Export2PDF, Translation, ToggleSideBar, setConfig };
const emitter = new mitt();
export default emitter;
export {Export2Word, Export2PDF, RefineDoc, ToggleSideBar, setConfig};

@ -7,6 +7,8 @@ import { CkeditorPlugin } from '@ckeditor/ckeditor5-vue';
const app = createApp(App);
window.store = store;
app.use(router);
app.use(store);
app.use(CkeditorPlugin);

@ -124,4 +124,16 @@
padding: 10px;
border-radius: 4px;
background-color: #ecf0f1;
}
.message-answer {
margin: 5px 0;
padding: 10px;
border-radius: 4px;
background-color: rgb(189, 195, 199);
}
.message-answer pre {
white-space: pre-wrap;
/* 保留空白符,但允许自动换行 */
word-wrap: break-word;
/* 允许长单词换行 */
}

@ -40,6 +40,12 @@ const routes = [
{
path: '/:catchAll(.*)',
redirect: '/404/',
},
{
path: '/web_api/',
target:'http://localhost:14514/',
changeOrigin:true, //修改源
rewrite:{'^/web_api/':''}
}
]

@ -1,5 +1,6 @@
import { createStore } from 'vuex'
import ModulerUser from './user';
import ModulerRefineDoc from './refine_doc';
export default createStore({
state: {
@ -12,5 +13,6 @@ export default createStore({
},
modules: {
user: ModulerUser,
refine_doc: ModulerRefineDoc
}
})

@ -0,0 +1,54 @@
const ModulerRefineDoc = {
state: {
current_tag: '',
contents: new Map()
},
mutations: {
setCurrentTag(state, newTag) {
console.log("storetag", newTag);
state.current_tag = newTag;
},
// 增加tag下的value数组里的内容的mutation方法
addContentToTag(state, {tag, newContent}) {
console.log("tag, newContent", {tag, newContent});
if (!state.contents.has(tag)) {
state.contents.set(tag, []);
}
state.contents.get(tag).push(newContent);
return state.contents.get(tag) - 1;
},
// 修改tag下的value数组里的内容的mutation方法
changeContentForTag(state, {tag, index, newContent}) {
if (!state.contents.has(tag)) {
state.contents.set(tag, []);
}
var tagContents = state.contents.get(tag);
console.log("oldtagc", tagContents, tagContents[index]);
if (tagContents[index]){
state.contents.get(tag).splice(index,1,newContent);
}
},
// 清空tag下的数组内容的mutation方法
clearContentsForTag(state, tag) {
if (state.contents.has(tag)) {
state.contents.set(tag, []);
}
}
},
getters: {
getCurrentTag(state) {
return state.current_tag;
},
getCurrentContent(state) {
return state.contents.get(state.current_tag);
},
getCurrentindex(state) {
return state.contents.get(state.current_tag).length - 1;
}
},
modules: {
}
}
export default ModulerRefineDoc;

@ -16,16 +16,16 @@
</div>
<el-button type="primary" @click="toggleSidebar()" style="display:none"
id="toggleSidebarButton">打开/关闭侧边栏</el-button>
<div class="sidebar" :class="{ 'active': isSidebarOpen }">
<div class="sidebar" :class="{ 'active': isSidebarOpen }" >
<!-- 侧边栏内容 -->
<el-menu class="sidebar-menu" :class="{ 'active': isNavbarOpen }" :collapse="isNavbarOpen">
<el-sub-menu index="1" class="horizontal-sub-menu">
<template #title>智能助手</template>
<el-menu-item index="1-1" @click="showContent('polish')"></el-menu-item>
<el-menu-item index="1-2" @click="showContent('rewrite')"></el-menu-item>
<el-menu-item index="1-3" @click="showContent('summary')"></el-menu-item>
<el-menu-item index="1-4" @click="showContent('edit')"></el-menu-item>
<el-menu-item index="1-5" @click="showContent('translate')"></el-menu-item>
<el-menu-item index="1-1" @click="showRefineDOCContent('decoration')"></el-menu-item>
<el-menu-item index="1-2" @click="showRefineDOCContent('extension')"></el-menu-item>
<el-menu-item index="1-3" @click="showRefineDOCContent('summary')"></el-menu-item>
<el-menu-item index="1-4" @click="showRefineDOCContent('correction')"></el-menu-item>
<el-menu-item index="1-5" @click="showRefineDOCContent('translation')"></el-menu-item>
</el-sub-menu>
<el-sub-menu index="2" class="horizontal-sub-menu">
<template #title>图文转换</template>
@ -41,11 +41,19 @@
<!-- Content Sections -->
<div v-if="currentContent" class="content-section">
<!-- Dynamic content based on navigation selection -->
<div v-if="currentContent === 'polish'"></div>
<div v-if="currentContent === 'rewrite'"></div>
<div v-if="currentContent === 'summary'"></div>
<div v-if="currentContent === 'edit'"></div>
<div v-if="currentContent === 'translate'"></div>
<div v-if="currentContent === 'refine_doc'" id='refine_doc_block'>
<div class="refine_docs" id="refine_docs">
<el-button style="margin-left: 10px; width: 40px; height: 40px;" @click="clearRefineDOCContent()"><svg t="1731509926355" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8154" width="20" height="20"><path d="M1011.43552 981.92384l-68.4032-394.40384h23.10144c18.5856 0 33.54624-14.97088 33.54624-33.55648V306.16576c0-18.5856-14.97088-33.55648-33.54624-33.55648H648.6528V37.71392c0-18.5856-14.97088-33.55648-33.55648-33.55648H408.59648c-18.5856 0-33.55648 14.97088-33.55648 33.55648v234.88512H57.5488c-18.5856 0-33.54624 14.97088-33.54624 33.55648v247.79776c0 18.5856 14.97088 33.55648 33.54624 33.55648h23.10144L12.24704 981.9136c-0.38912 1.9456-0.512 3.87072-0.512 5.6832 0 18.5856 14.97088 33.54624 33.55648 33.54624h933.10976c1.93536 0 3.88096-0.12288 5.6832-0.512 18.31936-3.08224 30.57664-20.51072 27.35104-38.7072zM114.33984 362.94656h351.03744V94.50496h92.928v268.4416h351.03744v134.22592H114.33984V362.94656zM718.336 930.816V729.48736c0-5.6832-4.64896-10.33216-10.32192-10.33216h-61.952c-5.67296 0-10.32192 4.64896-10.32192 10.33216V930.816H387.9424V729.48736c0-5.6832-4.64896-10.33216-10.32192-10.33216h-61.952c-5.67296 0-10.32192 4.64896-10.32192 10.33216V930.816H112.78336l58.20416-335.55456h681.5744L910.76608 930.816H718.336z m0 0" fill="#2C2C2C" p-id="8155"></path></svg></el-button>
<div v-for="(item, index) in currentRefineDocContent" :key="index" class="messages">
<div class="message">
<p>{{ item.oldContent }}</p>
</div>
<div class="message-answer">
<pre>{{ item.newContent }}</pre>
</div>
</div>
</div>
</div>
<div v-if="currentContent === 'ocr'">OCR</div>
<div v-if="currentContent === 'mindmap'"></div>
<div v-if="currentContent === 'manual'">
@ -293,7 +301,7 @@ import {
import 'ckeditor5/ckeditor5.css';
import '../public/sidebar.css';
import { ElButton, ElInput, ElSelect, ElOption, ElForm, ElFormItem, ElMenu, ElMenuItem, ElColorPicker, ElSubMenu } from 'element-plus';
import { setConfig } from '../components/plugins'
import emitter, { setConfig } from '../components/plugins'
// import {getUserConfigFromBackend,saveData,getPageContent,getAndApplyUserStyles} from './components/utils';
import { useStore } from 'vuex';
import router from '../router/index.js';
@ -311,6 +319,7 @@ export default {
isSidebarOpen: false,//
isNavbarOpen: false,//
currentContent: '', //
currentRefineDocContent: [], //
formData: {
fontFamily: '',
color: '',
@ -328,10 +337,6 @@ export default {
previewStyle: {},
};
},
mounted() {
this.config = setConfig();
this.isLayoutReady = true;
},
methods: {
onReady(editor) {
Array.from(this.$refs.editorToolbarElement.children).forEach(child => child.remove());
@ -356,6 +361,20 @@ export default {
showContent(formType) {
this.currentContent = formType;
},
//
showRefineDOCContent(tag){
this.currentContent = 'refine_doc';
this.store.commit('setCurrentTag', tag);
if (this.store.getters.getCurrentContent){
this.currentRefineDocContent = this.store.getters.getCurrentContent.reduce((acc, current) => [current,...acc], []);
}
},
clearRefineDOCContent(){
this.store.commit('clearContentsForTag', this.store.getters.getCurrentTag);
if (this.store.getters.getCurrentContent){
this.currentRefineDocContent = this.store.getters.getCurrentContent.reduce((acc, current)=> [current,...acc], []);
}
},
//
submitForm() {
const selectedStyles = {};
@ -438,7 +457,7 @@ export default {
// TODO
// const chat_history = []
try {
const response = await fetch('http://localhost:14514/admin/ai_layout/style_generate', {
const response = await fetch('/web_api/admin/ai_layout/style_generate', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
@ -615,6 +634,16 @@ export default {
return clearButton;
}
},
mounted() {
this.config = setConfig();
this.isLayoutReady = true;
emitter.on('show-refine-doc-sidebar', (id) => {
this.isSidebarOpen = true;
this.isNavbarOpen = true;
this.showRefineDOCContent(id);
console.log(this.currentContent)
});
},
components: {
//
ElButton, ElInput, ElSelect, ElOption, ElForm, ElFormItem, ElMenu, ElMenuItem, ElColorPicker, ElSubMenu
@ -623,6 +652,9 @@ export default {
if (!this.store.state.user.is_login) {
router.push({ name: 'login' });
}
},
beforeUnmount() {
emitter.off('show-refine-doc-sidebar');
}
};
</script>

@ -14,8 +14,18 @@ module.exports = defineConfig({
Components({
resolvers: [ElementPlusResolver()]
}),
]
],
devServer:{
proxy:{
'/web_api':{
target:'http://localhost:14514/',
changeOrigin:true, //修改源
pathRewrite: {
'^/web_api': ''
}
}
}
}
}
})

Loading…
Cancel
Save