zj-plugin-intelligent 1.2.18-beta.4 → 1.2.18-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/ZjPluginIntelligent.common.js +160 -20
- package/lib/ZjPluginIntelligent.umd.js +160 -20
- package/lib/ZjPluginIntelligent.umd.min.js +160 -20
- package/package.json +1 -1
|
@@ -964,7 +964,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n
|
|
|
964
964
|
/***/ (function(module, exports, __webpack_require__) {
|
|
965
965
|
|
|
966
966
|
"use strict";
|
|
967
|
-
eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _knowledgeBase = __webpack_require__(/*! ./api/knowledgeBase */ \"./src/lib/knowledgeBase/api/knowledgeBase.js\");\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nvar _default = {\n name: 'CategoryManager',\n props: {\n companyId: {\n type: String,\n default: ''\n }\n },\n data: function data() {\n return {\n list: [],\n flatList: [],\n treeData: [],\n treeProps: {\n children: 'children',\n label: 'name'\n },\n loading: false,\n dialogVisible: false,\n dialogType: 'add',\n editingId: null,\n submitting: false,\n formData: {\n name: '',\n parentId: 0,\n sortOrder: 0\n },\n formRules: {\n name: [{\n required: true,\n message: '请输入文件夹名称',\n trigger: 'blur'\n }, {\n max: 50,\n message: '长度不超过50个字符',\n trigger: 'blur'\n }]\n },\n // 猜你想问\n suggestDialogVisible: false,\n suggestSubmitting: false,\n suggestLoading: false,\n suggestList: [],\n suggestQuestions: ['']\n };\n },\n computed: {\n /**\n * 可选作上级的文件夹列表(过滤掉已达最大层级的,避免无效选择)\n */\n availableParents: function availableParents() {\n var _this = this;\n\n return this.list.filter(function (f) {\n return _this.getFolderDepth(f) < 5;\n });\n }\n },\n watch: {\n companyId: function companyId() {\n this.loadList();\n }\n },\n created: function created() {\n if (this.companyId) {\n this.loadList();\n }\n },\n methods: {\n /**\n * 加载文件夹列表(平铺 → 组装树)\n */\n loadList: function loadList() {\n var _this2 = this;\n\n if (!this.companyId) {\n this.list = [];\n this.flatList = [];\n this.treeData = [];\n this.$emit('list', []);\n return;\n }\n\n this.loading = true;\n (0, _knowledgeBase.getFolderList)(this.companyId).then(function (list) {\n _this2.list = list || [];\n _this2.flatList = _this2.list;\n _this2.treeData = _this2.buildTree(_this2.list);\n\n _this2.$emit('list', _this2.list); // 默认展示全部文件\n\n\n _this2.handleSelectAll();\n }).catch(function () {}).finally(function () {\n _this2.loading = false;\n });\n },\n\n /**\n * 平铺列表组装为树结构\n */\n buildTree: function buildTree(list) {\n var map = {};\n list.forEach(function (f) {\n f.children = [];\n map[f.id] = f;\n });\n var roots = [];\n list.forEach(function (f) {\n var pid = f.parentId || 0;\n\n if (map[pid]) {\n map[pid].children.push(f);\n } else {\n roots.push(f);\n }\n });\n return roots;\n },\n handleSelect: function handleSelect(data) {\n this.$emit('select', data);\n },\n // 外部定位并高亮指定文件夹(用于批量移动成功后的联动)\n setCurrentFolder: function setCurrentFolder(folder) {\n var _this3 = this;\n\n if (!folder || !folder.id) return;\n this.$nextTick(function () {\n if (_this3.$refs.treeRef) {\n _this3.$refs.treeRef.setCurrentKey(folder.id);\n }\n });\n this.$emit('select', folder);\n },\n\n /**\n * 显示全部文件:不带 folderId 查询\n */\n handleSelectAll: function handleSelectAll() {\n this.$refs.treeRef && this.$refs.treeRef.setCurrentKey(null);\n this.$emit('select', {\n id: '',\n name: '全部文件'\n });\n },\n\n /**\n * 计算文件夹深度(第1层=根目录)\n */\n getFolderDepth: function getFolderDepth(item) {\n var depth = 1;\n var current = item;\n var visited = new Set();\n\n while (current.parentId && current.parentId !== 0) {\n if (visited.has(current.id)) break; // 防循环引用\n\n visited.add(current.id);\n var parent = this.list.find(function (f) {\n return f.id === current.parentId;\n });\n if (!parent) break;\n depth++;\n current = parent;\n }\n\n return depth;\n },\n handleAdd: function handleAdd(parent) {\n var _this4 = this;\n\n // 检查文件夹深度限制(最多5层)\n if (parent) {\n var depth = this.getFolderDepth(parent);\n\n if (depth >= 5) {\n this.$message.warning('文件夹层级已达到最大限制(5层),无法在此文件夹下继续新增子文件夹');\n return;\n }\n }\n\n this.dialogType = 'add';\n this.editingId = null;\n var defaultParentId = parent ? parent.id : 0;\n this.formData = {\n name: '',\n parentId: defaultParentId,\n sortOrder: 0\n };\n this.dialogVisible = true;\n this.$nextTick(function () {\n if (_this4.$refs.folderForm) _this4.$refs.folderForm.clearValidate();\n });\n },\n handleEdit: function handleEdit(item) {\n var _this5 = this;\n\n this.dialogType = 'edit';\n this.editingId = item.id;\n this.formData = {\n name: item.name,\n parentId: item.parentId || 0,\n sortOrder: item.sortOrder || 0\n };\n this.dialogVisible = true;\n this.$nextTick(function () {\n if (_this5.$refs.folderForm) _this5.$refs.folderForm.clearValidate();\n });\n },\n handleDelete: function handleDelete(item) {\n var _this6 = this;\n\n this.$confirm(\"\\u786E\\u8BA4\\u5220\\u9664\\u6587\\u4EF6\\u5939\\u300C\".concat(item.name, \"\\u300D\\uFF1F\\u5220\\u9664\\u540E\\u65E0\\u6CD5\\u6062\\u590D\\u3002\"), '提示', {\n type: 'warning',\n confirmButtonText: '确定删除',\n cancelButtonText: '取消'\n }).then(function () {\n (0, _knowledgeBase.deleteFolder)(item.id).then(function () {\n _this6.$message.success('删除成功');\n\n _this6.loadList();\n }).catch(function () {});\n }).catch(function () {});\n },\n\n /**\n * 提交新增/重命名文件夹\n */\n handleSubmit: function handleSubmit() {\n var _this7 = this;\n\n this.$refs.folderForm.validate(function (valid) {\n if (!valid) return; // 新增时检查所选上级文件夹深度(最多5层)\n\n if (_this7.dialogType === 'add') {\n var parentId = _this7.formData.parentId || 0;\n\n if (parentId !== 0) {\n var parent = _this7.list.find(function (f) {\n return f.id === parentId;\n });\n\n if (parent) {\n var depth = _this7.getFolderDepth(parent);\n\n if (depth >= 5) {\n _this7.$message.warning('所选上级文件夹已到达最大层级限制(5层),无法继续新增子文件夹');\n\n return;\n }\n }\n }\n }\n\n _this7.submitting = true;\n\n if (_this7.dialogType === 'add') {\n (0, _knowledgeBase.addFolder)({\n companyId: _this7.companyId,\n parentId: _this7.formData.parentId || 0,\n name: _this7.formData.name,\n sortOrder: _this7.formData.sortOrder,\n status: 1\n }).then(function () {\n _this7.$message.success('新增成功');\n\n _this7.dialogVisible = false;\n\n _this7.loadList();\n }).catch(function () {}).finally(function () {\n _this7.submitting = false;\n });\n } else {\n (0, _knowledgeBase.updateFolder)(_this7.editingId, {\n name: _this7.formData.name,\n sortOrder: _this7.formData.sortOrder\n }).then(function () {\n _this7.$message.success('修改成功');\n\n _this7.dialogVisible = false;\n\n _this7.loadList();\n }).catch(function () {}).finally(function () {\n _this7.submitting = false;\n });\n }\n });\n },\n\n /**\n * 打开猜你想问管理对话框\n */\n openSuggestedDialog: function openSuggestedDialog() {\n if (!this.companyId) return;\n this.suggestQuestions = [''];\n this.suggestDialogVisible = true;\n this.loadSuggestedList();\n },\n\n /**\n * 加载猜你想问问题列表\n */\n loadSuggestedList: function loadSuggestedList() {\n var _this8 = this;\n\n this.suggestLoading = true;\n (0, _knowledgeBase.getSuggestedQuestions)(this.companyId).then(function (list) {\n _this8.suggestList = list || [];\n }).catch(function () {}).finally(function () {\n _this8.suggestLoading = false;\n });\n },\n\n /**\n * 添加问题块点击(输入框数 + 已有问题数,上限 6)\n */\n onAddBtnClick: function onAddBtnClick() {\n if (this.suggestQuestions.length + this.suggestList.length >= 6) {\n this.$message.warning('最多可添加 6 个问题(含已有问题)');\n return;\n }\n\n this.addQuestionInput();\n },\n\n /**\n * 增加一个问题输入框(输入框数 + 已有问题数,上限 6)\n */\n addQuestionInput: function addQuestionInput() {\n if (this.suggestQuestions.length + this.suggestList.length >= 6) {\n this.$message.warning('最多可添加 6 个问题(含已有问题)');\n return;\n }\n\n this.suggestQuestions.push('');\n },\n\n /**\n * 移除一个问题输入框\n */\n removeQuestionInput: function removeQuestionInput(index) {\n this.suggestQuestions.splice(index, 1);\n },\n\n /**\n * 批量保存猜你想问问题\n */\n handleSaveSuggested: function handleSaveSuggested() {\n var _this9 = this;\n\n var questions = this.suggestQuestions.map(function (q) {\n return (q || '').trim();\n }).filter(Boolean);\n\n if (questions.length === 0) {\n this.$message.warning('请至少输入一个问题内容');\n return;\n }\n\n if (questions.length + this.suggestList.length > 6) {\n this.$message.warning(\"\\u6700\\u591A\\u53EF\\u6DFB\\u52A0 6 \\u4E2A\\u95EE\\u9898\\uFF08\\u542B\\u5DF2\\u6709 \".concat(this.suggestList.length, \" \\u4E2A\\uFF0C\\u672C\\u6B21\\u6700\\u591A\\u518D\\u6DFB\\u52A0 \").concat(Math.max(6 - this.suggestList.length, 0), \" \\u4E2A\\uFF09\"));\n return;\n }\n\n this.suggestSubmitting = true;\n (0, _knowledgeBase.addSuggestedQuestions)({\n companyId: this.companyId,\n questions: questions\n }).then(function (saved) {\n var count = (saved || []).length;\n\n if (count === 0) {\n _this9.$message.warning('所填问题均已存在,未新增');\n } else {\n _this9.$message.success(\"\\u4FDD\\u5B58\\u6210\\u529F\\uFF0C\\u65B0\\u589E \".concat(count, \" \\u4E2A\\u95EE\\u9898\"));\n }\n\n _this9.suggestQuestions = [''];\n\n _this9.loadSuggestedList();\n }).catch(function (msg) {\n if (msg) _this9.$message.error(msg);\n }).finally(function () {\n _this9.suggestSubmitting = false;\n });\n },\n\n /**\n * 删除猜你想问问题\n */\n handleDeleteSuggested: function handleDeleteSuggested(item) {\n var _this10 = this;\n\n this.$confirm(\"\\u786E\\u8BA4\\u5220\\u9664\\u95EE\\u9898\\u300C\".concat(item.questionText, \"\\u300D\\uFF1F\"), '提示', {\n type: 'warning',\n confirmButtonText: '确定删除',\n cancelButtonText: '取消'\n }).then(function () {\n (0, _knowledgeBase.deleteSuggestedQuestion)(item.id).then(function () {\n _this10.$message.success('删除成功');\n\n _this10.loadSuggestedList();\n }).catch(function () {});\n }).catch(function () {});\n }\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/CategoryManager.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
967
|
+
eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _knowledgeBase = __webpack_require__(/*! ./api/knowledgeBase */ \"./src/lib/knowledgeBase/api/knowledgeBase.js\");\n\nvar _MobileDialog = _interopRequireDefault(__webpack_require__(/*! ./MobileDialog.vue */ \"./src/lib/knowledgeBase/MobileDialog.vue\"));\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nvar _default = {\n name: 'CategoryManager',\n components: {\n MobileDialog: _MobileDialog.default\n },\n props: {\n companyId: {\n type: String,\n default: ''\n },\n // 是否移动端(由父组件根据宽度传入;未传时按窗口宽度自动判断)\n isMobile: {\n type: Boolean,\n default: null\n }\n },\n data: function data() {\n return {\n list: [],\n flatList: [],\n treeData: [],\n treeProps: {\n children: 'children',\n label: 'name'\n },\n loading: false,\n // 当前选中的文件夹 id(空字符串 = 全部文件)\n selectedFolderId: '',\n // 移动端操作单\n mobileActionVisible: false,\n mobileActionTarget: null,\n dialogVisible: false,\n dialogType: 'add',\n editingId: null,\n submitting: false,\n formData: {\n name: '',\n parentId: 0,\n sortOrder: 0\n },\n formRules: {\n name: [{\n required: true,\n message: '请输入文件夹名称',\n trigger: 'blur'\n }, {\n max: 50,\n message: '长度不超过50个字符',\n trigger: 'blur'\n }]\n },\n // 猜你想问\n suggestDialogVisible: false,\n suggestSubmitting: false,\n suggestLoading: false,\n suggestList: [],\n suggestQuestions: [''],\n // 移动端上级目录选择器\n parentPickerVisible: false\n };\n },\n computed: {\n /**\n * 可选作上级的文件夹列表(过滤掉已达最大层级的,避免无效选择)\n */\n availableParents: function availableParents() {\n var _this = this;\n\n return this.list.filter(function (f) {\n return _this.getFolderDepth(f) < 5;\n });\n },\n\n /**\n * 移动端上级目录回显名称\n */\n selectedParentName: function selectedParentName() {\n var _this2 = this;\n\n if (!this.formData.parentId) return '根目录';\n var f = this.availableParents.find(function (x) {\n return x.id === _this2.formData.parentId;\n });\n return f ? f.name : '';\n },\n\n /**\n * 当前是否选中「全部文件」\n */\n isAllSelected: function isAllSelected() {\n return !this.selectedFolderId;\n },\n\n /**\n * 移动端文件夹列表:前序遍历树,展开为 {node, depth} 数组,供扁平化渲染\n */\n mobileFolderRows: function mobileFolderRows() {\n var rows = [];\n\n var walk = function walk(nodes, depth) {\n ;\n (nodes || []).forEach(function (n) {\n rows.push({\n node: n,\n depth: depth\n });\n if (n.children && n.children.length) walk(n.children, depth + 1);\n });\n };\n\n walk(this.treeData, 0);\n return rows;\n }\n },\n watch: {\n companyId: function companyId() {\n this.loadList();\n }\n },\n created: function created() {\n if (this.companyId) {\n this.loadList();\n }\n },\n methods: {\n /**\n * 移动端上级目录选择器:选中即回填并收起(null = 根目录)\n */\n handleParentPick: function handleParentPick(f) {\n this.formData.parentId = f ? f.id : 0;\n this.parentPickerVisible = false;\n },\n\n /**\n * 加载文件夹列表(平铺 → 组装树)\n */\n loadList: function loadList() {\n var _this3 = this;\n\n if (!this.companyId) {\n this.list = [];\n this.flatList = [];\n this.treeData = [];\n this.$emit('list', []);\n return;\n }\n\n this.loading = true;\n (0, _knowledgeBase.getFolderList)(this.companyId).then(function (list) {\n _this3.list = list || [];\n _this3.flatList = _this3.list;\n _this3.treeData = _this3.buildTree(_this3.list);\n\n _this3.$emit('list', _this3.list); // 默认展示全部文件\n\n\n _this3.handleSelectAll();\n }).catch(function () {}).finally(function () {\n _this3.loading = false;\n });\n },\n\n /**\n * 平铺列表组装为树结构\n */\n buildTree: function buildTree(list) {\n var map = {};\n list.forEach(function (f) {\n f.children = [];\n map[f.id] = f;\n });\n var roots = [];\n list.forEach(function (f) {\n var pid = f.parentId || 0;\n\n if (map[pid]) {\n map[pid].children.push(f);\n } else {\n roots.push(f);\n }\n });\n return roots;\n },\n handleSelect: function handleSelect(data) {\n this.selectedFolderId = data.id || '';\n this.$emit('select', data);\n },\n\n /**\n * 移动端:点击某个文件夹 → 选中并进入该文件夹文档列表\n */\n handleSelectFolder: function handleSelectFolder(node) {\n this.selectedFolderId = node.id || '';\n this.$emit('select', node);\n this.$emit('docs-entry');\n },\n\n /**\n * 移动端:点击「全部文件」→ 选中全部并进入全部文档列表\n */\n handleSelectRoot: function handleSelectRoot() {\n this.handleSelectAll();\n this.$emit('docs-entry');\n },\n // 外部定位并高亮指定文件夹(用于批量移动成功后的联动)\n setCurrentFolder: function setCurrentFolder(folder) {\n var _this4 = this;\n\n if (!folder || !folder.id) return;\n this.selectedFolderId = folder.id;\n this.$nextTick(function () {\n if (_this4.$refs.treeRef) {\n _this4.$refs.treeRef.setCurrentKey(folder.id);\n }\n });\n this.$emit('select', folder);\n },\n\n /**\n * 显示全部文件:不带 folderId 查询\n */\n handleSelectAll: function handleSelectAll() {\n this.selectedFolderId = '';\n this.$refs.treeRef && this.$refs.treeRef.setCurrentKey(null);\n this.$emit('select', {\n id: '',\n name: '全部文件'\n });\n },\n\n /**\n * ===== 移动端操作单 =====\n */\n openMobileAction: function openMobileAction(node) {\n this.mobileActionTarget = node;\n this.mobileActionVisible = true;\n },\n closeMobileAction: function closeMobileAction() {\n this.mobileActionVisible = false;\n this.mobileActionTarget = null;\n },\n doMobileAdd: function doMobileAdd() {\n var target = this.mobileActionTarget;\n this.closeMobileAction(); // 子级新增时校验层级上限(handleAdd 内部已处理)\n\n if (target) this.handleAdd(target);\n },\n doMobileRename: function doMobileRename() {\n var target = this.mobileActionTarget;\n this.closeMobileAction();\n if (target) this.handleEdit(target);\n },\n doMobileDelete: function doMobileDelete() {\n var target = this.mobileActionTarget;\n this.closeMobileAction();\n if (target) this.handleDelete(target);\n },\n\n /**\n * 计算文件夹深度(第1层=根目录)\n */\n getFolderDepth: function getFolderDepth(item) {\n var depth = 1;\n var current = item;\n var visited = new Set();\n\n while (current.parentId && current.parentId !== 0) {\n if (visited.has(current.id)) break; // 防循环引用\n\n visited.add(current.id);\n var parent = this.list.find(function (f) {\n return f.id === current.parentId;\n });\n if (!parent) break;\n depth++;\n current = parent;\n }\n\n return depth;\n },\n handleAdd: function handleAdd(parent) {\n var _this5 = this;\n\n // 检查文件夹深度限制(最多5层)\n if (parent) {\n var depth = this.getFolderDepth(parent);\n\n if (depth >= 5) {\n this.$message.warning('文件夹层级已达到最大限制(5层),无法在此文件夹下继续新增子文件夹');\n return;\n }\n }\n\n this.dialogType = 'add';\n this.editingId = null;\n var defaultParentId = parent ? parent.id : 0;\n this.formData = {\n name: '',\n parentId: defaultParentId,\n sortOrder: 0\n };\n this.dialogVisible = true;\n this.$nextTick(function () {\n if (_this5.$refs.folderForm) _this5.$refs.folderForm.clearValidate();\n });\n },\n handleEdit: function handleEdit(item) {\n var _this6 = this;\n\n this.dialogType = 'edit';\n this.editingId = item.id;\n this.formData = {\n name: item.name,\n parentId: item.parentId || 0,\n sortOrder: item.sortOrder || 0\n };\n this.dialogVisible = true;\n this.$nextTick(function () {\n if (_this6.$refs.folderForm) _this6.$refs.folderForm.clearValidate();\n });\n },\n handleDelete: function handleDelete(item) {\n var _this7 = this;\n\n this.$confirm(\"\\u786E\\u8BA4\\u5220\\u9664\\u6587\\u4EF6\\u5939\\u300C\".concat(item.name, \"\\u300D\\uFF1F\\u5220\\u9664\\u540E\\u65E0\\u6CD5\\u6062\\u590D\\u3002\"), '提示', {\n type: 'warning',\n confirmButtonText: '确定删除',\n cancelButtonText: '取消'\n }).then(function () {\n (0, _knowledgeBase.deleteFolder)(item.id).then(function () {\n _this7.$message.success('删除成功');\n\n _this7.loadList();\n }).catch(function () {});\n }).catch(function () {});\n },\n\n /**\n * 提交新增/重命名文件夹\n */\n handleSubmit: function handleSubmit() {\n var _this8 = this;\n\n // 移动端为自绘表单,无 el-form 实例($refs.folderForm 为 undefined),改为手动校验\n if (this.isMobile) {\n this.submitFolder();\n return;\n }\n\n this.$refs.folderForm.validate(function (valid) {\n if (!valid) return;\n\n _this8.submitFolder();\n });\n },\n\n /**\n * 移动端自绘表单校验(与 formRules 保持一致)\n */\n validateMobileForm: function validateMobileForm() {\n var name = (this.formData.name || '').trim();\n\n if (!name) {\n this.$message.warning('请输入文件夹名称');\n return false;\n }\n\n if (name.length > 50) {\n this.$message.warning('长度不超过50个字符');\n return false;\n }\n\n return true;\n },\n\n /**\n * 实际提交(新增/重命名)\n */\n submitFolder: function submitFolder() {\n var _this9 = this;\n\n if (this.isMobile && !this.validateMobileForm()) return; // 新增时检查所选上级文件夹深度(最多5层)\n\n if (this.dialogType === 'add') {\n var parentId = this.formData.parentId || 0;\n\n if (parentId !== 0) {\n var parent = this.list.find(function (f) {\n return f.id === parentId;\n });\n\n if (parent) {\n var depth = this.getFolderDepth(parent);\n\n if (depth >= 5) {\n this.$message.warning('所选上级文件夹已到达最大层级限制(5层),无法继续新增子文件夹');\n return;\n }\n }\n }\n }\n\n this.submitting = true;\n\n if (this.dialogType === 'add') {\n (0, _knowledgeBase.addFolder)({\n companyId: this.companyId,\n parentId: this.formData.parentId || 0,\n name: this.formData.name,\n sortOrder: this.formData.sortOrder,\n status: 1\n }).then(function () {\n _this9.$message.success('新增成功');\n\n _this9.dialogVisible = false;\n\n _this9.loadList();\n }).catch(function () {}).finally(function () {\n _this9.submitting = false;\n });\n } else {\n (0, _knowledgeBase.updateFolder)(this.editingId, {\n name: this.formData.name,\n sortOrder: this.formData.sortOrder\n }).then(function () {\n _this9.$message.success('修改成功');\n\n _this9.dialogVisible = false;\n\n _this9.loadList();\n }).catch(function () {}).finally(function () {\n _this9.submitting = false;\n });\n }\n },\n\n /**\n * 打开猜你想问管理对话框\n */\n openSuggestedDialog: function openSuggestedDialog() {\n if (!this.companyId) return;\n this.suggestQuestions = [''];\n this.suggestDialogVisible = true;\n this.loadSuggestedList();\n },\n\n /**\n * 加载猜你想问问题列表\n */\n loadSuggestedList: function loadSuggestedList() {\n var _this10 = this;\n\n this.suggestLoading = true;\n (0, _knowledgeBase.getSuggestedQuestions)(this.companyId).then(function (list) {\n _this10.suggestList = list || [];\n }).catch(function () {}).finally(function () {\n _this10.suggestLoading = false;\n });\n },\n\n /**\n * 添加问题块点击(输入框数 + 已有问题数,上限 6)\n */\n onAddBtnClick: function onAddBtnClick() {\n if (this.suggestQuestions.length + this.suggestList.length >= 6) {\n this.$message.warning('最多可添加 6 个问题(含已有问题)');\n return;\n }\n\n this.addQuestionInput();\n },\n\n /**\n * 增加一个问题输入框(输入框数 + 已有问题数,上限 6)\n */\n addQuestionInput: function addQuestionInput() {\n if (this.suggestQuestions.length + this.suggestList.length >= 6) {\n this.$message.warning('最多可添加 6 个问题(含已有问题)');\n return;\n }\n\n this.suggestQuestions.push('');\n },\n\n /**\n * 移除一个问题输入框\n */\n removeQuestionInput: function removeQuestionInput(index) {\n this.suggestQuestions.splice(index, 1);\n },\n\n /**\n * 批量保存猜你想问问题\n */\n handleSaveSuggested: function handleSaveSuggested() {\n var _this11 = this;\n\n var questions = this.suggestQuestions.map(function (q) {\n return (q || '').trim();\n }).filter(Boolean);\n\n if (questions.length === 0) {\n this.$message.warning('请至少输入一个问题内容');\n return;\n }\n\n if (questions.length + this.suggestList.length > 6) {\n this.$message.warning(\"\\u6700\\u591A\\u53EF\\u6DFB\\u52A0 6 \\u4E2A\\u95EE\\u9898\\uFF08\\u542B\\u5DF2\\u6709 \".concat(this.suggestList.length, \" \\u4E2A\\uFF0C\\u672C\\u6B21\\u6700\\u591A\\u518D\\u6DFB\\u52A0 \").concat(Math.max(6 - this.suggestList.length, 0), \" \\u4E2A\\uFF09\"));\n return;\n }\n\n this.suggestSubmitting = true;\n (0, _knowledgeBase.addSuggestedQuestions)({\n companyId: this.companyId,\n questions: questions\n }).then(function (saved) {\n var count = (saved || []).length;\n\n if (count === 0) {\n _this11.$message.warning('所填问题均已存在,未新增');\n } else {\n _this11.$message.success(\"\\u4FDD\\u5B58\\u6210\\u529F\\uFF0C\\u65B0\\u589E \".concat(count, \" \\u4E2A\\u95EE\\u9898\"));\n }\n\n _this11.suggestQuestions = [''];\n\n _this11.loadSuggestedList();\n }).catch(function (msg) {\n if (msg) _this11.$message.error(msg);\n }).finally(function () {\n _this11.suggestSubmitting = false;\n });\n },\n\n /**\n * 删除猜你想问问题\n */\n handleDeleteSuggested: function handleDeleteSuggested(item) {\n var _this12 = this;\n\n this.$confirm(\"\\u786E\\u8BA4\\u5220\\u9664\\u95EE\\u9898\\u300C\".concat(item.questionText, \"\\u300D\\uFF1F\"), '提示', {\n type: 'warning',\n confirmButtonText: '确定删除',\n cancelButtonText: '取消'\n }).then(function () {\n (0, _knowledgeBase.deleteSuggestedQuestion)(item.id).then(function () {\n _this12.$message.success('删除成功');\n\n _this12.loadSuggestedList();\n }).catch(function () {});\n }).catch(function () {});\n }\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/CategoryManager.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
968
968
|
|
|
969
969
|
/***/ }),
|
|
970
970
|
|
|
@@ -976,7 +976,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n
|
|
|
976
976
|
/***/ (function(module, exports, __webpack_require__) {
|
|
977
977
|
|
|
978
978
|
"use strict";
|
|
979
|
-
eval("\n\nvar _interopRequireWildcard = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireWildcard */ \"./node_modules/@babel/runtime/helpers/interopRequireWildcard.js\").default;\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _createForOfIteratorHelper2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/createForOfIteratorHelper */ \"./node_modules/@babel/runtime/helpers/createForOfIteratorHelper.js\"));\n\nvar _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\"));\n\nvar _objectSpread2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/objectSpread2 */ \"./node_modules/@babel/runtime/helpers/objectSpread2.js\"));\n\nvar _marked = __webpack_require__(/*! marked */ \"./node_modules/marked/lib/marked.esm.js\");\n\nvar XLSX = _interopRequireWildcard(__webpack_require__(/*! xlsx */ \"./node_modules/xlsx/xlsx.mjs\"));\n\nvar _mammoth = _interopRequireDefault(__webpack_require__(/*! mammoth */ \"./node_modules/mammoth/lib/index.js\"));\n\nvar _docx = __webpack_require__(/*! docx */ \"./node_modules/docx/build/index.mjs\");\n\nvar _knowledgeBase = __webpack_require__(/*! ./api/knowledgeBase */ \"./src/lib/knowledgeBase/api/knowledgeBase.js\");\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n// 单文件大小上限:50MB\nvar MAX_SIZE = 50 * 1024 * 1024;\nvar ALLOWED_TYPES = ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf', 'txt', 'md', 'markdown', 'jpg', 'jpeg', 'png', 'gif', 'webp']; // 支持在线编辑的文本文件类型\n\nvar TEXT_EDITABLE_TYPES = ['txt', 'md', 'markdown', 'json', 'xml', 'yaml', 'yml', 'ini', 'cfg', 'env', 'js', 'ts', 'jsx', 'tsx', 'css', 'scss', 'less', 'html', 'htm', 'vue', 'py', 'java', 'rb', 'go', 'rs', 'sh', 'bat', 'ps1', 'sql', 'php', 'c', 'cpp', 'h', 'hpp', 'swift', 'kt', 'groovy'];\nvar _default2 = {\n name: 'DocumentForm',\n props: {\n companyId: {\n type: String,\n default: ''\n },\n folderList: {\n type: Array,\n default: function _default() {\n return [];\n }\n }\n },\n data: function data() {\n return {\n visible: false,\n isEdit: false,\n editingId: null,\n submitting: false,\n fileList: [],\n formData: {\n title: '',\n folderId: '',\n fileName: ''\n },\n resolvePromise: null,\n editingFileType: '',\n originalIndexStatus: 0,\n mdTab: 'edit',\n xlsxData: {\n sheetNames: [],\n currentSheet: '',\n rows: [],\n cols: [],\n workbook: null,\n loading: false\n },\n wordHtml: '',\n wordLoading: false,\n folderTreeProps: {\n children: 'children',\n label: 'name'\n },\n folderPopoverVisible: false\n };\n },\n watch: {\n /**\n * wordLoading 变为 false 时,编辑器 DOM 已渲染,将 wordHtml 写入编辑器\n */\n wordLoading: function wordLoading(val) {\n var _this = this;\n\n if (!val && this.wordHtml) {\n this.$nextTick(function () {\n var editor = _this.$refs && _this.$refs.wordEditor;\n\n if (editor) {\n editor.innerHTML = _this.wordHtml;\n }\n });\n }\n }\n },\n computed: {\n dialogTitle: function dialogTitle() {\n if (this.isXlsxType) return '编辑表格数据';\n if (this.isWordType) return '编辑 Word 文档';\n if (this.isTextEditable) return '编辑文件内容';\n return '编辑文档';\n },\n dialogWidth: function dialogWidth() {\n if (this.isXlsxType) return '960px';\n if (this.isWordType) return '900px';\n if (this.isTextEditable) return '860px';\n return '560px';\n },\n\n /**\n * 当前编辑的文件是否为文本可编辑类型\n */\n isTextEditable: function isTextEditable() {\n var t = (this.editingFileType || '').toLowerCase();\n return TEXT_EDITABLE_TYPES.includes(t);\n },\n\n /**\n * 当前编辑的文件是否为 Excel 类型\n */\n isXlsxType: function isXlsxType() {\n var t = (this.editingFileType || '').toLowerCase();\n return t === 'xlsx' || t === 'xls';\n },\n\n /**\n * 当前编辑的文件是否为 Markdown 类型(支持预览)\n */\n isMarkdownType: function isMarkdownType() {\n var t = (this.editingFileType || '').toLowerCase();\n return t === 'md' || t === 'markdown';\n },\n\n /**\n * 当前编辑的文件是否为 Word 类型\n */\n isWordType: function isWordType() {\n var t = (this.editingFileType || '').toLowerCase();\n return t === 'docx' || t === 'doc';\n },\n\n /**\n * Word 编辑器字符数\n */\n wordCharCount: function wordCharCount() {\n var editor = this.$refs && this.$refs.wordEditor;\n\n if (editor) {\n return (editor.innerText || '').replace(/\\s/g, '').length;\n }\n\n return (this.wordHtml || '').replace(/<[^>]+>/g, '').length;\n },\n\n /**\n * Markdown 预览 HTML\n */\n previewHtml: function previewHtml() {\n if (!this.formData.content) return '';\n return _marked.marked.parse(this.formData.content, {\n breaks: true,\n gfm: true\n });\n },\n\n /**\n * 所属文件夹树(由平铺列表组装,不污染 prop)\n */\n folderTree: function folderTree() {\n var nodes = this.folderList.map(function (f) {\n return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, f), {}, {\n children: []\n });\n });\n var map = {};\n nodes.forEach(function (n) {\n map[n.id] = n;\n });\n var roots = [];\n nodes.forEach(function (n) {\n var pid = n.parentId || 0;\n\n if (map[pid]) {\n map[pid].children.push(n);\n } else {\n roots.push(n);\n }\n });\n return roots;\n },\n\n /**\n * 当前所选文件夹的名称(用于下拉框显示)\n */\n selectedFolderName: function selectedFolderName() {\n var _this2 = this;\n\n if (!this.formData.folderId) return '';\n var f = this.folderList.find(function (x) {\n return x.id === _this2.formData.folderId;\n });\n return f ? f.name : '';\n }\n },\n methods: {\n handleFolderSelect: function handleFolderSelect(data) {\n this.formData.folderId = data.id;\n this.folderPopoverVisible = false;\n },\n handleFolderPopoverShow: function handleFolderPopoverShow() {\n var _this3 = this;\n\n this.$nextTick(function () {\n if (_this3.$refs.folderTreeRef) _this3.$refs.folderTreeRef.setCurrentKey(_this3.formData.folderId || null);\n });\n },\n clearFolderSelect: function clearFolderSelect() {\n this.formData.folderId = '';\n this.folderPopoverVisible = false;\n },\n\n /**\n * 打开上传对话框(新增)\n * @param {string} folderId - 预选文件夹ID\n * @returns {Promise}\n */\n openAdd: function openAdd(folderId) {\n var _this4 = this;\n\n this.isEdit = false;\n this.editingId = null;\n this.fileList = [];\n this.formData = {\n title: '',\n folderId: folderId || '',\n fileName: ''\n };\n this.visible = true;\n this.$nextTick(function () {\n if (_this4.$refs.folderTreeRef) _this4.$refs.folderTreeRef.setCurrentKey(_this4.formData.folderId || null);\n });\n return new Promise(function (resolve) {\n _this4.resolvePromise = resolve;\n });\n },\n\n /**\n * 打开编辑对话框\n * @param {object} file - 文件对象\n * @returns {Promise}\n */\n openEdit: function openEdit(file) {\n var _this5 = this;\n\n this.isEdit = true;\n this.editingId = file.id;\n this.editingFileType = file.fileType || '';\n this.originalIndexStatus = file.indexStatus || 0;\n this.fileList = [];\n this.mdTab = 'edit';\n this.resetXlsxData();\n this.formData = {\n title: file.title || '',\n folderId: file.folderId || '',\n fileName: file.fileName || '',\n content: ''\n };\n var t = (file.fileType || '').toLowerCase(); // 如果是文本可编辑类型,异步加载文件内容\n\n if (TEXT_EDITABLE_TYPES.includes(t)) {\n (0, _knowledgeBase.getFileDetail)(file.id).then(function (d) {\n _this5.formData.content = d.content || '';\n }).catch(function () {\n _this5.formData.content = '(内容加载失败)';\n });\n } // 如果是 Excel 类型,下载原文件并解析\n\n\n if (t === 'xlsx' || t === 'xls') {\n this.loadXlsxFile(file);\n }\n\n this.visible = true;\n this.$nextTick(function () {\n if (_this5.$refs.folderTreeRef) _this5.$refs.folderTreeRef.setCurrentKey(_this5.formData.folderId || null);\n }); // 如果是 Word 类型,下载原文件并解析(visible 先置为 true 确保 DOM 已渲染)\n\n if (t === 'docx' || t === 'doc') {\n this.loadWordFile(file);\n }\n\n return new Promise(function (resolve) {\n _this5.resolvePromise = resolve;\n });\n },\n // ==================== Excel 编辑 ====================\n resetXlsxData: function resetXlsxData() {\n this.xlsxData = {\n sheetNames: [],\n currentSheet: '',\n rows: [],\n cols: [],\n workbook: null,\n loading: false\n };\n },\n loadXlsxFile: function loadXlsxFile(file) {\n var _this6 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n var detail, fileUrl, response, ab, workbook;\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _this6.xlsxData.loading = true;\n _context.prev = 1;\n _context.next = 4;\n return (0, _knowledgeBase.getFileDetail)(file.id);\n\n case 4:\n detail = _context.sent;\n fileUrl = detail.fileUrl || file.fileUrl;\n\n if (fileUrl) {\n _context.next = 9;\n break;\n }\n\n _this6.$message.warning('无法获取文件下载地址');\n\n return _context.abrupt(\"return\");\n\n case 9:\n _context.next = 11;\n return fetch(fileUrl);\n\n case 11:\n response = _context.sent;\n\n if (response.ok) {\n _context.next = 14;\n break;\n }\n\n throw new Error('下载文件失败');\n\n case 14:\n _context.next = 16;\n return response.arrayBuffer();\n\n case 16:\n ab = _context.sent;\n workbook = XLSX.read(ab, {\n type: 'array'\n });\n _this6.xlsxData.workbook = workbook;\n _this6.xlsxData.sheetNames = workbook.SheetNames;\n\n if (workbook.SheetNames.length > 0) {\n _this6.xlsxData.currentSheet = workbook.SheetNames[0];\n\n _this6.buildXlsxSheetData(workbook.SheetNames[0]);\n }\n\n _context.next = 27;\n break;\n\n case 23:\n _context.prev = 23;\n _context.t0 = _context[\"catch\"](1);\n console.error('加载 Excel 文件失败', _context.t0);\n\n _this6.$message.error('加载 Excel 文件失败');\n\n case 27:\n _context.prev = 27;\n _this6.xlsxData.loading = false;\n return _context.finish(27);\n\n case 30:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, null, [[1, 23, 27, 30]]);\n }))();\n },\n buildXlsxSheetData: function buildXlsxSheetData(sheetName) {\n var workbook = this.xlsxData.workbook;\n if (!workbook) return;\n var sheet = workbook.Sheets[sheetName];\n\n if (!sheet) {\n this.xlsxData.rows = [];\n this.xlsxData.cols = [];\n return;\n } // 转为二维数组(defval 补齐空单元格,保证各列取值一致)\n\n\n var data = XLSX.utils.sheet_to_json(sheet, {\n header: 1,\n defval: ''\n });\n\n if (data.length === 0) {\n this.xlsxData.rows = [];\n this.xlsxData.cols = [];\n return;\n } // 列数以「所有行的最大宽度」为准:表头行可能只填了第一格,若直接按第一行长度定列会丢失后续列\n\n\n var maxCols = Math.max.apply(null, data.map(function (row) {\n return row && row.length || 0;\n })); // 第一行作为列名,未填表头的列用「列N」补齐\n\n this.xlsxData.cols = Array.from({\n length: maxCols\n }, function (_, i) {\n var v = data[0] && data[0][i];\n return v != null && String(v).trim() !== '' ? String(v) : \"\\u5217\".concat(i + 1);\n }); // 剩余行作为数据:过滤全空行,避免出现多余空白行\n\n this.xlsxData.rows = data.slice(1).filter(function (row) {\n return row && row.some(function (c) {\n return c != null && String(c).trim() !== '';\n });\n }).map(function (row) {\n var obj = {};\n\n for (var ci = 0; ci < maxCols; ci++) {\n obj[ci] = row[ci] != null ? String(row[ci]) : '';\n }\n\n return obj;\n });\n },\n switchXlsxSheet: function switchXlsxSheet(name) {\n // 先保存当前 sheet 的编辑数据到 workbook\n this.saveCurrentSheetData();\n this.xlsxData.currentSheet = name;\n this.buildXlsxSheetData(name);\n },\n addXlsxRow: function addXlsxRow() {\n var row = {};\n this.xlsxData.cols.forEach(function (col, ci) {\n row[ci] = '';\n });\n this.xlsxData.rows.push(row);\n },\n addXlsxCol: function addXlsxCol() {\n var _this7 = this;\n\n var newColName = \"\\u5217\".concat(this.xlsxData.cols.length + 1);\n this.xlsxData.cols.push(newColName);\n this.xlsxData.rows.forEach(function (row) {\n row[_this7.xlsxData.cols.length - 1] = '';\n });\n },\n deleteXlsxRow: function deleteXlsxRow() {\n if (this.xlsxData.rows.length === 0) return;\n this.xlsxData.rows.pop();\n },\n deleteXlsxCol: function deleteXlsxCol() {\n if (this.xlsxData.cols.length === 0) return;\n this.xlsxData.cols.pop();\n var ci = this.xlsxData.cols.length;\n this.xlsxData.rows.forEach(function (row) {\n delete row[ci];\n });\n },\n removeXlsxRow: function removeXlsxRow(index) {\n this.xlsxData.rows.splice(index, 1);\n },\n onXlsxCellChange: function onXlsxCellChange() {// 数据变更标记(将来可用于 dirty 判断)\n },\n\n /**\n * 将当前编辑的 rows/cols 写回 workbook.Sheets[currentSheet]\n */\n saveCurrentSheetData: function saveCurrentSheetData() {\n var _this8 = this;\n\n var workbook = this.xlsxData.workbook;\n var sheetName = this.xlsxData.currentSheet;\n if (!workbook || !sheetName || !this.xlsxData.cols.length) return;\n var aoa = [this.xlsxData.cols];\n this.xlsxData.rows.forEach(function (row) {\n // 用列索引取数,避免列名重复时 indexOf 定位错位\n var rowData = [];\n\n for (var ci = 0; ci < _this8.xlsxData.cols.length; ci++) {\n rowData.push(row[ci] != null ? row[ci] : '');\n }\n\n aoa.push(rowData);\n });\n workbook.Sheets[sheetName] = XLSX.utils.aoa_to_sheet(aoa);\n },\n\n /**\n * 生成新的 xlsx 文件并上传替换\n */\n replaceXlsxFile: function replaceXlsxFile() {\n var _this9 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n var workbook, origExt, isXls, bookType, mime, wbout, blob, originalName, file, formData, newFile;\n return regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n // 先保存当前 sheet 的编辑数据\n _this9.saveCurrentSheetData();\n\n workbook = _this9.xlsxData.workbook; // 写出所有 sheet 到新文件,保持与原文件扩展名一致(xls → biff8, xlsx → xlsx)\n\n origExt = ((_this9.formData.fileName || '').split('.').pop() || 'xlsx').toLowerCase();\n isXls = origExt === 'xls';\n bookType = isXls ? 'biff8' : 'xlsx';\n mime = isXls ? 'application/vnd.ms-excel' : 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n wbout = XLSX.write(workbook, {\n bookType: bookType,\n type: 'array'\n });\n blob = new Blob([wbout], {\n type: mime\n });\n originalName = (_this9.formData.fileName || 'export.xlsx').replace(/\\.(xls|xlsx)$/i, isXls ? '.xls' : '.xlsx');\n file = new File([blob], originalName, {\n type: mime\n }); // 上传新文件(携带 editId 原地替换原文件,保留原 id,避免删旧建新后旧 id 失效)\n\n formData = new FormData();\n formData.append('file', file);\n formData.append('companyId', _this9.companyId);\n\n if (_this9.formData.folderId) {\n formData.append('folderId', _this9.formData.folderId);\n }\n\n if (_this9.editingId) {\n formData.append('editId', _this9.editingId);\n }\n\n _context2.next = 17;\n return (0, _knowledgeBase.uploadFile)(formData);\n\n case 17:\n newFile = _context2.sent;\n return _context2.abrupt(\"return\", newFile);\n\n case 19:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2);\n }))();\n },\n // ==================== Word 编辑 ====================\n loadWordFile: function loadWordFile(file) {\n var _this10 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n var detail, fileUrl, response, ab, result;\n return regeneratorRuntime.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n _this10.wordLoading = true;\n _this10.wordHtml = '';\n _context3.prev = 2;\n _context3.next = 5;\n return (0, _knowledgeBase.getFileDetail)(file.id);\n\n case 5:\n detail = _context3.sent;\n fileUrl = detail.fileUrl || file.fileUrl;\n\n if (fileUrl) {\n _context3.next = 10;\n break;\n }\n\n _this10.$message.warning('无法获取文件下载地址');\n\n return _context3.abrupt(\"return\");\n\n case 10:\n _context3.next = 12;\n return fetch(fileUrl);\n\n case 12:\n response = _context3.sent;\n\n if (response.ok) {\n _context3.next = 15;\n break;\n }\n\n throw new Error('下载文件失败');\n\n case 15:\n _context3.next = 17;\n return response.arrayBuffer();\n\n case 17:\n ab = _context3.sent;\n\n if (ab.byteLength) {\n _context3.next = 21;\n break;\n }\n\n _this10.wordHtml = '<p>(空文档)</p>';\n return _context3.abrupt(\"return\");\n\n case 21:\n _context3.next = 23;\n return _mammoth.default.convertToHtml({\n arrayBuffer: ab\n });\n\n case 23:\n result = _context3.sent;\n _this10.wordHtml = result.value || '<p>(空文档)</p>';\n _context3.next = 31;\n break;\n\n case 27:\n _context3.prev = 27;\n _context3.t0 = _context3[\"catch\"](2);\n console.error('加载 Word 文件失败', _context3.t0);\n\n _this10.$message.error('加载 Word 文件失败:文件可能为空或格式不支持在线编辑(仅支持 .docx)');\n\n case 31:\n _context3.prev = 31;\n _this10.wordLoading = false;\n return _context3.finish(31);\n\n case 34:\n case \"end\":\n return _context3.stop();\n }\n }\n }, _callee3, null, [[2, 27, 31, 34]]);\n }))();\n },\n execFormat: function execFormat(command, value) {\n document.execCommand(command, false, value || null);\n this.$refs.wordEditor && this.$refs.wordEditor.focus();\n },\n onWordInput: function onWordInput() {\n // 触发 wordCharCount 重新计算\n this.$forceUpdate();\n },\n\n /**\n * 将编辑后的 HTML 转为 .docx 文件并上传替换\n */\n replaceWordFile: function replaceWordFile() {\n var _this11 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {\n var editor, html, paragraphs, doc, blob, originalName, file, formData, newFile;\n return regeneratorRuntime.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n editor = _this11.$refs.wordEditor;\n html = editor ? editor.innerHTML : _this11.wordHtml; // 用 docx 包生成新文档\n\n paragraphs = _this11.htmlToDocxParagraphs(html);\n doc = new _docx.Document({\n sections: [{\n children: paragraphs\n }]\n });\n _context4.next = 6;\n return _docx.Packer.toBlob(doc);\n\n case 6:\n blob = _context4.sent;\n originalName = _this11.formData.fileName || 'document.docx';\n file = new File([blob], originalName, {\n type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\n }); // 上传新文件(携带 editId 原地替换原文件,保留原 id,避免删旧建新后旧 id 失效)\n\n formData = new FormData();\n formData.append('file', file);\n formData.append('companyId', _this11.companyId);\n\n if (_this11.formData.folderId) {\n formData.append('folderId', _this11.formData.folderId);\n }\n\n if (_this11.editingId) {\n formData.append('editId', _this11.editingId);\n }\n\n _context4.next = 16;\n return (0, _knowledgeBase.uploadFile)(formData);\n\n case 16:\n newFile = _context4.sent;\n return _context4.abrupt(\"return\", newFile);\n\n case 18:\n case \"end\":\n return _context4.stop();\n }\n }\n }, _callee4);\n }))();\n },\n\n /**\n * 将 HTML 内容解析为 docx Paragraph 数组\n */\n htmlToDocxParagraphs: function htmlToDocxParagraphs(html) {\n var _this12 = this;\n\n var div = document.createElement('div');\n div.innerHTML = html;\n var children = div.childNodes;\n var paragraphs = [];\n\n var _iterator = (0, _createForOfIteratorHelper2.default)(children),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var node = _step.value;\n\n if (node.nodeType === 3) {\n // 纯文本节点\n var text = (node.textContent || '').trim();\n\n if (text) {\n paragraphs.push(new _docx.Paragraph({\n children: [new _docx.TextRun(text)]\n }));\n }\n\n continue;\n }\n\n if (node.nodeType !== 1) continue;\n var tag = node.tagName.toLowerCase(); // 标题 h1-h6\n\n if (/^h[1-6]$/.test(tag)) {\n var level = parseInt(tag[1]);\n var headingMap = {\n 1: _docx.HeadingLevel.HEADING_1,\n 2: _docx.HeadingLevel.HEADING_2,\n 3: _docx.HeadingLevel.HEADING_3,\n 4: _docx.HeadingLevel.HEADING_4,\n 5: _docx.HeadingLevel.HEADING_5,\n 6: _docx.HeadingLevel.HEADING_6\n };\n\n var _text = node.textContent || '';\n\n paragraphs.push(new _docx.Paragraph({\n heading: headingMap[level] || _docx.HeadingLevel.HEADING_1,\n spacing: {\n before: 200,\n after: 100\n },\n children: [new _docx.TextRun({\n text: _text,\n bold: level <= 3,\n size: level <= 1 ? 32 : level <= 2 ? 28 : 24\n })]\n }));\n continue;\n } // 段落、div、引用\n\n\n if (tag === 'p' || tag === 'div' || tag === 'blockquote') {\n var _runs = this.buildTextRuns(node);\n\n var opts = {\n children: _runs,\n spacing: {\n after: 80\n }\n };\n\n if (tag === 'blockquote') {\n opts.indent = {\n left: 400\n };\n }\n\n paragraphs.push(new _docx.Paragraph(opts));\n continue;\n } // 无序列表\n\n\n if (tag === 'ul') {\n var items = node.querySelectorAll('li');\n items.forEach(function (li) {\n var runs = _this12.buildTextRuns(li);\n\n paragraphs.push(new _docx.Paragraph({\n children: runs,\n bullet: {\n level: 0\n },\n spacing: {\n after: 40\n }\n }));\n });\n continue;\n } // 有序列表\n\n\n if (tag === 'ol') {\n var _ret = function () {\n var items = node.querySelectorAll('li');\n var num = 1;\n items.forEach(function (li) {\n var runs = _this12.buildTextRuns(li);\n\n paragraphs.push(new _docx.Paragraph({\n children: runs,\n numbering: {\n reference: 1,\n level: 0\n },\n spacing: {\n after: 40\n }\n }));\n num++;\n });\n return \"continue\";\n }();\n\n if (_ret === \"continue\") continue;\n } // 其他标签(pre, hr 等)当作段落处理\n\n\n var runs = this.buildTextRuns(node);\n\n if (runs.length > 0) {\n paragraphs.push(new _docx.Paragraph({\n children: runs\n }));\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n return paragraphs;\n },\n\n /**\n * 从 DOM 节点构建 TextRun 数组\n */\n buildTextRuns: function buildTextRuns(node) {\n var runs = [];\n\n var walk = function walk(el) {\n el.childNodes.forEach(function (child) {\n if (child.nodeType === 3) {\n var text = (child.textContent || '').trim();\n\n if (text) {\n runs.push(new _docx.TextRun({\n text: text\n }));\n }\n } else if (child.nodeType === 1) {\n var t = child.tagName.toLowerCase();\n\n var _text2 = child.textContent || '';\n\n if (t === 'br') {// 换行不处理\n } else if (t === 'strong' || t === 'b') {\n runs.push(new _docx.TextRun({\n text: _text2,\n bold: true\n }));\n } else if (t === 'em' || t === 'i') {\n runs.push(new _docx.TextRun({\n text: _text2,\n italics: true\n }));\n } else if (t === 'u') {\n runs.push(new _docx.TextRun({\n text: _text2,\n underline: {\n type: 'single'\n }\n }));\n } else if (t === 'a') {\n runs.push(new _docx.TextRun({\n text: _text2\n }));\n } else {\n walk(child);\n }\n }\n });\n };\n\n walk(node);\n return runs;\n },\n // ==================== 表单提交 ====================\n handleFileChange: function handleFileChange(file, fileList) {\n this.fileList = fileList;\n },\n handleFileRemove: function handleFileRemove(file, fileList) {\n this.fileList = fileList;\n },\n handleFileExceed: function handleFileExceed() {\n this.$message.warning('最多只能上传 5 个文件');\n },\n\n /**\n * 上传前校验:大小 50MB、类型白名单\n */\n beforeUpload: function beforeUpload(file) {\n if (file.size > MAX_SIZE) {\n this.$message.error(\"\\u6587\\u4EF6\\u300C\".concat(file.name, \"\\u300D\\u5927\\u5C0F\\u4E0D\\u80FD\\u8D85\\u8FC7 50MB\"));\n return false;\n }\n\n var ext = file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase();\n\n if (!ALLOWED_TYPES.includes(ext)) {\n this.$message.error(\"\\u6587\\u4EF6\\u300C\".concat(file.name, \"\\u300D\\u7C7B\\u578B\\u4E0D\\u652F\\u6301: .\").concat(ext));\n return false;\n }\n\n return true;\n },\n handleSubmit: function handleSubmit() {\n if (this.isEdit) {\n this.handleSubmitEdit();\n } else {\n this.handleSubmitUpload();\n }\n },\n\n /**\n * 上传模式提交:逐个文件构造 FormData 调用上传接口\n */\n handleSubmitUpload: function handleSubmitUpload() {\n var _this13 = this;\n\n if (!this.companyId) {\n this.$message.warning('公司ID不能为空');\n return;\n }\n\n if (!this.formData.folderId) {\n this.$message.warning('请选择所属文件夹');\n return;\n }\n\n var files = this.fileList.filter(function (f) {\n return f.status !== 'success';\n });\n\n if (files.length === 0) {\n this.$message.warning('请先选择文件');\n return;\n } // 空文件直接拦截,避免上传后预览/解析失败\n\n\n var emptyFile = files.find(function (f) {\n return f.raw && f.raw.size === 0;\n });\n\n if (emptyFile) {\n this.$message.error(\"\\u6587\\u4EF6\\u300C\".concat(emptyFile.name, \"\\u300D\\u5185\\u5BB9\\u4E3A\\u7A7A\\uFF0C\\u8BF7\\u4E0A\\u4F20\\u6709\\u6548\\u6587\\u4EF6\"));\n return;\n }\n\n this.submitting = true; // 逐个上传(后端单文件接口)\n\n var tasks = files.map(function (file) {\n var formData = new FormData();\n formData.append('file', file.raw);\n formData.append('companyId', _this13.companyId);\n console.log('[DocumentForm] 上传文件:', file.name, ', companyId:', _this13.companyId);\n\n if (_this13.formData.folderId) {\n formData.append('folderId', _this13.formData.folderId);\n }\n\n return (0, _knowledgeBase.uploadFile)(formData);\n });\n Promise.all(tasks).then(function () {\n _this13.$message.success(\"\\u6210\\u529F\\u4E0A\\u4F20 \".concat(files.length, \" \\u4E2A\\u6587\\u4EF6\"));\n\n _this13.visible = false;\n\n if (_this13.resolvePromise) {\n _this13.resolvePromise(true);\n\n _this13.resolvePromise = null;\n }\n }).catch(function () {}).finally(function () {\n _this13.submitting = false;\n });\n },\n\n /**\n * 编辑模式提交\n */\n handleSubmitEdit: function handleSubmitEdit() {\n var _this14 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {\n var newFile, _newFile, data;\n\n return regeneratorRuntime.wrap(function _callee5$(_context5) {\n while (1) {\n switch (_context5.prev = _context5.next) {\n case 0:\n _this14.submitting = true;\n _context5.prev = 1;\n\n if (!_this14.isXlsxType) {\n _context5.next = 10;\n break;\n }\n\n _context5.next = 5;\n return _this14.replaceXlsxFile();\n\n case 5:\n newFile = _context5.sent;\n _context5.next = 8;\n return _this14.syncEditedMeta(newFile);\n\n case 8:\n _context5.next = 23;\n break;\n\n case 10:\n if (!_this14.isWordType) {\n _context5.next = 18;\n break;\n }\n\n _context5.next = 13;\n return _this14.replaceWordFile();\n\n case 13:\n _newFile = _context5.sent;\n _context5.next = 16;\n return _this14.syncEditedMeta(_newFile);\n\n case 16:\n _context5.next = 23;\n break;\n\n case 18:\n // 普通文件:更新元数据 + 文本内容\n data = {\n title: _this14.formData.title\n };\n\n if (_this14.formData.folderId) {\n data.folderId = _this14.formData.folderId;\n }\n\n if (_this14.isTextEditable && _this14.formData.content) {\n data.content = _this14.formData.content;\n }\n\n _context5.next = 23;\n return (0, _knowledgeBase.updateFile)(_this14.editingId, data);\n\n case 23:\n if (!(_this14.originalIndexStatus === 1)) {\n _context5.next = 33;\n break;\n }\n\n _context5.prev = 24;\n _context5.next = 27;\n return (0, _knowledgeBase.deleteFileIndex)(_this14.editingId);\n\n case 27:\n _this14.$message.info('文件已修改,原索引已删除,请重新执行索引');\n\n _context5.next = 33;\n break;\n\n case 30:\n _context5.prev = 30;\n _context5.t0 = _context5[\"catch\"](24);\n console.error('删除旧索引失败', _context5.t0);\n\n case 33:\n _this14.$message.success('修改成功');\n\n _this14.visible = false;\n\n if (_this14.resolvePromise) {\n _this14.resolvePromise(true);\n\n _this14.resolvePromise = null;\n }\n\n _context5.next = 42;\n break;\n\n case 38:\n _context5.prev = 38;\n _context5.t1 = _context5[\"catch\"](1);\n console.error('保存失败', _context5.t1);\n\n _this14.$message.error('保存失败');\n\n case 42:\n _context5.prev = 42;\n _this14.submitting = false;\n return _context5.finish(42);\n\n case 45:\n case \"end\":\n return _context5.stop();\n }\n }\n }, _callee5, null, [[1, 38, 42, 45], [24, 30]]);\n }))();\n },\n\n /**\n * Word/Excel 替换保存后,同步标题与所属文件夹元数据\n */\n syncEditedMeta: function syncEditedMeta(newFile) {\n var _this15 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee6() {\n var id, data, title;\n return regeneratorRuntime.wrap(function _callee6$(_context6) {\n while (1) {\n switch (_context6.prev = _context6.next) {\n case 0:\n id = newFile && newFile.id || _this15.editingId;\n data = {};\n title = (_this15.formData.title || '').trim();\n if (title) data.title = title;\n if (_this15.formData.folderId) data.folderId = _this15.formData.folderId;\n\n if (!Object.keys(data).length) {\n _context6.next = 8;\n break;\n }\n\n _context6.next = 8;\n return (0, _knowledgeBase.updateFile)(id, data);\n\n case 8:\n case \"end\":\n return _context6.stop();\n }\n }\n }, _callee6);\n }))();\n },\n onDialogOpened: function onDialogOpened() {\n // dialog 完全打开后,尝试将 wordHtml 写入编辑器\n if (this.isWordType && this.wordHtml && this.$refs && this.$refs.wordEditor) {\n this.$refs.wordEditor.innerHTML = this.wordHtml;\n }\n },\n handleClosed: function handleClosed() {\n // 关闭后清空上传列表,避免下次打开残留\n if (this.$refs.uploadRef) {\n this.$refs.uploadRef.clearFiles();\n }\n\n this.fileList = [];\n this.resetXlsxData();\n this.wordHtml = '';\n\n if (this.resolvePromise) {\n this.resolvePromise(null);\n this.resolvePromise = null;\n }\n }\n }\n};\nexports.default = _default2;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/DocumentForm.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
979
|
+
eval("\n\nvar _interopRequireWildcard = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireWildcard */ \"./node_modules/@babel/runtime/helpers/interopRequireWildcard.js\").default;\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _createForOfIteratorHelper2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/createForOfIteratorHelper */ \"./node_modules/@babel/runtime/helpers/createForOfIteratorHelper.js\"));\n\nvar _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\"));\n\nvar _objectSpread2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/objectSpread2 */ \"./node_modules/@babel/runtime/helpers/objectSpread2.js\"));\n\nvar _marked = __webpack_require__(/*! marked */ \"./node_modules/marked/lib/marked.esm.js\");\n\nvar XLSX = _interopRequireWildcard(__webpack_require__(/*! xlsx */ \"./node_modules/xlsx/xlsx.mjs\"));\n\nvar _mammoth = _interopRequireDefault(__webpack_require__(/*! mammoth */ \"./node_modules/mammoth/lib/index.js\"));\n\nvar _docx = __webpack_require__(/*! docx */ \"./node_modules/docx/build/index.mjs\");\n\nvar _knowledgeBase = __webpack_require__(/*! ./api/knowledgeBase */ \"./src/lib/knowledgeBase/api/knowledgeBase.js\");\n\nvar _MobileDialog = _interopRequireDefault(__webpack_require__(/*! ./MobileDialog.vue */ \"./src/lib/knowledgeBase/MobileDialog.vue\"));\n\nvar _native = __webpack_require__(/*! ./native.js */ \"./src/lib/knowledgeBase/native.js\");\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n// 单文件大小上限:50MB\nvar MAX_SIZE = 50 * 1024 * 1024;\nvar ALLOWED_TYPES = ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf', 'txt', 'md', 'markdown', 'jpg', 'jpeg', 'png', 'gif', 'webp']; // 支持在线编辑的文本文件类型\n\nvar TEXT_EDITABLE_TYPES = ['txt', 'md', 'markdown', 'json', 'xml', 'yaml', 'yml', 'ini', 'cfg', 'env', 'js', 'ts', 'jsx', 'tsx', 'css', 'scss', 'less', 'html', 'htm', 'vue', 'py', 'java', 'rb', 'go', 'rs', 'sh', 'bat', 'ps1', 'sql', 'php', 'c', 'cpp', 'h', 'hpp', 'swift', 'kt', 'groovy'];\nvar _default2 = {\n name: 'DocumentForm',\n components: {\n MobileDialog: _MobileDialog.default\n },\n props: {\n companyId: {\n type: String,\n default: ''\n },\n folderList: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n // 是否移动端(由父组件根据宽度传入)\n isMobile: {\n type: Boolean,\n default: null\n }\n },\n data: function data() {\n return {\n visible: false,\n isEdit: false,\n editingId: null,\n submitting: false,\n fileList: [],\n formData: {\n title: '',\n folderId: '',\n fileName: ''\n },\n resolvePromise: null,\n editingFileType: '',\n originalIndexStatus: 0,\n mdTab: 'edit',\n xlsxData: {\n sheetNames: [],\n currentSheet: '',\n rows: [],\n cols: [],\n workbook: null,\n loading: false\n },\n wordHtml: '',\n wordLoading: false,\n folderPickerVisible: false,\n folderTreeProps: {\n children: 'children',\n label: 'name'\n },\n folderPopoverVisible: false\n };\n },\n watch: {\n /**\n * wordLoading 变为 false 时,编辑器 DOM 已渲染,将 wordHtml 写入编辑器\n */\n wordLoading: function wordLoading(val) {\n var _this = this;\n\n if (!val && this.wordHtml) {\n this.$nextTick(function () {\n var editor = _this.$refs && _this.$refs.wordEditor;\n\n if (editor) {\n editor.innerHTML = _this.wordHtml;\n }\n });\n }\n }\n },\n computed: {\n /**\n * 文件夹扁平列表(移动端原生下拉用,depth 缩进体现层级)\n */\n folderFlat: function folderFlat() {\n return (0, _native.flattenFolderTree)(this.folderTree);\n },\n dialogTitle: function dialogTitle() {\n if (this.isXlsxType) return '编辑表格数据';\n if (this.isWordType) return '编辑 Word 文档';\n if (this.isTextEditable) return '编辑文件内容';\n return '编辑文档';\n },\n dialogWidth: function dialogWidth() {\n // 移动端全屏展示\n if (this.isMobile) return '100%';\n if (this.isXlsxType) return '960px';\n if (this.isWordType) return '900px';\n if (this.isTextEditable) return '860px';\n return '560px';\n },\n\n /**\n * 当前编辑的文件是否为文本可编辑类型\n */\n isTextEditable: function isTextEditable() {\n var t = (this.editingFileType || '').toLowerCase();\n return TEXT_EDITABLE_TYPES.includes(t);\n },\n\n /**\n * 当前编辑的文件是否为 Excel 类型\n */\n isXlsxType: function isXlsxType() {\n var t = (this.editingFileType || '').toLowerCase();\n return t === 'xlsx' || t === 'xls';\n },\n\n /**\n * 当前编辑的文件是否为 Markdown 类型(支持预览)\n */\n isMarkdownType: function isMarkdownType() {\n var t = (this.editingFileType || '').toLowerCase();\n return t === 'md' || t === 'markdown';\n },\n\n /**\n * 当前编辑的文件是否为 Word 类型\n */\n isWordType: function isWordType() {\n var t = (this.editingFileType || '').toLowerCase();\n return t === 'docx' || t === 'doc';\n },\n\n /**\n * Word 编辑器字符数\n */\n wordCharCount: function wordCharCount() {\n var editor = this.$refs && this.$refs.wordEditor;\n\n if (editor) {\n return (editor.innerText || '').replace(/\\s/g, '').length;\n }\n\n return (this.wordHtml || '').replace(/<[^>]+>/g, '').length;\n },\n\n /**\n * Markdown 预览 HTML\n */\n previewHtml: function previewHtml() {\n if (!this.formData.content) return '';\n return _marked.marked.parse(this.formData.content, {\n breaks: true,\n gfm: true\n });\n },\n\n /**\n * 所属文件夹树(由平铺列表组装,不污染 prop)\n */\n folderTree: function folderTree() {\n var nodes = this.folderList.map(function (f) {\n return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, f), {}, {\n children: []\n });\n });\n var map = {};\n nodes.forEach(function (n) {\n map[n.id] = n;\n });\n var roots = [];\n nodes.forEach(function (n) {\n var pid = n.parentId || 0;\n\n if (map[pid]) {\n map[pid].children.push(n);\n } else {\n roots.push(n);\n }\n });\n return roots;\n },\n\n /**\n * 当前所选文件夹的名称(用于下拉框显示)\n */\n selectedFolderName: function selectedFolderName() {\n var _this2 = this;\n\n if (!this.formData.folderId) return '';\n var f = this.folderList.find(function (x) {\n return x.id === _this2.formData.folderId;\n });\n return f ? f.name : '';\n }\n },\n methods: {\n /**\n * 移动端文件夹选择器:选中即回填并收起\n */\n handleMobileFolderPick: function handleMobileFolderPick(node) {\n this.formData.folderId = node.id;\n this.folderPickerVisible = false;\n },\n handleFolderSelect: function handleFolderSelect(data) {\n this.formData.folderId = data.id;\n this.folderPopoverVisible = false;\n },\n handleFolderPopoverShow: function handleFolderPopoverShow() {\n var _this3 = this;\n\n this.$nextTick(function () {\n if (_this3.$refs.folderTreeRef) _this3.$refs.folderTreeRef.setCurrentKey(_this3.formData.folderId || null);\n });\n },\n clearFolderSelect: function clearFolderSelect() {\n this.formData.folderId = '';\n this.folderPopoverVisible = false;\n },\n\n /**\n * 打开上传对话框(新增)\n * @param {string} folderId - 预选文件夹ID\n * @returns {Promise}\n */\n openAdd: function openAdd(folderId) {\n var _this4 = this;\n\n this.isEdit = false;\n this.editingId = null;\n this.fileList = [];\n this.formData = {\n title: '',\n folderId: folderId || '',\n fileName: ''\n };\n this.visible = true;\n this.$nextTick(function () {\n if (_this4.$refs.folderTreeRef) _this4.$refs.folderTreeRef.setCurrentKey(_this4.formData.folderId || null);\n });\n return new Promise(function (resolve) {\n _this4.resolvePromise = resolve;\n });\n },\n\n /**\n * 打开编辑对话框\n * @param {object} file - 文件对象\n * @returns {Promise}\n */\n openEdit: function openEdit(file) {\n var _this5 = this;\n\n this.isEdit = true;\n this.editingId = file.id;\n this.editingFileType = file.fileType || '';\n this.originalIndexStatus = file.indexStatus || 0;\n this.fileList = [];\n this.mdTab = 'edit';\n this.resetXlsxData();\n this.formData = {\n title: file.title || '',\n folderId: file.folderId || '',\n fileName: file.fileName || '',\n content: ''\n };\n var t = (file.fileType || '').toLowerCase(); // 如果是文本可编辑类型,异步加载文件内容\n\n if (TEXT_EDITABLE_TYPES.includes(t)) {\n (0, _knowledgeBase.getFileDetail)(file.id).then(function (d) {\n _this5.formData.content = d.content || '';\n }).catch(function () {\n _this5.formData.content = '(内容加载失败)';\n });\n } // 如果是 Excel 类型,下载原文件并解析\n\n\n if (t === 'xlsx' || t === 'xls') {\n this.loadXlsxFile(file);\n }\n\n this.visible = true;\n this.$nextTick(function () {\n if (_this5.$refs.folderTreeRef) _this5.$refs.folderTreeRef.setCurrentKey(_this5.formData.folderId || null);\n }); // 如果是 Word 类型,下载原文件并解析(visible 先置为 true 确保 DOM 已渲染)\n\n if (t === 'docx' || t === 'doc') {\n this.loadWordFile(file);\n }\n\n return new Promise(function (resolve) {\n _this5.resolvePromise = resolve;\n });\n },\n // ==================== Excel 编辑 ====================\n resetXlsxData: function resetXlsxData() {\n this.xlsxData = {\n sheetNames: [],\n currentSheet: '',\n rows: [],\n cols: [],\n workbook: null,\n loading: false\n };\n },\n loadXlsxFile: function loadXlsxFile(file) {\n var _this6 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n var detail, fileUrl, response, ab, workbook;\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _this6.xlsxData.loading = true;\n _context.prev = 1;\n _context.next = 4;\n return (0, _knowledgeBase.getFileDetail)(file.id);\n\n case 4:\n detail = _context.sent;\n fileUrl = detail.fileUrl || file.fileUrl;\n\n if (fileUrl) {\n _context.next = 9;\n break;\n }\n\n _this6.$message.warning('无法获取文件下载地址');\n\n return _context.abrupt(\"return\");\n\n case 9:\n _context.next = 11;\n return fetch(fileUrl);\n\n case 11:\n response = _context.sent;\n\n if (response.ok) {\n _context.next = 14;\n break;\n }\n\n throw new Error('下载文件失败');\n\n case 14:\n _context.next = 16;\n return response.arrayBuffer();\n\n case 16:\n ab = _context.sent;\n workbook = XLSX.read(ab, {\n type: 'array'\n });\n _this6.xlsxData.workbook = workbook;\n _this6.xlsxData.sheetNames = workbook.SheetNames;\n\n if (workbook.SheetNames.length > 0) {\n _this6.xlsxData.currentSheet = workbook.SheetNames[0];\n\n _this6.buildXlsxSheetData(workbook.SheetNames[0]);\n }\n\n _context.next = 27;\n break;\n\n case 23:\n _context.prev = 23;\n _context.t0 = _context[\"catch\"](1);\n console.error('加载 Excel 文件失败', _context.t0);\n\n _this6.$message.error('加载 Excel 文件失败');\n\n case 27:\n _context.prev = 27;\n _this6.xlsxData.loading = false;\n return _context.finish(27);\n\n case 30:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, null, [[1, 23, 27, 30]]);\n }))();\n },\n buildXlsxSheetData: function buildXlsxSheetData(sheetName) {\n var workbook = this.xlsxData.workbook;\n if (!workbook) return;\n var sheet = workbook.Sheets[sheetName];\n\n if (!sheet) {\n this.xlsxData.rows = [];\n this.xlsxData.cols = [];\n return;\n } // 转为二维数组(defval 补齐空单元格,保证各列取值一致)\n\n\n var data = XLSX.utils.sheet_to_json(sheet, {\n header: 1,\n defval: ''\n });\n\n if (data.length === 0) {\n this.xlsxData.rows = [];\n this.xlsxData.cols = [];\n return;\n } // 列数以「所有行的最大宽度」为准:表头行可能只填了第一格,若直接按第一行长度定列会丢失后续列\n\n\n var maxCols = Math.max.apply(null, data.map(function (row) {\n return row && row.length || 0;\n })); // 第一行作为列名,未填表头的列用「列N」补齐\n\n this.xlsxData.cols = Array.from({\n length: maxCols\n }, function (_, i) {\n var v = data[0] && data[0][i];\n return v != null && String(v).trim() !== '' ? String(v) : \"\\u5217\".concat(i + 1);\n }); // 剩余行作为数据:过滤全空行,避免出现多余空白行\n\n this.xlsxData.rows = data.slice(1).filter(function (row) {\n return row && row.some(function (c) {\n return c != null && String(c).trim() !== '';\n });\n }).map(function (row) {\n var obj = {};\n\n for (var ci = 0; ci < maxCols; ci++) {\n obj[ci] = row[ci] != null ? String(row[ci]) : '';\n }\n\n return obj;\n });\n },\n switchXlsxSheet: function switchXlsxSheet(name) {\n // 先保存当前 sheet 的编辑数据到 workbook\n this.saveCurrentSheetData();\n this.xlsxData.currentSheet = name;\n this.buildXlsxSheetData(name);\n },\n addXlsxRow: function addXlsxRow() {\n var row = {};\n this.xlsxData.cols.forEach(function (col, ci) {\n row[ci] = '';\n });\n this.xlsxData.rows.push(row);\n },\n addXlsxCol: function addXlsxCol() {\n var _this7 = this;\n\n var newColName = \"\\u5217\".concat(this.xlsxData.cols.length + 1);\n this.xlsxData.cols.push(newColName);\n this.xlsxData.rows.forEach(function (row) {\n row[_this7.xlsxData.cols.length - 1] = '';\n });\n },\n deleteXlsxRow: function deleteXlsxRow() {\n if (this.xlsxData.rows.length === 0) return;\n this.xlsxData.rows.pop();\n },\n deleteXlsxCol: function deleteXlsxCol() {\n if (this.xlsxData.cols.length === 0) return;\n this.xlsxData.cols.pop();\n var ci = this.xlsxData.cols.length;\n this.xlsxData.rows.forEach(function (row) {\n delete row[ci];\n });\n },\n removeXlsxRow: function removeXlsxRow(index) {\n this.xlsxData.rows.splice(index, 1);\n },\n onXlsxCellChange: function onXlsxCellChange() {// 数据变更标记(将来可用于 dirty 判断)\n },\n\n /**\n * 将当前编辑的 rows/cols 写回 workbook.Sheets[currentSheet]\n */\n saveCurrentSheetData: function saveCurrentSheetData() {\n var _this8 = this;\n\n var workbook = this.xlsxData.workbook;\n var sheetName = this.xlsxData.currentSheet;\n if (!workbook || !sheetName || !this.xlsxData.cols.length) return;\n var aoa = [this.xlsxData.cols];\n this.xlsxData.rows.forEach(function (row) {\n // 用列索引取数,避免列名重复时 indexOf 定位错位\n var rowData = [];\n\n for (var ci = 0; ci < _this8.xlsxData.cols.length; ci++) {\n rowData.push(row[ci] != null ? row[ci] : '');\n }\n\n aoa.push(rowData);\n });\n workbook.Sheets[sheetName] = XLSX.utils.aoa_to_sheet(aoa);\n },\n\n /**\n * 生成新的 xlsx 文件并上传替换\n */\n replaceXlsxFile: function replaceXlsxFile() {\n var _this9 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n var workbook, origExt, isXls, bookType, mime, wbout, blob, originalName, file, formData, newFile;\n return regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n // 先保存当前 sheet 的编辑数据\n _this9.saveCurrentSheetData();\n\n workbook = _this9.xlsxData.workbook; // 写出所有 sheet 到新文件,保持与原文件扩展名一致(xls → biff8, xlsx → xlsx)\n\n origExt = ((_this9.formData.fileName || '').split('.').pop() || 'xlsx').toLowerCase();\n isXls = origExt === 'xls';\n bookType = isXls ? 'biff8' : 'xlsx';\n mime = isXls ? 'application/vnd.ms-excel' : 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n wbout = XLSX.write(workbook, {\n bookType: bookType,\n type: 'array'\n });\n blob = new Blob([wbout], {\n type: mime\n });\n originalName = (_this9.formData.fileName || 'export.xlsx').replace(/\\.(xls|xlsx)$/i, isXls ? '.xls' : '.xlsx');\n file = new File([blob], originalName, {\n type: mime\n }); // 上传新文件(携带 editId 原地替换原文件,保留原 id,避免删旧建新后旧 id 失效)\n\n formData = new FormData();\n formData.append('file', file);\n formData.append('companyId', _this9.companyId);\n\n if (_this9.formData.folderId) {\n formData.append('folderId', _this9.formData.folderId);\n }\n\n if (_this9.editingId) {\n formData.append('editId', _this9.editingId);\n }\n\n _context2.next = 17;\n return (0, _knowledgeBase.uploadFile)(formData);\n\n case 17:\n newFile = _context2.sent;\n return _context2.abrupt(\"return\", newFile);\n\n case 19:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2);\n }))();\n },\n // ==================== Word 编辑 ====================\n loadWordFile: function loadWordFile(file) {\n var _this10 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n var detail, fileUrl, response, ab, result;\n return regeneratorRuntime.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n _this10.wordLoading = true;\n _this10.wordHtml = '';\n _context3.prev = 2;\n _context3.next = 5;\n return (0, _knowledgeBase.getFileDetail)(file.id);\n\n case 5:\n detail = _context3.sent;\n fileUrl = detail.fileUrl || file.fileUrl;\n\n if (fileUrl) {\n _context3.next = 10;\n break;\n }\n\n _this10.$message.warning('无法获取文件下载地址');\n\n return _context3.abrupt(\"return\");\n\n case 10:\n _context3.next = 12;\n return fetch(fileUrl);\n\n case 12:\n response = _context3.sent;\n\n if (response.ok) {\n _context3.next = 15;\n break;\n }\n\n throw new Error('下载文件失败');\n\n case 15:\n _context3.next = 17;\n return response.arrayBuffer();\n\n case 17:\n ab = _context3.sent;\n\n if (ab.byteLength) {\n _context3.next = 21;\n break;\n }\n\n _this10.wordHtml = '<p>(空文档)</p>';\n return _context3.abrupt(\"return\");\n\n case 21:\n _context3.next = 23;\n return _mammoth.default.convertToHtml({\n arrayBuffer: ab\n });\n\n case 23:\n result = _context3.sent;\n _this10.wordHtml = result.value || '<p>(空文档)</p>';\n _context3.next = 31;\n break;\n\n case 27:\n _context3.prev = 27;\n _context3.t0 = _context3[\"catch\"](2);\n console.error('加载 Word 文件失败', _context3.t0);\n\n _this10.$message.error('加载 Word 文件失败:文件可能为空或格式不支持在线编辑(仅支持 .docx)');\n\n case 31:\n _context3.prev = 31;\n _this10.wordLoading = false;\n return _context3.finish(31);\n\n case 34:\n case \"end\":\n return _context3.stop();\n }\n }\n }, _callee3, null, [[2, 27, 31, 34]]);\n }))();\n },\n execFormat: function execFormat(command, value) {\n document.execCommand(command, false, value || null);\n this.$refs.wordEditor && this.$refs.wordEditor.focus();\n },\n onWordInput: function onWordInput() {\n // 触发 wordCharCount 重新计算\n this.$forceUpdate();\n },\n\n /**\n * 将编辑后的 HTML 转为 .docx 文件并上传替换\n */\n replaceWordFile: function replaceWordFile() {\n var _this11 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {\n var editor, html, paragraphs, doc, blob, originalName, file, formData, newFile;\n return regeneratorRuntime.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n editor = _this11.$refs.wordEditor;\n html = editor ? editor.innerHTML : _this11.wordHtml; // 用 docx 包生成新文档\n\n paragraphs = _this11.htmlToDocxParagraphs(html);\n doc = new _docx.Document({\n sections: [{\n children: paragraphs\n }]\n });\n _context4.next = 6;\n return _docx.Packer.toBlob(doc);\n\n case 6:\n blob = _context4.sent;\n originalName = _this11.formData.fileName || 'document.docx';\n file = new File([blob], originalName, {\n type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\n }); // 上传新文件(携带 editId 原地替换原文件,保留原 id,避免删旧建新后旧 id 失效)\n\n formData = new FormData();\n formData.append('file', file);\n formData.append('companyId', _this11.companyId);\n\n if (_this11.formData.folderId) {\n formData.append('folderId', _this11.formData.folderId);\n }\n\n if (_this11.editingId) {\n formData.append('editId', _this11.editingId);\n }\n\n _context4.next = 16;\n return (0, _knowledgeBase.uploadFile)(formData);\n\n case 16:\n newFile = _context4.sent;\n return _context4.abrupt(\"return\", newFile);\n\n case 18:\n case \"end\":\n return _context4.stop();\n }\n }\n }, _callee4);\n }))();\n },\n\n /**\n * 将 HTML 内容解析为 docx Paragraph 数组\n */\n htmlToDocxParagraphs: function htmlToDocxParagraphs(html) {\n var _this12 = this;\n\n var div = document.createElement('div');\n div.innerHTML = html;\n var children = div.childNodes;\n var paragraphs = [];\n\n var _iterator = (0, _createForOfIteratorHelper2.default)(children),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var node = _step.value;\n\n if (node.nodeType === 3) {\n // 纯文本节点\n var text = (node.textContent || '').trim();\n\n if (text) {\n paragraphs.push(new _docx.Paragraph({\n children: [new _docx.TextRun(text)]\n }));\n }\n\n continue;\n }\n\n if (node.nodeType !== 1) continue;\n var tag = node.tagName.toLowerCase(); // 标题 h1-h6\n\n if (/^h[1-6]$/.test(tag)) {\n var level = parseInt(tag[1]);\n var headingMap = {\n 1: _docx.HeadingLevel.HEADING_1,\n 2: _docx.HeadingLevel.HEADING_2,\n 3: _docx.HeadingLevel.HEADING_3,\n 4: _docx.HeadingLevel.HEADING_4,\n 5: _docx.HeadingLevel.HEADING_5,\n 6: _docx.HeadingLevel.HEADING_6\n };\n\n var _text = node.textContent || '';\n\n paragraphs.push(new _docx.Paragraph({\n heading: headingMap[level] || _docx.HeadingLevel.HEADING_1,\n spacing: {\n before: 200,\n after: 100\n },\n children: [new _docx.TextRun({\n text: _text,\n bold: level <= 3,\n size: level <= 1 ? 32 : level <= 2 ? 28 : 24\n })]\n }));\n continue;\n } // 段落、div、引用\n\n\n if (tag === 'p' || tag === 'div' || tag === 'blockquote') {\n var _runs = this.buildTextRuns(node);\n\n var opts = {\n children: _runs,\n spacing: {\n after: 80\n }\n };\n\n if (tag === 'blockquote') {\n opts.indent = {\n left: 400\n };\n }\n\n paragraphs.push(new _docx.Paragraph(opts));\n continue;\n } // 无序列表\n\n\n if (tag === 'ul') {\n var items = node.querySelectorAll('li');\n items.forEach(function (li) {\n var runs = _this12.buildTextRuns(li);\n\n paragraphs.push(new _docx.Paragraph({\n children: runs,\n bullet: {\n level: 0\n },\n spacing: {\n after: 40\n }\n }));\n });\n continue;\n } // 有序列表\n\n\n if (tag === 'ol') {\n var _ret = function () {\n var items = node.querySelectorAll('li');\n var num = 1;\n items.forEach(function (li) {\n var runs = _this12.buildTextRuns(li);\n\n paragraphs.push(new _docx.Paragraph({\n children: runs,\n numbering: {\n reference: 1,\n level: 0\n },\n spacing: {\n after: 40\n }\n }));\n num++;\n });\n return \"continue\";\n }();\n\n if (_ret === \"continue\") continue;\n } // 其他标签(pre, hr 等)当作段落处理\n\n\n var runs = this.buildTextRuns(node);\n\n if (runs.length > 0) {\n paragraphs.push(new _docx.Paragraph({\n children: runs\n }));\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n return paragraphs;\n },\n\n /**\n * 从 DOM 节点构建 TextRun 数组\n */\n buildTextRuns: function buildTextRuns(node) {\n var runs = [];\n\n var walk = function walk(el) {\n el.childNodes.forEach(function (child) {\n if (child.nodeType === 3) {\n var text = (child.textContent || '').trim();\n\n if (text) {\n runs.push(new _docx.TextRun({\n text: text\n }));\n }\n } else if (child.nodeType === 1) {\n var t = child.tagName.toLowerCase();\n\n var _text2 = child.textContent || '';\n\n if (t === 'br') {// 换行不处理\n } else if (t === 'strong' || t === 'b') {\n runs.push(new _docx.TextRun({\n text: _text2,\n bold: true\n }));\n } else if (t === 'em' || t === 'i') {\n runs.push(new _docx.TextRun({\n text: _text2,\n italics: true\n }));\n } else if (t === 'u') {\n runs.push(new _docx.TextRun({\n text: _text2,\n underline: {\n type: 'single'\n }\n }));\n } else if (t === 'a') {\n runs.push(new _docx.TextRun({\n text: _text2\n }));\n } else {\n walk(child);\n }\n }\n });\n };\n\n walk(node);\n return runs;\n },\n // ==================== 表单提交 ====================\n handleFileChange: function handleFileChange(file, fileList) {\n this.fileList = fileList;\n },\n handleFileRemove: function handleFileRemove(file, fileList) {\n this.fileList = fileList;\n },\n handleFileExceed: function handleFileExceed() {\n this.$message.warning('最多只能上传 5 个文件');\n },\n\n /**\n * 移动端原生多选文件(替代 el-upload):校验大小/类型后加入 fileList\n */\n handleNativeFileSelect: function handleNativeFileSelect(event) {\n var _this13 = this;\n\n var files = Array.from(event.target && event.target.files || []); // 清空 input.value,保证再次选择同一文件也能触发 change\n\n event.target.value = '';\n files.forEach(function (file) {\n if (_this13.fileList.length >= 5) {\n _this13.$message.warning('最多只能上传 5 个文件');\n\n return;\n }\n\n if (_this13.fileList.some(function (f) {\n return f.name === file.name && f.raw && f.raw.size === file.size;\n })) return;\n if (!_this13.beforeUpload(file)) return;\n\n _this13.fileList.push({\n name: file.name,\n size: file.size,\n raw: file,\n status: 'ready'\n });\n });\n },\n\n /**\n * 移动端移除已选文件\n */\n removeNativeFile: function removeNativeFile(index) {\n this.fileList.splice(index, 1);\n },\n\n /**\n * 上传前校验:大小 50MB、类型白名单\n */\n beforeUpload: function beforeUpload(file) {\n if (file.size > MAX_SIZE) {\n this.$message.error(\"\\u6587\\u4EF6\\u300C\".concat(file.name, \"\\u300D\\u5927\\u5C0F\\u4E0D\\u80FD\\u8D85\\u8FC7 50MB\"));\n return false;\n }\n\n var ext = file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase();\n\n if (!ALLOWED_TYPES.includes(ext)) {\n this.$message.error(\"\\u6587\\u4EF6\\u300C\".concat(file.name, \"\\u300D\\u7C7B\\u578B\\u4E0D\\u652F\\u6301: .\").concat(ext));\n return false;\n }\n\n return true;\n },\n handleSubmit: function handleSubmit() {\n if (this.isEdit) {\n this.handleSubmitEdit();\n } else {\n this.handleSubmitUpload();\n }\n },\n\n /**\n * 上传模式提交:逐个文件构造 FormData 调用上传接口\n */\n handleSubmitUpload: function handleSubmitUpload() {\n var _this14 = this;\n\n if (!this.companyId) {\n this.$message.warning('公司ID不能为空');\n return;\n }\n\n if (!this.formData.folderId) {\n this.$message.warning('请选择所属文件夹');\n return;\n }\n\n var files = this.fileList.filter(function (f) {\n return f.status !== 'success';\n });\n\n if (files.length === 0) {\n this.$message.warning('请先选择文件');\n return;\n } // 空文件直接拦截,避免上传后预览/解析失败\n\n\n var emptyFile = files.find(function (f) {\n return f.raw && f.raw.size === 0;\n });\n\n if (emptyFile) {\n this.$message.error(\"\\u6587\\u4EF6\\u300C\".concat(emptyFile.name, \"\\u300D\\u5185\\u5BB9\\u4E3A\\u7A7A\\uFF0C\\u8BF7\\u4E0A\\u4F20\\u6709\\u6548\\u6587\\u4EF6\"));\n return;\n }\n\n this.submitting = true; // 逐个上传(后端单文件接口)\n\n var tasks = files.map(function (file) {\n var formData = new FormData();\n formData.append('file', file.raw);\n formData.append('companyId', _this14.companyId);\n console.log('[DocumentForm] 上传文件:', file.name, ', companyId:', _this14.companyId);\n\n if (_this14.formData.folderId) {\n formData.append('folderId', _this14.formData.folderId);\n }\n\n return (0, _knowledgeBase.uploadFile)(formData);\n });\n Promise.all(tasks).then(function () {\n _this14.$message.success(\"\\u6210\\u529F\\u4E0A\\u4F20 \".concat(files.length, \" \\u4E2A\\u6587\\u4EF6\"));\n\n _this14.visible = false;\n\n if (_this14.resolvePromise) {\n _this14.resolvePromise(true);\n\n _this14.resolvePromise = null;\n }\n }).catch(function () {}).finally(function () {\n _this14.submitting = false;\n });\n },\n\n /**\n * 编辑模式提交\n */\n handleSubmitEdit: function handleSubmitEdit() {\n var _this15 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {\n var newFile, _newFile, data;\n\n return regeneratorRuntime.wrap(function _callee5$(_context5) {\n while (1) {\n switch (_context5.prev = _context5.next) {\n case 0:\n _this15.submitting = true;\n _context5.prev = 1;\n\n if (!_this15.isXlsxType) {\n _context5.next = 10;\n break;\n }\n\n _context5.next = 5;\n return _this15.replaceXlsxFile();\n\n case 5:\n newFile = _context5.sent;\n _context5.next = 8;\n return _this15.syncEditedMeta(newFile);\n\n case 8:\n _context5.next = 23;\n break;\n\n case 10:\n if (!_this15.isWordType) {\n _context5.next = 18;\n break;\n }\n\n _context5.next = 13;\n return _this15.replaceWordFile();\n\n case 13:\n _newFile = _context5.sent;\n _context5.next = 16;\n return _this15.syncEditedMeta(_newFile);\n\n case 16:\n _context5.next = 23;\n break;\n\n case 18:\n // 普通文件:更新元数据 + 文本内容\n data = {\n title: _this15.formData.title\n };\n\n if (_this15.formData.folderId) {\n data.folderId = _this15.formData.folderId;\n }\n\n if (_this15.isTextEditable && _this15.formData.content) {\n data.content = _this15.formData.content;\n }\n\n _context5.next = 23;\n return (0, _knowledgeBase.updateFile)(_this15.editingId, data);\n\n case 23:\n if (!(_this15.originalIndexStatus === 1)) {\n _context5.next = 33;\n break;\n }\n\n _context5.prev = 24;\n _context5.next = 27;\n return (0, _knowledgeBase.deleteFileIndex)(_this15.editingId);\n\n case 27:\n _this15.$message.info('文件已修改,原索引已删除,请重新执行索引');\n\n _context5.next = 33;\n break;\n\n case 30:\n _context5.prev = 30;\n _context5.t0 = _context5[\"catch\"](24);\n console.error('删除旧索引失败', _context5.t0);\n\n case 33:\n _this15.$message.success('修改成功');\n\n _this15.visible = false;\n\n if (_this15.resolvePromise) {\n _this15.resolvePromise(true);\n\n _this15.resolvePromise = null;\n }\n\n _context5.next = 42;\n break;\n\n case 38:\n _context5.prev = 38;\n _context5.t1 = _context5[\"catch\"](1);\n console.error('保存失败', _context5.t1);\n\n _this15.$message.error('保存失败');\n\n case 42:\n _context5.prev = 42;\n _this15.submitting = false;\n return _context5.finish(42);\n\n case 45:\n case \"end\":\n return _context5.stop();\n }\n }\n }, _callee5, null, [[1, 38, 42, 45], [24, 30]]);\n }))();\n },\n\n /**\n * Word/Excel 替换保存后,同步标题与所属文件夹元数据\n */\n syncEditedMeta: function syncEditedMeta(newFile) {\n var _this16 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee6() {\n var id, data, title;\n return regeneratorRuntime.wrap(function _callee6$(_context6) {\n while (1) {\n switch (_context6.prev = _context6.next) {\n case 0:\n id = newFile && newFile.id || _this16.editingId;\n data = {};\n title = (_this16.formData.title || '').trim();\n if (title) data.title = title;\n if (_this16.formData.folderId) data.folderId = _this16.formData.folderId;\n\n if (!Object.keys(data).length) {\n _context6.next = 8;\n break;\n }\n\n _context6.next = 8;\n return (0, _knowledgeBase.updateFile)(id, data);\n\n case 8:\n case \"end\":\n return _context6.stop();\n }\n }\n }, _callee6);\n }))();\n },\n onDialogOpened: function onDialogOpened() {\n // dialog 完全打开后,尝试将 wordHtml 写入编辑器\n if (this.isWordType && this.wordHtml && this.$refs && this.$refs.wordEditor) {\n this.$refs.wordEditor.innerHTML = this.wordHtml;\n }\n },\n handleClosed: function handleClosed() {\n // 关闭后清空上传列表,避免下次打开残留\n if (this.$refs.uploadRef) {\n this.$refs.uploadRef.clearFiles();\n }\n\n this.fileList = [];\n this.resetXlsxData();\n this.wordHtml = '';\n\n if (this.resolvePromise) {\n this.resolvePromise(null);\n this.resolvePromise = null;\n }\n }\n }\n};\nexports.default = _default2;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/DocumentForm.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
980
980
|
|
|
981
981
|
/***/ }),
|
|
982
982
|
|
|
@@ -988,7 +988,7 @@ eval("\n\nvar _interopRequireWildcard = __webpack_require__(/*! ./node_modules/@
|
|
|
988
988
|
/***/ (function(module, exports, __webpack_require__) {
|
|
989
989
|
|
|
990
990
|
"use strict";
|
|
991
|
-
eval("\n\nvar _interopRequireWildcard = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireWildcard */ \"./node_modules/@babel/runtime/helpers/interopRequireWildcard.js\").default;\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\"));\n\nvar _objectSpread2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/objectSpread2 */ \"./node_modules/@babel/runtime/helpers/objectSpread2.js\"));\n\nvar _marked = __webpack_require__(/*! marked */ \"./node_modules/marked/lib/marked.esm.js\");\n\nvar XLSX = _interopRequireWildcard(__webpack_require__(/*! xlsx */ \"./node_modules/xlsx/xlsx.mjs\"));\n\nvar _mammoth = _interopRequireDefault(__webpack_require__(/*! mammoth */ \"./node_modules/mammoth/lib/index.js\"));\n\nvar _knowledgeBase = __webpack_require__(/*! ./api/knowledgeBase */ \"./src/lib/knowledgeBase/api/knowledgeBase.js\");\n\nvar _DocumentForm = _interopRequireDefault(__webpack_require__(/*! ./DocumentForm */ \"./src/lib/knowledgeBase/DocumentForm.vue\"));\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n// 预览最多显示的行数(防止大文件卡死)\nvar MAX_PREVIEW_ROWS = 500;\nvar _default2 = {\n name: 'DocumentList',\n components: {\n DocumentForm: _DocumentForm.default\n },\n props: {\n selectedCategory: {\n type: Object,\n default: null\n },\n categoryList: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n companyId: {\n type: String,\n default: ''\n }\n },\n data: function data() {\n return {\n list: [],\n loading: false,\n total: 0,\n page: 1,\n pageSize: 10,\n searchKeyword: '',\n // 批量删除选中的文件\n selectedRows: [],\n // 批量移动\n moveVisible: false,\n moveFolderId: null,\n moving: false,\n folderList: [],\n folderTreeProps: {\n children: 'children',\n label: 'name'\n },\n // 在线预览\n previewVisible: false,\n previewFile: null,\n previewType: 'none',\n previewText: '',\n // PDF 预览(Blob URL 避免下载)\n pdfBlobUrl: '',\n // Excel 预览\n xlsxLoading: false,\n xlsxWorkbook: null,\n xlsxSheetNames: [],\n xlsxCurrentSheet: '',\n xlsxCols: [],\n xlsxTableData: [],\n hasMoreRows: false,\n // Word 预览\n docxLoading: false,\n docxHtml: ''\n };\n },\n computed: {\n /**\n * Markdown 渲染后的 HTML(使用 marked)\n */\n previewHtml: function previewHtml() {\n if (!this.previewText) return '';\n return _marked.marked.parse(this.previewText, {\n breaks: true,\n gfm: true\n });\n },\n maxPreviewRows: function maxPreviewRows() {\n return MAX_PREVIEW_ROWS;\n },\n\n /**\n * 批量移动的文件夹树(由平铺列表组装)\n */\n moveFolderTree: function moveFolderTree() {\n var nodes = this.folderList.map(function (f) {\n return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, f), {}, {\n children: []\n });\n });\n var map = {};\n nodes.forEach(function (n) {\n map[n.id] = n;\n });\n var roots = [];\n nodes.forEach(function (n) {\n var pid = n.parentId || 0;\n if (map[pid]) map[pid].children.push(n);else roots.push(n);\n });\n return roots;\n },\n\n /**\n * 目标文件夹名称\n */\n moveTargetName: function moveTargetName() {\n var _this = this;\n\n if (!this.moveFolderId) return '';\n var f = this.folderList.find(function (x) {\n return x.id === _this.moveFolderId;\n });\n return f ? f.name : '';\n }\n },\n watch: {\n selectedCategory: function selectedCategory() {\n this.page = 1;\n this.loadList();\n },\n companyId: function companyId() {\n this.page = 1;\n this.searchKeyword = '';\n this.list = [];\n this.total = 0;\n this.loadList();\n },\n\n /**\n * 预览弹窗关闭时清理 PDF Blob URL\n */\n previewVisible: function previewVisible(val) {\n if (!val && this.pdfBlobUrl) {\n URL.revokeObjectURL(this.pdfBlobUrl);\n this.pdfBlobUrl = '';\n }\n }\n },\n created: function created() {\n this.loadList();\n },\n methods: {\n loadList: function loadList() {\n var _this2 = this;\n\n if (!this.companyId) return;\n this.loading = true;\n var params = {\n companyId: this.companyId,\n pageNum: this.page,\n pageSize: this.pageSize\n }; // 选中具体文件夹时按文件夹过滤(\"显示全部文件\"时 id 为空串,不传)\n\n if (this.selectedCategory && this.selectedCategory.id) {\n params.folderId = this.selectedCategory.id;\n }\n\n if (this.searchKeyword) {\n params.keyword = this.searchKeyword;\n }\n\n (0, _knowledgeBase.getFileList)(params).then(function (data) {\n _this2.list = data.records || [];\n _this2.total = data.total || 0; // 列表刷新后清空勾选\n\n _this2.selectedRows = [];\n\n _this2.$nextTick(function () {\n if (_this2.$refs.tableRef) _this2.$refs.tableRef.clearSelection();\n });\n }).catch(function () {}).finally(function () {\n _this2.loading = false;\n });\n },\n handleSearch: function handleSearch() {\n this.page = 1;\n this.loadList();\n },\n handleSizeChange: function handleSizeChange(size) {\n this.pageSize = size;\n this.page = 1;\n this.loadList();\n },\n handleCurrentChange: function handleCurrentChange(page) {\n this.page = page;\n this.loadList();\n },\n\n /**\n * 删除文件后刷新列表:若当前页因删除而超出最大页数(如某页只剩 1 条被删掉),\n * 自动回退到最后一页(即上一页),避免停留在空白页。\n */\n handleDeleted: function handleDeleted() {\n var count = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n var newTotal = Math.max(0, this.total - count);\n var maxPage = Math.max(1, Math.ceil(newTotal / this.pageSize));\n\n if (this.page > maxPage) {\n this.page = maxPage;\n }\n\n this.loadList();\n },\n handleAdd: function handleAdd() {\n var _this3 = this;\n\n if (!this.companyId) {\n this.$message.warning('公司数据未加载,请稍后刷新');\n return;\n }\n\n if (!this.categoryList || this.categoryList.length === 0) {\n this.$message.warning('暂无根目录,请先创建文件夹再新增文档');\n return;\n }\n\n var folderId = this.selectedCategory && this.selectedCategory.id ? this.selectedCategory.id : '';\n this.$refs.docFormRef.openAdd(folderId).then(function (res) {\n if (res) _this3.loadList();\n });\n },\n handleEdit: function handleEdit(row) {\n var _this4 = this;\n\n this.$refs.docFormRef.openEdit(row).then(function (res) {\n if (res) _this4.loadList();\n });\n },\n\n /**\n * 在线预览:图片 / PDF / Excel / Word / 文本\n */\n handlePreview: function handlePreview(row) {\n var _this5 = this;\n\n this.previewFile = row;\n this.previewText = '';\n this.docxHtml = '';\n this.xlsxWorkbook = null;\n this.xlsxSheetNames = [];\n this.xlsxCurrentSheet = '';\n this.xlsxCols = [];\n this.xlsxTableData = []; // 清理上一次的 PDF Blob URL\n\n if (this.pdfBlobUrl) {\n URL.revokeObjectURL(this.pdfBlobUrl);\n this.pdfBlobUrl = '';\n }\n\n var t = (row.fileType || '').toLowerCase();\n\n if (['png', 'jpg', 'jpeg', 'gif', 'webp', 'bmp'].includes(t)) {\n this.previewType = 'image';\n } else if (t === 'pdf') {\n this.previewType = 'pdf';\n this.loadPdfPreview(row);\n } else if (t === 'xlsx' || t === 'xls') {\n this.previewType = 'xlsx';\n this.loadXlsxPreview(row);\n } else if (t === 'docx' || t === 'doc') {\n this.previewType = 'docx';\n this.loadDocxPreview(row);\n } else if (['txt', 'md', 'markdown', 'html', 'htm'].includes(t)) {\n this.previewType = 'text';\n (0, _knowledgeBase.getFileDetail)(row.id).then(function (d) {\n _this5.previewText = d.content || '(该文件暂无可预览的文本内容)';\n }).catch(function () {\n _this5.previewText = '(文本内容加载失败)';\n });\n } else {\n this.previewType = 'none';\n }\n\n this.previewVisible = true;\n },\n // ==================== Excel 预览 ====================\n loadXlsxPreview: function loadXlsxPreview(file) {\n var _this6 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n var detail, fileUrl, response, ab, workbook;\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _this6.xlsxLoading = true;\n _context.prev = 1;\n _context.next = 4;\n return (0, _knowledgeBase.getFileDetail)(file.id);\n\n case 4:\n detail = _context.sent;\n fileUrl = detail.fileUrl || file.fileUrl;\n\n if (fileUrl) {\n _context.next = 9;\n break;\n }\n\n _this6.$message.warning('无法获取文件下载地址');\n\n return _context.abrupt(\"return\");\n\n case 9:\n _context.next = 11;\n return fetch(fileUrl);\n\n case 11:\n response = _context.sent;\n\n if (response.ok) {\n _context.next = 14;\n break;\n }\n\n throw new Error('下载文件失败');\n\n case 14:\n _context.next = 16;\n return response.arrayBuffer();\n\n case 16:\n ab = _context.sent;\n _context.next = 19;\n return new Promise(function (r) {\n return setTimeout(r, 0);\n });\n\n case 19:\n workbook = XLSX.read(ab, {\n type: 'array'\n });\n _this6.xlsxWorkbook = workbook;\n _this6.xlsxSheetNames = workbook.SheetNames;\n\n if (workbook.SheetNames.length > 0) {\n _this6.xlsxCurrentSheet = workbook.SheetNames[0];\n\n _this6.renderXlsxSheet();\n }\n\n _context.next = 29;\n break;\n\n case 25:\n _context.prev = 25;\n _context.t0 = _context[\"catch\"](1);\n console.error('加载 Excel 文件失败', _context.t0);\n\n _this6.$message.error('Excel 文件加载失败');\n\n case 29:\n _context.prev = 29;\n _this6.xlsxLoading = false;\n return _context.finish(29);\n\n case 32:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, null, [[1, 25, 29, 32]]);\n }))();\n },\n renderXlsxSheet: function renderXlsxSheet() {\n var workbook = this.xlsxWorkbook;\n var sheetName = this.xlsxCurrentSheet;\n if (!workbook || !sheetName) return;\n var sheet = workbook.Sheets[sheetName];\n\n if (!sheet) {\n this.xlsxCols = [];\n this.xlsxTableData = [];\n return;\n } // 让出主线程,防止 sheet_to_json 阻塞 UI\n\n\n var data = XLSX.utils.sheet_to_json(sheet, {\n header: 1,\n defval: ''\n });\n\n if (data.length === 0) {\n this.xlsxCols = [];\n this.xlsxTableData = [];\n return;\n } // 列数以「所有行的最大宽度」为准:表头行可能只填了第一格,若直接按第一行长度定列会丢失后续列\n\n\n var maxCols = Math.max.apply(null, data.map(function (row) {\n return row && row.length || 0;\n }));\n this.xlsxCols = Array.from({\n length: maxCols\n }, function (_, i) {\n var v = data[0] && data[0][i];\n return v != null && String(v).trim() !== '' ? String(v) : \"\\u5217\".concat(i + 1);\n }); // 限制预览行数,防止渲染过多 DOM 卡死;同时过滤全空行\n\n var allRows = data.slice(1).filter(function (row) {\n return row && row.some(function (c) {\n return c != null && String(c).trim() !== '';\n });\n });\n this.hasMoreRows = allRows.length > MAX_PREVIEW_ROWS;\n this.xlsxTableData = allRows.slice(0, MAX_PREVIEW_ROWS).map(function (row) {\n var obj = {};\n\n for (var ci = 0; ci < maxCols; ci++) {\n obj[ci] = row[ci] != null ? String(row[ci]) : '';\n }\n\n return obj;\n });\n },\n // ==================== Word 预览 ====================\n loadDocxPreview: function loadDocxPreview(file) {\n var _this7 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n var detail, fileUrl, response, ab, result;\n return regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _this7.docxLoading = true;\n _context2.prev = 1;\n _context2.next = 4;\n return (0, _knowledgeBase.getFileDetail)(file.id);\n\n case 4:\n detail = _context2.sent;\n fileUrl = detail.fileUrl || file.fileUrl;\n\n if (fileUrl) {\n _context2.next = 9;\n break;\n }\n\n _this7.$message.warning('无法获取文件下载地址');\n\n return _context2.abrupt(\"return\");\n\n case 9:\n _context2.next = 11;\n return fetch(fileUrl);\n\n case 11:\n response = _context2.sent;\n\n if (response.ok) {\n _context2.next = 14;\n break;\n }\n\n throw new Error('下载文件失败');\n\n case 14:\n _context2.next = 16;\n return response.arrayBuffer();\n\n case 16:\n ab = _context2.sent;\n\n if (ab.byteLength) {\n _context2.next = 20;\n break;\n }\n\n _this7.docxHtml = '<p>(空文档)</p>';\n return _context2.abrupt(\"return\");\n\n case 20:\n _context2.next = 22;\n return _mammoth.default.convertToHtml({\n arrayBuffer: ab\n });\n\n case 22:\n result = _context2.sent;\n _this7.docxHtml = result.value || '<p>(空文档)</p>';\n _context2.next = 30;\n break;\n\n case 26:\n _context2.prev = 26;\n _context2.t0 = _context2[\"catch\"](1);\n console.error('加载 Word 文件失败', _context2.t0);\n\n _this7.$message.error('Word 文件加载失败');\n\n case 30:\n _context2.prev = 30;\n _this7.docxLoading = false;\n return _context2.finish(30);\n\n case 33:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2, null, [[1, 26, 30, 33]]);\n }))();\n },\n // ==================== PDF 预览 ====================\n loadPdfPreview: function loadPdfPreview(file) {\n var _this8 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n var detail, fileUrl, response, blob;\n return regeneratorRuntime.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n _context3.prev = 0;\n _context3.next = 3;\n return (0, _knowledgeBase.getFileDetail)(file.id);\n\n case 3:\n detail = _context3.sent;\n fileUrl = detail.fileUrl || file.fileUrl;\n\n if (fileUrl) {\n _context3.next = 8;\n break;\n }\n\n _this8.$message.warning('无法获取文件下载地址');\n\n return _context3.abrupt(\"return\");\n\n case 8:\n _context3.next = 10;\n return fetch(fileUrl);\n\n case 10:\n response = _context3.sent;\n\n if (response.ok) {\n _context3.next = 13;\n break;\n }\n\n throw new Error('下载文件失败');\n\n case 13:\n _context3.next = 15;\n return response.blob();\n\n case 15:\n blob = _context3.sent;\n _this8.pdfBlobUrl = URL.createObjectURL(blob);\n _context3.next = 23;\n break;\n\n case 19:\n _context3.prev = 19;\n _context3.t0 = _context3[\"catch\"](0);\n console.error('加载 PDF 文件失败', _context3.t0);\n\n _this8.$message.error('PDF 文件加载失败');\n\n case 23:\n case \"end\":\n return _context3.stop();\n }\n }\n }, _callee3, null, [[0, 19]]);\n }))();\n },\n\n /**\n * 索引 / 重建索引(二次确认)\n */\n handleIndex: function handleIndex(row) {\n var _this9 = this;\n\n var isRebuild = row.indexStatus === 1;\n console.log('[DocumentList] 索引文件:', row.id, row.title, 'companyId:', this.companyId);\n this.$confirm(\"\\u786E\\u8BA4\\u5BF9\\u6587\\u4EF6\\u300C\".concat(row.title || row.fileName, \"\\u300D\").concat(isRebuild ? '重建' : '创建', \"\\u7D22\\u5F15\\uFF1F\"), '提示', {\n type: 'warning',\n confirmButtonText: '确定',\n cancelButtonText: '取消'\n }).then(function () {\n var request = isRebuild ? (0, _knowledgeBase.reindexFile)(row.id) : (0, _knowledgeBase.indexFile)(row.id);\n request.then(function () {\n _this9.$message.success(isRebuild ? '已开始重建索引' : '已开始索引');\n\n _this9.loadList();\n }).catch(function () {});\n }).catch(function () {});\n },\n\n /**\n * 删除索引(二次确认)\n */\n handleDeleteIndex: function handleDeleteIndex(row) {\n var _this10 = this;\n\n this.$confirm(\"\\u786E\\u8BA4\\u5220\\u9664\\u6587\\u4EF6\\u300C\".concat(row.title || row.fileName, \"\\u300D\\u7684\\u7D22\\u5F15\\uFF1F\\u5220\\u9664\\u540E\\u65E0\\u6CD5\\u6062\\u590D\\u3002\"), '提示', {\n type: 'warning',\n confirmButtonText: '确定删除',\n cancelButtonText: '取消'\n }).then(function () {\n (0, _knowledgeBase.deleteFileIndex)(row.id).then(function () {\n _this10.$message.success('索引已删除');\n\n _this10.loadList();\n }).catch(function () {});\n }).catch(function () {});\n },\n handleDelete: function handleDelete(row) {\n var _this11 = this;\n\n // 索引中的文件不允许删除\n if (row.indexStatus === 2) {\n this.$message.warning('该文件正在索引中,无法删除');\n return;\n }\n\n var hasIndex = row.indexStatus === 1;\n this.$confirm(\"\\u786E\\u8BA4\\u5220\\u9664\\u6587\\u4EF6\\u300C\".concat(row.title || row.fileName, \"\\u300D\\uFF1F\").concat(hasIndex ? '删除文件前会先删除该文件的索引。' : '', \"\\u5220\\u9664\\u540E\\u65E0\\u6CD5\\u6062\\u590D\\u3002\"), '提示', {\n type: 'warning',\n confirmButtonText: '确定删除',\n cancelButtonText: '取消'\n }).then( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {\n return regeneratorRuntime.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n _context4.prev = 0;\n\n if (!hasIndex) {\n _context4.next = 4;\n break;\n }\n\n _context4.next = 4;\n return (0, _knowledgeBase.deleteFileIndex)(row.id);\n\n case 4:\n _context4.next = 6;\n return (0, _knowledgeBase.deleteFile)(row.id);\n\n case 6:\n _this11.$message.success('文件已删除');\n\n _this11.handleDeleted(1);\n\n _context4.next = 12;\n break;\n\n case 10:\n _context4.prev = 10;\n _context4.t0 = _context4[\"catch\"](0);\n\n case 12:\n case \"end\":\n return _context4.stop();\n }\n }\n }, _callee4, null, [[0, 10]]);\n }))).catch(function () {});\n },\n\n /**\n * 表格勾选变化\n */\n handleSelectionChange: function handleSelectionChange(rows) {\n this.selectedRows = rows || [];\n },\n\n /**\n * 索引中的文件不可勾选删除\n */\n rowSelectable: function rowSelectable(row) {\n return row.indexStatus !== 2;\n },\n\n /**\n * 批量删除勾选的文件\n */\n handleBatchDelete: function handleBatchDelete() {\n var _this12 = this;\n\n var selected = this.selectedRows || [];\n\n if (!selected.length) {\n this.$message.warning('请先勾选要删除的文件');\n return;\n } // 索引中的文件不允许删除\n\n\n var indexingFiles = selected.filter(function (f) {\n return f.indexStatus === 2;\n });\n var deletable = selected.filter(function (f) {\n return f.indexStatus !== 2;\n });\n\n if (!deletable.length) {\n this.$message.warning('所选文件均正在索引中,无法删除');\n return;\n }\n\n if (indexingFiles.length) {\n this.$message.warning(\"\\u6709 \".concat(indexingFiles.length, \" \\u4E2A\\u6587\\u4EF6\\u6B63\\u5728\\u7D22\\u5F15\\u4E2D\\uFF0C\\u672C\\u6B21\\u5C06\\u8DF3\\u8FC7\"));\n } // 已索引的文件需先删除索引,再删除文件\n\n\n var indexed = deletable.filter(function (f) {\n return f.indexStatus === 1;\n });\n var ids = deletable.map(function (f) {\n return f.id;\n });\n this.$confirm(\"\\u786E\\u8BA4\\u5220\\u9664\\u9009\\u4E2D\\u7684 \".concat(deletable.length, \" \\u4E2A\\u6587\\u4EF6\\uFF1F\").concat(indexed.length ? '删除前会先删除这些文件的索引。' : '', \"\\u5220\\u9664\\u540E\\u65E0\\u6CD5\\u6062\\u590D\\u3002\"), '提示', {\n type: 'warning',\n confirmButtonText: '确定删除',\n cancelButtonText: '取消',\n customClass: 'kb-message-box'\n }).then( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {\n return regeneratorRuntime.wrap(function _callee5$(_context5) {\n while (1) {\n switch (_context5.prev = _context5.next) {\n case 0:\n _context5.prev = 0;\n\n if (!indexed.length) {\n _context5.next = 4;\n break;\n }\n\n _context5.next = 4;\n return Promise.all(indexed.map(function (f) {\n return (0, _knowledgeBase.deleteFileIndex)(f.id);\n }));\n\n case 4:\n _context5.next = 6;\n return (0, _knowledgeBase.deleteFiles)(ids);\n\n case 6:\n _this12.$message.success('批量删除成功');\n\n _this12.handleDeleted(deletable.length);\n\n _context5.next = 12;\n break;\n\n case 10:\n _context5.prev = 10;\n _context5.t0 = _context5[\"catch\"](0);\n\n case 12:\n case \"end\":\n return _context5.stop();\n }\n }\n }, _callee5, null, [[0, 10]]);\n }))).catch(function () {});\n },\n\n /**\n * 批量移动:打开目标文件夹选择弹窗\n */\n handleBatchMove: function handleBatchMove() {\n var _this13 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee6() {\n var selected, folders;\n return regeneratorRuntime.wrap(function _callee6$(_context6) {\n while (1) {\n switch (_context6.prev = _context6.next) {\n case 0:\n selected = _this13.selectedRows || [];\n\n if (selected.length) {\n _context6.next = 4;\n break;\n }\n\n _this13.$message.warning('请先勾选要移动的文件');\n\n return _context6.abrupt(\"return\");\n\n case 4:\n if (_this13.companyId) {\n _context6.next = 7;\n break;\n }\n\n _this13.$message.warning('公司数据未加载');\n\n return _context6.abrupt(\"return\");\n\n case 7:\n _this13.moveFolderId = null;\n _this13.moveVisible = true; // 每次打开都重新加载文件夹列表,确保新建/重命名/删除文件夹后看到最新目录\n\n _context6.prev = 9;\n _context6.next = 12;\n return (0, _knowledgeBase.getFolderList)(_this13.companyId);\n\n case 12:\n folders = _context6.sent;\n _this13.folderList = folders || [];\n _context6.next = 18;\n break;\n\n case 16:\n _context6.prev = 16;\n _context6.t0 = _context6[\"catch\"](9);\n\n case 18:\n _this13.$nextTick(function () {\n if (_this13.$refs.moveTreeRef) _this13.$refs.moveTreeRef.setCurrentKey(null);\n });\n\n case 19:\n case \"end\":\n return _context6.stop();\n }\n }\n }, _callee6, null, [[9, 16]]);\n }))();\n },\n\n /**\n * 选择目标文件夹\n */\n handleMoveFolderSelect: function handleMoveFolderSelect(data) {\n this.moveFolderId = data.id;\n },\n\n /**\n * 确认批量移动\n */\n handleMoveConfirm: function handleMoveConfirm() {\n var _this14 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee7() {\n var ids, targetFolder;\n return regeneratorRuntime.wrap(function _callee7$(_context7) {\n while (1) {\n switch (_context7.prev = _context7.next) {\n case 0:\n if (_this14.moveFolderId) {\n _context7.next = 3;\n break;\n }\n\n _this14.$message.warning('请选择目标文件夹');\n\n return _context7.abrupt(\"return\");\n\n case 3:\n ids = _this14.selectedRows.map(function (f) {\n return f.id;\n });\n _this14.moving = true;\n _context7.prev = 5;\n _context7.next = 8;\n return (0, _knowledgeBase.moveFiles)(ids, _this14.moveFolderId);\n\n case 8:\n _this14.$message.success('批量移动成功');\n\n _this14.moveVisible = false; // 移动成功后,通知父级定位并高亮左侧树到目标文件夹\n\n targetFolder = _this14.folderList.find(function (f) {\n return String(f.id) === String(_this14.moveFolderId);\n }) || null;\n if (targetFolder) _this14.$emit('move-target', targetFolder);else _this14.$emit('move-target', {\n id: _this14.moveFolderId,\n name: _this14.moveTargetName\n });\n\n _this14.loadList();\n\n _context7.next = 17;\n break;\n\n case 15:\n _context7.prev = 15;\n _context7.t0 = _context7[\"catch\"](5);\n\n case 17:\n _context7.prev = 17;\n _this14.moving = false;\n return _context7.finish(17);\n\n case 20:\n case \"end\":\n return _context7.stop();\n }\n }\n }, _callee7, null, [[5, 15, 17, 20]]);\n }))();\n },\n\n /**\n * 通过 folderId 映射文件夹名称\n */\n folderName: function folderName(folderId) {\n if (!folderId) return '根目录';\n var found = this.categoryList.find(function (f) {\n return String(f.id) === String(folderId);\n });\n return found ? found.name : '-';\n },\n\n /**\n * 根据文件类型返回对应图标\n */\n getFileIcon: function getFileIcon(fileType) {\n var type = (fileType || '').toLowerCase();\n var iconMap = {\n pdf: 'el-icon-document',\n doc: 'el-icon-document',\n docx: 'el-icon-document',\n xls: 'el-icon-tickets',\n xlsx: 'el-icon-tickets',\n ppt: 'el-icon-data-line',\n pptx: 'el-icon-data-line',\n txt: 'el-icon-document',\n md: 'el-icon-edit-outline',\n png: 'el-icon-picture',\n jpg: 'el-icon-picture',\n jpeg: 'el-icon-picture',\n gif: 'el-icon-picture',\n zip: 'el-icon-folder-opened',\n rar: 'el-icon-folder-opened'\n };\n return iconMap[type] || 'el-icon-document';\n },\n\n /**\n * 根据文件类型返回对应的图标 URL\n */\n getFileIconUrl: function getFileIconUrl(fileType) {\n var type = (fileType || '').toLowerCase();\n var base = 'https://qiguanbang-client.obs.cn-east-3.myhuaweicloud.com/fileimgdoc';\n var generic = \"\".concat(base, \"/\\u901A\\u7528.png\"); // 通用文档 / 云文档(无专属图标时使用通用图片兜底)\n\n var genericTypes = ['md', 'markdown', 'html', 'htm', 'docx2', 'rtf'];\n var urlMap = {\n // 图片格式(jpg/png/jpeg 等)\n jpg: \"\".concat(base, \"/png.png\"),\n jpeg: \"\".concat(base, \"/png.png\"),\n png: \"\".concat(base, \"/png.png\"),\n gif: \"\".concat(base, \"/png.png\"),\n webp: \"\".concat(base, \"/png.png\"),\n bmp: \"\".concat(base, \"/png.png\"),\n // Excel 表格(xlsx/xls)\n xlsx: \"\".concat(base, \"/xlsx.png\"),\n xls: \"\".concat(base, \"/xlsx.png\"),\n csv: \"\".concat(base, \"/xlsx.png\"),\n // PDF 文档\n pdf: \"\".concat(base, \"/pdf.png\"),\n // 压缩包(zip/rar)\n zip: \"\".concat(base, \"/zip.png\"),\n rar: \"\".concat(base, \"/zip.png\"),\n '7z': \"\".concat(base, \"/zip.png\"),\n gz: \"\".concat(base, \"/zip.png\"),\n tar: \"\".concat(base, \"/zip.png\"),\n // Word 文档(docx/doc)\n docx: \"\".concat(base, \"/word.png\"),\n doc: \"\".concat(base, \"/word.png\"),\n // TXT 文本文件\n txt: \"\".concat(base, \"/txt.png\"),\n // PPT 演示文稿(pptx/ppt)\n pptx: \"\".concat(base, \"/ppt.png\"),\n ppt: \"\".concat(base, \"/ppt.png\"),\n // 视频文件\n mp4: \"\".concat(base, \"/mp4.png\"),\n avi: \"\".concat(base, \"/mp4.png\"),\n mov: \"\".concat(base, \"/mp4.png\"),\n wmv: \"\".concat(base, \"/mp4.png\"),\n flv: \"\".concat(base, \"/mp4.png\"),\n mkv: \"\".concat(base, \"/mp4.png\"),\n // 音频文件(mp3 等)\n mp3: \"\".concat(base, \"/mp3.png\"),\n wav: \"\".concat(base, \"/mp3.png\"),\n flac: \"\".concat(base, \"/mp3.png\"),\n aac: \"\".concat(base, \"/mp3.png\"),\n ogg: \"\".concat(base, \"/mp3.png\"),\n m4a: \"\".concat(base, \"/mp3.png\")\n };\n return (genericTypes.includes(type) ? generic : urlMap[type]) || generic;\n },\n\n /**\n * 文件大小格式化(字节 → B/KB/MB/GB)\n */\n formatSize: function formatSize(bytes) {\n if (!bytes && bytes !== 0) return '-';\n if (bytes === 0) return '0 B';\n var units = ['B', 'KB', 'MB', 'GB', 'TB'];\n var size = bytes;\n var idx = 0;\n\n while (size >= 1024 && idx < units.length - 1) {\n size /= 1024;\n idx++;\n }\n\n return \"\".concat(idx === 0 ? size : size.toFixed(2), \" \").concat(units[idx]);\n },\n\n /**\n * 时间展示:ISO 本地时间去掉 T 分隔符\n */\n formatTime: function formatTime(time) {\n if (!time) return '-';\n return String(time).replace('T', ' ').replace(/\\+08:00$/, '').replace(/\\.\\d{3}/, '');\n },\n\n /**\n * 索引状态标签:0 未索引 / 1 已索引 / 2 索引中 / 3 失败\n */\n indexTagType: function indexTagType(status) {\n var map = {\n 0: 'info',\n 1: 'success',\n 2: 'warning',\n 3: 'danger'\n };\n return map[status] || 'info';\n },\n indexTagText: function indexTagText(status) {\n var map = {\n 0: '未索引',\n 1: '已索引',\n 2: '索引中',\n 3: '索引失败'\n };\n return map[status] || '未知';\n }\n }\n};\nexports.default = _default2;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/DocumentList.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
991
|
+
eval("\n\nvar _interopRequireWildcard = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireWildcard */ \"./node_modules/@babel/runtime/helpers/interopRequireWildcard.js\").default;\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\"));\n\nvar _objectSpread2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/objectSpread2 */ \"./node_modules/@babel/runtime/helpers/objectSpread2.js\"));\n\nvar _marked = __webpack_require__(/*! marked */ \"./node_modules/marked/lib/marked.esm.js\");\n\nvar XLSX = _interopRequireWildcard(__webpack_require__(/*! xlsx */ \"./node_modules/xlsx/xlsx.mjs\"));\n\nvar _mammoth = _interopRequireDefault(__webpack_require__(/*! mammoth */ \"./node_modules/mammoth/lib/index.js\"));\n\nvar _knowledgeBase = __webpack_require__(/*! ./api/knowledgeBase */ \"./src/lib/knowledgeBase/api/knowledgeBase.js\");\n\nvar _DocumentForm = _interopRequireDefault(__webpack_require__(/*! ./DocumentForm */ \"./src/lib/knowledgeBase/DocumentForm.vue\"));\n\nvar _MobileDialog = _interopRequireDefault(__webpack_require__(/*! ./MobileDialog.vue */ \"./src/lib/knowledgeBase/MobileDialog.vue\"));\n\nvar _native = __webpack_require__(/*! ./native.js */ \"./src/lib/knowledgeBase/native.js\");\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n// 预览最多显示的行数(防止大文件卡死)\nvar MAX_PREVIEW_ROWS = 500;\nvar _default2 = {\n name: 'DocumentList',\n components: {\n DocumentForm: _DocumentForm.default,\n MobileDialog: _MobileDialog.default\n },\n props: {\n selectedCategory: {\n type: Object,\n default: null\n },\n categoryList: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n companyId: {\n type: String,\n default: ''\n },\n // 是否移动端(由父组件根据宽度传入;未传时按窗口宽度自动判断)\n isMobile: {\n type: Boolean,\n default: null\n }\n },\n data: function data() {\n return {\n list: [],\n loading: false,\n total: 0,\n page: 1,\n pageSize: 10,\n searchKeyword: '',\n // 批量删除选中的文件\n selectedRows: [],\n // 批量移动\n moveVisible: false,\n moveFolderId: null,\n moving: false,\n folderList: [],\n folderTreeProps: {\n children: 'children',\n label: 'name'\n },\n // 在线预览\n previewVisible: false,\n previewFile: null,\n previewType: 'none',\n previewText: '',\n // PDF 预览(Blob URL 避免下载)\n pdfBlobUrl: '',\n // Excel 预览\n xlsxLoading: false,\n xlsxWorkbook: null,\n xlsxSheetNames: [],\n xlsxCurrentSheet: '',\n xlsxCols: [],\n xlsxTableData: [],\n hasMoreRows: false,\n // Word 预览\n docxLoading: false,\n docxHtml: '',\n // 窗口宽度(横屏判断:isMobile 且宽>768 时操作按钮与搜索同行)\n innerWidth: typeof window !== 'undefined' ? window.innerWidth : 0\n };\n },\n computed: {\n /**\n * 移动端横屏(宽>768,如平板横屏):空间充足,操作按钮与搜索同行\n */\n isLandscape: function isLandscape() {\n return !!this.isMobile && this.innerWidth > 768;\n },\n\n /**\n * 总页数(横屏自绘分页用)\n */\n totalPages: function totalPages() {\n return Math.max(1, Math.ceil((this.total || 0) / this.pageSize));\n },\n\n /**\n * 横屏表格:当前页可勾选的行(索引中的文件不可勾选)\n */\n selectableRows: function selectableRows() {\n var _this = this;\n\n return (this.list || []).filter(function (row) {\n return _this.rowSelectable(row);\n });\n },\n\n /**\n * 横屏表格:表头全选是否为选中态\n */\n isAllSelected: function isAllSelected() {\n var _this2 = this;\n\n return this.selectableRows.length > 0 && this.selectableRows.every(function (row) {\n return _this2.docMSelected(row);\n });\n },\n\n /**\n * 横屏表格:表头全选是否为半选态\n */\n isIndeterminate: function isIndeterminate() {\n var _this3 = this;\n\n var checked = this.selectableRows.filter(function (row) {\n return _this3.docMSelected(row);\n }).length;\n return checked > 0 && checked < this.selectableRows.length;\n },\n\n /**\n * Markdown 渲染后的 HTML(使用 marked)\n */\n previewHtml: function previewHtml() {\n if (!this.previewText) return '';\n return _marked.marked.parse(this.previewText, {\n breaks: true,\n gfm: true\n });\n },\n maxPreviewRows: function maxPreviewRows() {\n return MAX_PREVIEW_ROWS;\n },\n\n /**\n * 批量移动的文件夹树(由平铺列表组装)\n */\n moveFolderTree: function moveFolderTree() {\n var nodes = this.folderList.map(function (f) {\n return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, f), {}, {\n children: []\n });\n });\n var map = {};\n nodes.forEach(function (n) {\n map[n.id] = n;\n });\n var roots = [];\n nodes.forEach(function (n) {\n var pid = n.parentId || 0;\n if (map[pid]) map[pid].children.push(n);else roots.push(n);\n });\n return roots;\n },\n\n /**\n * 批量移动的文件夹扁平列表(移动端自绘列表用)\n */\n moveFolderFlat: function moveFolderFlat() {\n return (0, _native.flattenFolderTree)(this.moveFolderTree);\n },\n\n /**\n * 目标文件夹名称\n */\n moveTargetName: function moveTargetName() {\n var _this4 = this;\n\n if (!this.moveFolderId) return '';\n var f = this.folderList.find(function (x) {\n return x.id === _this4.moveFolderId;\n });\n return f ? f.name : '';\n }\n },\n watch: {\n selectedCategory: function selectedCategory() {\n this.page = 1;\n this.loadList();\n },\n companyId: function companyId() {\n this.page = 1;\n this.searchKeyword = '';\n this.list = [];\n this.total = 0;\n this.loadList();\n },\n\n /**\n * 预览弹窗关闭时清理 PDF Blob URL\n */\n previewVisible: function previewVisible(val) {\n if (!val && this.pdfBlobUrl) {\n URL.revokeObjectURL(this.pdfBlobUrl);\n this.pdfBlobUrl = '';\n }\n }\n },\n created: function created() {\n this.loadList(); // 跟踪窗口宽度用于横屏判断(旋转屏幕时按钮行内/换行切换)\n\n if (typeof window !== 'undefined') {\n this.innerWidth = window.innerWidth;\n window.addEventListener('resize', this.handleWinResize);\n }\n },\n beforeDestroy: function beforeDestroy() {\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', this.handleWinResize);\n }\n },\n methods: {\n handleWinResize: function handleWinResize() {\n if (typeof window !== 'undefined') {\n this.innerWidth = window.innerWidth;\n }\n },\n loadList: function loadList() {\n var _this5 = this;\n\n var append = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n if (!this.companyId) return;\n this.loading = true;\n var params = {\n companyId: this.companyId,\n pageNum: this.page,\n pageSize: this.pageSize\n }; // 选中具体文件夹时按文件夹过滤(\"显示全部文件\"时 id 为空串,不传)\n\n if (this.selectedCategory && this.selectedCategory.id) {\n params.folderId = this.selectedCategory.id;\n }\n\n if (this.searchKeyword) {\n params.keyword = this.searchKeyword;\n }\n\n (0, _knowledgeBase.getFileList)(params).then(function (data) {\n // append:移动端「加载更多」追加到列表尾部\n if (append) {\n _this5.list = (_this5.list || []).concat(data.records || []);\n } else {\n _this5.list = data.records || []; // 列表刷新后清空勾选\n\n _this5.selectedRows = [];\n\n _this5.$nextTick(function () {\n // 移动端 el-table 不渲染,$refs.tableRef 可能不存在或非 el-table 实例\n if (_this5.$refs.tableRef && typeof _this5.$refs.tableRef.clearSelection === 'function') {\n _this5.$refs.tableRef.clearSelection();\n }\n });\n }\n\n _this5.total = data.total || 0;\n }).catch(function () {}).finally(function () {\n _this5.loading = false;\n });\n },\n\n /**\n * 移动端:加载更多(追加下一页)\n */\n loadMore: function loadMore() {\n if (this.loading) return;\n this.page += 1;\n this.loadList(true);\n },\n\n /**\n * 移动端:当前是否已勾选该文件\n */\n docMSelected: function docMSelected(row) {\n return (this.selectedRows || []).some(function (x) {\n return x && x.id === row.id;\n });\n },\n\n /**\n * 移动端:切换勾选(索引中的文件不可勾选)\n */\n toggleMSelected: function toggleMSelected(row) {\n if (row.indexStatus === 2) return;\n var i = (this.selectedRows || []).findIndex(function (x) {\n return x && x.id === row.id;\n });\n if (i >= 0) this.selectedRows.splice(i, 1);else this.selectedRows.push(row);\n },\n\n /**\n * 移动端横屏表格:表头全选/取消全选(仅作用于当前页可选行)\n */\n toggleSelectAll: function toggleSelectAll(e) {\n var _this6 = this;\n\n var checked = e && e.target ? e.target.checked : !this.isAllSelected;\n var selectable = this.selectableRows;\n\n if (checked) {\n selectable.forEach(function (row) {\n if (!_this6.docMSelected(row)) _this6.selectedRows.push(row);\n });\n } else {\n var ids = selectable.map(function (row) {\n return row.id;\n });\n this.selectedRows = (this.selectedRows || []).filter(function (row) {\n return !row || ids.indexOf(row.id) === -1;\n });\n }\n },\n handleSearch: function handleSearch() {\n this.page = 1;\n this.loadList();\n },\n handleSizeChange: function handleSizeChange(size) {\n this.pageSize = size;\n this.page = 1;\n this.loadList();\n },\n handleCurrentChange: function handleCurrentChange(page) {\n this.page = page;\n this.loadList();\n },\n\n /**\n * 删除文件后刷新列表:若当前页因删除而超出最大页数(如某页只剩 1 条被删掉),\n * 自动回退到最后一页(即上一页),避免停留在空白页。\n */\n handleDeleted: function handleDeleted() {\n var count = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n var newTotal = Math.max(0, this.total - count);\n var maxPage = Math.max(1, Math.ceil(newTotal / this.pageSize));\n\n if (this.page > maxPage) {\n this.page = maxPage;\n }\n\n this.loadList();\n },\n handleAdd: function handleAdd() {\n var _this7 = this;\n\n if (!this.companyId) {\n this.$message.warning('公司数据未加载,请稍后刷新');\n return;\n }\n\n if (!this.categoryList || this.categoryList.length === 0) {\n this.$message.warning('暂无根目录,请先创建文件夹再新增文档');\n return;\n }\n\n var folderId = this.selectedCategory && this.selectedCategory.id ? this.selectedCategory.id : '';\n this.$refs.docFormRef.openAdd(folderId).then(function (res) {\n if (res) _this7.loadList();\n });\n },\n handleEdit: function handleEdit(row) {\n var _this8 = this;\n\n this.$refs.docFormRef.openEdit(row).then(function (res) {\n if (res) _this8.loadList();\n });\n },\n\n /**\n * 在线预览:图片 / PDF / Excel / Word / 文本\n */\n handlePreview: function handlePreview(row) {\n var _this9 = this;\n\n this.previewFile = row;\n this.previewText = '';\n this.docxHtml = '';\n this.xlsxWorkbook = null;\n this.xlsxSheetNames = [];\n this.xlsxCurrentSheet = '';\n this.xlsxCols = [];\n this.xlsxTableData = []; // 清理上一次的 PDF Blob URL\n\n if (this.pdfBlobUrl) {\n URL.revokeObjectURL(this.pdfBlobUrl);\n this.pdfBlobUrl = '';\n }\n\n var t = (row.fileType || '').toLowerCase();\n\n if (['png', 'jpg', 'jpeg', 'gif', 'webp', 'bmp'].includes(t)) {\n this.previewType = 'image';\n } else if (t === 'pdf') {\n this.previewType = 'pdf';\n this.loadPdfPreview(row);\n } else if (t === 'xlsx' || t === 'xls') {\n this.previewType = 'xlsx';\n this.loadXlsxPreview(row);\n } else if (t === 'docx' || t === 'doc') {\n this.previewType = 'docx';\n this.loadDocxPreview(row);\n } else if (['txt', 'md', 'markdown', 'html', 'htm'].includes(t)) {\n this.previewType = 'text';\n (0, _knowledgeBase.getFileDetail)(row.id).then(function (d) {\n _this9.previewText = d.content || '(该文件暂无可预览的文本内容)';\n }).catch(function () {\n _this9.previewText = '(文本内容加载失败)';\n });\n } else {\n this.previewType = 'none';\n }\n\n this.previewVisible = true;\n },\n // ==================== Excel 预览 ====================\n loadXlsxPreview: function loadXlsxPreview(file) {\n var _this10 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n var detail, fileUrl, response, ab, workbook;\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _this10.xlsxLoading = true;\n _context.prev = 1;\n _context.next = 4;\n return (0, _knowledgeBase.getFileDetail)(file.id);\n\n case 4:\n detail = _context.sent;\n fileUrl = detail.fileUrl || file.fileUrl;\n\n if (fileUrl) {\n _context.next = 9;\n break;\n }\n\n _this10.$message.warning('无法获取文件下载地址');\n\n return _context.abrupt(\"return\");\n\n case 9:\n _context.next = 11;\n return fetch(fileUrl);\n\n case 11:\n response = _context.sent;\n\n if (response.ok) {\n _context.next = 14;\n break;\n }\n\n throw new Error('下载文件失败');\n\n case 14:\n _context.next = 16;\n return response.arrayBuffer();\n\n case 16:\n ab = _context.sent;\n _context.next = 19;\n return new Promise(function (r) {\n return setTimeout(r, 0);\n });\n\n case 19:\n workbook = XLSX.read(ab, {\n type: 'array'\n });\n _this10.xlsxWorkbook = workbook;\n _this10.xlsxSheetNames = workbook.SheetNames;\n\n if (workbook.SheetNames.length > 0) {\n _this10.xlsxCurrentSheet = workbook.SheetNames[0];\n\n _this10.renderXlsxSheet();\n }\n\n _context.next = 29;\n break;\n\n case 25:\n _context.prev = 25;\n _context.t0 = _context[\"catch\"](1);\n console.error('加载 Excel 文件失败', _context.t0);\n\n _this10.$message.error('Excel 文件加载失败');\n\n case 29:\n _context.prev = 29;\n _this10.xlsxLoading = false;\n return _context.finish(29);\n\n case 32:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, null, [[1, 25, 29, 32]]);\n }))();\n },\n renderXlsxSheet: function renderXlsxSheet() {\n var workbook = this.xlsxWorkbook;\n var sheetName = this.xlsxCurrentSheet;\n if (!workbook || !sheetName) return;\n var sheet = workbook.Sheets[sheetName];\n\n if (!sheet) {\n this.xlsxCols = [];\n this.xlsxTableData = [];\n return;\n } // 让出主线程,防止 sheet_to_json 阻塞 UI\n\n\n var data = XLSX.utils.sheet_to_json(sheet, {\n header: 1,\n defval: ''\n });\n\n if (data.length === 0) {\n this.xlsxCols = [];\n this.xlsxTableData = [];\n return;\n } // 列数以「所有行的最大宽度」为准:表头行可能只填了第一格,若直接按第一行长度定列会丢失后续列\n\n\n var maxCols = Math.max.apply(null, data.map(function (row) {\n return row && row.length || 0;\n }));\n this.xlsxCols = Array.from({\n length: maxCols\n }, function (_, i) {\n var v = data[0] && data[0][i];\n return v != null && String(v).trim() !== '' ? String(v) : \"\\u5217\".concat(i + 1);\n }); // 限制预览行数,防止渲染过多 DOM 卡死;同时过滤全空行\n\n var allRows = data.slice(1).filter(function (row) {\n return row && row.some(function (c) {\n return c != null && String(c).trim() !== '';\n });\n });\n this.hasMoreRows = allRows.length > MAX_PREVIEW_ROWS;\n this.xlsxTableData = allRows.slice(0, MAX_PREVIEW_ROWS).map(function (row) {\n var obj = {};\n\n for (var ci = 0; ci < maxCols; ci++) {\n obj[ci] = row[ci] != null ? String(row[ci]) : '';\n }\n\n return obj;\n });\n },\n // ==================== Word 预览 ====================\n loadDocxPreview: function loadDocxPreview(file) {\n var _this11 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n var detail, fileUrl, response, ab, result;\n return regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _this11.docxLoading = true;\n _context2.prev = 1;\n _context2.next = 4;\n return (0, _knowledgeBase.getFileDetail)(file.id);\n\n case 4:\n detail = _context2.sent;\n fileUrl = detail.fileUrl || file.fileUrl;\n\n if (fileUrl) {\n _context2.next = 9;\n break;\n }\n\n _this11.$message.warning('无法获取文件下载地址');\n\n return _context2.abrupt(\"return\");\n\n case 9:\n _context2.next = 11;\n return fetch(fileUrl);\n\n case 11:\n response = _context2.sent;\n\n if (response.ok) {\n _context2.next = 14;\n break;\n }\n\n throw new Error('下载文件失败');\n\n case 14:\n _context2.next = 16;\n return response.arrayBuffer();\n\n case 16:\n ab = _context2.sent;\n\n if (ab.byteLength) {\n _context2.next = 20;\n break;\n }\n\n _this11.docxHtml = '<p>(空文档)</p>';\n return _context2.abrupt(\"return\");\n\n case 20:\n _context2.next = 22;\n return _mammoth.default.convertToHtml({\n arrayBuffer: ab\n });\n\n case 22:\n result = _context2.sent;\n _this11.docxHtml = result.value || '<p>(空文档)</p>';\n _context2.next = 30;\n break;\n\n case 26:\n _context2.prev = 26;\n _context2.t0 = _context2[\"catch\"](1);\n console.error('加载 Word 文件失败', _context2.t0);\n\n _this11.$message.error('Word 文件加载失败');\n\n case 30:\n _context2.prev = 30;\n _this11.docxLoading = false;\n return _context2.finish(30);\n\n case 33:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2, null, [[1, 26, 30, 33]]);\n }))();\n },\n // ==================== PDF 预览 ====================\n loadPdfPreview: function loadPdfPreview(file) {\n var _this12 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n var detail, fileUrl, response, blob;\n return regeneratorRuntime.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n _context3.prev = 0;\n _context3.next = 3;\n return (0, _knowledgeBase.getFileDetail)(file.id);\n\n case 3:\n detail = _context3.sent;\n fileUrl = detail.fileUrl || file.fileUrl;\n\n if (fileUrl) {\n _context3.next = 8;\n break;\n }\n\n _this12.$message.warning('无法获取文件下载地址');\n\n return _context3.abrupt(\"return\");\n\n case 8:\n _context3.next = 10;\n return fetch(fileUrl);\n\n case 10:\n response = _context3.sent;\n\n if (response.ok) {\n _context3.next = 13;\n break;\n }\n\n throw new Error('下载文件失败');\n\n case 13:\n _context3.next = 15;\n return response.blob();\n\n case 15:\n blob = _context3.sent;\n _this12.pdfBlobUrl = URL.createObjectURL(blob);\n _context3.next = 23;\n break;\n\n case 19:\n _context3.prev = 19;\n _context3.t0 = _context3[\"catch\"](0);\n console.error('加载 PDF 文件失败', _context3.t0);\n\n _this12.$message.error('PDF 文件加载失败');\n\n case 23:\n case \"end\":\n return _context3.stop();\n }\n }\n }, _callee3, null, [[0, 19]]);\n }))();\n },\n\n /**\n * 索引 / 重建索引(二次确认)\n */\n handleIndex: function handleIndex(row) {\n var _this13 = this;\n\n var isRebuild = row.indexStatus === 1;\n console.log('[DocumentList] 索引文件:', row.id, row.title, 'companyId:', this.companyId);\n this.$confirm(\"\\u786E\\u8BA4\\u5BF9\\u6587\\u4EF6\\u300C\".concat(row.title || row.fileName, \"\\u300D\").concat(isRebuild ? '重建' : '创建', \"\\u7D22\\u5F15\\uFF1F\"), '提示', {\n type: 'warning',\n confirmButtonText: '确定',\n cancelButtonText: '取消'\n }).then(function () {\n var request = isRebuild ? (0, _knowledgeBase.reindexFile)(row.id) : (0, _knowledgeBase.indexFile)(row.id);\n request.then(function () {\n _this13.$message.success(isRebuild ? '已开始重建索引' : '已开始索引');\n\n _this13.loadList();\n }).catch(function () {});\n }).catch(function () {});\n },\n\n /**\n * 删除索引(二次确认)\n */\n handleDeleteIndex: function handleDeleteIndex(row) {\n var _this14 = this;\n\n this.$confirm(\"\\u786E\\u8BA4\\u5220\\u9664\\u6587\\u4EF6\\u300C\".concat(row.title || row.fileName, \"\\u300D\\u7684\\u7D22\\u5F15\\uFF1F\\u5220\\u9664\\u540E\\u65E0\\u6CD5\\u6062\\u590D\\u3002\"), '提示', {\n type: 'warning',\n confirmButtonText: '确定删除',\n cancelButtonText: '取消'\n }).then(function () {\n (0, _knowledgeBase.deleteFileIndex)(row.id).then(function () {\n _this14.$message.success('索引已删除');\n\n _this14.loadList();\n }).catch(function () {});\n }).catch(function () {});\n },\n handleDelete: function handleDelete(row) {\n var _this15 = this;\n\n // 索引中的文件不允许删除\n if (row.indexStatus === 2) {\n this.$message.warning('该文件正在索引中,无法删除');\n return;\n }\n\n var hasIndex = row.indexStatus === 1;\n this.$confirm(\"\\u786E\\u8BA4\\u5220\\u9664\\u6587\\u4EF6\\u300C\".concat(row.title || row.fileName, \"\\u300D\\uFF1F\").concat(hasIndex ? '删除文件前会先删除该文件的索引。' : '', \"\\u5220\\u9664\\u540E\\u65E0\\u6CD5\\u6062\\u590D\\u3002\"), '提示', {\n type: 'warning',\n confirmButtonText: '确定删除',\n cancelButtonText: '取消'\n }).then( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {\n return regeneratorRuntime.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n _context4.prev = 0;\n\n if (!hasIndex) {\n _context4.next = 4;\n break;\n }\n\n _context4.next = 4;\n return (0, _knowledgeBase.deleteFileIndex)(row.id);\n\n case 4:\n _context4.next = 6;\n return (0, _knowledgeBase.deleteFile)(row.id);\n\n case 6:\n _this15.$message.success('文件已删除');\n\n _this15.handleDeleted(1);\n\n _context4.next = 12;\n break;\n\n case 10:\n _context4.prev = 10;\n _context4.t0 = _context4[\"catch\"](0);\n\n case 12:\n case \"end\":\n return _context4.stop();\n }\n }\n }, _callee4, null, [[0, 10]]);\n }))).catch(function () {});\n },\n\n /**\n * 表格勾选变化\n */\n handleSelectionChange: function handleSelectionChange(rows) {\n this.selectedRows = rows || [];\n },\n\n /**\n * 索引中的文件不可勾选删除\n */\n rowSelectable: function rowSelectable(row) {\n return row.indexStatus !== 2;\n },\n\n /**\n * 批量删除勾选的文件\n */\n handleBatchDelete: function handleBatchDelete() {\n var _this16 = this;\n\n var selected = this.selectedRows || [];\n\n if (!selected.length) {\n this.$message.warning('请先勾选要删除的文件');\n return;\n } // 索引中的文件不允许删除\n\n\n var indexingFiles = selected.filter(function (f) {\n return f.indexStatus === 2;\n });\n var deletable = selected.filter(function (f) {\n return f.indexStatus !== 2;\n });\n\n if (!deletable.length) {\n this.$message.warning('所选文件均正在索引中,无法删除');\n return;\n }\n\n if (indexingFiles.length) {\n this.$message.warning(\"\\u6709 \".concat(indexingFiles.length, \" \\u4E2A\\u6587\\u4EF6\\u6B63\\u5728\\u7D22\\u5F15\\u4E2D\\uFF0C\\u672C\\u6B21\\u5C06\\u8DF3\\u8FC7\"));\n } // 已索引的文件需先删除索引,再删除文件\n\n\n var indexed = deletable.filter(function (f) {\n return f.indexStatus === 1;\n });\n var ids = deletable.map(function (f) {\n return f.id;\n });\n this.$confirm(\"\\u786E\\u8BA4\\u5220\\u9664\\u9009\\u4E2D\\u7684 \".concat(deletable.length, \" \\u4E2A\\u6587\\u4EF6\\uFF1F\").concat(indexed.length ? '删除前会先删除这些文件的索引。' : '', \"\\u5220\\u9664\\u540E\\u65E0\\u6CD5\\u6062\\u590D\\u3002\"), '提示', {\n type: 'warning',\n confirmButtonText: '确定删除',\n cancelButtonText: '取消',\n customClass: 'kb-message-box'\n }).then( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {\n return regeneratorRuntime.wrap(function _callee5$(_context5) {\n while (1) {\n switch (_context5.prev = _context5.next) {\n case 0:\n _context5.prev = 0;\n\n if (!indexed.length) {\n _context5.next = 4;\n break;\n }\n\n _context5.next = 4;\n return Promise.all(indexed.map(function (f) {\n return (0, _knowledgeBase.deleteFileIndex)(f.id);\n }));\n\n case 4:\n _context5.next = 6;\n return (0, _knowledgeBase.deleteFiles)(ids);\n\n case 6:\n _this16.$message.success('批量删除成功');\n\n _this16.handleDeleted(deletable.length);\n\n _context5.next = 12;\n break;\n\n case 10:\n _context5.prev = 10;\n _context5.t0 = _context5[\"catch\"](0);\n\n case 12:\n case \"end\":\n return _context5.stop();\n }\n }\n }, _callee5, null, [[0, 10]]);\n }))).catch(function () {});\n },\n\n /**\n * 批量移动:打开目标文件夹选择弹窗\n */\n handleBatchMove: function handleBatchMove() {\n var _this17 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee6() {\n var selected, folders;\n return regeneratorRuntime.wrap(function _callee6$(_context6) {\n while (1) {\n switch (_context6.prev = _context6.next) {\n case 0:\n selected = _this17.selectedRows || [];\n\n if (selected.length) {\n _context6.next = 4;\n break;\n }\n\n _this17.$message.warning('请先勾选要移动的文件');\n\n return _context6.abrupt(\"return\");\n\n case 4:\n if (_this17.companyId) {\n _context6.next = 7;\n break;\n }\n\n _this17.$message.warning('公司数据未加载');\n\n return _context6.abrupt(\"return\");\n\n case 7:\n _this17.moveFolderId = null;\n _this17.moveVisible = true; // 每次打开都重新加载文件夹列表,确保新建/重命名/删除文件夹后看到最新目录\n\n _context6.prev = 9;\n _context6.next = 12;\n return (0, _knowledgeBase.getFolderList)(_this17.companyId);\n\n case 12:\n folders = _context6.sent;\n _this17.folderList = folders || [];\n _context6.next = 18;\n break;\n\n case 16:\n _context6.prev = 16;\n _context6.t0 = _context6[\"catch\"](9);\n\n case 18:\n _this17.$nextTick(function () {\n if (_this17.$refs.moveTreeRef) _this17.$refs.moveTreeRef.setCurrentKey(null);\n });\n\n case 19:\n case \"end\":\n return _context6.stop();\n }\n }\n }, _callee6, null, [[9, 16]]);\n }))();\n },\n\n /**\n * 选择目标文件夹\n */\n handleMoveFolderSelect: function handleMoveFolderSelect(data) {\n this.moveFolderId = data.id;\n },\n\n /**\n * 确认批量移动\n */\n handleMoveConfirm: function handleMoveConfirm() {\n var _this18 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee7() {\n var ids, targetFolder;\n return regeneratorRuntime.wrap(function _callee7$(_context7) {\n while (1) {\n switch (_context7.prev = _context7.next) {\n case 0:\n if (_this18.moveFolderId) {\n _context7.next = 3;\n break;\n }\n\n _this18.$message.warning('请选择目标文件夹');\n\n return _context7.abrupt(\"return\");\n\n case 3:\n ids = _this18.selectedRows.map(function (f) {\n return f.id;\n });\n _this18.moving = true;\n _context7.prev = 5;\n _context7.next = 8;\n return (0, _knowledgeBase.moveFiles)(ids, _this18.moveFolderId);\n\n case 8:\n _this18.$message.success('批量移动成功');\n\n _this18.moveVisible = false; // 移动成功后,通知父级定位并高亮左侧树到目标文件夹\n\n targetFolder = _this18.folderList.find(function (f) {\n return String(f.id) === String(_this18.moveFolderId);\n }) || null;\n if (targetFolder) _this18.$emit('move-target', targetFolder);else _this18.$emit('move-target', {\n id: _this18.moveFolderId,\n name: _this18.moveTargetName\n });\n\n _this18.loadList();\n\n _context7.next = 17;\n break;\n\n case 15:\n _context7.prev = 15;\n _context7.t0 = _context7[\"catch\"](5);\n\n case 17:\n _context7.prev = 17;\n _this18.moving = false;\n return _context7.finish(17);\n\n case 20:\n case \"end\":\n return _context7.stop();\n }\n }\n }, _callee7, null, [[5, 15, 17, 20]]);\n }))();\n },\n\n /**\n * 通过 folderId 映射文件夹名称\n */\n folderName: function folderName(folderId) {\n if (!folderId) return '根目录';\n var found = this.categoryList.find(function (f) {\n return String(f.id) === String(folderId);\n });\n return found ? found.name : '-';\n },\n\n /**\n * 根据文件类型返回对应图标\n */\n getFileIcon: function getFileIcon(fileType) {\n var type = (fileType || '').toLowerCase();\n var iconMap = {\n pdf: 'el-icon-document',\n doc: 'el-icon-document',\n docx: 'el-icon-document',\n xls: 'el-icon-tickets',\n xlsx: 'el-icon-tickets',\n ppt: 'el-icon-data-line',\n pptx: 'el-icon-data-line',\n txt: 'el-icon-document',\n md: 'el-icon-edit-outline',\n png: 'el-icon-picture',\n jpg: 'el-icon-picture',\n jpeg: 'el-icon-picture',\n gif: 'el-icon-picture',\n zip: 'el-icon-folder-opened',\n rar: 'el-icon-folder-opened'\n };\n return iconMap[type] || 'el-icon-document';\n },\n\n /**\n * 根据文件类型返回对应的图标 URL\n */\n getFileIconUrl: function getFileIconUrl(fileType) {\n var type = (fileType || '').toLowerCase();\n var base = 'https://qiguanbang-client.obs.cn-east-3.myhuaweicloud.com/fileimgdoc';\n var generic = \"\".concat(base, \"/\\u901A\\u7528.png\"); // 通用文档 / 云文档(无专属图标时使用通用图片兜底)\n\n var genericTypes = ['md', 'markdown', 'html', 'htm', 'docx2', 'rtf'];\n var urlMap = {\n // 图片格式(jpg/png/jpeg 等)\n jpg: \"\".concat(base, \"/png.png\"),\n jpeg: \"\".concat(base, \"/png.png\"),\n png: \"\".concat(base, \"/png.png\"),\n gif: \"\".concat(base, \"/png.png\"),\n webp: \"\".concat(base, \"/png.png\"),\n bmp: \"\".concat(base, \"/png.png\"),\n // Excel 表格(xlsx/xls)\n xlsx: \"\".concat(base, \"/xlsx.png\"),\n xls: \"\".concat(base, \"/xlsx.png\"),\n csv: \"\".concat(base, \"/xlsx.png\"),\n // PDF 文档\n pdf: \"\".concat(base, \"/pdf.png\"),\n // 压缩包(zip/rar)\n zip: \"\".concat(base, \"/zip.png\"),\n rar: \"\".concat(base, \"/zip.png\"),\n '7z': \"\".concat(base, \"/zip.png\"),\n gz: \"\".concat(base, \"/zip.png\"),\n tar: \"\".concat(base, \"/zip.png\"),\n // Word 文档(docx/doc)\n docx: \"\".concat(base, \"/word.png\"),\n doc: \"\".concat(base, \"/word.png\"),\n // TXT 文本文件\n txt: \"\".concat(base, \"/txt.png\"),\n // PPT 演示文稿(pptx/ppt)\n pptx: \"\".concat(base, \"/ppt.png\"),\n ppt: \"\".concat(base, \"/ppt.png\"),\n // 视频文件\n mp4: \"\".concat(base, \"/mp4.png\"),\n avi: \"\".concat(base, \"/mp4.png\"),\n mov: \"\".concat(base, \"/mp4.png\"),\n wmv: \"\".concat(base, \"/mp4.png\"),\n flv: \"\".concat(base, \"/mp4.png\"),\n mkv: \"\".concat(base, \"/mp4.png\"),\n // 音频文件(mp3 等)\n mp3: \"\".concat(base, \"/mp3.png\"),\n wav: \"\".concat(base, \"/mp3.png\"),\n flac: \"\".concat(base, \"/mp3.png\"),\n aac: \"\".concat(base, \"/mp3.png\"),\n ogg: \"\".concat(base, \"/mp3.png\"),\n m4a: \"\".concat(base, \"/mp3.png\")\n };\n return (genericTypes.includes(type) ? generic : urlMap[type]) || generic;\n },\n\n /**\n * 文件大小格式化(字节 → B/KB/MB/GB)\n */\n formatSize: function formatSize(bytes) {\n if (!bytes && bytes !== 0) return '-';\n if (bytes === 0) return '0 B';\n var units = ['B', 'KB', 'MB', 'GB', 'TB'];\n var size = bytes;\n var idx = 0;\n\n while (size >= 1024 && idx < units.length - 1) {\n size /= 1024;\n idx++;\n }\n\n return \"\".concat(idx === 0 ? size : size.toFixed(2), \" \").concat(units[idx]);\n },\n\n /**\n * 时间展示:ISO 本地时间去掉 T 分隔符\n */\n formatTime: function formatTime(time) {\n if (!time) return '-';\n return String(time).replace('T', ' ').replace(/\\+08:00$/, '').replace(/\\.\\d{3}/, '');\n },\n\n /**\n * 索引状态标签:0 未索引 / 1 已索引 / 2 索引中 / 3 失败\n */\n indexTagType: function indexTagType(status) {\n var map = {\n 0: 'info',\n 1: 'success',\n 2: 'warning',\n 3: 'danger'\n };\n return map[status] || 'info';\n },\n indexTagText: function indexTagText(status) {\n var map = {\n 0: '未索引',\n 1: '已索引',\n 2: '索引中',\n 3: '索引失败'\n };\n return map[status] || '未知';\n }\n }\n};\nexports.default = _default2;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/DocumentList.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
992
992
|
|
|
993
993
|
/***/ }),
|
|
994
994
|
|
|
@@ -1000,7 +1000,7 @@ eval("\n\nvar _interopRequireWildcard = __webpack_require__(/*! ./node_modules/@
|
|
|
1000
1000
|
/***/ (function(module, exports, __webpack_require__) {
|
|
1001
1001
|
|
|
1002
1002
|
"use strict";
|
|
1003
|
-
eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\"));\n\nvar _typeof2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/typeof */ \"./node_modules/@babel/runtime/helpers/typeof.js\"));\n\nvar _logo = _interopRequireDefault(__webpack_require__(/*! @/assets/logo.png */ \"./src/assets/logo.png\"));\n\nvar _markdownIt = _interopRequireDefault(__webpack_require__(/*! markdown-it */ \"./node_modules/markdown-it/index.mjs\"));\n\nvar _kbChat = __webpack_require__(/*! ./api/kbChat */ \"./src/lib/knowledgeBase/api/kbChat.js\");\n\nvar _knowledgeBase = __webpack_require__(/*! ./api/knowledgeBase */ \"./src/lib/knowledgeBase/api/knowledgeBase.js\");\n\nvar _request = __webpack_require__(/*! @lib/utils/request.js */ \"./src/lib/utils/request.js\");\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nvar AI_AVATAR_URL = 'https://qiguanbang.obs.cn-east-3.myhuaweicloud.com/production/image/AlAgent/doc_query.png'; // 与 ChatDetail 使用相同的 Markdown 配置\n\nvar md = new _markdownIt.default({\n breaks: true,\n html: false,\n linkify: true,\n typographer: true\n});\nmd.enable('table');\nvar _default = {\n name: 'KbChatMain',\n props: {\n companyId: {\n type: String,\n default: ''\n },\n userno: {\n type: String,\n default: ''\n },\n imAccount: {\n type: [String, Object],\n default: ''\n },\n userName: {\n type: String,\n default: ''\n }\n },\n data: function data() {\n return {\n initDone: false,\n activeSessionId: '',\n sessionList: [],\n // 默认折叠侧边栏:避免新用户进入时先展开再合住的闪烁,\n // 加载出会话后再按规则决定是否展开\n sidebarCollapsed: true,\n messages: [],\n inputText: '',\n streaming: false,\n streamMsg: null,\n showToolInfo: false,\n contentCache: {},\n eventSource: null,\n streamRequestId: 0,\n suggestedQuestions: [],\n // 当前公司是否没有知识库文档(无资料时展示遮罩)\n noDocument: false\n };\n },\n computed: {\n aiAvatar: function aiAvatar() {\n return AI_AVATAR_URL;\n },\n userAvatar: function userAvatar() {\n var account = this.imAccount;\n console.log('KbChatMain - imAccount 原始值:', account); // 尝试解析字符串为对象\n\n if (typeof account === 'string') {\n try {\n account = JSON.parse(account);\n console.log('KbChatMain - imAccount 解析后:', account);\n } catch (e) {\n // 如果解析失败,检查是否是纯 URL 字符串\n if (account.trim() && (account.includes('http://') || account.includes('https://'))) {\n console.log('KbChatMain - imAccount 是 URL:', account.trim());\n return account.trim();\n }\n }\n } // 如果是对象,尝试多个可能的头像字段(优先使用 headImg)\n\n\n if (account && (0, _typeof2.default)(account) === 'object') {\n var avatarFields = ['headImg', 'headPortrait', 'avatar', 'avatarUrl', 'headImage', 'photoUrl', 'portrait', 'headUrl', 'userHeadUrl', 'userAvatar'];\n\n for (var _i = 0, _avatarFields = avatarFields; _i < _avatarFields.length; _i++) {\n var field = _avatarFields[_i];\n\n if (account[field] && String(account[field]).trim()) {\n console.log(\"KbChatMain - \\u627E\\u5230\\u5934\\u50CF\\u5B57\\u6BB5 \".concat(field, \":\"), account[field]);\n return String(account[field]).trim();\n }\n }\n }\n\n console.log('KbChatMain - 使用默认头像');\n return _logo.default;\n },\n // 是否有真实头像(区别于默认 fallback 图片)\n hasUserAvatar: function hasUserAvatar() {\n return this.userAvatar && this.userAvatar !== _logo.default;\n },\n // 无头像时的文字头像(与 zjkjAvatar 一致:取名字最后两个字)\n userAvatarText: function userAvatarText() {\n var name = this.userName || '';\n return name ? name.substring(name.length - 2) : '';\n }\n },\n watch: {\n companyId: function companyId() {\n this.initDone = false;\n this.finishStream();\n this.loadSuggestedQuestions();\n this.checkKbDocuments();\n this.initSession();\n },\n userno: function userno() {\n this.initDone = false;\n this.finishStream();\n this.activeSessionId = '';\n this.messages = [];\n this.initSession();\n }\n },\n mounted: function mounted() {\n var _this = this;\n\n this.initSession();\n this.checkKbDocuments(); // v-show 隐藏期间加载的历史消息无法滚动(scrollHeight 为 0),\n // 监听组件由隐藏变为可见时,滚动到最新问答;\n // 同时每次变为可见时刷新\"猜您想问\"(管理端可能刚更新过)\n\n if (typeof IntersectionObserver !== 'undefined' && this.$el) {\n this._visibilityObserver = new IntersectionObserver(function (entries) {\n if (entries.some(function (e) {\n return e.isIntersecting;\n })) {\n _this.loadSuggestedQuestions(); // 管理端可能刚上传/删除了文档,重新校验遮罩状态\n\n\n _this.checkKbDocuments();\n\n if (_this.messages.length) {\n _this.$nextTick(function () {\n return _this.scrollToBottom();\n });\n }\n }\n });\n\n this._visibilityObserver.observe(this.$el);\n } else {\n this.loadSuggestedQuestions();\n }\n },\n beforeDestroy: function beforeDestroy() {\n if (this._visibilityObserver) {\n this._visibilityObserver.disconnect();\n\n this._visibilityObserver = null;\n }\n\n this.streamRequestId++;\n this.closeEventSource();\n this.clearTypeTimer();\n this.contentCache = {};\n },\n methods: {\n renderMarkdown: function renderMarkdown(text) {\n if (!text) return '';\n\n try {\n return md.render(text);\n } catch (err) {\n return this.escapeHtml(text);\n }\n },\n // 与 ChatDetail 一致的增量渲染:完整行走 markdown、未完成尾行转义拼接,\n // 借助 markdown-it breaks:true 实现逐行浮现效果。\n renderStreaming: function renderStreaming(text, msgKey) {\n if (!text) return '';\n var cache = this.contentCache[msgKey];\n var lines = text.split('\\n');\n var lastLineIdx = lines.length - 1;\n\n if (!cache) {\n try {\n var html = md.render(text);\n this.$set(this.contentCache, msgKey, {\n renderedLines: lastLineIdx,\n html: html,\n fullText: text\n });\n return html;\n } catch (_unused) {\n return this.escapeHtml(text);\n }\n }\n\n if (text === cache.fullText) return cache.html;\n cache.fullText = text; // 行数没变,仅末尾追加字符,直接拼接尾行\n\n if (lastLineIdx === cache.renderedLines) {\n return cache.html + this.escapeHtml(lines[lastLineIdx]);\n } // 行数变少/文本回退截断,全量重渲染\n\n\n if (lastLineIdx < cache.renderedLines) {\n try {\n var fullLines = lines.slice(0, lastLineIdx);\n var newBaseHtml = '';\n\n if (fullLines.length > 0) {\n newBaseHtml = md.render(fullLines.join('\\n'));\n }\n\n cache.html = newBaseHtml;\n cache.renderedLines = lastLineIdx;\n\n var _lastLine = this.escapeHtml(lines[lastLineIdx]);\n\n return cache.html + (_lastLine || '');\n } catch (_unused2) {\n return this.escapeHtml(text);\n }\n } // 新增完整行\n\n\n if (cache.renderedLines < lastLineIdx) {\n var allFullLines = lines.slice(0, lastLineIdx);\n var _newBaseHtml = '';\n\n if (allFullLines.length > 0) {\n _newBaseHtml = md.render(allFullLines.join('\\n'));\n }\n\n cache.html = _newBaseHtml;\n cache.renderedLines = lastLineIdx;\n }\n\n var lastLine = this.escapeHtml(lines[lastLineIdx]);\n cache.renderedLines = lastLineIdx;\n return cache.html + (lastLine || '');\n },\n escapeHtml: function escapeHtml(text) {\n if (!text) return '';\n var map = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n };\n return String(text).replace(/[&<>\"']/g, function (c) {\n return map[c];\n });\n },\n autoResizeTextarea: function autoResizeTextarea() {\n var ta = this.$refs.taRef;\n if (!ta) return;\n var baseH = 100;\n var maxH = 180;\n ta.style.height = \"\".concat(baseH, \"px\");\n var realH = ta.scrollHeight;\n\n if (realH > baseH) {\n ta.style.height = \"\".concat(Math.min(realH, maxH), \"px\");\n }\n },\n newLine: function newLine(e) {\n var _this2 = this;\n\n e.preventDefault();\n var ta = this.$refs.taRef;\n var start = ta.selectionStart;\n var end = ta.selectionEnd;\n this.inputText = this.inputText.slice(0, start) + '\\n' + this.inputText.slice(end);\n this.$nextTick(function () {\n ta.selectionStart = ta.selectionEnd = start + 1;\n\n _this2.autoResizeTextarea();\n });\n },\n\n /**\n * 加载\"猜您想问\"问题(按公司,所有用户可见)\n */\n loadSuggestedQuestions: function loadSuggestedQuestions() {\n var _this3 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n var list;\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n if (_this3.companyId) {\n _context.next = 3;\n break;\n }\n\n _this3.suggestedQuestions = [];\n return _context.abrupt(\"return\");\n\n case 3:\n _context.prev = 3;\n _context.next = 6;\n return (0, _knowledgeBase.getSuggestedQuestions)(_this3.companyId);\n\n case 6:\n _context.t0 = _context.sent;\n\n if (_context.t0) {\n _context.next = 9;\n break;\n }\n\n _context.t0 = [];\n\n case 9:\n list = _context.t0;\n _this3.suggestedQuestions = list.map(function (q) {\n return q.questionText;\n });\n _context.next = 16;\n break;\n\n case 13:\n _context.prev = 13;\n _context.t1 = _context[\"catch\"](3);\n console.error('加载猜您想问失败', _context.t1);\n\n case 16:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, null, [[3, 13]]);\n }))();\n },\n\n /**\n * 检查当前公司是否有「已索引」的知识库文档,无可用资料时展示遮罩提示\n * 仅已索引(indexStatus === 1)的文档才能被检索,未索引/索引中/索引失败都不算\n */\n checkKbDocuments: function checkKbDocuments() {\n var _this4 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n var data, isEmpty;\n return regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (_this4.companyId) {\n _context2.next = 3;\n break;\n }\n\n _this4.noDocument = false;\n return _context2.abrupt(\"return\");\n\n case 3:\n _context2.prev = 3;\n _context2.next = 6;\n return (0, _knowledgeBase.getFileList)({\n companyId: _this4.companyId,\n indexStatus: 1,\n pageNum: 1,\n pageSize: 1\n });\n\n case 6:\n data = _context2.sent;\n isEmpty = (data && data.total || 0) === 0;\n _this4.noDocument = isEmpty; // 无资料时把会话固定回第一个\n\n if (isEmpty) _this4.lockFirstSession();\n _context2.next = 16;\n break;\n\n case 12:\n _context2.prev = 12;\n _context2.t0 = _context2[\"catch\"](3);\n // 查询失败(如无管理权限)时不展示遮罩,避免误拦截\n console.error('检查知识库文档失败', _context2.t0);\n _this4.noDocument = false;\n\n case 16:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2, null, [[3, 12]]);\n }))();\n },\n initSession: function initSession() {\n var _this5 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n var list;\n return regeneratorRuntime.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n if (_this5.companyId) {\n _context3.next = 2;\n break;\n }\n\n return _context3.abrupt(\"return\");\n\n case 2:\n if (!(_this5.initDone && (_this5.messages.length || _this5.streaming || _this5.inputText))) {\n _context3.next = 4;\n break;\n }\n\n return _context3.abrupt(\"return\");\n\n case 4:\n _this5.initDone = false;\n _context3.prev = 5;\n _context3.next = 8;\n return (0, _kbChat.getKbSessionList)(_this5.companyId);\n\n case 8:\n _context3.t0 = _context3.sent;\n\n if (_context3.t0) {\n _context3.next = 11;\n break;\n }\n\n _context3.t0 = [];\n\n case 11:\n list = _context3.t0;\n _this5.sessionList = list;\n\n if (!(list.length > 0)) {\n _context3.next = 19;\n break;\n }\n\n // 只有 1 个会话且无消息(新用户首次进入自动生成的空会话)时,\n // 默认折叠侧边栏只显示聊天主界面;在 selectSession 前同步设置,\n // 避免「先展开再合住」的闪烁\n _this5.sidebarCollapsed = list.length === 1 && !list[0].lastContent;\n _context3.next = 17;\n return _this5.selectSession(list[0].sessionId);\n\n case 17:\n _context3.next = 21;\n break;\n\n case 19:\n _context3.next = 21;\n return _this5.autoCreateSession();\n\n case 21:\n _context3.next = 28;\n break;\n\n case 23:\n _context3.prev = 23;\n _context3.t1 = _context3[\"catch\"](5);\n console.error('获取会话列表失败,尝试自动创建', _context3.t1);\n _context3.next = 28;\n return _this5.autoCreateSession();\n\n case 28:\n _context3.prev = 28;\n _this5.initDone = true;\n return _context3.finish(28);\n\n case 31:\n case \"end\":\n return _context3.stop();\n }\n }\n }, _callee3, null, [[5, 23, 28, 31]]);\n }))();\n },\n autoCreateSession: function autoCreateSession() {\n var _this6 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {\n var data;\n return regeneratorRuntime.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n if (_this6.companyId) {\n _context4.next = 3;\n break;\n }\n\n console.warn('[KbChat] 无法创建会话:companyId 为空');\n return _context4.abrupt(\"return\");\n\n case 3:\n console.log('[KbChat] 创建会话,companyId:', _this6.companyId);\n _context4.prev = 4;\n _context4.next = 7;\n return (0, _kbChat.createKbSession)(_this6.companyId);\n\n case 7:\n data = _context4.sent;\n console.log('[KbChat] 会话创建成功,sessionId:', data.sessionId);\n\n _this6.finishStream();\n\n _this6.activeSessionId = data.sessionId;\n _this6.streamRequestId++;\n _this6.messages = [];\n _this6.sessionList = [{\n sessionId: data.sessionId,\n title: '',\n lastContent: ''\n }].concat(_this6.sessionList || []); // 新建会话时保持侧边栏展开,方便继续切换会话\n\n _this6.sidebarCollapsed = false;\n\n _this6.$nextTick(function () {\n return _this6.scrollToBottom();\n });\n\n _context4.next = 21;\n break;\n\n case 18:\n _context4.prev = 18;\n _context4.t0 = _context4[\"catch\"](4);\n console.error('自动创建会话失败', _context4.t0);\n\n case 21:\n case \"end\":\n return _context4.stop();\n }\n }\n }, _callee4, null, [[4, 18]]);\n }))();\n },\n\n /** 新建会话(豆包式「新对话」) */\n handleNewSession: function handleNewSession() {\n var _this7 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {\n return regeneratorRuntime.wrap(function _callee5$(_context5) {\n while (1) {\n switch (_context5.prev = _context5.next) {\n case 0:\n if (!_this7.noDocument) {\n _context5.next = 2;\n break;\n }\n\n return _context5.abrupt(\"return\");\n\n case 2:\n if (_this7.streaming) _this7.handleStop();\n _context5.next = 5;\n return _this7.autoCreateSession();\n\n case 5:\n case \"end\":\n return _context5.stop();\n }\n }\n }, _callee5);\n }))();\n },\n\n /** 切换会话 */\n handleSelectSession: function handleSelectSession(item) {\n var _this8 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee6() {\n return regeneratorRuntime.wrap(function _callee6$(_context6) {\n while (1) {\n switch (_context6.prev = _context6.next) {\n case 0:\n if (!(!item || !item.sessionId)) {\n _context6.next = 2;\n break;\n }\n\n return _context6.abrupt(\"return\");\n\n case 2:\n if (!_this8.noDocument) {\n _context6.next = 5;\n break;\n }\n\n _this8.lockFirstSession();\n\n return _context6.abrupt(\"return\");\n\n case 5:\n if (!(item.sessionId === _this8.activeSessionId && _this8.messages.length)) {\n _context6.next = 7;\n break;\n }\n\n return _context6.abrupt(\"return\");\n\n case 7:\n _context6.next = 9;\n return _this8.selectSession(item.sessionId);\n\n case 9:\n case \"end\":\n return _context6.stop();\n }\n }\n }, _callee6);\n }))();\n },\n\n /** 无资料遮罩期间:把当前会话固定回列表中的第一个 */\n lockFirstSession: function lockFirstSession() {\n var first = this.sessionList[0];\n\n if (first && first.sessionId && first.sessionId !== this.activeSessionId) {\n this.selectSession(first.sessionId);\n }\n },\n\n /** 会话项「…」菜单:重命名 / 删除 */\n handleSessionMenu: function handleSessionMenu(cmd, item) {\n if (!item || !item.sessionId) return;\n\n if (cmd === 'rename') {\n this.handleRenameSession(item);\n } else if (cmd === 'delete') {\n this.handleDeleteSession(item);\n }\n },\n\n /** 重命名会话 */\n handleRenameSession: function handleRenameSession(item) {\n var _this9 = this;\n\n if (!item || !item.sessionId) return;\n this.$prompt('请输入新的会话名称', '重命名会话', {\n confirmButtonText: '确定',\n cancelButtonText: '取消',\n inputValue: item.title || '',\n inputPattern: /\\S+/,\n inputErrorMessage: '名称不能为空'\n }).then(function (_ref) {\n var value = _ref.value;\n var title = (value || '').trim();\n if (!title) return;\n return (0, _kbChat.renameKbSession)(item.sessionId, title).then(function () {\n item.title = title;\n\n _this9.$message.success('重命名成功');\n });\n }).catch(function (err) {\n // 取消或校验失败,不提示错误\n if (err && err !== 'cancel' && err !== 'close') {\n console.error('重命名失败', err);\n\n _this9.$message.error('重命名失败');\n }\n });\n },\n\n /** 删除会话 */\n handleDeleteSession: function handleDeleteSession(item) {\n var _this10 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee7() {\n return regeneratorRuntime.wrap(function _callee7$(_context7) {\n while (1) {\n switch (_context7.prev = _context7.next) {\n case 0:\n if (!(!item || !item.sessionId)) {\n _context7.next = 2;\n break;\n }\n\n return _context7.abrupt(\"return\");\n\n case 2:\n if (!(_this10.sessionList.length <= 1)) {\n _context7.next = 5;\n break;\n }\n\n _this10.$message.warning('至少保留一个会话');\n\n return _context7.abrupt(\"return\");\n\n case 5:\n _context7.prev = 5;\n _context7.next = 8;\n return _this10.$confirm('删除后无法恢复,确定删除该会话吗?', '删除会话', {\n confirmButtonText: '确定',\n cancelButtonText: '取消',\n type: 'warning'\n });\n\n case 8:\n _context7.next = 13;\n break;\n\n case 10:\n _context7.prev = 10;\n _context7.t0 = _context7[\"catch\"](5);\n return _context7.abrupt(\"return\");\n\n case 13:\n _context7.prev = 13;\n _context7.next = 16;\n return (0, _kbChat.deleteKbSession)(item.sessionId);\n\n case 16:\n _this10.sessionList = (_this10.sessionList || []).filter(function (s) {\n return s.sessionId !== item.sessionId;\n });\n\n if (!(_this10.activeSessionId === item.sessionId)) {\n _context7.next = 28;\n break;\n }\n\n _this10.finishStream();\n\n _this10.activeSessionId = '';\n _this10.messages = [];\n\n if (!(_this10.sessionList.length > 0)) {\n _context7.next = 26;\n break;\n }\n\n _context7.next = 24;\n return _this10.selectSession(_this10.sessionList[0].sessionId);\n\n case 24:\n _context7.next = 28;\n break;\n\n case 26:\n _context7.next = 28;\n return _this10.autoCreateSession();\n\n case 28:\n _this10.$message.success('删除成功');\n\n _context7.next = 35;\n break;\n\n case 31:\n _context7.prev = 31;\n _context7.t1 = _context7[\"catch\"](13);\n console.error('删除会话失败', _context7.t1);\n\n _this10.$message.error('删除失败');\n\n case 35:\n case \"end\":\n return _context7.stop();\n }\n }\n }, _callee7, null, [[5, 10], [13, 31]]);\n }))();\n },\n\n /** 会话列表时间格式化:今天显示时分,更早显示月日 */\n formatTime: function formatTime(time) {\n if (!time) return '';\n var d = new Date(time);\n if (isNaN(d.getTime())) return '';\n var now = new Date();\n var sameDay = d.getFullYear() === now.getFullYear() && d.getMonth() === now.getMonth() && d.getDate() === now.getDate();\n\n var pad = function pad(n) {\n return n < 10 ? '0' + n : '' + n;\n };\n\n if (sameDay) {\n return pad(d.getHours()) + ':' + pad(d.getMinutes());\n }\n\n return pad(d.getMonth() + 1) + '-' + pad(d.getDate());\n },\n selectSession: function selectSession(sessionId) {\n var _this11 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee8() {\n var raw, msgs;\n return regeneratorRuntime.wrap(function _callee8$(_context8) {\n while (1) {\n switch (_context8.prev = _context8.next) {\n case 0:\n if (_this11.streaming) _this11.handleStop();\n _this11.activeSessionId = sessionId;\n _this11.messages = [];\n _this11.streamMsg = null;\n _context8.prev = 4;\n _context8.next = 7;\n return (0, _kbChat.getKbSessionMessages)(sessionId);\n\n case 7:\n raw = _context8.sent;\n msgs = Array.isArray(raw) ? raw : raw.messages || raw.records || raw.list || [];\n _this11.messages = msgs.map(function (m, i) {\n return {\n role: m.role,\n content: m.content || '',\n thinking: m.thinking || m.reasoning || m.reasoning_result || m.reasoningContent || m.reasoning_content || m.thinkingContent || m.thinking_content || '',\n _key: m.createTime ? 'msg_' + m.createTime + '_' + i : 'msg_' + Date.now() + '_' + Math.random()\n };\n });\n\n _this11.$nextTick(function () {\n return _this11.scrollToBottom();\n });\n\n _context8.next = 16;\n break;\n\n case 13:\n _context8.prev = 13;\n _context8.t0 = _context8[\"catch\"](4);\n console.error('加载消息失败', _context8.t0);\n\n case 16:\n case \"end\":\n return _context8.stop();\n }\n }\n }, _callee8, null, [[4, 13]]);\n }))();\n },\n handleResetSession: function handleResetSession() {\n var _this12 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee9() {\n return regeneratorRuntime.wrap(function _callee9$(_context9) {\n while (1) {\n switch (_context9.prev = _context9.next) {\n case 0:\n if (!_this12.activeSessionId) {\n _context9.next = 8;\n break;\n }\n\n _context9.prev = 1;\n _context9.next = 4;\n return (0, _kbChat.closeKbSession)(_this12.activeSessionId);\n\n case 4:\n _context9.next = 8;\n break;\n\n case 6:\n _context9.prev = 6;\n _context9.t0 = _context9[\"catch\"](1);\n\n case 8:\n _context9.next = 10;\n return _this12.autoCreateSession();\n\n case 10:\n case \"end\":\n return _context9.stop();\n }\n }\n }, _callee9, null, [[1, 6]]);\n }))();\n },\n handleSend: function handleSend(quickText) {\n var _this13 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee10() {\n var text, requestSessionId, requestId, msgKey, msgIdx, streamMsg, isCurrentStream, answerBuffer, finalContent, streamDone, url;\n return regeneratorRuntime.wrap(function _callee10$(_context10) {\n while (1) {\n switch (_context10.prev = _context10.next) {\n case 0:\n text = typeof quickText === 'string' ? quickText.trim() : _this13.inputText.trim();\n\n if (!(!text || !_this13.activeSessionId || _this13.streaming)) {\n _context10.next = 3;\n break;\n }\n\n return _context10.abrupt(\"return\");\n\n case 3:\n _this13.inputText = '';\n requestSessionId = _this13.activeSessionId;\n requestId = ++_this13.streamRequestId;\n\n _this13.clearTypeTimer();\n\n _this13.messages.push({\n role: 'user',\n content: text\n });\n\n _this13.$nextTick(function () {\n return _this13.scrollToBottom();\n }); // 流式消息:作为 messages 中的对象(带 _key/loading),与 ChatDetail 一致\n\n\n msgKey = 'stream_' + requestId;\n msgIdx = _this13.messages.push({\n role: 'assistant',\n content: '',\n thinking: '',\n toolCalls: [],\n loading: true,\n _key: msgKey\n }) - 1;\n streamMsg = _this13.messages[msgIdx];\n _this13.streamMsg = streamMsg;\n _this13.streaming = true;\n\n isCurrentStream = function isCurrentStream() {\n return requestId === _this13.streamRequestId && requestSessionId === _this13.activeSessionId && _this13.streamMsg === streamMsg;\n }; // SSE 只把数据累积到 answerBuffer。typeTimer(30ms) 节流按「完整换行」逐行把内容\n // 推进到 msg.content:每个 tick 最多只推进「到下一个 \\n 为止」的一行,未完成的尾行\n // 保持不动;配合 renderStreaming(breaks:true) 实现「一行显示一行」。\n // 不是打字机模式(不逐字)、也不是一次性整段渲染(不会一出就是全文)。\n\n\n answerBuffer = '';\n finalContent = '';\n streamDone = false;\n _this13._typeTimer = setInterval(function () {\n if (!isCurrentStream()) return;\n var msg = _this13.messages[msgIdx];\n var source = finalContent || answerBuffer;\n var curLen = msg._prevReveal || 0;\n var nextLen = curLen; // 找到「当前已揭示进度之后」的第一条完整换行,仅推进这一行\n\n var nl = source.indexOf('\\n', curLen);\n\n if (nl !== -1) {\n nextLen = nl + 1;\n } else if (streamDone) {\n // 流结束且没有更多换行:最后一段未以换行结尾的内容一次性露出(此时即完整一行)\n nextLen = source.length;\n }\n\n if (nextLen > curLen) {\n msg._prevReveal = nextLen;\n msg.content = source.substring(0, nextLen);\n\n _this13.$nextTick(function () {\n return _this13.scrollToBottom();\n });\n } // 流结束且所有内容都已逐行露出 → 收尾\n\n\n if (streamDone && nextLen >= source.length) {\n _this13.finishStream();\n }\n }, 30);\n url = (0, _kbChat.createKbStreamUrl)(_this13.activeSessionId, text);\n _this13.eventSource = new EventSource(url);\n\n _this13.eventSource.addEventListener('tool_result', function (e) {\n if (!isCurrentStream() || streamDone) return;\n\n if (e.data && _this13.messages[msgIdx]) {\n if (!_this13.messages[msgIdx].toolCalls) _this13.messages[msgIdx].toolCalls = [];\n\n _this13.messages[msgIdx].toolCalls.push(e.data);\n\n _this13.$nextTick(function () {\n return _this13.scrollToBottom();\n });\n }\n });\n\n _this13.eventSource.addEventListener('answer', function (e) {\n if (!isCurrentStream() || streamDone) return;\n answerBuffer += e.data;\n });\n\n _this13.eventSource.addEventListener('answer_result', function (e) {\n if (!isCurrentStream() || streamDone) return; // 兼容保留:若后端未来补发 answer_result,则以它为最终真相源。\n // 只记录 finalContent 并结束流,不打断已在逐行推进的 content,交给 typeTimer 以 target 推进/校正。\n\n if (e.data) finalContent = e.data;\n streamDone = true;\n\n _this13.closeEventSource();\n });\n\n _this13.eventSource.addEventListener('reasoning', function (e) {\n if (!isCurrentStream() || streamDone) return;\n streamMsg.thinking += e.data;\n\n _this13.$nextTick(function () {\n return _this13.scrollToBottom();\n });\n });\n\n _this13.eventSource.addEventListener('reasoning_result', function (e) {\n if (!isCurrentStream() || streamDone) return;\n streamMsg.thinking = e.data;\n\n _this13.$nextTick(function () {\n return _this13.scrollToBottom();\n });\n });\n\n _this13.eventSource.addEventListener('done', function () {\n if (!isCurrentStream() || streamDone) return; // 后端不在 AGENT_RESULT 时补发 answer_result,这里用「answer 累积的完整文本」\n // 作为最终真相源,交由 typeTimer 逐行推进到全文并收尾。\n\n if (!finalContent) finalContent = answerBuffer;\n streamDone = true;\n\n _this13.closeEventSource();\n });\n\n _this13.eventSource.addEventListener('error', function () {\n if (!isCurrentStream() || streamDone) return;\n if (!answerBuffer) answerBuffer = '❌ 连接中断';\n streamDone = true;\n\n _this13.closeEventSource();\n });\n\n case 28:\n case \"end\":\n return _context10.stop();\n }\n }\n }, _callee10);\n }))();\n },\n handleStop: function handleStop() {\n this.streamRequestId++;\n\n if (this.activeSessionId) {\n (0, _kbChat.stopKbStream)(this.activeSessionId).catch(function () {});\n }\n\n this.finishStream();\n },\n finishStream: function finishStream() {\n var _this14 = this;\n\n this.clearTypeTimer();\n\n if (this.streamMsg) {\n this.$delete(this.contentCache, this.streamMsg._key);\n this.streamMsg.loading = false;\n this.streamMsg = null;\n }\n\n this.closeEventSource();\n this.streaming = false;\n this.refreshSessionList();\n this.$nextTick(function () {\n return _this14.scrollToBottom();\n });\n },\n\n /** 流式结束后刷新会话列表(更新标题/最后消息) */\n refreshSessionList: function refreshSessionList() {\n var _this15 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee11() {\n var list;\n return regeneratorRuntime.wrap(function _callee11$(_context11) {\n while (1) {\n switch (_context11.prev = _context11.next) {\n case 0:\n if (_this15.companyId) {\n _context11.next = 2;\n break;\n }\n\n return _context11.abrupt(\"return\");\n\n case 2:\n _context11.prev = 2;\n _context11.next = 5;\n return (0, _kbChat.getKbSessionList)(_this15.companyId);\n\n case 5:\n _context11.t0 = _context11.sent;\n\n if (_context11.t0) {\n _context11.next = 8;\n break;\n }\n\n _context11.t0 = [];\n\n case 8:\n list = _context11.t0;\n _this15.sessionList = list;\n _context11.next = 15;\n break;\n\n case 12:\n _context11.prev = 12;\n _context11.t1 = _context11[\"catch\"](2);\n console.error('刷新会话列表失败', _context11.t1);\n\n case 15:\n case \"end\":\n return _context11.stop();\n }\n }\n }, _callee11, null, [[2, 12]]);\n }))();\n },\n clearTypeTimer: function clearTypeTimer() {\n if (this._typeTimer) {\n clearInterval(this._typeTimer);\n this._typeTimer = null;\n }\n },\n closeEventSource: function closeEventSource() {\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n },\n copyText: function copyText(text) {\n if (navigator.clipboard) {\n navigator.clipboard.writeText(text);\n }\n },\n scrollToBottom: function scrollToBottom() {\n var el = this.$refs.messagesRef;\n\n if (el) {\n el.scrollTop = el.scrollHeight;\n }\n }\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/KbChatMain.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1003
|
+
eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\"));\n\nvar _typeof2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/typeof */ \"./node_modules/@babel/runtime/helpers/typeof.js\"));\n\nvar _logo = _interopRequireDefault(__webpack_require__(/*! @/assets/logo.png */ \"./src/assets/logo.png\"));\n\nvar _markdownIt = _interopRequireDefault(__webpack_require__(/*! markdown-it */ \"./node_modules/markdown-it/index.mjs\"));\n\nvar _kbChat = __webpack_require__(/*! ./api/kbChat */ \"./src/lib/knowledgeBase/api/kbChat.js\");\n\nvar _knowledgeBase = __webpack_require__(/*! ./api/knowledgeBase */ \"./src/lib/knowledgeBase/api/knowledgeBase.js\");\n\nvar _native = __webpack_require__(/*! ./native.js */ \"./src/lib/knowledgeBase/native.js\");\n\nvar _request = __webpack_require__(/*! @lib/utils/request.js */ \"./src/lib/utils/request.js\");\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nvar AI_AVATAR_URL = 'https://qiguanbang.obs.cn-east-3.myhuaweicloud.com/production/image/AlAgent/doc_query.png'; // 与 ChatDetail 使用相同的 Markdown 配置\n\nvar md = new _markdownIt.default({\n breaks: true,\n html: false,\n linkify: true,\n typographer: true\n});\nmd.enable('table');\nvar _default = {\n name: 'KbChatMain',\n props: {\n companyId: {\n type: String,\n default: ''\n },\n userno: {\n type: String,\n default: ''\n },\n imAccount: {\n type: [String, Object],\n default: ''\n },\n userName: {\n type: String,\n default: ''\n },\n // 是否移动端:由父级(KnowledgeBaseMain)传入;未传时组件自身按窗口宽度判断\n isMobile: {\n type: Boolean,\n default: null\n }\n },\n data: function data() {\n // 首帧前计算是否移动端,避免 H5 先显示 PC 布局再切换的闪烁(与 AI 助理一致)\n // 宿主没有 Element UI 时(H5/平板横屏)一律走自绘 UI 分支,避免 el-* 未知元素报错\n var _isMobile = typeof window !== 'undefined' && (window.innerWidth <= 768 || !(0, _native.hasElementUI)(this));\n\n return {\n initDone: false,\n activeSessionId: '',\n sessionList: [],\n // 默认折叠侧边栏:避免新用户进入时先展开再合住的闪烁,\n // 加载出会话后再按规则决定是否展开\n sidebarCollapsed: true,\n messages: [],\n inputText: '',\n streaming: false,\n streamMsg: null,\n showToolInfo: false,\n contentCache: {},\n eventSource: null,\n streamRequestId: 0,\n suggestedQuestions: [],\n // 当前公司是否没有知识库文档(无资料时展示遮罩)\n noDocument: false,\n // 移动端状态(仿 AI 助理):showH5List=true 显示会话列表页,false 显示聊天详情页\n localIsMobile: _isMobile,\n showH5List: _isMobile,\n // 移动端会话「…」弹出的操作单\n mobileAction: null\n };\n },\n computed: {\n /** 实际是否移动端:优先用父级 prop,未传则用自身窗口判断 */\n isMobileActive: function isMobileActive() {\n return this.isMobile !== null ? this.isMobile : this.localIsMobile;\n },\n aiAvatar: function aiAvatar() {\n return AI_AVATAR_URL;\n },\n userAvatar: function userAvatar() {\n var account = this.imAccount;\n console.log('KbChatMain - imAccount 原始值:', account); // 尝试解析字符串为对象\n\n if (typeof account === 'string') {\n try {\n account = JSON.parse(account);\n console.log('KbChatMain - imAccount 解析后:', account);\n } catch (e) {\n // 如果解析失败,检查是否是纯 URL 字符串\n if (account.trim() && (account.includes('http://') || account.includes('https://'))) {\n console.log('KbChatMain - imAccount 是 URL:', account.trim());\n return account.trim();\n }\n }\n } // 如果是对象,尝试多个可能的头像字段(优先使用 headImg)\n\n\n if (account && (0, _typeof2.default)(account) === 'object') {\n var avatarFields = ['headImg', 'headPortrait', 'avatar', 'avatarUrl', 'headImage', 'photoUrl', 'portrait', 'headUrl', 'userHeadUrl', 'userAvatar'];\n\n for (var _i = 0, _avatarFields = avatarFields; _i < _avatarFields.length; _i++) {\n var field = _avatarFields[_i];\n\n if (account[field] && String(account[field]).trim()) {\n console.log(\"KbChatMain - \\u627E\\u5230\\u5934\\u50CF\\u5B57\\u6BB5 \".concat(field, \":\"), account[field]);\n return String(account[field]).trim();\n }\n }\n }\n\n console.log('KbChatMain - 使用默认头像');\n return _logo.default;\n },\n // 是否有真实头像(区别于默认 fallback 图片)\n hasUserAvatar: function hasUserAvatar() {\n return this.userAvatar && this.userAvatar !== _logo.default;\n },\n // 无头像时的文字头像(与 zjkjAvatar 一致:取名字最后两个字)\n userAvatarText: function userAvatarText() {\n var name = this.userName || '';\n return name ? name.substring(name.length - 2) : '';\n }\n },\n watch: {\n companyId: function companyId() {\n this.initDone = false;\n this.finishStream();\n this.loadSuggestedQuestions();\n this.checkKbDocuments();\n this.initSession();\n },\n userno: function userno() {\n this.initDone = false;\n this.finishStream();\n this.activeSessionId = '';\n this.messages = [];\n this.initSession();\n },\n // 移动端进入时默认先显示会话列表页(仿 AI 助理)\n isMobileActive: function isMobileActive(val) {\n if (val) {\n // 无资料时遮罩只在详情页可见(列表页 .kb-chat-main 被隐藏),故保持停在详情页\n this.showH5List = !this.noDocument;\n this.mobileAction = null;\n }\n }\n },\n mounted: function mounted() {\n var _this = this;\n\n // 独立使用(父级未传 isMobile)时自检窗口宽度\n this._onResize = this.handleResize;\n window.addEventListener('resize', this._onResize, {\n passive: true\n });\n this.initSession();\n this.checkKbDocuments(); // v-show 隐藏期间加载的历史消息无法滚动(scrollHeight 为 0),\n // 监听组件由隐藏变为可见时,滚动到最新问答;\n // 同时每次变为可见时刷新\"猜您想问\"(管理端可能刚更新过)\n\n if (typeof IntersectionObserver !== 'undefined' && this.$el) {\n this._visibilityObserver = new IntersectionObserver(function (entries) {\n if (entries.some(function (e) {\n return e.isIntersecting;\n })) {\n _this.loadSuggestedQuestions(); // 管理端可能刚上传/删除了文档,重新校验遮罩状态\n\n\n _this.checkKbDocuments();\n\n if (_this.messages.length) {\n _this.$nextTick(function () {\n return _this.scrollToBottom();\n });\n }\n }\n });\n\n this._visibilityObserver.observe(this.$el);\n } else {\n this.loadSuggestedQuestions();\n }\n },\n beforeDestroy: function beforeDestroy() {\n if (this._visibilityObserver) {\n this._visibilityObserver.disconnect();\n\n this._visibilityObserver = null;\n }\n\n if (this._onResize) {\n window.removeEventListener('resize', this._onResize);\n }\n\n this.streamRequestId++;\n this.closeEventSource();\n this.clearTypeTimer();\n this.contentCache = {};\n },\n methods: {\n // 独立使用时自检移动端(父级已传 isMobile 时忽略)\n handleResize: function handleResize() {\n var now = typeof window !== 'undefined' && (window.innerWidth <= 768 || !(0, _native.hasElementUI)(this));\n this.localIsMobile = now;\n },\n renderMarkdown: function renderMarkdown(text) {\n if (!text) return '';\n\n try {\n return md.render(text);\n } catch (err) {\n return this.escapeHtml(text);\n }\n },\n // 与 ChatDetail 一致的增量渲染:完整行走 markdown、未完成尾行转义拼接,\n // 借助 markdown-it breaks:true 实现逐行浮现效果。\n renderStreaming: function renderStreaming(text, msgKey) {\n if (!text) return '';\n var cache = this.contentCache[msgKey];\n var lines = text.split('\\n');\n var lastLineIdx = lines.length - 1;\n\n if (!cache) {\n try {\n var html = md.render(text);\n this.$set(this.contentCache, msgKey, {\n renderedLines: lastLineIdx,\n html: html,\n fullText: text\n });\n return html;\n } catch (_unused) {\n return this.escapeHtml(text);\n }\n }\n\n if (text === cache.fullText) return cache.html;\n cache.fullText = text; // 行数没变,仅末尾追加字符,直接拼接尾行\n\n if (lastLineIdx === cache.renderedLines) {\n return cache.html + this.escapeHtml(lines[lastLineIdx]);\n } // 行数变少/文本回退截断,全量重渲染\n\n\n if (lastLineIdx < cache.renderedLines) {\n try {\n var fullLines = lines.slice(0, lastLineIdx);\n var newBaseHtml = '';\n\n if (fullLines.length > 0) {\n newBaseHtml = md.render(fullLines.join('\\n'));\n }\n\n cache.html = newBaseHtml;\n cache.renderedLines = lastLineIdx;\n\n var _lastLine = this.escapeHtml(lines[lastLineIdx]);\n\n return cache.html + (_lastLine || '');\n } catch (_unused2) {\n return this.escapeHtml(text);\n }\n } // 新增完整行\n\n\n if (cache.renderedLines < lastLineIdx) {\n var allFullLines = lines.slice(0, lastLineIdx);\n var _newBaseHtml = '';\n\n if (allFullLines.length > 0) {\n _newBaseHtml = md.render(allFullLines.join('\\n'));\n }\n\n cache.html = _newBaseHtml;\n cache.renderedLines = lastLineIdx;\n }\n\n var lastLine = this.escapeHtml(lines[lastLineIdx]);\n cache.renderedLines = lastLineIdx;\n return cache.html + (lastLine || '');\n },\n escapeHtml: function escapeHtml(text) {\n if (!text) return '';\n var map = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n };\n return String(text).replace(/[&<>\"']/g, function (c) {\n return map[c];\n });\n },\n autoResizeTextarea: function autoResizeTextarea() {\n var ta = this.$refs.taRef;\n if (!ta) return;\n var baseH = 100;\n var maxH = 180;\n ta.style.height = \"\".concat(baseH, \"px\");\n var realH = ta.scrollHeight;\n\n if (realH > baseH) {\n ta.style.height = \"\".concat(Math.min(realH, maxH), \"px\");\n }\n },\n newLine: function newLine(e) {\n var _this2 = this;\n\n e.preventDefault();\n var ta = this.$refs.taRef;\n var start = ta.selectionStart;\n var end = ta.selectionEnd;\n this.inputText = this.inputText.slice(0, start) + '\\n' + this.inputText.slice(end);\n this.$nextTick(function () {\n ta.selectionStart = ta.selectionEnd = start + 1;\n\n _this2.autoResizeTextarea();\n });\n },\n\n /**\n * 加载\"猜您想问\"问题(按公司,所有用户可见)\n */\n loadSuggestedQuestions: function loadSuggestedQuestions() {\n var _this3 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n var list;\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n if (_this3.companyId) {\n _context.next = 3;\n break;\n }\n\n _this3.suggestedQuestions = [];\n return _context.abrupt(\"return\");\n\n case 3:\n _context.prev = 3;\n _context.next = 6;\n return (0, _knowledgeBase.getSuggestedQuestions)(_this3.companyId);\n\n case 6:\n _context.t0 = _context.sent;\n\n if (_context.t0) {\n _context.next = 9;\n break;\n }\n\n _context.t0 = [];\n\n case 9:\n list = _context.t0;\n _this3.suggestedQuestions = list.map(function (q) {\n return q.questionText;\n });\n _context.next = 16;\n break;\n\n case 13:\n _context.prev = 13;\n _context.t1 = _context[\"catch\"](3);\n console.error('加载猜您想问失败', _context.t1);\n\n case 16:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, null, [[3, 13]]);\n }))();\n },\n\n /**\n * 检查当前公司是否有「已索引」的知识库文档,无可用资料时展示遮罩提示\n * 仅已索引(indexStatus === 1)的文档才能被检索,未索引/索引中/索引失败都不算\n */\n checkKbDocuments: function checkKbDocuments() {\n var _this4 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n var data, isEmpty;\n return regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (_this4.companyId) {\n _context2.next = 3;\n break;\n }\n\n _this4.noDocument = false;\n return _context2.abrupt(\"return\");\n\n case 3:\n _context2.prev = 3;\n _context2.next = 6;\n return (0, _knowledgeBase.getFileList)({\n companyId: _this4.companyId,\n indexStatus: 1,\n pageNum: 1,\n pageSize: 1\n });\n\n case 6:\n data = _context2.sent;\n isEmpty = (data && data.total || 0) === 0;\n _this4.noDocument = isEmpty; // 无资料时把会话固定回第一个\n\n if (isEmpty) {\n _this4.lockFirstSession(); // 无资料遮罩位于聊天详情页的 .kb-chat-main 内,而移动端首屏是会话列表页\n // (h5-list-mode 下 .kb-chat-main 被 display:none 隐藏),若停留在列表页\n // 则遮罩永远不可见;故无资料时强制切到详情页把遮罩展示出来\n\n\n if (_this4.isMobileActive) _this4.showH5List = false;\n }\n\n _context2.next = 16;\n break;\n\n case 12:\n _context2.prev = 12;\n _context2.t0 = _context2[\"catch\"](3);\n // 查询失败(如无管理权限)时不展示遮罩,避免误拦截\n console.error('检查知识库文档失败', _context2.t0);\n _this4.noDocument = false;\n\n case 16:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2, null, [[3, 12]]);\n }))();\n },\n initSession: function initSession() {\n var _this5 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n var list;\n return regeneratorRuntime.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n if (_this5.companyId) {\n _context3.next = 2;\n break;\n }\n\n return _context3.abrupt(\"return\");\n\n case 2:\n if (!(_this5.initDone && (_this5.messages.length || _this5.streaming || _this5.inputText))) {\n _context3.next = 4;\n break;\n }\n\n return _context3.abrupt(\"return\");\n\n case 4:\n _this5.initDone = false;\n _context3.prev = 5;\n _context3.next = 8;\n return (0, _kbChat.getKbSessionList)(_this5.companyId);\n\n case 8:\n _context3.t0 = _context3.sent;\n\n if (_context3.t0) {\n _context3.next = 11;\n break;\n }\n\n _context3.t0 = [];\n\n case 11:\n list = _context3.t0;\n _this5.sessionList = list;\n\n if (!(list.length > 0)) {\n _context3.next = 19;\n break;\n }\n\n // 只有 1 个会话且无消息(新用户首次进入自动生成的空会话)时,\n // 默认折叠侧边栏只显示聊天主界面;在 selectSession 前同步设置,\n // 避免「先展开再合住」的闪烁\n _this5.sidebarCollapsed = list.length === 1 && !list[0].lastContent;\n _context3.next = 17;\n return _this5.selectSession(list[0].sessionId);\n\n case 17:\n _context3.next = 21;\n break;\n\n case 19:\n _context3.next = 21;\n return _this5.autoCreateSession();\n\n case 21:\n _context3.next = 28;\n break;\n\n case 23:\n _context3.prev = 23;\n _context3.t1 = _context3[\"catch\"](5);\n console.error('获取会话列表失败,尝试自动创建', _context3.t1);\n _context3.next = 28;\n return _this5.autoCreateSession();\n\n case 28:\n _context3.prev = 28;\n _this5.initDone = true;\n return _context3.finish(28);\n\n case 31:\n case \"end\":\n return _context3.stop();\n }\n }\n }, _callee3, null, [[5, 23, 28, 31]]);\n }))();\n },\n autoCreateSession: function autoCreateSession() {\n var _this6 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {\n var data;\n return regeneratorRuntime.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n if (_this6.companyId) {\n _context4.next = 3;\n break;\n }\n\n console.warn('[KbChat] 无法创建会话:companyId 为空');\n return _context4.abrupt(\"return\");\n\n case 3:\n console.log('[KbChat] 创建会话,companyId:', _this6.companyId);\n _context4.prev = 4;\n _context4.next = 7;\n return (0, _kbChat.createKbSession)(_this6.companyId);\n\n case 7:\n data = _context4.sent;\n console.log('[KbChat] 会话创建成功,sessionId:', data.sessionId);\n\n _this6.finishStream();\n\n _this6.activeSessionId = data.sessionId;\n _this6.streamRequestId++;\n _this6.messages = [];\n _this6.sessionList = [{\n sessionId: data.sessionId,\n title: '',\n lastContent: ''\n }].concat(_this6.sessionList || []); // 新建会话时保持侧边栏展开,方便继续切换会话\n\n _this6.sidebarCollapsed = false;\n\n _this6.$nextTick(function () {\n return _this6.scrollToBottom();\n });\n\n _context4.next = 21;\n break;\n\n case 18:\n _context4.prev = 18;\n _context4.t0 = _context4[\"catch\"](4);\n console.error('自动创建会话失败', _context4.t0);\n\n case 21:\n case \"end\":\n return _context4.stop();\n }\n }\n }, _callee4, null, [[4, 18]]);\n }))();\n },\n\n /** 新建会话(豆包式「新对话」) */\n handleNewSession: function handleNewSession() {\n var _this7 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {\n return regeneratorRuntime.wrap(function _callee5$(_context5) {\n while (1) {\n switch (_context5.prev = _context5.next) {\n case 0:\n if (!_this7.noDocument) {\n _context5.next = 2;\n break;\n }\n\n return _context5.abrupt(\"return\");\n\n case 2:\n if (_this7.streaming) _this7.handleStop();\n _context5.next = 5;\n return _this7.autoCreateSession();\n\n case 5:\n case \"end\":\n return _context5.stop();\n }\n }\n }, _callee5);\n }))();\n },\n\n /** 切换会话 */\n handleSelectSession: function handleSelectSession(item) {\n var _this8 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee6() {\n return regeneratorRuntime.wrap(function _callee6$(_context6) {\n while (1) {\n switch (_context6.prev = _context6.next) {\n case 0:\n if (!(!item || !item.sessionId)) {\n _context6.next = 2;\n break;\n }\n\n return _context6.abrupt(\"return\");\n\n case 2:\n if (!_this8.noDocument) {\n _context6.next = 5;\n break;\n }\n\n _this8.lockFirstSession();\n\n return _context6.abrupt(\"return\");\n\n case 5:\n if (!(item.sessionId === _this8.activeSessionId && _this8.messages.length)) {\n _context6.next = 7;\n break;\n }\n\n return _context6.abrupt(\"return\");\n\n case 7:\n _context6.next = 9;\n return _this8.selectSession(item.sessionId);\n\n case 9:\n // 移动端:选中后跳到聊天详情页\n if (_this8.isMobileActive) {\n _this8.showH5List = false;\n }\n\n case 10:\n case \"end\":\n return _context6.stop();\n }\n }\n }, _callee6);\n }))();\n },\n\n /** 移动端详情页返回:无资料时遮罩只在详情页可见,禁止回到列表页 */\n handleMobileBack: function handleMobileBack() {\n if (this.noDocument) return;\n this.showH5List = true;\n },\n\n /** 无资料遮罩期间:把当前会话固定回列表中的第一个 */\n lockFirstSession: function lockFirstSession() {\n var first = this.sessionList[0];\n\n if (first && first.sessionId && first.sessionId !== this.activeSessionId) {\n this.selectSession(first.sessionId);\n }\n },\n\n /** 会话项「…」菜单:重命名 / 删除 */\n handleSessionMenu: function handleSessionMenu(cmd, item) {\n if (!item || !item.sessionId) return;\n\n if (cmd === 'rename') {\n this.handleRenameSession(item);\n } else if (cmd === 'delete') {\n this.handleDeleteSession(item);\n }\n },\n // ==================== 移动端会话操作单 ====================\n openMobileAction: function openMobileAction(item) {\n if (this.noDocument) return;\n this.mobileAction = item;\n },\n doMobileRename: function doMobileRename(item) {\n this.mobileAction = null;\n this.handleRenameSession(item);\n },\n doMobileDelete: function doMobileDelete(item) {\n this.mobileAction = null;\n this.handleDeleteSession(item);\n },\n\n /** 重命名会话 */\n handleRenameSession: function handleRenameSession(item) {\n var _this9 = this;\n\n if (!item || !item.sessionId) return;\n this.$prompt('请输入新的会话名称', '重命名会话', {\n confirmButtonText: '确定',\n cancelButtonText: '取消',\n inputValue: item.title || '',\n inputPattern: /\\S+/,\n inputErrorMessage: '名称不能为空'\n }).then(function (_ref) {\n var value = _ref.value;\n var title = (value || '').trim();\n if (!title) return;\n return (0, _kbChat.renameKbSession)(item.sessionId, title).then(function () {\n item.title = title;\n\n _this9.$message.success('重命名成功');\n });\n }).catch(function (err) {\n // 取消或校验失败,不提示错误\n if (err && err !== 'cancel' && err !== 'close') {\n console.error('重命名失败', err);\n\n _this9.$message.error('重命名失败');\n }\n });\n },\n\n /** 删除会话 */\n handleDeleteSession: function handleDeleteSession(item) {\n var _this10 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee7() {\n return regeneratorRuntime.wrap(function _callee7$(_context7) {\n while (1) {\n switch (_context7.prev = _context7.next) {\n case 0:\n if (!(!item || !item.sessionId)) {\n _context7.next = 2;\n break;\n }\n\n return _context7.abrupt(\"return\");\n\n case 2:\n if (!(_this10.sessionList.length <= 1)) {\n _context7.next = 5;\n break;\n }\n\n _this10.$message.warning('至少保留一个会话');\n\n return _context7.abrupt(\"return\");\n\n case 5:\n _context7.prev = 5;\n _context7.next = 8;\n return _this10.$confirm('删除后无法恢复,确定删除该会话吗?', '删除会话', {\n confirmButtonText: '确定',\n cancelButtonText: '取消',\n type: 'warning'\n });\n\n case 8:\n _context7.next = 13;\n break;\n\n case 10:\n _context7.prev = 10;\n _context7.t0 = _context7[\"catch\"](5);\n return _context7.abrupt(\"return\");\n\n case 13:\n _context7.prev = 13;\n _context7.next = 16;\n return (0, _kbChat.deleteKbSession)(item.sessionId);\n\n case 16:\n _this10.sessionList = (_this10.sessionList || []).filter(function (s) {\n return s.sessionId !== item.sessionId;\n });\n\n if (!(_this10.activeSessionId === item.sessionId)) {\n _context7.next = 28;\n break;\n }\n\n _this10.finishStream();\n\n _this10.activeSessionId = '';\n _this10.messages = [];\n\n if (!(_this10.sessionList.length > 0)) {\n _context7.next = 26;\n break;\n }\n\n _context7.next = 24;\n return _this10.selectSession(_this10.sessionList[0].sessionId);\n\n case 24:\n _context7.next = 28;\n break;\n\n case 26:\n _context7.next = 28;\n return _this10.autoCreateSession();\n\n case 28:\n _this10.$message.success('删除成功');\n\n _context7.next = 35;\n break;\n\n case 31:\n _context7.prev = 31;\n _context7.t1 = _context7[\"catch\"](13);\n console.error('删除会话失败', _context7.t1);\n\n _this10.$message.error('删除失败');\n\n case 35:\n case \"end\":\n return _context7.stop();\n }\n }\n }, _callee7, null, [[5, 10], [13, 31]]);\n }))();\n },\n\n /** 会话列表时间格式化:今天显示时分,更早显示月日 */\n formatTime: function formatTime(time) {\n if (!time) return '';\n var d = new Date(time);\n if (isNaN(d.getTime())) return '';\n var now = new Date();\n var sameDay = d.getFullYear() === now.getFullYear() && d.getMonth() === now.getMonth() && d.getDate() === now.getDate();\n\n var pad = function pad(n) {\n return n < 10 ? '0' + n : '' + n;\n };\n\n if (sameDay) {\n return pad(d.getHours()) + ':' + pad(d.getMinutes());\n }\n\n return pad(d.getMonth() + 1) + '-' + pad(d.getDate());\n },\n selectSession: function selectSession(sessionId) {\n var _this11 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee8() {\n var raw, msgs;\n return regeneratorRuntime.wrap(function _callee8$(_context8) {\n while (1) {\n switch (_context8.prev = _context8.next) {\n case 0:\n if (_this11.streaming) _this11.handleStop();\n _this11.activeSessionId = sessionId;\n _this11.messages = [];\n _this11.streamMsg = null;\n _context8.prev = 4;\n _context8.next = 7;\n return (0, _kbChat.getKbSessionMessages)(sessionId);\n\n case 7:\n raw = _context8.sent;\n msgs = Array.isArray(raw) ? raw : raw.messages || raw.records || raw.list || [];\n _this11.messages = msgs.map(function (m, i) {\n return {\n role: m.role,\n content: m.content || '',\n thinking: m.thinking || m.reasoning || m.reasoning_result || m.reasoningContent || m.reasoning_content || m.thinkingContent || m.thinking_content || '',\n _key: m.createTime ? 'msg_' + m.createTime + '_' + i : 'msg_' + Date.now() + '_' + Math.random()\n };\n });\n\n _this11.$nextTick(function () {\n return _this11.scrollToBottom();\n });\n\n _context8.next = 16;\n break;\n\n case 13:\n _context8.prev = 13;\n _context8.t0 = _context8[\"catch\"](4);\n console.error('加载消息失败', _context8.t0);\n\n case 16:\n case \"end\":\n return _context8.stop();\n }\n }\n }, _callee8, null, [[4, 13]]);\n }))();\n },\n handleResetSession: function handleResetSession() {\n var _this12 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee9() {\n return regeneratorRuntime.wrap(function _callee9$(_context9) {\n while (1) {\n switch (_context9.prev = _context9.next) {\n case 0:\n if (!_this12.activeSessionId) {\n _context9.next = 8;\n break;\n }\n\n _context9.prev = 1;\n _context9.next = 4;\n return (0, _kbChat.closeKbSession)(_this12.activeSessionId);\n\n case 4:\n _context9.next = 8;\n break;\n\n case 6:\n _context9.prev = 6;\n _context9.t0 = _context9[\"catch\"](1);\n\n case 8:\n _context9.next = 10;\n return _this12.autoCreateSession();\n\n case 10:\n case \"end\":\n return _context9.stop();\n }\n }\n }, _callee9, null, [[1, 6]]);\n }))();\n },\n handleSend: function handleSend(quickText) {\n var _this13 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee10() {\n var text, requestSessionId, requestId, msgKey, msgIdx, streamMsg, isCurrentStream, answerBuffer, finalContent, streamDone, url;\n return regeneratorRuntime.wrap(function _callee10$(_context10) {\n while (1) {\n switch (_context10.prev = _context10.next) {\n case 0:\n text = typeof quickText === 'string' ? quickText.trim() : _this13.inputText.trim();\n\n if (!(!text || !_this13.activeSessionId || _this13.streaming)) {\n _context10.next = 3;\n break;\n }\n\n return _context10.abrupt(\"return\");\n\n case 3:\n _this13.inputText = '';\n requestSessionId = _this13.activeSessionId;\n requestId = ++_this13.streamRequestId;\n\n _this13.clearTypeTimer();\n\n _this13.messages.push({\n role: 'user',\n content: text\n });\n\n _this13.$nextTick(function () {\n return _this13.scrollToBottom();\n }); // 流式消息:作为 messages 中的对象(带 _key/loading),与 ChatDetail 一致\n\n\n msgKey = 'stream_' + requestId;\n msgIdx = _this13.messages.push({\n role: 'assistant',\n content: '',\n thinking: '',\n toolCalls: [],\n loading: true,\n _key: msgKey\n }) - 1;\n streamMsg = _this13.messages[msgIdx];\n _this13.streamMsg = streamMsg;\n _this13.streaming = true;\n\n isCurrentStream = function isCurrentStream() {\n return requestId === _this13.streamRequestId && requestSessionId === _this13.activeSessionId && _this13.streamMsg === streamMsg;\n }; // SSE 只把数据累积到 answerBuffer。typeTimer(30ms) 节流按「完整换行」逐行把内容\n // 推进到 msg.content:每个 tick 最多只推进「到下一个 \\n 为止」的一行,未完成的尾行\n // 保持不动;配合 renderStreaming(breaks:true) 实现「一行显示一行」。\n // 不是打字机模式(不逐字)、也不是一次性整段渲染(不会一出就是全文)。\n\n\n answerBuffer = '';\n finalContent = '';\n streamDone = false;\n _this13._typeTimer = setInterval(function () {\n if (!isCurrentStream()) return;\n var msg = _this13.messages[msgIdx];\n var source = finalContent || answerBuffer;\n var curLen = msg._prevReveal || 0;\n var nextLen = curLen; // 找到「当前已揭示进度之后」的第一条完整换行,仅推进这一行\n\n var nl = source.indexOf('\\n', curLen);\n\n if (nl !== -1) {\n nextLen = nl + 1;\n } else if (streamDone) {\n // 流结束且没有更多换行:最后一段未以换行结尾的内容一次性露出(此时即完整一行)\n nextLen = source.length;\n }\n\n if (nextLen > curLen) {\n msg._prevReveal = nextLen;\n msg.content = source.substring(0, nextLen);\n\n _this13.$nextTick(function () {\n return _this13.scrollToBottom();\n });\n } // 流结束且所有内容都已逐行露出 → 收尾\n\n\n if (streamDone && nextLen >= source.length) {\n _this13.finishStream();\n }\n }, 30);\n url = (0, _kbChat.createKbStreamUrl)(_this13.activeSessionId, text);\n _this13.eventSource = new EventSource(url);\n\n _this13.eventSource.addEventListener('tool_result', function (e) {\n if (!isCurrentStream() || streamDone) return;\n\n if (e.data && _this13.messages[msgIdx]) {\n if (!_this13.messages[msgIdx].toolCalls) _this13.messages[msgIdx].toolCalls = [];\n\n _this13.messages[msgIdx].toolCalls.push(e.data);\n\n _this13.$nextTick(function () {\n return _this13.scrollToBottom();\n });\n }\n });\n\n _this13.eventSource.addEventListener('answer', function (e) {\n if (!isCurrentStream() || streamDone) return;\n answerBuffer += e.data;\n });\n\n _this13.eventSource.addEventListener('agent_result', function (e) {\n if (!isCurrentStream() || streamDone) return; // 与档案君(AiChat.vue)对齐:AGENT_RESULT 为最终真相源。\n // 只记录 finalContent 并结束流,不打断已在逐行推进的 content,交给 typeTimer 以 target 推进/校正。\n\n if (e.data) finalContent = e.data;\n streamDone = true;\n\n _this13.closeEventSource();\n });\n\n _this13.eventSource.addEventListener('msgKey', function (e) {\n if (!isCurrentStream()) return;\n\n if (e.data && _this13.messages[msgIdx]) {\n _this13.messages[msgIdx].msgKey = e.data;\n }\n });\n\n _this13.eventSource.addEventListener('reasoning', function (e) {\n if (!isCurrentStream() || streamDone) return;\n streamMsg.thinking += e.data;\n\n _this13.$nextTick(function () {\n return _this13.scrollToBottom();\n });\n });\n\n _this13.eventSource.addEventListener('reasoning_result', function (e) {\n if (!isCurrentStream() || streamDone) return;\n streamMsg.thinking = e.data;\n\n _this13.$nextTick(function () {\n return _this13.scrollToBottom();\n });\n });\n\n _this13.eventSource.addEventListener('error', function () {\n if (!isCurrentStream() || streamDone) return;\n if (!answerBuffer) answerBuffer = '❌ 连接中断';\n streamDone = true;\n\n _this13.closeEventSource();\n });\n\n case 28:\n case \"end\":\n return _context10.stop();\n }\n }\n }, _callee10);\n }))();\n },\n handleStop: function handleStop() {\n this.streamRequestId++;\n\n if (this.activeSessionId) {\n (0, _kbChat.stopKbStream)(this.activeSessionId).catch(function () {});\n }\n\n this.finishStream();\n },\n finishStream: function finishStream() {\n var _this14 = this;\n\n this.clearTypeTimer();\n\n if (this.streamMsg) {\n this.$delete(this.contentCache, this.streamMsg._key);\n this.streamMsg.loading = false;\n this.streamMsg = null;\n }\n\n this.closeEventSource();\n this.streaming = false;\n this.refreshSessionList();\n this.$nextTick(function () {\n return _this14.scrollToBottom();\n });\n },\n\n /** 流式结束后刷新会话列表(更新标题/最后消息) */\n refreshSessionList: function refreshSessionList() {\n var _this15 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee11() {\n var list;\n return regeneratorRuntime.wrap(function _callee11$(_context11) {\n while (1) {\n switch (_context11.prev = _context11.next) {\n case 0:\n if (_this15.companyId) {\n _context11.next = 2;\n break;\n }\n\n return _context11.abrupt(\"return\");\n\n case 2:\n _context11.prev = 2;\n _context11.next = 5;\n return (0, _kbChat.getKbSessionList)(_this15.companyId);\n\n case 5:\n _context11.t0 = _context11.sent;\n\n if (_context11.t0) {\n _context11.next = 8;\n break;\n }\n\n _context11.t0 = [];\n\n case 8:\n list = _context11.t0;\n _this15.sessionList = list;\n _context11.next = 15;\n break;\n\n case 12:\n _context11.prev = 12;\n _context11.t1 = _context11[\"catch\"](2);\n console.error('刷新会话列表失败', _context11.t1);\n\n case 15:\n case \"end\":\n return _context11.stop();\n }\n }\n }, _callee11, null, [[2, 12]]);\n }))();\n },\n clearTypeTimer: function clearTypeTimer() {\n if (this._typeTimer) {\n clearInterval(this._typeTimer);\n this._typeTimer = null;\n }\n },\n closeEventSource: function closeEventSource() {\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n },\n copyText: function copyText(text) {\n if (navigator.clipboard) {\n navigator.clipboard.writeText(text);\n }\n },\n scrollToBottom: function scrollToBottom() {\n var el = this.$refs.messagesRef;\n\n if (el) {\n el.scrollTop = el.scrollHeight;\n }\n }\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/KbChatMain.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1004
1004
|
|
|
1005
1005
|
/***/ }),
|
|
1006
1006
|
|
|
@@ -1012,7 +1012,19 @@ eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@b
|
|
|
1012
1012
|
/***/ (function(module, exports, __webpack_require__) {
|
|
1013
1013
|
|
|
1014
1014
|
"use strict";
|
|
1015
|
-
eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _CategoryManager = _interopRequireDefault(__webpack_require__(/*! ./CategoryManager */ \"./src/lib/knowledgeBase/CategoryManager.vue\"));\n\nvar _DocumentList = _interopRequireDefault(__webpack_require__(/*! ./DocumentList */ \"./src/lib/knowledgeBase/DocumentList.vue\"));\n\nvar _KbChatMain = _interopRequireDefault(__webpack_require__(/*! ./KbChatMain */ \"./src/lib/knowledgeBase/KbChatMain.vue\"));\n\nvar _knowledgeBase = __webpack_require__(/*! ./api/knowledgeBase */ \"./src/lib/knowledgeBase/api/knowledgeBase.js\");\n\nvar _request = __webpack_require__(/*! @lib/utils/request.js */ \"./src/lib/utils/request.js\");\n\nvar _guideHelper = __webpack_require__(/*! @lib/utils/guideHelper.js */ \"./src/lib/utils/guideHelper.js\");\n\nvar _guideConfig = __webpack_require__(/*! @lib/components/guide/guideConfig.js */ \"./src/lib/components/guide/guideConfig.js\");\n\nvar _NewFeatureGuide = _interopRequireDefault(__webpack_require__(/*! @lib/components/guide/NewFeatureGuide.vue */ \"./src/lib/components/guide/NewFeatureGuide.vue\"));\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nvar _default = {\n name: 'ZjKnowledgeBase',\n components: {\n CategoryManager: _CategoryManager.default,\n DocumentList: _DocumentList.default,\n KbChatMain: _KbChatMain.default,\n NewFeatureGuide: _NewFeatureGuide.default\n },\n props: {\n title: {\n type: String,\n default: '知识库'\n },\n Ak: {\n type: String,\n default: ''\n },\n Sk: {\n type: String,\n default: ''\n },\n imAccount: {\n type: [String, Object],\n default: ''\n },\n // 用户名:无头像时用于渲染文字头像(与 zjkjAvatar 一致)\n userName: {\n type: String,\n default: ''\n },\n companyNo: {\n type: String,\n default: ''\n },\n chatImToken: {\n type: String,\n default: ''\n },\n userno: {\n type: String,\n default: ''\n },\n // 公司知识库固定公司ID(公司编号)。不传时自动使用第一家公司的ID\n companyId: {\n type: String,\n default: ''\n },\n\n /**\r\n * 是否有知识库管理权限\r\n * true → 显示知识库管理界面(文件夹树 + 文件列表 + 增删改查)\r\n * false → 显示知识库 AI 聊天界面(仅对话查询,不可管理文档)\r\n */\n hasPermission: {\n type: Boolean,\n default: true\n }\n },\n data: function data() {\n return {\n viewMode: 'manage',\n // 'manage' | 'chat'\n currentCategory: null,\n categoryList: [],\n currentCompanyId: this.companyId || this.companyNo || '',\n // 新手引导状态\n showGuide: false,\n guideSteps: [],\n isGuideFirstStep: true,\n isGuideLastStep: false\n };\n },\n watch: {\n companyId: function companyId(val) {\n if (val) {\n this.currentCompanyId = val;\n this.refreshAuth();\n }\n },\n companyNo: function companyNo(val) {\n if (val) {\n this.currentCompanyId = val;\n }\n\n this.refreshAuth();\n },\n userno: function userno() {\n this.refreshAuth();\n }\n },\n created: function created() {\n this.refreshAuth();\n\n if (!this.currentCompanyId) {\n this.loadCompanies();\n }\n },\n mounted: function mounted() {\n this.initGuide();\n },\n methods: {\n refreshAuth: function refreshAuth() {\n if (this.Ak || this.Sk) {\n (0, _request.setKbAuth)(this.Ak, this.Sk, this.userno, this.currentCompanyId || this.companyNo, this.chatImToken, this.userno);\n }\n },\n loadCompanies: function loadCompanies() {\n var _this = this;\n\n (0, _knowledgeBase.getCompanyList)().then(function (list) {\n var companies = list || [];\n\n if (companies.length > 0 && !_this.currentCompanyId) {\n _this.currentCompanyId = companies[0];\n }\n }).catch(function () {});\n },\n handleCategorySelect: function handleCategorySelect(category) {\n this.currentCategory = category;\n },\n setCategoryList: function setCategoryList(list) {\n this.categoryList = list;\n },\n // 批量移动成功:左侧树定位并高亮到目标文件夹\n handleMoveTarget: function handleMoveTarget(folder) {\n if (folder && folder.id) {\n this.currentCategory = folder;\n\n if (this.$refs.categoryRef) {\n this.$refs.categoryRef.setCurrentFolder(folder);\n }\n }\n },\n handleRefresh: function handleRefresh() {\n if (!this.currentCompanyId) {\n this.loadCompanies();\n return;\n }\n\n if (this.$refs.categoryRef) {\n this.$refs.categoryRef.loadList();\n }\n\n if (this.$refs.docListRef) {\n this.$refs.docListRef.loadList();\n }\n },\n\n /**\r\n * 新手引导:仅首次进入知识库管理页展示(无管理权限时页面只有 AI 聊天,不引导)\r\n * 展示状态持久化在 guideHelper 的 ZJKJ_KB_MANAGE_GUIDE,二次进入不再展示\r\n */\n initGuide: function initGuide() {\n var _this2 = this;\n\n if (!this.hasPermission) return;\n if (!(0, _guideHelper.shouldShowKbManageGuide)()) return
|
|
1015
|
+
eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _CategoryManager = _interopRequireDefault(__webpack_require__(/*! ./CategoryManager */ \"./src/lib/knowledgeBase/CategoryManager.vue\"));\n\nvar _DocumentList = _interopRequireDefault(__webpack_require__(/*! ./DocumentList */ \"./src/lib/knowledgeBase/DocumentList.vue\"));\n\nvar _KbChatMain = _interopRequireDefault(__webpack_require__(/*! ./KbChatMain */ \"./src/lib/knowledgeBase/KbChatMain.vue\"));\n\nvar _native = __webpack_require__(/*! ./native.js */ \"./src/lib/knowledgeBase/native.js\");\n\nvar _knowledgeBase = __webpack_require__(/*! ./api/knowledgeBase */ \"./src/lib/knowledgeBase/api/knowledgeBase.js\");\n\nvar _request = __webpack_require__(/*! @lib/utils/request.js */ \"./src/lib/utils/request.js\");\n\nvar _guideHelper = __webpack_require__(/*! @lib/utils/guideHelper.js */ \"./src/lib/utils/guideHelper.js\");\n\nvar _guideConfig = __webpack_require__(/*! @lib/components/guide/guideConfig.js */ \"./src/lib/components/guide/guideConfig.js\");\n\nvar _NewFeatureGuide = _interopRequireDefault(__webpack_require__(/*! @lib/components/guide/NewFeatureGuide.vue */ \"./src/lib/components/guide/NewFeatureGuide.vue\"));\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nvar _default = {\n name: 'ZjKnowledgeBase',\n components: {\n CategoryManager: _CategoryManager.default,\n DocumentList: _DocumentList.default,\n KbChatMain: _KbChatMain.default,\n NewFeatureGuide: _NewFeatureGuide.default\n },\n props: {\n title: {\n type: String,\n default: '知识库'\n },\n Ak: {\n type: String,\n default: ''\n },\n Sk: {\n type: String,\n default: ''\n },\n imAccount: {\n type: [String, Object],\n default: ''\n },\n // 用户名:无头像时用于渲染文字头像(与 zjkjAvatar 一致)\n userName: {\n type: String,\n default: ''\n },\n companyNo: {\n type: String,\n default: ''\n },\n chatImToken: {\n type: String,\n default: ''\n },\n userno: {\n type: String,\n default: ''\n },\n // 公司知识库固定公司ID(公司编号)。不传时自动使用第一家公司的ID\n companyId: {\n type: String,\n default: ''\n },\n\n /**\r\n * 是否有知识库管理权限\r\n * true → 显示知识库管理界面(文件夹树 + 文件列表 + 增删改查)\r\n * false → 显示知识库 AI 聊天界面(仅对话查询,不可管理文档)\r\n */\n hasPermission: {\n type: Boolean,\n default: true\n }\n },\n data: function data() {\n // 首帧前计算是否移动端,避免 H5 先显示 PC 布局再切换的闪烁(与 AI 助理一致)\n // 宿主没有 Element UI 时(H5/平板横屏)一律走自绘 UI 分支,避免 el-* 未知元素报错\n var _isMobile = typeof window !== 'undefined' && (window.innerWidth <= 768 || !(0, _native.hasElementUI)(this));\n\n return {\n viewMode: 'manage',\n // 'manage' | 'chat'\n currentCategory: null,\n categoryList: [],\n currentCompanyId: this.companyId || this.companyNo || '',\n // 移动端:管理页内「目录 ⇄ 文档列表」导航\n isMobile: _isMobile,\n manageView: 'categories',\n // 'categories' | 'docs'(仅移动端管理用)\n // 新手引导状态\n showGuide: false,\n guideSteps: [],\n isGuideFirstStep: true,\n isGuideLastStep: false\n };\n },\n watch: {\n companyId: function companyId(val) {\n if (val) {\n this.currentCompanyId = val;\n this.refreshAuth();\n }\n },\n companyNo: function companyNo(val) {\n if (val) {\n this.currentCompanyId = val;\n }\n\n this.refreshAuth();\n },\n userno: function userno() {\n this.refreshAuth();\n }\n },\n created: function created() {\n this.refreshAuth();\n\n if (!this.currentCompanyId) {\n this.loadCompanies();\n }\n },\n mounted: function mounted() {\n this.initGuide();\n this._onResize = this.handleResize;\n window.addEventListener('resize', this._onResize, {\n passive: true\n });\n },\n beforeDestroy: function beforeDestroy() {\n if (this._onResize) {\n window.removeEventListener('resize', this._onResize);\n }\n },\n methods: {\n /**\r\n * 窗口宽度变化切换移动端状态(与 AI 助理一致)\r\n */\n handleResize: function handleResize() {\n var now = typeof window !== 'undefined' && (window.innerWidth <= 768 || !(0, _native.hasElementUI)(this));\n\n if (now !== this.isMobile) {\n this.isMobile = now;\n }\n },\n\n /**\r\n * 移动端:点击某个目录/「显示全部文件」进入文档列表页\r\n */\n handleMobileGoDocs: function handleMobileGoDocs() {\n if (!this.isMobile) return;\n this.manageView = 'docs';\n },\n\n /**\r\n * 移动端:文档列表返回目录列表\r\n */\n mobileManageBack: function mobileManageBack() {\n if (this.manageView === 'docs') {\n this.manageView = 'categories';\n }\n },\n refreshAuth: function refreshAuth() {\n if (this.Ak || this.Sk) {\n (0, _request.setKbAuth)(this.Ak, this.Sk, this.userno, this.currentCompanyId || this.companyNo, this.chatImToken, this.userno);\n }\n },\n loadCompanies: function loadCompanies() {\n var _this = this;\n\n (0, _knowledgeBase.getCompanyList)().then(function (list) {\n var companies = list || [];\n\n if (companies.length > 0 && !_this.currentCompanyId) {\n _this.currentCompanyId = companies[0];\n }\n }).catch(function () {});\n },\n handleCategorySelect: function handleCategorySelect(category) {\n this.currentCategory = category;\n },\n setCategoryList: function setCategoryList(list) {\n this.categoryList = list;\n },\n // 批量移动成功:左侧树定位并高亮到目标文件夹\n handleMoveTarget: function handleMoveTarget(folder) {\n if (folder && folder.id) {\n this.currentCategory = folder;\n\n if (this.$refs.categoryRef) {\n this.$refs.categoryRef.setCurrentFolder(folder);\n }\n }\n },\n handleRefresh: function handleRefresh() {\n if (!this.currentCompanyId) {\n this.loadCompanies();\n return;\n }\n\n if (this.$refs.categoryRef) {\n this.$refs.categoryRef.loadList();\n }\n\n if (this.$refs.docListRef) {\n this.$refs.docListRef.loadList();\n }\n },\n\n /**\r\n * 新手引导:仅首次进入知识库管理页展示(无管理权限时页面只有 AI 聊天,不引导)\r\n * 展示状态持久化在 guideHelper 的 ZJKJ_KB_MANAGE_GUIDE,二次进入不再展示\r\n */\n initGuide: function initGuide() {\n var _this2 = this;\n\n if (!this.hasPermission) return;\n if (!(0, _guideHelper.shouldShowKbManageGuide)()) return; // 移动端为自绘 UI(MobileDialog + .kbm-*)且「目录/文档」分两页,步骤与选择器单独配置\n\n this.guideSteps = this.isMobile ? (0, _guideConfig.generateKbManageGuideStepsMobile)() : (0, _guideConfig.generateKbManageGuideSteps)();\n if (!this.guideSteps.length) return; // 等页面渲染稳定后再展示,避免引导定位到未布局完成的目标元素\n\n setTimeout(function () {\n _this2.showGuide = true; // 展示即视为已引导过,保证\"首次进入展示、二次进入不再展示\"\n\n (0, _guideHelper.markKbManageGuideCompleted)();\n }, 600);\n },\n onGuideSkip: function onGuideSkip() {\n this.showGuide = false;\n },\n onGuideComplete: function onGuideComplete() {\n this.showGuide = false;\n },\n handleGuideClosed: function handleGuideClosed() {\n this.showGuide = false;\n }\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/KnowledgeBaseMain.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1016
|
+
|
|
1017
|
+
/***/ }),
|
|
1018
|
+
|
|
1019
|
+
/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/lib/knowledgeBase/MobileDialog.vue?vue&type=script&lang=js&":
|
|
1020
|
+
/*!****************************************************************************************************************************************************************************************************************************************************************!*\
|
|
1021
|
+
!*** ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/lib/knowledgeBase/MobileDialog.vue?vue&type=script&lang=js& ***!
|
|
1022
|
+
\****************************************************************************************************************************************************************************************************************************************************************/
|
|
1023
|
+
/*! no static exports found */
|
|
1024
|
+
/***/ (function(module, exports, __webpack_require__) {
|
|
1025
|
+
|
|
1026
|
+
"use strict";
|
|
1027
|
+
eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/**\n * 知识库 H5 自绘弹框(无 Element UI 依赖)\n * 仅移动端分支使用;PC 端仍使用 el-dialog,互不影响\n */\nvar _default = {\n name: 'KbMobileDialog',\n props: {\n visible: {\n type: Boolean,\n default: false\n },\n title: {\n type: String,\n default: ''\n },\n // true:全屏弹框(预览/大表单);false:底部滑出面板(小表单)\n fullscreen: {\n type: Boolean,\n default: false\n },\n // 点击遮罩是否关闭(表单类默认关闭该行为,防误触)\n closeOnClickModal: {\n type: Boolean,\n default: false\n }\n },\n methods: {\n close: function close() {\n this.$emit('update:visible', false);\n this.$emit('closed');\n },\n handleMaskClick: function handleMaskClick() {\n if (this.closeOnClickModal) this.close();\n }\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/MobileDialog.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1016
1028
|
|
|
1017
1029
|
/***/ }),
|
|
1018
1030
|
|
|
@@ -1120,7 +1132,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
|
|
|
1120
1132
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
1121
1133
|
|
|
1122
1134
|
"use strict";
|
|
1123
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"kb-category-manager\" },\n [\n _c(\"div\", { staticClass: \"category-header\" }, [\n _c(\"span\", { staticClass: \"category-title\" }, [_vm._v(\"知识库\")]),\n _c(\"div\", { staticClass: \"category-L-button\" }, [\n _c(\n \"button\",\n {\n staticClass: \"add-folder-btn\",\n attrs: { disabled: !_vm.companyId, title: \"新建目录\" },\n on: {\n click: function($event) {\n return _vm.handleAdd(null)\n }\n }\n },\n [_c(\"i\", { staticClass: \"el-icon-circle-plus-outline\" })]\n ),\n _c(\n \"button\",\n {\n staticClass: \"suggest-btn\",\n attrs: { disabled: !_vm.companyId, title: \"设置\" },\n on: { click: _vm.openSuggestedDialog }\n },\n [_c(\"i\", { staticClass: \"el-icon-setting\" })]\n )\n ])\n ]),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"loading\",\n rawName: \"v-loading\",\n value: _vm.loading,\n expression: \"loading\"\n }\n ],\n staticClass: \"category-list\"\n },\n [\n _c(\"el-tree\", {\n ref: \"treeRef\",\n attrs: {\n data: _vm.treeData,\n props: _vm.treeProps,\n \"node-key\": \"id\",\n \"highlight-current\": \"\",\n \"expand-on-click-node\": false,\n \"default-expand-all\": \"\",\n indent: 12\n },\n on: { \"node-click\": _vm.handleSelect },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(ref) {\n var data = ref.data\n return _c(\"span\", { staticClass: \"tree-node\" }, [\n _c(\n \"span\",\n {\n staticClass: \"tree-label\",\n attrs: { title: data.name }\n },\n [\n _c(\"i\", {\n staticClass: \"tree-icon\",\n class:\n data.parentId === 0\n ? \"el-icon-folder-opened\"\n : \"el-icon-folder\"\n }),\n _vm._v(\" \" + _vm._s(data.name) + \" \")\n ]\n ),\n _c(\n \"span\",\n {\n staticClass: \"tree-actions\",\n on: {\n click: function($event) {\n $event.stopPropagation()\n }\n }\n },\n [\n _c(\"el-button\", {\n attrs: {\n size: \"mini\",\n type: \"text\",\n icon: \"el-icon-plus\",\n title: \"新增子文件夹\"\n },\n on: {\n click: function($event) {\n return _vm.handleAdd(data)\n }\n }\n }),\n _c(\"el-button\", {\n attrs: {\n size: \"mini\",\n type: \"text\",\n icon: \"el-icon-edit\",\n title: \"重命名\"\n },\n on: {\n click: function($event) {\n return _vm.handleEdit(data)\n }\n }\n }),\n _c(\"el-button\", {\n staticStyle: { color: \"#f56c6c\" },\n attrs: {\n size: \"mini\",\n type: \"text\",\n icon: \"el-icon-delete\",\n title: \"删除\"\n },\n on: {\n click: function($event) {\n return _vm.handleDelete(data)\n }\n }\n })\n ],\n 1\n )\n ])\n }\n }\n ])\n }),\n !_vm.loading && !_vm.companyId\n ? _c(\"div\", { staticClass: \"category-empty\" }, [\n _vm._v(\"暂无公司数据\")\n ])\n : !_vm.loading && _vm.treeData.length === 0\n ? _c(\"div\", { staticClass: \"category-empty\" }, [\n _vm._v(\"暂无文件夹\")\n ])\n : _vm._e()\n ],\n 1\n ),\n _c(\n \"el-button\",\n {\n staticClass: \"show-all-btn\",\n attrs: { type: \"text\", size: \"small\", disabled: !_vm.companyId },\n on: { click: _vm.handleSelectAll }\n },\n [_vm._v(\" 显示全部文件 \")]\n ),\n _c(\n \"el-dialog\",\n {\n attrs: {\n title: _vm.dialogType === \"add\" ? \"新增文件夹\" : \"重命名文件夹\",\n visible: _vm.dialogVisible,\n width: \"420px\",\n \"custom-class\": \"kb-folder-dialog\",\n \"close-on-click-modal\": false\n },\n on: {\n \"update:visible\": function($event) {\n _vm.dialogVisible = $event\n }\n }\n },\n [\n _c(\n \"el-form\",\n {\n ref: \"folderForm\",\n attrs: {\n model: _vm.formData,\n rules: _vm.formRules,\n \"label-width\": \"80px\"\n }\n },\n [\n _vm.dialogType === \"add\"\n ? _c(\n \"el-form-item\",\n { attrs: { label: \"上级目录\" } },\n [\n _c(\n \"el-select\",\n {\n staticStyle: { width: \"100%\" },\n attrs: {\n placeholder: \"选择上级目录(默认根目录)\",\n clearable: \"\"\n },\n model: {\n value: _vm.formData.parentId,\n callback: function($$v) {\n _vm.$set(_vm.formData, \"parentId\", $$v)\n },\n expression: \"formData.parentId\"\n }\n },\n [\n _c(\"el-option\", {\n attrs: { label: \"根目录\", value: 0 }\n }),\n _vm._l(_vm.availableParents, function(f) {\n return _c(\"el-option\", {\n key: f.id,\n attrs: { label: f.name, value: f.id }\n })\n })\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e(),\n _c(\n \"el-form-item\",\n { attrs: { label: \"名称\", prop: \"name\" } },\n [\n _c(\"el-input\", {\n staticClass: \"kb-folder-name-input\",\n attrs: { placeholder: \"请输入文件夹名称\", maxlength: \"50\" },\n model: {\n value: _vm.formData.name,\n callback: function($$v) {\n _vm.$set(_vm.formData, \"name\", $$v)\n },\n expression: \"formData.name\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: \"排序\", prop: \"sortOrder\" } },\n [\n _c(\"el-input-number\", {\n attrs: { min: 0, max: 9999 },\n model: {\n value: _vm.formData.sortOrder,\n callback: function($$v) {\n _vm.$set(_vm.formData, \"sortOrder\", $$v)\n },\n expression: \"formData.sortOrder\"\n }\n })\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"span\",\n { attrs: { slot: \"footer\" }, slot: \"footer\" },\n [\n _c(\n \"el-button\",\n {\n on: {\n click: function($event) {\n _vm.dialogVisible = false\n }\n }\n },\n [_vm._v(\"取消\")]\n ),\n _c(\n \"el-button\",\n {\n staticClass: \"kb-folder-submit\",\n attrs: { type: \"primary\", loading: _vm.submitting },\n on: { click: _vm.handleSubmit }\n },\n [_vm._v(\"确定\")]\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-dialog\",\n {\n attrs: {\n title: \"设置\",\n visible: _vm.suggestDialogVisible,\n width: \"480px\",\n \"custom-class\": \"kb-suggest-dialog\",\n \"close-on-click-modal\": false\n },\n on: {\n \"update:visible\": function($event) {\n _vm.suggestDialogVisible = $event\n }\n }\n },\n [\n _c(\n \"el-form\",\n {\n staticClass: \"suggest-form\",\n attrs: { \"label-width\": \"80px\" },\n nativeOn: {\n submit: function($event) {\n $event.preventDefault()\n }\n }\n },\n [\n _vm._l(_vm.suggestQuestions, function(q, index) {\n return _c(\n \"el-form-item\",\n {\n key: index,\n attrs: { label: index === 0 ? \"问题内容\" : \"\" }\n },\n [\n _c(\n \"div\",\n { staticClass: \"suggest-input-row\" },\n [\n _c(\"el-input\", {\n attrs: {\n placeholder: \"请输入要展示给用户的问题\",\n maxlength: \"200\"\n },\n model: {\n value: _vm.suggestQuestions[index],\n callback: function($$v) {\n _vm.$set(_vm.suggestQuestions, index, $$v)\n },\n expression: \"suggestQuestions[index]\"\n }\n }),\n _vm.suggestQuestions.length > 1\n ? _c(\"el-button\", {\n staticClass: \"suggest-input-remove\",\n attrs: { type: \"text\", icon: \"el-icon-close\" },\n on: {\n click: function($event) {\n return _vm.removeQuestionInput(index)\n }\n }\n })\n : _vm._e()\n ],\n 1\n )\n ]\n )\n }),\n _c(\"el-form-item\", [\n _c(\n \"div\",\n {\n staticClass: \"suggest-add-btn\",\n class: {\n disabled:\n _vm.suggestQuestions.length + _vm.suggestList.length >=\n 6\n },\n on: { click: _vm.onAddBtnClick }\n },\n [\n _c(\"i\", { staticClass: \"el-icon-plus\" }),\n _c(\"span\", [_vm._v(\"添加问题\")])\n ]\n )\n ])\n ],\n 2\n ),\n _c(\"div\", { staticClass: \"suggest-section-header\" }, [\n _c(\"span\", { staticClass: \"suggest-section-title\" }, [\n _vm._v(\"猜你想问\")\n ]),\n _c(\"span\", { staticClass: \"suggest-count\" }, [\n _vm._v(_vm._s(_vm.suggestList.length) + \"/6\")\n ])\n ]),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"loading\",\n rawName: \"v-loading\",\n value: _vm.suggestLoading,\n expression: \"suggestLoading\"\n }\n ],\n staticClass: \"suggest-list\"\n },\n [\n !_vm.suggestLoading && _vm.suggestList.length === 0\n ? _c(\"div\", { staticClass: \"suggest-empty\" }, [\n _c(\"i\", { staticClass: \"el-icon-chat-line-square\" }),\n _c(\"div\", [_vm._v(\"暂无问题,请在上方添加\")])\n ])\n : _vm._e(),\n _vm._l(_vm.suggestList, function(q, idx) {\n return _c(\n \"div\",\n { key: q.id, staticClass: \"suggest-item\" },\n [\n _c(\"span\", { staticClass: \"suggest-index\" }, [\n _vm._v(_vm._s(idx + 1))\n ]),\n _c(\"span\", { staticClass: \"suggest-text\" }, [\n _vm._v(_vm._s(q.questionText))\n ]),\n _c(\"el-button\", {\n staticClass: \"suggest-delete\",\n attrs: {\n size: \"mini\",\n type: \"text\",\n icon: \"el-icon-delete\"\n },\n on: {\n click: function($event) {\n return _vm.handleDeleteSuggested(q)\n }\n }\n })\n ],\n 1\n )\n })\n ],\n 2\n ),\n _c(\n \"span\",\n { attrs: { slot: \"footer\" }, slot: \"footer\" },\n [\n _c(\n \"el-button\",\n {\n on: {\n click: function($event) {\n _vm.suggestDialogVisible = false\n }\n }\n },\n [_vm._v(\"关闭\")]\n ),\n _c(\n \"el-button\",\n {\n attrs: { type: \"primary\", loading: _vm.suggestSubmitting },\n on: { click: _vm.handleSaveSuggested }\n },\n [_vm._v(\"保存\")]\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/CategoryManager.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%2268609640-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1135
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"kb-category-manager\" },\n [\n _c(\"div\", { staticClass: \"category-header\" }, [\n _c(\"span\", { staticClass: \"category-title\" }, [_vm._v(\"知识库\")]),\n _c(\"div\", { staticClass: \"category-L-button\" }, [\n _c(\n \"button\",\n {\n staticClass: \"add-folder-btn\",\n attrs: { disabled: !_vm.companyId, title: \"新建目录\" },\n on: {\n click: function($event) {\n return _vm.handleAdd(null)\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"18\",\n height: \"18\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M20 6h-8l-2-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm-1 8h-3v3h-2v-3h-3v-2h3V9h2v3h3v2z\"\n }\n })\n ]\n )\n ]\n ),\n _c(\n \"button\",\n {\n staticClass: \"suggest-btn\",\n attrs: { disabled: !_vm.companyId, title: \"设置\" },\n on: { click: _vm.openSuggestedDialog }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"18\",\n height: \"18\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58a.49.49 0 0 0 .12-.61l-1.92-3.32a.488.488 0 0 0-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54a.484.484 0 0 0-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58a.49.49 0 0 0-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z\"\n }\n })\n ]\n )\n ]\n )\n ])\n ]),\n !_vm.isMobile\n ? _c(\n \"div\",\n {\n directives: [\n {\n name: \"loading\",\n rawName: \"v-loading\",\n value: _vm.loading,\n expression: \"loading\"\n }\n ],\n staticClass: \"category-list\"\n },\n [\n _c(\"el-tree\", {\n ref: \"treeRef\",\n attrs: {\n data: _vm.treeData,\n props: _vm.treeProps,\n \"node-key\": \"id\",\n \"highlight-current\": \"\",\n \"expand-on-click-node\": false,\n \"default-expand-all\": \"\",\n indent: 12\n },\n on: { \"node-click\": _vm.handleSelect },\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var data = ref.data\n return _c(\"span\", { staticClass: \"tree-node\" }, [\n _c(\n \"span\",\n {\n staticClass: \"tree-label\",\n attrs: { title: data.name }\n },\n [\n _c(\"i\", {\n staticClass: \"tree-icon\",\n class:\n data.parentId === 0\n ? \"el-icon-folder-opened\"\n : \"el-icon-folder\"\n }),\n _vm._v(\" \" + _vm._s(data.name) + \" \")\n ]\n ),\n _c(\n \"span\",\n {\n staticClass: \"tree-actions\",\n on: {\n click: function($event) {\n $event.stopPropagation()\n }\n }\n },\n [\n _c(\"el-button\", {\n attrs: {\n size: \"mini\",\n type: \"text\",\n icon: \"el-icon-plus\",\n title: \"新增子文件夹\"\n },\n on: {\n click: function($event) {\n return _vm.handleAdd(data)\n }\n }\n }),\n _c(\"el-button\", {\n attrs: {\n size: \"mini\",\n type: \"text\",\n icon: \"el-icon-edit\",\n title: \"重命名\"\n },\n on: {\n click: function($event) {\n return _vm.handleEdit(data)\n }\n }\n }),\n _c(\"el-button\", {\n staticStyle: { color: \"#f56c6c\" },\n attrs: {\n size: \"mini\",\n type: \"text\",\n icon: \"el-icon-delete\",\n title: \"删除\"\n },\n on: {\n click: function($event) {\n return _vm.handleDelete(data)\n }\n }\n })\n ],\n 1\n )\n ])\n }\n }\n ],\n null,\n false,\n 5867912\n )\n }),\n !_vm.loading && !_vm.companyId\n ? _c(\"div\", { staticClass: \"category-empty\" }, [\n _vm._v(\"暂无公司数据\")\n ])\n : !_vm.loading && _vm.treeData.length === 0\n ? _c(\"div\", { staticClass: \"category-empty\" }, [\n _vm._v(\"暂无文件夹\")\n ])\n : _vm._e()\n ],\n 1\n )\n : _c(\n \"div\",\n {\n directives: [\n {\n name: \"loading\",\n rawName: \"v-loading\",\n value: _vm.loading,\n expression: \"loading\"\n }\n ],\n staticClass: \"category-list kb-m-category-list\"\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"kb-m-folder-row kb-m-folder-all\",\n class: { active: _vm.isAllSelected },\n on: { click: _vm.handleSelectRoot }\n },\n [\n _c(\"i\", {\n staticClass: \"el-icon-folder-opened kb-m-folder-icon\"\n }),\n _c(\"span\", { staticClass: \"kb-m-folder-name\" }, [\n _vm._v(\"全部文件\")\n ]),\n _c(\"span\", { staticClass: \"kb-m-folder-arrow\" }, [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d: \"M8.59 16.59 13.17 12 8.59 7.41 10 6l6 6-6 6z\"\n }\n })\n ]\n )\n ])\n ]\n ),\n _vm._l(_vm.mobileFolderRows, function(row) {\n return _c(\n \"div\",\n {\n key: \"row-\" + row.node.id,\n staticClass: \"kb-m-folder-row\",\n class: { active: row.node.id === _vm.selectedFolderId },\n style: { paddingLeft: 12 + row.depth * 16 + \"px\" },\n on: {\n click: function($event) {\n return _vm.handleSelectFolder(row.node)\n }\n }\n },\n [\n _c(\"i\", { staticClass: \"el-icon-folder kb-m-folder-icon\" }),\n _c(\"span\", { staticClass: \"kb-m-folder-name\" }, [\n _vm._v(_vm._s(row.node.name))\n ]),\n _c(\n \"span\",\n {\n staticClass: \"kb-m-folder-more\",\n attrs: { title: \"更多操作\" },\n on: {\n click: function($event) {\n $event.stopPropagation()\n return _vm.openMobileAction(row.node)\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"18\",\n height: \"18\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"\n }\n })\n ]\n )\n ]\n )\n ]\n )\n }),\n !_vm.loading && !_vm.companyId\n ? _c(\"div\", { staticClass: \"category-empty\" }, [\n _vm._v(\"暂无公司数据\")\n ])\n : !_vm.loading && _vm.mobileFolderRows.length === 0\n ? _c(\"div\", { staticClass: \"category-empty\" }, [\n _vm._v(\"暂无文件夹\")\n ])\n : _vm._e()\n ],\n 2\n ),\n !_vm.isMobile\n ? _c(\n \"el-button\",\n {\n staticClass: \"show-all-btn\",\n attrs: { type: \"text\", size: \"small\", disabled: !_vm.companyId },\n on: { click: _vm.handleSelectAll }\n },\n [_vm._v(\" 显示全部文件 \")]\n )\n : _vm._e(),\n !_vm.isMobile\n ? _c(\n \"el-dialog\",\n {\n attrs: {\n title: _vm.dialogType === \"add\" ? \"新增文件夹\" : \"重命名文件夹\",\n visible: _vm.dialogVisible,\n width: \"420px\",\n \"custom-class\": \"kb-folder-dialog\",\n \"close-on-click-modal\": false\n },\n on: {\n \"update:visible\": function($event) {\n _vm.dialogVisible = $event\n }\n }\n },\n [\n _c(\n \"el-form\",\n {\n ref: \"folderForm\",\n attrs: {\n model: _vm.formData,\n rules: _vm.formRules,\n \"label-width\": \"80px\"\n }\n },\n [\n _vm.dialogType === \"add\"\n ? _c(\n \"el-form-item\",\n { attrs: { label: \"上级目录\" } },\n [\n _c(\n \"el-select\",\n {\n staticStyle: { width: \"100%\" },\n attrs: {\n placeholder: \"选择上级目录(默认根目录)\",\n clearable: \"\"\n },\n model: {\n value: _vm.formData.parentId,\n callback: function($$v) {\n _vm.$set(_vm.formData, \"parentId\", $$v)\n },\n expression: \"formData.parentId\"\n }\n },\n [\n _c(\"el-option\", {\n attrs: { label: \"根目录\", value: 0 }\n }),\n _vm._l(_vm.availableParents, function(f) {\n return _c(\"el-option\", {\n key: f.id,\n attrs: { label: f.name, value: f.id }\n })\n })\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e(),\n _c(\n \"el-form-item\",\n { attrs: { label: \"名称\", prop: \"name\" } },\n [\n _c(\"el-input\", {\n staticClass: \"kb-folder-name-input\",\n attrs: {\n placeholder: \"请输入文件夹名称\",\n maxlength: \"50\"\n },\n model: {\n value: _vm.formData.name,\n callback: function($$v) {\n _vm.$set(_vm.formData, \"name\", $$v)\n },\n expression: \"formData.name\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: \"排序\", prop: \"sortOrder\" } },\n [\n _c(\"el-input-number\", {\n attrs: { min: 0, max: 9999 },\n model: {\n value: _vm.formData.sortOrder,\n callback: function($$v) {\n _vm.$set(_vm.formData, \"sortOrder\", $$v)\n },\n expression: \"formData.sortOrder\"\n }\n })\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"span\",\n { attrs: { slot: \"footer\" }, slot: \"footer\" },\n [\n _c(\n \"el-button\",\n {\n on: {\n click: function($event) {\n _vm.dialogVisible = false\n }\n }\n },\n [_vm._v(\"取消\")]\n ),\n _c(\n \"el-button\",\n {\n staticClass: \"kb-folder-submit\",\n attrs: { type: \"primary\", loading: _vm.submitting },\n on: { click: _vm.handleSubmit }\n },\n [_vm._v(\"确定\")]\n )\n ],\n 1\n )\n ],\n 1\n )\n : _vm._e(),\n _vm.isMobile\n ? _c(\n \"MobileDialog\",\n {\n attrs: {\n visible: _vm.dialogVisible,\n title: _vm.dialogType === \"add\" ? \"新增文件夹\" : \"重命名文件夹\"\n },\n on: {\n \"update:visible\": function($event) {\n _vm.dialogVisible = $event\n }\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"footer\",\n fn: function() {\n return [\n _c(\n \"button\",\n {\n staticClass: \"kbm-btn\",\n on: {\n click: function($event) {\n _vm.dialogVisible = false\n }\n }\n },\n [_vm._v(\"取消\")]\n ),\n _c(\n \"button\",\n {\n staticClass: \"kbm-btn primary\",\n attrs: { disabled: _vm.submitting },\n on: { click: _vm.handleSubmit }\n },\n [\n _vm._v(\n _vm._s(_vm.submitting ? \"保存中...\" : \"确定\")\n )\n ]\n )\n ]\n },\n proxy: true\n }\n ],\n null,\n false,\n 3604911227\n )\n },\n [\n _vm.dialogType === \"add\"\n ? _c(\"div\", { staticClass: \"kbm-field\" }, [\n _c(\"label\", { staticClass: \"kbm-field-label\" }, [\n _vm._v(\"上级目录\")\n ]),\n _c(\n \"button\",\n {\n staticClass: \"kbm-input kbm-select\",\n attrs: { type: \"button\" },\n on: {\n click: function($event) {\n _vm.parentPickerVisible = true\n }\n }\n },\n [\n _c(\"span\", [\n _vm._v(\n _vm._s(_vm.selectedParentName || \"请选择上级目录\")\n )\n ]),\n _c(\n \"svg\",\n {\n staticClass: \"kbm-select-arrow\",\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M7.41 8.59 12 13.17l4.59-4.58L18 10l-6 6-6-6z\"\n }\n })\n ]\n )\n ]\n ),\n _vm.parentPickerVisible\n ? _c(\n \"div\",\n {\n staticClass: \"kbm-picker-mask\",\n on: {\n click: function($event) {\n _vm.parentPickerVisible = false\n }\n }\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"kbm-picker\",\n on: {\n click: function($event) {\n $event.stopPropagation()\n }\n }\n },\n [\n _c(\"div\", { staticClass: \"kbm-picker-title\" }, [\n _vm._v(\"选择上级目录\")\n ]),\n _c(\n \"div\",\n { staticClass: \"kbm-picker-list\" },\n [\n _c(\n \"div\",\n {\n staticClass: \"kbm-picker-row\",\n class: {\n active: !_vm.formData.parentId\n },\n staticStyle: { \"padding-left\": \"14px\" },\n on: {\n click: function($event) {\n return _vm.handleParentPick(null)\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M10 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z\"\n }\n })\n ]\n ),\n _c(\n \"span\",\n { staticClass: \"kbm-picker-name\" },\n [_vm._v(\"根目录\")]\n ),\n !_vm.formData.parentId\n ? _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\n }\n })\n ]\n )\n : _vm._e()\n ]\n ),\n _vm._l(_vm.availableParents, function(f) {\n return _c(\n \"div\",\n {\n key: f.id,\n staticClass: \"kbm-picker-row\",\n class: {\n active:\n _vm.formData.parentId === f.id\n },\n staticStyle: {\n \"padding-left\": \"14px\"\n },\n on: {\n click: function($event) {\n return _vm.handleParentPick(f)\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M10 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z\"\n }\n })\n ]\n ),\n _c(\n \"span\",\n { staticClass: \"kbm-picker-name\" },\n [_vm._v(_vm._s(f.name))]\n ),\n _vm.formData.parentId === f.id\n ? _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\n }\n })\n ]\n )\n : _vm._e()\n ]\n )\n })\n ],\n 2\n ),\n _c(\n \"div\",\n {\n staticClass: \"kbm-picker-cancel\",\n on: {\n click: function($event) {\n _vm.parentPickerVisible = false\n }\n }\n },\n [_vm._v(\"取消\")]\n )\n ]\n )\n ]\n )\n : _vm._e()\n ])\n : _vm._e(),\n _c(\"div\", { staticClass: \"kbm-field\" }, [\n _c(\"label\", { staticClass: \"kbm-field-label\" }, [\n _vm._v(\"名称\")\n ]),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.formData.name,\n expression: \"formData.name\"\n }\n ],\n staticClass: \"kbm-input\",\n attrs: { placeholder: \"请输入文件夹名称\", maxlength: \"50\" },\n domProps: { value: _vm.formData.name },\n on: {\n input: function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.$set(_vm.formData, \"name\", $event.target.value)\n }\n }\n })\n ]),\n _c(\"div\", { staticClass: \"kbm-field\" }, [\n _c(\"label\", { staticClass: \"kbm-field-label\" }, [\n _vm._v(\"排序\")\n ]),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.number\",\n value: _vm.formData.sortOrder,\n expression: \"formData.sortOrder\",\n modifiers: { number: true }\n }\n ],\n staticClass: \"kbm-input\",\n attrs: {\n type: \"number\",\n min: \"0\",\n max: \"9999\",\n placeholder: \"0\"\n },\n domProps: { value: _vm.formData.sortOrder },\n on: {\n input: function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.$set(\n _vm.formData,\n \"sortOrder\",\n _vm._n($event.target.value)\n )\n },\n blur: function($event) {\n return _vm.$forceUpdate()\n }\n }\n })\n ])\n ]\n )\n : _vm._e(),\n !_vm.isMobile\n ? _c(\n \"el-dialog\",\n {\n attrs: {\n title: \"设置\",\n visible: _vm.suggestDialogVisible,\n width: \"480px\",\n \"custom-class\": \"kb-suggest-dialog\",\n \"close-on-click-modal\": false\n },\n on: {\n \"update:visible\": function($event) {\n _vm.suggestDialogVisible = $event\n }\n }\n },\n [\n _c(\n \"el-form\",\n {\n staticClass: \"suggest-form\",\n attrs: { \"label-width\": \"80px\" },\n nativeOn: {\n submit: function($event) {\n $event.preventDefault()\n }\n }\n },\n [\n _vm._l(_vm.suggestQuestions, function(q, index) {\n return _c(\n \"el-form-item\",\n {\n key: index,\n attrs: { label: index === 0 ? \"问题内容\" : \"\" }\n },\n [\n _c(\n \"div\",\n { staticClass: \"suggest-input-row\" },\n [\n _c(\"el-input\", {\n attrs: {\n placeholder: \"请输入要展示给用户的问题\",\n maxlength: \"200\"\n },\n model: {\n value: _vm.suggestQuestions[index],\n callback: function($$v) {\n _vm.$set(_vm.suggestQuestions, index, $$v)\n },\n expression: \"suggestQuestions[index]\"\n }\n }),\n _vm.suggestQuestions.length > 1\n ? _c(\"el-button\", {\n staticClass: \"suggest-input-remove\",\n attrs: {\n type: \"text\",\n icon: \"el-icon-close\"\n },\n on: {\n click: function($event) {\n return _vm.removeQuestionInput(index)\n }\n }\n })\n : _vm._e()\n ],\n 1\n )\n ]\n )\n }),\n _c(\"el-form-item\", [\n _c(\n \"div\",\n {\n staticClass: \"suggest-add-btn\",\n class: {\n disabled:\n _vm.suggestQuestions.length +\n _vm.suggestList.length >=\n 6\n },\n on: { click: _vm.onAddBtnClick }\n },\n [\n _c(\"i\", { staticClass: \"el-icon-plus\" }),\n _c(\"span\", [_vm._v(\"添加问题\")])\n ]\n )\n ])\n ],\n 2\n ),\n _c(\"div\", { staticClass: \"suggest-section-header\" }, [\n _c(\"span\", { staticClass: \"suggest-section-title\" }, [\n _vm._v(\"猜你想问\")\n ]),\n _c(\"span\", { staticClass: \"suggest-count\" }, [\n _vm._v(_vm._s(_vm.suggestList.length) + \"/6\")\n ])\n ]),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"loading\",\n rawName: \"v-loading\",\n value: _vm.suggestLoading,\n expression: \"suggestLoading\"\n }\n ],\n staticClass: \"suggest-list\"\n },\n [\n !_vm.suggestLoading && _vm.suggestList.length === 0\n ? _c(\"div\", { staticClass: \"suggest-empty\" }, [\n _c(\"i\", { staticClass: \"el-icon-chat-line-square\" }),\n _c(\"div\", [_vm._v(\"暂无问题,请在上方添加\")])\n ])\n : _vm._e(),\n _vm._l(_vm.suggestList, function(q, idx) {\n return _c(\n \"div\",\n { key: q.id, staticClass: \"suggest-item\" },\n [\n _c(\"span\", { staticClass: \"suggest-index\" }, [\n _vm._v(_vm._s(idx + 1))\n ]),\n _c(\"span\", { staticClass: \"suggest-text\" }, [\n _vm._v(_vm._s(q.questionText))\n ]),\n _c(\"el-button\", {\n staticClass: \"suggest-delete\",\n attrs: {\n size: \"mini\",\n type: \"text\",\n icon: \"el-icon-delete\"\n },\n on: {\n click: function($event) {\n return _vm.handleDeleteSuggested(q)\n }\n }\n })\n ],\n 1\n )\n })\n ],\n 2\n ),\n _c(\n \"span\",\n { attrs: { slot: \"footer\" }, slot: \"footer\" },\n [\n _c(\n \"el-button\",\n {\n on: {\n click: function($event) {\n _vm.suggestDialogVisible = false\n }\n }\n },\n [_vm._v(\"关闭\")]\n ),\n _c(\n \"el-button\",\n {\n attrs: {\n type: \"primary\",\n loading: _vm.suggestSubmitting\n },\n on: { click: _vm.handleSaveSuggested }\n },\n [_vm._v(\"保存\")]\n )\n ],\n 1\n )\n ],\n 1\n )\n : _vm._e(),\n _vm.isMobile\n ? _c(\n \"MobileDialog\",\n {\n attrs: {\n visible: _vm.suggestDialogVisible,\n title: \"设置\",\n fullscreen: \"\"\n },\n on: {\n \"update:visible\": function($event) {\n _vm.suggestDialogVisible = $event\n }\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"footer\",\n fn: function() {\n return [\n _c(\n \"button\",\n {\n staticClass: \"kbm-btn\",\n on: {\n click: function($event) {\n _vm.suggestDialogVisible = false\n }\n }\n },\n [_vm._v(\"关闭\")]\n ),\n _c(\n \"button\",\n {\n staticClass: \"kbm-btn primary\",\n attrs: { disabled: _vm.suggestSubmitting },\n on: { click: _vm.handleSaveSuggested }\n },\n [\n _vm._v(\n _vm._s(\n _vm.suggestSubmitting ? \"保存中...\" : \"保存\"\n )\n )\n ]\n )\n ]\n },\n proxy: true\n }\n ],\n null,\n false,\n 137213598\n )\n },\n [\n _vm._l(_vm.suggestQuestions, function(q, index) {\n return _c(\n \"div\",\n { key: \"kbm-q-\" + index, staticClass: \"kbm-field\" },\n [\n _c(\"div\", { staticClass: \"kbm-field-row\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.suggestQuestions[index],\n expression: \"suggestQuestions[index]\"\n }\n ],\n staticClass: \"kbm-input\",\n attrs: {\n placeholder: \"请输入要展示给用户的问题\",\n maxlength: \"200\"\n },\n domProps: { value: _vm.suggestQuestions[index] },\n on: {\n input: function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.$set(\n _vm.suggestQuestions,\n index,\n $event.target.value\n )\n }\n }\n }),\n _vm.suggestQuestions.length > 1\n ? _c(\n \"button\",\n {\n staticClass: \"kbm-field-remove\",\n on: {\n click: function($event) {\n return _vm.removeQuestionInput(index)\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"14\",\n height: \"14\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\n }\n })\n ]\n )\n ]\n )\n : _vm._e()\n ])\n ]\n )\n }),\n _c(\n \"div\",\n {\n staticClass: \"suggest-add-btn\",\n class: {\n disabled:\n _vm.suggestQuestions.length + _vm.suggestList.length >= 6\n },\n on: { click: _vm.onAddBtnClick }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"14\",\n height: \"14\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: { d: \"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" }\n })\n ]\n ),\n _c(\"span\", [_vm._v(\"添加问题\")])\n ]\n ),\n _c(\"div\", { staticClass: \"suggest-section-header\" }, [\n _c(\"span\", { staticClass: \"suggest-section-title\" }, [\n _vm._v(\"猜你想问\")\n ]),\n _c(\"span\", { staticClass: \"suggest-count\" }, [\n _vm._v(_vm._s(_vm.suggestList.length) + \"/6\")\n ])\n ]),\n _c(\n \"div\",\n { staticClass: \"suggest-list\" },\n [\n _vm.suggestLoading\n ? _c(\"div\", { staticClass: \"kbm-loading\" }, [\n _vm._v(\"加载中...\")\n ])\n : _vm.suggestList.length === 0\n ? _c(\"div\", { staticClass: \"suggest-empty\" }, [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"36\",\n height: \"36\",\n fill: \"#c0c4cc\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z\"\n }\n })\n ]\n ),\n _c(\"div\", [_vm._v(\"暂无问题,请在上方添加\")])\n ])\n : _vm._e(),\n _vm._l(_vm.suggestList, function(q, idx) {\n return _c(\n \"div\",\n { key: q.id, staticClass: \"suggest-item\" },\n [\n _c(\"span\", { staticClass: \"suggest-index\" }, [\n _vm._v(_vm._s(idx + 1))\n ]),\n _c(\"span\", { staticClass: \"suggest-text\" }, [\n _vm._v(_vm._s(q.questionText))\n ]),\n _c(\n \"button\",\n {\n staticClass: \"suggest-delete\",\n on: {\n click: function($event) {\n return _vm.handleDeleteSuggested(q)\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"14\",\n height: \"14\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\"\n }\n })\n ]\n )\n ]\n )\n ]\n )\n })\n ],\n 2\n )\n ],\n 2\n )\n : _vm._e(),\n _c(\"transition\", { attrs: { name: \"kb-m-fade\" } }, [\n _vm.mobileActionVisible\n ? _c(\"div\", {\n staticClass: \"kb-m-mask\",\n on: { click: _vm.closeMobileAction }\n })\n : _vm._e()\n ]),\n _c(\"transition\", { attrs: { name: \"kb-m-slide\" } }, [\n _vm.mobileActionVisible\n ? _c(\"div\", { staticClass: \"kb-m-actionsheet\" }, [\n _c(\"div\", { staticClass: \"kb-m-actionsheet-title\" }, [\n _vm._v(\n _vm._s(_vm.mobileActionTarget && _vm.mobileActionTarget.name)\n )\n ]),\n _c(\n \"div\",\n {\n staticClass: \"kb-m-actionsheet-item\",\n on: { click: _vm.doMobileAdd }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11h-4v4h-2v-4H7v-2h4V7h2v4h4v2z\"\n }\n })\n ]\n ),\n _c(\"span\", [_vm._v(\"在该文件夹下新增子文件夹\")])\n ]\n ),\n _c(\n \"div\",\n {\n staticClass: \"kb-m-actionsheet-item\",\n on: { click: _vm.doMobileRename }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04a.996.996 0 0 0 0-1.41l-2.34-2.34a.996.996 0 0 0-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z\"\n }\n })\n ]\n ),\n _c(\"span\", [_vm._v(\"重命名\")])\n ]\n ),\n _c(\n \"div\",\n {\n staticClass: \"kb-m-actionsheet-item kb-m-actionsheet-danger\",\n on: { click: _vm.doMobileDelete }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\"\n }\n })\n ]\n ),\n _c(\"span\", [_vm._v(\"删除\")])\n ]\n ),\n _c(\n \"div\",\n {\n staticClass: \"kb-m-actionsheet-cancel\",\n on: { click: _vm.closeMobileAction }\n },\n [_vm._v(\"取消\")]\n )\n ])\n : _vm._e()\n ])\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/CategoryManager.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%2268609640-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1124
1136
|
|
|
1125
1137
|
/***/ }),
|
|
1126
1138
|
|
|
@@ -1132,7 +1144,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
|
|
|
1132
1144
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
1133
1145
|
|
|
1134
1146
|
"use strict";
|
|
1135
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"el-dialog\",\n {\n attrs: {\n \"custom-class\": \"document-form-dialog\",\n title: _vm.isEdit ? _vm.dialogTitle : \"新增文档\",\n visible: _vm.visible,\n width: _vm.dialogWidth,\n \"close-on-click-modal\": false\n },\n on: {\n \"update:visible\": function($event) {\n _vm.visible = $event\n },\n opened: _vm.onDialogOpened,\n closed: _vm.handleClosed\n }\n },\n [\n _c(\n \"el-form\",\n {\n ref: \"docForm\",\n attrs: { model: _vm.formData, \"label-width\": \"100px\" }\n },\n [\n !_vm.isEdit\n ? _c(\n \"el-form-item\",\n { attrs: { label: \"选择文件\" } },\n [\n _c(\n \"el-upload\",\n {\n ref: \"uploadRef\",\n staticClass: \"kb-doc-upload\",\n attrs: {\n drag: \"\",\n multiple: \"\",\n \"auto-upload\": false,\n limit: 5,\n \"file-list\": _vm.fileList,\n \"on-change\": _vm.handleFileChange,\n \"on-remove\": _vm.handleFileRemove,\n \"on-exceed\": _vm.handleFileExceed,\n \"before-upload\": _vm.beforeUpload,\n accept:\n \".pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt,.md,.jpg,.jpeg,.png,.gif,.webp\"\n }\n },\n [\n _c(\"i\", { staticClass: \"el-icon-upload\" }),\n _c(\"div\", { staticClass: \"el-upload__text\" }, [\n _vm._v(\"将文件拖到此处,或\"),\n _c(\"em\", [_vm._v(\"点击上传\")])\n ]),\n _c(\n \"div\",\n {\n staticClass: \"el-upload__tip\",\n attrs: { slot: \"tip\" },\n slot: \"tip\"\n },\n [\n _vm._v(\n \" 支持 Word / Excel / PPT / PDF / TXT / Markdown / 图片,单文件不超过 50MB,最多 5 个文件 \"\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n : _vm._e(),\n _vm.isEdit\n ? _c(\n \"el-form-item\",\n { attrs: { label: \"文件标题\", prop: \"title\" } },\n [\n _c(\"el-input\", {\n staticClass: \"doc-title-input\",\n attrs: { placeholder: \"请输入文件标题\", maxlength: \"100\" },\n model: {\n value: _vm.formData.title,\n callback: function($$v) {\n _vm.$set(_vm.formData, \"title\", $$v)\n },\n expression: \"formData.title\"\n }\n })\n ],\n 1\n )\n : _vm._e(),\n _c(\n \"el-form-item\",\n { attrs: { label: \"所属文件夹\", required: !_vm.isEdit } },\n [\n _c(\n \"el-popover\",\n {\n ref: \"folderPopover\",\n attrs: {\n trigger: \"click\",\n placement: \"bottom-start\",\n width: 360\n },\n on: { show: _vm.handleFolderPopoverShow },\n model: {\n value: _vm.folderPopoverVisible,\n callback: function($$v) {\n _vm.folderPopoverVisible = $$v\n },\n expression: \"folderPopoverVisible\"\n }\n },\n [\n _c(\n \"div\",\n { staticClass: \"folder-tree-wrap\" },\n [\n _c(\"el-tree\", {\n ref: \"folderTreeRef\",\n attrs: {\n data: _vm.folderTree,\n props: _vm.folderTreeProps,\n \"node-key\": \"id\",\n \"highlight-current\": \"\",\n \"expand-on-click-node\": false,\n \"default-expand-all\": \"\"\n },\n on: { \"node-click\": _vm.handleFolderSelect }\n })\n ],\n 1\n ),\n _c(\n \"div\",\n {\n staticClass: \"folder-picker-input\",\n attrs: { slot: \"reference\" },\n slot: \"reference\"\n },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"folder-picker-input-el\",\n attrs: {\n readonly: \"\",\n placeholder: \"请选择所属文件夹\",\n value: _vm.selectedFolderName,\n clearable: \"\"\n },\n on: { clear: _vm.clearFolderSelect }\n },\n [\n _c(\"i\", {\n staticClass: \"el-input__icon el-icon-arrow-down\",\n attrs: { slot: \"suffix\" },\n slot: \"suffix\"\n })\n ]\n )\n ],\n 1\n )\n ]\n )\n ],\n 1\n ),\n _vm.isEdit && _vm.isTextEditable && !_vm.isXlsxType\n ? _c(\"el-form-item\", { attrs: { label: \"文件内容\" } }, [\n _c(\"div\", { staticClass: \"md-editor-wrap\" }, [\n _c(\"div\", { staticClass: \"md-editor-toolbar\" }, [\n _c(\n \"span\",\n {\n staticClass: \"md-editor-tab\",\n class: { active: _vm.mdTab === \"edit\" },\n on: {\n click: function($event) {\n _vm.mdTab = \"edit\"\n }\n }\n },\n [_vm._v(\"编辑\")]\n ),\n _vm.isMarkdownType\n ? _c(\n \"span\",\n {\n staticClass: \"md-editor-tab\",\n class: { active: _vm.mdTab === \"preview\" },\n on: {\n click: function($event) {\n _vm.mdTab = \"preview\"\n }\n }\n },\n [_vm._v(\"预览\")]\n )\n : _vm._e(),\n _c(\"span\", { staticClass: \"md-editor-status\" }, [\n _vm._v(\n _vm._s(\n _vm.formData.content\n ? _vm.formData.content.length + \" 字符\"\n : \"空内容\"\n )\n )\n ])\n ]),\n _vm.mdTab === \"edit\"\n ? _c(\"textarea\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.formData.content,\n expression: \"formData.content\"\n }\n ],\n staticClass: \"md-textarea\",\n attrs: {\n placeholder:\n \"在此输入 \" +\n (_vm.editingFileType || \"\") +\n \" 内容...\"\n },\n domProps: { value: _vm.formData.content },\n on: {\n input: function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.$set(\n _vm.formData,\n \"content\",\n $event.target.value\n )\n }\n }\n })\n : _c(\"div\", {\n staticClass: \"md-preview\",\n attrs: { contenteditable: \"false\" },\n domProps: { innerHTML: _vm._s(_vm.previewHtml) }\n })\n ])\n ])\n : _vm._e(),\n _vm.isEdit && _vm.isXlsxType\n ? _c(\"el-form-item\", { attrs: { label: \"表格编辑\" } }, [\n _c(\n \"div\",\n { staticClass: \"xlsx-editor-wrap\" },\n [\n _vm.xlsxData.loading\n ? _c(\"div\", { staticClass: \"xlsx-loading\" }, [\n _c(\"i\", { staticClass: \"el-icon-loading\" }),\n _vm._v(\" 正在解析 Excel 文件... \")\n ])\n : [\n _c(\"div\", { staticClass: \"xlsx-toolbar\" }, [\n _c(\n \"div\",\n { staticClass: \"xlsx-sheet-tabs\" },\n _vm._l(_vm.xlsxData.sheetNames, function(name) {\n return _c(\n \"span\",\n {\n key: name,\n staticClass: \"xlsx-sheet-tab\",\n class: {\n active: _vm.xlsxData.currentSheet === name\n },\n on: {\n click: function($event) {\n return _vm.switchXlsxSheet(name)\n }\n }\n },\n [_vm._v(_vm._s(name))]\n )\n }),\n 0\n ),\n _c(\n \"div\",\n { staticClass: \"xlsx-actions\" },\n [\n _c(\n \"el-button\",\n {\n attrs: { size: \"mini\" },\n on: { click: _vm.addXlsxRow }\n },\n [_vm._v(\"添加行\")]\n ),\n _c(\n \"el-button\",\n {\n attrs: { size: \"mini\" },\n on: { click: _vm.addXlsxCol }\n },\n [_vm._v(\"添加列\")]\n ),\n _c(\n \"el-button\",\n {\n attrs: {\n size: \"mini\",\n type: \"danger\",\n plain: \"\"\n },\n on: { click: _vm.deleteXlsxRow }\n },\n [_vm._v(\"删除最后行\")]\n ),\n _c(\n \"el-button\",\n {\n attrs: {\n size: \"mini\",\n type: \"warning\",\n plain: \"\"\n },\n on: { click: _vm.deleteXlsxCol }\n },\n [_vm._v(\"删除最后列\")]\n ),\n _c(\"span\", { staticClass: \"xlsx-info\" }, [\n _vm._v(\n _vm._s(_vm.xlsxData.rows.length) +\n \" 行 x \" +\n _vm._s(_vm.xlsxData.cols.length) +\n \" 列\"\n )\n ])\n ],\n 1\n )\n ]),\n _vm.xlsxData.rows.length > 0\n ? _c(\n \"div\",\n { staticClass: \"xlsx-table-wrap\" },\n [\n _c(\n \"el-table\",\n {\n staticStyle: { width: \"100%\" },\n attrs: {\n data: _vm.xlsxData.rows,\n border: \"\",\n size: \"mini\",\n \"max-height\": 420\n }\n },\n [\n _vm._l(_vm.xlsxData.cols, function(\n col,\n ci\n ) {\n return _c(\"el-table-column\", {\n key: ci,\n attrs: {\n label: col,\n width: 120,\n \"min-width\": 90\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var row = ref.row\n return [\n _c(\"el-input\", {\n attrs: {\n size: \"mini\",\n placeholder: col\n },\n on: {\n change:\n _vm.onXlsxCellChange\n },\n model: {\n value: row[ci],\n callback: function(\n $$v\n ) {\n _vm.$set(row, ci, $$v)\n },\n expression: \"row[ci]\"\n }\n })\n ]\n }\n }\n ],\n null,\n true\n )\n })\n }),\n _c(\"el-table-column\", {\n attrs: {\n label: \"操作\",\n width: \"60\",\n fixed: \"right\"\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var $index = ref.$index\n return [\n _c(\"el-button\", {\n attrs: {\n size: \"mini\",\n type: \"danger\",\n icon: \"el-icon-delete\",\n circle: \"\"\n },\n on: {\n click: function($event) {\n return _vm.removeXlsxRow(\n $index\n )\n }\n }\n })\n ]\n }\n }\n ],\n null,\n false,\n 438211574\n )\n })\n ],\n 2\n )\n ],\n 1\n )\n : _c(\n \"div\",\n { staticClass: \"xlsx-empty\" },\n [\n _c(\"el-empty\", {\n attrs: { description: \"当前 sheet 无数据\" }\n })\n ],\n 1\n )\n ]\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm.isEdit && _vm.isWordType\n ? _c(\"el-form-item\", { attrs: { label: \"文档内容\" } }, [\n _c(\n \"div\",\n { staticClass: \"word-editor-wrap\" },\n [\n _vm.wordLoading\n ? _c(\"div\", { staticClass: \"word-loading\" }, [\n _c(\"i\", { staticClass: \"el-icon-loading\" }),\n _vm._v(\" 正在解析 Word 文件... \")\n ])\n : [\n _c(\"div\", { staticClass: \"word-header\" }, [\n _c(\"span\", { staticClass: \"word-filename\" }, [\n _c(\"i\", { staticClass: \"el-icon-document\" }),\n _vm._v(\" \" + _vm._s(_vm.formData.fileName) + \" \")\n ]),\n _c(\"span\", { staticClass: \"word-stats\" }, [\n _vm._v(_vm._s(_vm.wordCharCount) + \" 字符\")\n ])\n ]),\n _c(\"div\", { staticClass: \"word-toolbar\" }, [\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: { type: \"button\", title: \"加粗\" },\n on: {\n click: function($event) {\n return _vm.execFormat(\"bold\")\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n ),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: { type: \"button\", title: \"斜体\" },\n on: {\n click: function($event) {\n return _vm.execFormat(\"italic\")\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n ),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: { type: \"button\", title: \"下划线\" },\n on: {\n click: function($event) {\n return _vm.execFormat(\"underline\")\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n ),\n _c(\"span\", { staticClass: \"word-tb-sep\" }),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn word-tb-btn-heading\",\n attrs: { type: \"button\", title: \"标题1\" },\n on: {\n click: function($event) {\n return _vm.execFormat(\"formatBlock\", \"h1\")\n }\n }\n },\n [_vm._v(\"H1\")]\n ),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn word-tb-btn-heading\",\n attrs: { type: \"button\", title: \"标题2\" },\n on: {\n click: function($event) {\n return _vm.execFormat(\"formatBlock\", \"h2\")\n }\n }\n },\n [_vm._v(\"H2\")]\n ),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn word-tb-btn-heading\",\n attrs: { type: \"button\", title: \"标题3\" },\n on: {\n click: function($event) {\n return _vm.execFormat(\"formatBlock\", \"h3\")\n }\n }\n },\n [_vm._v(\"H3\")]\n ),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn word-tb-btn-heading\",\n attrs: { type: \"button\", title: \"正文\" },\n on: {\n click: function($event) {\n return _vm.execFormat(\"formatBlock\", \"p\")\n }\n }\n },\n [_vm._v(\"P\")]\n ),\n _c(\"span\", { staticClass: \"word-tb-sep\" }),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: { type: \"button\", title: \"无序列表\" },\n on: {\n click: function($event) {\n return _vm.execFormat(\"insertUnorderedList\")\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n ),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: { type: \"button\", title: \"有序列表\" },\n on: {\n click: function($event) {\n return _vm.execFormat(\"insertOrderedList\")\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n ),\n _c(\"span\", { staticClass: \"word-tb-sep\" }),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: { type: \"button\", title: \"引用\" },\n on: {\n click: function($event) {\n return _vm.execFormat(\n \"formatBlock\",\n \"blockquote\"\n )\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n ),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: { type: \"button\", title: \"清除格式\" },\n on: {\n click: function($event) {\n return _vm.execFormat(\"removeFormat\")\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n )\n ]),\n _c(\"div\", {\n ref: \"wordEditor\",\n staticClass: \"word-editor-content\",\n attrs: { contenteditable: \"true\" },\n on: { input: _vm.onWordInput }\n })\n ]\n ],\n 2\n )\n ])\n : _vm._e()\n ],\n 1\n ),\n _c(\n \"span\",\n { attrs: { slot: \"footer\" }, slot: \"footer\" },\n [\n _c(\n \"el-button\",\n {\n on: {\n click: function($event) {\n _vm.visible = false\n }\n }\n },\n [_vm._v(\"取消\")]\n ),\n _c(\n \"el-button\",\n {\n staticClass: \"kb-doc-submit\",\n attrs: { type: \"primary\", loading: _vm.submitting },\n on: { click: _vm.handleSubmit }\n },\n [_vm._v(\"确定\")]\n )\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/DocumentForm.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%2268609640-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1147
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"document-form-root\" },\n [\n !_vm.isMobile\n ? _c(\n \"el-dialog\",\n {\n attrs: {\n \"custom-class\": \"document-form-dialog\",\n title: _vm.isEdit ? _vm.dialogTitle : \"新增文档\",\n visible: _vm.visible,\n width: _vm.dialogWidth,\n fullscreen: _vm.isMobile === true,\n \"close-on-click-modal\": false\n },\n on: {\n \"update:visible\": function($event) {\n _vm.visible = $event\n },\n opened: _vm.onDialogOpened,\n closed: _vm.handleClosed\n }\n },\n [\n _c(\n \"el-form\",\n {\n ref: \"docForm\",\n attrs: { model: _vm.formData, \"label-width\": \"100px\" }\n },\n [\n !_vm.isEdit\n ? _c(\n \"el-form-item\",\n { attrs: { label: \"选择文件\" } },\n [\n _c(\n \"el-upload\",\n {\n ref: \"uploadRef\",\n staticClass: \"kb-doc-upload\",\n attrs: {\n drag: \"\",\n multiple: \"\",\n \"auto-upload\": false,\n limit: 5,\n \"file-list\": _vm.fileList,\n \"on-change\": _vm.handleFileChange,\n \"on-remove\": _vm.handleFileRemove,\n \"on-exceed\": _vm.handleFileExceed,\n \"before-upload\": _vm.beforeUpload,\n accept:\n \".pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt,.md,.jpg,.jpeg,.png,.gif,.webp\"\n }\n },\n [\n _c(\"i\", { staticClass: \"el-icon-upload\" }),\n _c(\"div\", { staticClass: \"el-upload__text\" }, [\n _vm._v(\"将文件拖到此处,或\"),\n _c(\"em\", [_vm._v(\"点击上传\")])\n ]),\n _c(\n \"div\",\n {\n staticClass: \"el-upload__tip\",\n attrs: { slot: \"tip\" },\n slot: \"tip\"\n },\n [\n _vm._v(\n \" 支持 Word / Excel / PPT / PDF / TXT / Markdown / 图片,单文件不超过 50MB,最多 5 个文件 \"\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n : _vm._e(),\n _vm.isEdit\n ? _c(\n \"el-form-item\",\n { attrs: { label: \"文件标题\", prop: \"title\" } },\n [\n _c(\"el-input\", {\n staticClass: \"doc-title-input\",\n attrs: {\n placeholder: \"请输入文件标题\",\n maxlength: \"100\"\n },\n model: {\n value: _vm.formData.title,\n callback: function($$v) {\n _vm.$set(_vm.formData, \"title\", $$v)\n },\n expression: \"formData.title\"\n }\n })\n ],\n 1\n )\n : _vm._e(),\n _c(\n \"el-form-item\",\n { attrs: { label: \"所属文件夹\", required: !_vm.isEdit } },\n [\n _c(\n \"el-popover\",\n {\n ref: \"folderPopover\",\n attrs: {\n trigger: \"click\",\n placement: \"bottom-start\",\n width: 360\n },\n on: { show: _vm.handleFolderPopoverShow },\n model: {\n value: _vm.folderPopoverVisible,\n callback: function($$v) {\n _vm.folderPopoverVisible = $$v\n },\n expression: \"folderPopoverVisible\"\n }\n },\n [\n _c(\n \"div\",\n { staticClass: \"folder-tree-wrap\" },\n [\n _c(\"el-tree\", {\n ref: \"folderTreeRef\",\n attrs: {\n data: _vm.folderTree,\n props: _vm.folderTreeProps,\n \"node-key\": \"id\",\n \"highlight-current\": \"\",\n \"expand-on-click-node\": false,\n \"default-expand-all\": \"\"\n },\n on: { \"node-click\": _vm.handleFolderSelect }\n })\n ],\n 1\n ),\n _c(\n \"div\",\n {\n staticClass: \"folder-picker-input\",\n attrs: { slot: \"reference\" },\n slot: \"reference\"\n },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"folder-picker-input-el\",\n attrs: {\n readonly: \"\",\n placeholder: \"请选择所属文件夹\",\n value: _vm.selectedFolderName,\n clearable: \"\"\n },\n on: { clear: _vm.clearFolderSelect }\n },\n [\n _c(\"i\", {\n staticClass:\n \"el-input__icon el-icon-arrow-down\",\n attrs: { slot: \"suffix\" },\n slot: \"suffix\"\n })\n ]\n )\n ],\n 1\n )\n ]\n )\n ],\n 1\n ),\n _vm.isEdit && _vm.isTextEditable && !_vm.isXlsxType\n ? _c(\"el-form-item\", { attrs: { label: \"文件内容\" } }, [\n _c(\"div\", { staticClass: \"md-editor-wrap\" }, [\n _c(\"div\", { staticClass: \"md-editor-toolbar\" }, [\n _c(\n \"span\",\n {\n staticClass: \"md-editor-tab\",\n class: { active: _vm.mdTab === \"edit\" },\n on: {\n click: function($event) {\n _vm.mdTab = \"edit\"\n }\n }\n },\n [_vm._v(\"编辑\")]\n ),\n _vm.isMarkdownType\n ? _c(\n \"span\",\n {\n staticClass: \"md-editor-tab\",\n class: { active: _vm.mdTab === \"preview\" },\n on: {\n click: function($event) {\n _vm.mdTab = \"preview\"\n }\n }\n },\n [_vm._v(\"预览\")]\n )\n : _vm._e(),\n _c(\"span\", { staticClass: \"md-editor-status\" }, [\n _vm._v(\n _vm._s(\n _vm.formData.content\n ? _vm.formData.content.length + \" 字符\"\n : \"空内容\"\n )\n )\n ])\n ]),\n _vm.mdTab === \"edit\"\n ? _c(\"textarea\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.formData.content,\n expression: \"formData.content\"\n }\n ],\n staticClass: \"md-textarea\",\n attrs: {\n placeholder:\n \"在此输入 \" +\n (_vm.editingFileType || \"\") +\n \" 内容...\"\n },\n domProps: { value: _vm.formData.content },\n on: {\n input: function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.$set(\n _vm.formData,\n \"content\",\n $event.target.value\n )\n }\n }\n })\n : _c(\"div\", {\n staticClass: \"md-preview\",\n attrs: { contenteditable: \"false\" },\n domProps: { innerHTML: _vm._s(_vm.previewHtml) }\n })\n ])\n ])\n : _vm._e(),\n _vm.isEdit && _vm.isXlsxType\n ? _c(\"el-form-item\", { attrs: { label: \"表格编辑\" } }, [\n _c(\n \"div\",\n { staticClass: \"xlsx-editor-wrap\" },\n [\n _vm.xlsxData.loading\n ? _c(\"div\", { staticClass: \"xlsx-loading\" }, [\n _c(\"i\", { staticClass: \"el-icon-loading\" }),\n _vm._v(\" 正在解析 Excel 文件... \")\n ])\n : [\n _c(\"div\", { staticClass: \"xlsx-toolbar\" }, [\n _c(\n \"div\",\n { staticClass: \"xlsx-sheet-tabs\" },\n _vm._l(_vm.xlsxData.sheetNames, function(\n name\n ) {\n return _c(\n \"span\",\n {\n key: name,\n staticClass: \"xlsx-sheet-tab\",\n class: {\n active:\n _vm.xlsxData.currentSheet ===\n name\n },\n on: {\n click: function($event) {\n return _vm.switchXlsxSheet(name)\n }\n }\n },\n [_vm._v(_vm._s(name))]\n )\n }),\n 0\n ),\n _c(\n \"div\",\n { staticClass: \"xlsx-actions\" },\n [\n _c(\n \"el-button\",\n {\n attrs: { size: \"mini\" },\n on: { click: _vm.addXlsxRow }\n },\n [_vm._v(\"添加行\")]\n ),\n _c(\n \"el-button\",\n {\n attrs: { size: \"mini\" },\n on: { click: _vm.addXlsxCol }\n },\n [_vm._v(\"添加列\")]\n ),\n _c(\n \"el-button\",\n {\n attrs: {\n size: \"mini\",\n type: \"danger\",\n plain: \"\"\n },\n on: { click: _vm.deleteXlsxRow }\n },\n [_vm._v(\"删除最后行\")]\n ),\n _c(\n \"el-button\",\n {\n attrs: {\n size: \"mini\",\n type: \"warning\",\n plain: \"\"\n },\n on: { click: _vm.deleteXlsxCol }\n },\n [_vm._v(\"删除最后列\")]\n ),\n _c(\n \"span\",\n { staticClass: \"xlsx-info\" },\n [\n _vm._v(\n _vm._s(_vm.xlsxData.rows.length) +\n \" 行 x \" +\n _vm._s(\n _vm.xlsxData.cols.length\n ) +\n \" 列\"\n )\n ]\n )\n ],\n 1\n )\n ]),\n _vm.xlsxData.rows.length > 0\n ? _c(\n \"div\",\n { staticClass: \"xlsx-table-wrap\" },\n [\n _c(\n \"el-table\",\n {\n staticStyle: { width: \"100%\" },\n attrs: {\n data: _vm.xlsxData.rows,\n border: \"\",\n size: \"mini\",\n \"max-height\": 420\n }\n },\n [\n _vm._l(\n _vm.xlsxData.cols,\n function(col, ci) {\n return _c(\"el-table-column\", {\n key: ci,\n attrs: {\n label: col,\n width: 120,\n \"min-width\": 90\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var row = ref.row\n return [\n _c(\"el-input\", {\n attrs: {\n size: \"mini\",\n placeholder: col\n },\n on: {\n change:\n _vm.onXlsxCellChange\n },\n model: {\n value:\n row[ci],\n callback: function(\n $$v\n ) {\n _vm.$set(\n row,\n ci,\n $$v\n )\n },\n expression:\n \"row[ci]\"\n }\n })\n ]\n }\n }\n ],\n null,\n true\n )\n })\n }\n ),\n _c(\"el-table-column\", {\n attrs: {\n label: \"操作\",\n width: \"60\",\n fixed: \"right\"\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var $index = ref.$index\n return [\n _c(\"el-button\", {\n attrs: {\n size: \"mini\",\n type: \"danger\",\n icon:\n \"el-icon-delete\",\n circle: \"\"\n },\n on: {\n click: function(\n $event\n ) {\n return _vm.removeXlsxRow(\n $index\n )\n }\n }\n })\n ]\n }\n }\n ],\n null,\n false,\n 438211574\n )\n })\n ],\n 2\n )\n ],\n 1\n )\n : _c(\n \"div\",\n { staticClass: \"xlsx-empty\" },\n [\n _c(\"el-empty\", {\n attrs: {\n description: \"当前 sheet 无数据\"\n }\n })\n ],\n 1\n )\n ]\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm.isEdit && _vm.isWordType\n ? _c(\"el-form-item\", { attrs: { label: \"文档内容\" } }, [\n _c(\n \"div\",\n { staticClass: \"word-editor-wrap\" },\n [\n _vm.wordLoading\n ? _c(\"div\", { staticClass: \"word-loading\" }, [\n _c(\"i\", { staticClass: \"el-icon-loading\" }),\n _vm._v(\" 正在解析 Word 文件... \")\n ])\n : [\n _c(\"div\", { staticClass: \"word-header\" }, [\n _c(\n \"span\",\n { staticClass: \"word-filename\" },\n [\n _c(\"i\", {\n staticClass: \"el-icon-document\"\n }),\n _vm._v(\n \" \" +\n _vm._s(_vm.formData.fileName) +\n \" \"\n )\n ]\n ),\n _c(\"span\", { staticClass: \"word-stats\" }, [\n _vm._v(\n _vm._s(_vm.wordCharCount) + \" 字符\"\n )\n ])\n ]),\n _c(\"div\", { staticClass: \"word-toolbar\" }, [\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: {\n type: \"button\",\n title: \"加粗\"\n },\n on: {\n click: function($event) {\n return _vm.execFormat(\"bold\")\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n ),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: {\n type: \"button\",\n title: \"斜体\"\n },\n on: {\n click: function($event) {\n return _vm.execFormat(\"italic\")\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n ),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: {\n type: \"button\",\n title: \"下划线\"\n },\n on: {\n click: function($event) {\n return _vm.execFormat(\"underline\")\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n ),\n _c(\"span\", { staticClass: \"word-tb-sep\" }),\n _c(\n \"button\",\n {\n staticClass:\n \"word-tb-btn word-tb-btn-heading\",\n attrs: {\n type: \"button\",\n title: \"标题1\"\n },\n on: {\n click: function($event) {\n return _vm.execFormat(\n \"formatBlock\",\n \"h1\"\n )\n }\n }\n },\n [_vm._v(\"H1\")]\n ),\n _c(\n \"button\",\n {\n staticClass:\n \"word-tb-btn word-tb-btn-heading\",\n attrs: {\n type: \"button\",\n title: \"标题2\"\n },\n on: {\n click: function($event) {\n return _vm.execFormat(\n \"formatBlock\",\n \"h2\"\n )\n }\n }\n },\n [_vm._v(\"H2\")]\n ),\n _c(\n \"button\",\n {\n staticClass:\n \"word-tb-btn word-tb-btn-heading\",\n attrs: {\n type: \"button\",\n title: \"标题3\"\n },\n on: {\n click: function($event) {\n return _vm.execFormat(\n \"formatBlock\",\n \"h3\"\n )\n }\n }\n },\n [_vm._v(\"H3\")]\n ),\n _c(\n \"button\",\n {\n staticClass:\n \"word-tb-btn word-tb-btn-heading\",\n attrs: {\n type: \"button\",\n title: \"正文\"\n },\n on: {\n click: function($event) {\n return _vm.execFormat(\n \"formatBlock\",\n \"p\"\n )\n }\n }\n },\n [_vm._v(\"P\")]\n ),\n _c(\"span\", { staticClass: \"word-tb-sep\" }),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: {\n type: \"button\",\n title: \"无序列表\"\n },\n on: {\n click: function($event) {\n return _vm.execFormat(\n \"insertUnorderedList\"\n )\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n ),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: {\n type: \"button\",\n title: \"有序列表\"\n },\n on: {\n click: function($event) {\n return _vm.execFormat(\n \"insertOrderedList\"\n )\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n ),\n _c(\"span\", { staticClass: \"word-tb-sep\" }),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: {\n type: \"button\",\n title: \"引用\"\n },\n on: {\n click: function($event) {\n return _vm.execFormat(\n \"formatBlock\",\n \"blockquote\"\n )\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n ),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: {\n type: \"button\",\n title: \"清除格式\"\n },\n on: {\n click: function($event) {\n return _vm.execFormat(\n \"removeFormat\"\n )\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n )\n ]),\n _c(\"div\", {\n ref: \"wordEditor\",\n staticClass: \"word-editor-content\",\n attrs: { contenteditable: \"true\" },\n on: { input: _vm.onWordInput }\n })\n ]\n ],\n 2\n )\n ])\n : _vm._e()\n ],\n 1\n ),\n _c(\n \"span\",\n { attrs: { slot: \"footer\" }, slot: \"footer\" },\n [\n _c(\n \"el-button\",\n {\n on: {\n click: function($event) {\n _vm.visible = false\n }\n }\n },\n [_vm._v(\"取消\")]\n ),\n _c(\n \"el-button\",\n {\n staticClass: \"kb-doc-submit\",\n attrs: { type: \"primary\", loading: _vm.submitting },\n on: { click: _vm.handleSubmit }\n },\n [_vm._v(\"确定\")]\n )\n ],\n 1\n )\n ],\n 1\n )\n : _vm._e(),\n _vm.isMobile\n ? _c(\n \"MobileDialog\",\n {\n attrs: {\n visible: _vm.visible,\n title: _vm.isEdit ? _vm.dialogTitle : \"新增文档\",\n fullscreen: \"\"\n },\n on: {\n \"update:visible\": function($event) {\n _vm.visible = $event\n },\n closed: _vm.handleClosed\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"footer\",\n fn: function() {\n return [\n _c(\n \"button\",\n {\n staticClass: \"kbm-btn\",\n on: {\n click: function($event) {\n _vm.visible = false\n }\n }\n },\n [_vm._v(\"取消\")]\n ),\n _c(\n \"button\",\n {\n staticClass: \"kbm-btn primary\",\n attrs: { disabled: _vm.submitting },\n on: { click: _vm.handleSubmit }\n },\n [\n _vm._v(\n _vm._s(_vm.submitting ? \"保存中...\" : \"确定\")\n )\n ]\n )\n ]\n },\n proxy: true\n }\n ],\n null,\n false,\n 3258342675\n )\n },\n [\n !_vm.isEdit\n ? [\n _c(\"label\", { staticClass: \"kbm-upload\" }, [\n _c(\"input\", {\n staticClass: \"kbm-upload-input\",\n attrs: {\n type: \"file\",\n multiple: \"\",\n accept:\n \".pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt,.md,.jpg,.jpeg,.png,.gif,.webp\"\n },\n on: { change: _vm.handleNativeFileSelect }\n }),\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"30\",\n height: \"30\",\n fill: \"#1677ff\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M19.35 10.04A7.49 7.49 0 0 0 12 4C9.11 4 6.6 5.64 5.35 8.04A5.994 5.994 0 0 0 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z\"\n }\n })\n ]\n ),\n _c(\"div\", { staticClass: \"kbm-upload-text\" }, [\n _vm._v(\"点击选择文件(可多选)\")\n ])\n ]),\n _c(\"div\", { staticClass: \"kbm-upload-tip\" }, [\n _vm._v(\n \"支持 Word / Excel / PPT / PDF / TXT / Markdown / 图片,单文件不超过 50MB,最多 5 个文件\"\n )\n ]),\n _vm._l(_vm.fileList, function(f, i) {\n return _c(\n \"div\",\n { key: \"nf-\" + i, staticClass: \"kbm-file-row\" },\n [\n _c(\"span\", { staticClass: \"kbm-file-name\" }, [\n _vm._v(_vm._s(f.name))\n ]),\n _c(\n \"button\",\n {\n staticClass: \"kbm-field-remove\",\n on: {\n click: function($event) {\n return _vm.removeNativeFile(i)\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"14\",\n height: \"14\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\n }\n })\n ]\n )\n ]\n )\n ]\n )\n })\n ]\n : _vm._e(),\n _vm.isEdit\n ? _c(\"div\", { staticClass: \"kbm-field\" }, [\n _c(\"label\", { staticClass: \"kbm-field-label\" }, [\n _vm._v(\"文件标题\")\n ]),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.formData.title,\n expression: \"formData.title\"\n }\n ],\n staticClass: \"kbm-input\",\n attrs: {\n placeholder: \"请输入文件标题\",\n maxlength: \"100\"\n },\n domProps: { value: _vm.formData.title },\n on: {\n input: function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.$set(_vm.formData, \"title\", $event.target.value)\n }\n }\n })\n ])\n : _vm._e(),\n _c(\"div\", { staticClass: \"kbm-field\" }, [\n _c(\"label\", { staticClass: \"kbm-field-label\" }, [\n _vm._v(\"所属文件夹\"),\n !_vm.isEdit\n ? _c(\"span\", { staticClass: \"kbm-required\" }, [_vm._v(\"*\")])\n : _vm._e()\n ]),\n _c(\n \"button\",\n {\n staticClass: \"kbm-input kbm-select\",\n attrs: { type: \"button\" },\n on: {\n click: function($event) {\n _vm.folderPickerVisible = true\n }\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n \"kbm-select-placeholder\": !_vm.formData.folderId\n }\n },\n [\n _vm._v(\n _vm._s(_vm.selectedFolderName || \"请选择所属文件夹\")\n )\n ]\n ),\n _c(\n \"svg\",\n {\n staticClass: \"kbm-select-arrow\",\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d: \"M7.41 8.59 12 13.17l4.59-4.58L18 10l-6 6-6-6z\"\n }\n })\n ]\n )\n ]\n ),\n _vm.folderPickerVisible\n ? _c(\n \"div\",\n {\n staticClass: \"kbm-picker-mask\",\n on: {\n click: function($event) {\n _vm.folderPickerVisible = false\n }\n }\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"kbm-picker\",\n on: {\n click: function($event) {\n $event.stopPropagation()\n }\n }\n },\n [\n _c(\"div\", { staticClass: \"kbm-picker-title\" }, [\n _vm._v(\"选择所属文件夹\")\n ]),\n _c(\n \"div\",\n { staticClass: \"kbm-picker-list\" },\n [\n _vm._l(_vm.folderFlat, function(f) {\n return _c(\n \"div\",\n {\n key: f.node.id,\n staticClass: \"kbm-picker-row\",\n class: {\n active:\n _vm.formData.folderId === f.node.id\n },\n style: {\n paddingLeft: 14 + f.depth * 16 + \"px\"\n },\n on: {\n click: function($event) {\n return _vm.handleMobileFolderPick(\n f.node\n )\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M10 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z\"\n }\n })\n ]\n ),\n _c(\n \"span\",\n { staticClass: \"kbm-picker-name\" },\n [_vm._v(_vm._s(f.node.name))]\n ),\n _vm.formData.folderId === f.node.id\n ? _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\n }\n })\n ]\n )\n : _vm._e()\n ]\n )\n }),\n !_vm.folderFlat.length\n ? _c(\"div\", { staticClass: \"kbm-empty\" }, [\n _vm._v(\"暂无文件夹\")\n ])\n : _vm._e()\n ],\n 2\n ),\n _c(\n \"div\",\n {\n staticClass: \"kbm-picker-cancel\",\n on: {\n click: function($event) {\n _vm.folderPickerVisible = false\n }\n }\n },\n [_vm._v(\"取消\")]\n )\n ]\n )\n ]\n )\n : _vm._e()\n ]),\n _vm.isEdit && _vm.isTextEditable && !_vm.isXlsxType\n ? _c(\"div\", { staticClass: \"kbm-field\" }, [\n _c(\"label\", { staticClass: \"kbm-field-label\" }, [\n _vm._v(\"文件内容\")\n ]),\n _c(\"div\", { staticClass: \"md-editor-wrap\" }, [\n _c(\"div\", { staticClass: \"md-editor-toolbar\" }, [\n _c(\n \"span\",\n {\n staticClass: \"md-editor-tab\",\n class: { active: _vm.mdTab === \"edit\" },\n on: {\n click: function($event) {\n _vm.mdTab = \"edit\"\n }\n }\n },\n [_vm._v(\"编辑\")]\n ),\n _vm.isMarkdownType\n ? _c(\n \"span\",\n {\n staticClass: \"md-editor-tab\",\n class: { active: _vm.mdTab === \"preview\" },\n on: {\n click: function($event) {\n _vm.mdTab = \"preview\"\n }\n }\n },\n [_vm._v(\"预览\")]\n )\n : _vm._e(),\n _c(\"span\", { staticClass: \"md-editor-status\" }, [\n _vm._v(\n _vm._s(\n _vm.formData.content\n ? _vm.formData.content.length + \" 字符\"\n : \"空内容\"\n )\n )\n ])\n ]),\n _vm.mdTab === \"edit\"\n ? _c(\"textarea\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.formData.content,\n expression: \"formData.content\"\n }\n ],\n staticClass: \"md-textarea\",\n attrs: {\n placeholder:\n \"在此输入 \" +\n (_vm.editingFileType || \"\") +\n \" 内容...\"\n },\n domProps: { value: _vm.formData.content },\n on: {\n input: function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.$set(\n _vm.formData,\n \"content\",\n $event.target.value\n )\n }\n }\n })\n : _c(\"div\", {\n staticClass: \"md-preview\",\n attrs: { contenteditable: \"false\" },\n domProps: { innerHTML: _vm._s(_vm.previewHtml) }\n })\n ])\n ])\n : _vm._e(),\n _vm.isEdit && _vm.isXlsxType\n ? _c(\"div\", { staticClass: \"kbm-field\" }, [\n _c(\"label\", { staticClass: \"kbm-field-label\" }, [\n _vm._v(\"表格编辑\")\n ]),\n _c(\n \"div\",\n { staticClass: \"xlsx-editor-wrap\" },\n [\n _vm.xlsxData.loading\n ? _c(\"div\", { staticClass: \"kbm-loading\" }, [\n _vm._v(\"正在解析 Excel 文件...\")\n ])\n : [\n _c(\"div\", { staticClass: \"xlsx-toolbar\" }, [\n _c(\n \"div\",\n { staticClass: \"xlsx-sheet-tabs\" },\n _vm._l(_vm.xlsxData.sheetNames, function(\n name\n ) {\n return _c(\n \"span\",\n {\n key: name,\n staticClass: \"xlsx-sheet-tab\",\n class: {\n active:\n _vm.xlsxData.currentSheet === name\n },\n on: {\n click: function($event) {\n return _vm.switchXlsxSheet(name)\n }\n }\n },\n [_vm._v(_vm._s(name))]\n )\n }),\n 0\n ),\n _c(\"div\", { staticClass: \"xlsx-actions\" }, [\n _c(\n \"button\",\n {\n staticClass: \"kbm-mini-btn\",\n on: { click: _vm.addXlsxRow }\n },\n [_vm._v(\"添加行\")]\n ),\n _c(\n \"button\",\n {\n staticClass: \"kbm-mini-btn\",\n on: { click: _vm.addXlsxCol }\n },\n [_vm._v(\"添加列\")]\n ),\n _c(\n \"button\",\n {\n staticClass: \"kbm-mini-btn danger\",\n on: { click: _vm.deleteXlsxRow }\n },\n [_vm._v(\"删除最后行\")]\n ),\n _c(\n \"button\",\n {\n staticClass: \"kbm-mini-btn warning\",\n on: { click: _vm.deleteXlsxCol }\n },\n [_vm._v(\"删除最后列\")]\n )\n ])\n ]),\n _vm.xlsxData.rows.length > 0\n ? _c(\n \"div\",\n {\n staticClass:\n \"xlsx-table-wrap kbm-xlsx-scroll\"\n },\n [\n _c(\n \"table\",\n {\n staticClass: \"kbm-xlsx-table\",\n attrs: { contenteditable: \"false\" }\n },\n [\n _c(\"thead\", [\n _c(\n \"tr\",\n [\n _vm._l(\n _vm.xlsxData.cols,\n function(col, ci) {\n return _c(\n \"th\",\n { key: \"h-\" + ci },\n [_vm._v(_vm._s(col))]\n )\n }\n ),\n _c(\n \"th\",\n {\n staticClass: \"kbm-xlsx-op\"\n },\n [_vm._v(\"操作\")]\n )\n ],\n 2\n )\n ]),\n _c(\n \"tbody\",\n _vm._l(_vm.xlsxData.rows, function(\n row,\n ri\n ) {\n return _c(\n \"tr\",\n { key: ri },\n [\n _vm._l(\n _vm.xlsxData.cols,\n function(col, ci) {\n return _c(\n \"td\",\n { key: ci },\n [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName:\n \"v-model\",\n value: row[ci],\n expression:\n \"row[ci]\"\n }\n ],\n staticClass:\n \"kbm-xlsx-cell\",\n domProps: {\n value: row[ci]\n },\n on: {\n change:\n _vm.onXlsxCellChange,\n input: function(\n $event\n ) {\n if (\n $event.target\n .composing\n ) {\n return\n }\n _vm.$set(\n row,\n ci,\n $event.target\n .value\n )\n }\n }\n })\n ]\n )\n }\n ),\n _c(\n \"td\",\n {\n staticClass: \"kbm-xlsx-op\"\n },\n [\n _c(\n \"button\",\n {\n staticClass:\n \"kbm-cell-del\",\n on: {\n click: function(\n $event\n ) {\n return _vm.removeXlsxRow(\n ri\n )\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox:\n \"0 0 24 24\",\n width: \"13\",\n height: \"13\",\n fill:\n \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\"\n }\n })\n ]\n )\n ]\n )\n ]\n )\n ],\n 2\n )\n }),\n 0\n )\n ]\n )\n ]\n )\n : _c(\"div\", { staticClass: \"kbm-empty\" }, [\n _vm._v(\"当前 sheet 无数据\")\n ])\n ]\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm.isEdit && _vm.isWordType\n ? _c(\"div\", { staticClass: \"kbm-field\" }, [\n _c(\"label\", { staticClass: \"kbm-field-label\" }, [\n _vm._v(\"文档内容\")\n ]),\n _c(\n \"div\",\n { staticClass: \"word-editor-wrap\" },\n [\n _vm.wordLoading\n ? _c(\"div\", { staticClass: \"kbm-loading\" }, [\n _vm._v(\"正在解析 Word 文件...\")\n ])\n : [\n _c(\"div\", { staticClass: \"word-header\" }, [\n _c(\"span\", { staticClass: \"word-filename\" }, [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"14\",\n height: \"14\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zm-1 7V3.5L18.5 9H13z\"\n }\n })\n ]\n ),\n _vm._v(\n \" \" + _vm._s(_vm.formData.fileName) + \" \"\n )\n ]),\n _c(\"span\", { staticClass: \"word-stats\" }, [\n _vm._v(_vm._s(_vm.wordCharCount) + \" 字符\")\n ])\n ]),\n _c(\"div\", { staticClass: \"word-toolbar\" }, [\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: { type: \"button\", title: \"加粗\" },\n on: {\n click: function($event) {\n return _vm.execFormat(\"bold\")\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n ),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: { type: \"button\", title: \"斜体\" },\n on: {\n click: function($event) {\n return _vm.execFormat(\"italic\")\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n ),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: { type: \"button\", title: \"下划线\" },\n on: {\n click: function($event) {\n return _vm.execFormat(\"underline\")\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n ),\n _c(\"span\", { staticClass: \"word-tb-sep\" }),\n _c(\n \"button\",\n {\n staticClass:\n \"word-tb-btn word-tb-btn-heading\",\n attrs: { type: \"button\", title: \"标题1\" },\n on: {\n click: function($event) {\n return _vm.execFormat(\n \"formatBlock\",\n \"h1\"\n )\n }\n }\n },\n [_vm._v(\"H1\")]\n ),\n _c(\n \"button\",\n {\n staticClass:\n \"word-tb-btn word-tb-btn-heading\",\n attrs: { type: \"button\", title: \"标题2\" },\n on: {\n click: function($event) {\n return _vm.execFormat(\n \"formatBlock\",\n \"h2\"\n )\n }\n }\n },\n [_vm._v(\"H2\")]\n ),\n _c(\n \"button\",\n {\n staticClass:\n \"word-tb-btn word-tb-btn-heading\",\n attrs: { type: \"button\", title: \"正文\" },\n on: {\n click: function($event) {\n return _vm.execFormat(\n \"formatBlock\",\n \"p\"\n )\n }\n }\n },\n [_vm._v(\"P\")]\n ),\n _c(\"span\", { staticClass: \"word-tb-sep\" }),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: {\n type: \"button\",\n title: \"无序列表\"\n },\n on: {\n click: function($event) {\n return _vm.execFormat(\n \"insertUnorderedList\"\n )\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n ),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: {\n type: \"button\",\n title: \"有序列表\"\n },\n on: {\n click: function($event) {\n return _vm.execFormat(\n \"insertOrderedList\"\n )\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n ),\n _c(\"span\", { staticClass: \"word-tb-sep\" }),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: { type: \"button\", title: \"引用\" },\n on: {\n click: function($event) {\n return _vm.execFormat(\n \"formatBlock\",\n \"blockquote\"\n )\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n ),\n _c(\n \"button\",\n {\n staticClass: \"word-tb-btn\",\n attrs: {\n type: \"button\",\n title: \"清除格式\"\n },\n on: {\n click: function($event) {\n return _vm.execFormat(\"removeFormat\")\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\",\n fill: \"currentColor\"\n }\n })\n ]\n )\n ]\n )\n ]),\n _c(\"div\", {\n ref: \"wordEditor\",\n staticClass: \"word-editor-content\",\n attrs: { contenteditable: \"true\" },\n on: { input: _vm.onWordInput }\n })\n ]\n ],\n 2\n )\n ])\n : _vm._e()\n ],\n 2\n )\n : _vm._e()\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/DocumentForm.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%2268609640-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1136
1148
|
|
|
1137
1149
|
/***/ }),
|
|
1138
1150
|
|
|
@@ -1144,7 +1156,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
|
|
|
1144
1156
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
1145
1157
|
|
|
1146
1158
|
"use strict";
|
|
1147
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"kb-document-list\" },\n [\n _c(\"div\", { staticClass: \"doc-toolbar\" }, [\n _c(\n \"div\",\n { staticClass: \"doc-toolbar-left\" },\n [\n _c(\"el-input\", {\n staticClass: \"search-input\",\n attrs: {\n placeholder: \"搜索文件标题...\",\n \"prefix-icon\": \"el-icon-search\",\n size: \"small\",\n clearable: \"\"\n },\n on: { clear: _vm.handleSearch },\n nativeOn: {\n keyup: function($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k($event.keyCode, \"enter\", 13, $event.key, \"Enter\")\n ) {\n return null\n }\n return _vm.handleSearch.apply(null, arguments)\n }\n },\n model: {\n value: _vm.searchKeyword,\n callback: function($$v) {\n _vm.searchKeyword = $$v\n },\n expression: \"searchKeyword\"\n }\n }),\n _c(\n \"el-button\",\n {\n attrs: {\n type: \"primary\",\n size: \"small\",\n icon: \"el-icon-search\",\n disabled: !_vm.companyId\n },\n on: { click: _vm.handleSearch }\n },\n [_vm._v(\"搜索\")]\n ),\n _c(\n \"el-button\",\n {\n staticClass: \"kb-add-doc-btn\",\n attrs: { type: \"success\", size: \"small\", icon: \"el-icon-plus\" },\n on: { click: _vm.handleAdd }\n },\n [_vm._v(\"新增文档\")]\n ),\n _c(\n \"el-button\",\n {\n attrs: {\n type: \"danger\",\n size: \"small\",\n icon: \"el-icon-delete\",\n disabled: !_vm.selectedRows.length\n },\n on: { click: _vm.handleBatchDelete }\n },\n [\n _vm._v(\n \" 批量删除\" +\n _vm._s(\n _vm.selectedRows.length\n ? \" (\" + _vm.selectedRows.length + \")\"\n : \"\"\n ) +\n \" \"\n )\n ]\n ),\n _c(\n \"el-button\",\n {\n attrs: {\n type: \"warning\",\n size: \"small\",\n icon: \"el-icon-folder-opened\",\n disabled: !_vm.selectedRows.length\n },\n on: { click: _vm.handleBatchMove }\n },\n [\n _vm._v(\n \" 批量移动\" +\n _vm._s(\n _vm.selectedRows.length\n ? \" (\" + _vm.selectedRows.length + \")\"\n : \"\"\n ) +\n \" \"\n )\n ]\n )\n ],\n 1\n )\n ]),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"loading\",\n rawName: \"v-loading\",\n value: _vm.loading,\n expression: \"loading\"\n }\n ],\n staticClass: \"doc-table-wrap\"\n },\n [\n _c(\n \"el-table\",\n {\n ref: \"tableRef\",\n attrs: {\n data: _vm.list,\n stripe: \"\",\n height: \"100%\",\n \"header-cell-style\": {\n background: \"#f5f7fa\",\n color: \"#333\",\n fontWeight: \"600\"\n }\n },\n on: { \"selection-change\": _vm.handleSelectionChange }\n },\n [\n _c(\"el-table-column\", {\n attrs: {\n type: \"selection\",\n width: \"48\",\n align: \"center\",\n selectable: _vm.rowSelectable\n }\n }),\n _c(\"el-table-column\", {\n attrs: { label: \"ID\", prop: \"id\", width: \"70\", align: \"center\" }\n }),\n _c(\"el-table-column\", {\n attrs: {\n label: \"文件标题\",\n prop: \"title\",\n \"min-width\": \"200\",\n \"show-overflow-tooltip\": \"\"\n },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(ref) {\n var row = ref.row\n return [\n _c(\"div\", { staticClass: \"file-title-cell\" }, [\n _c(\"img\", {\n staticClass: \"file-icon-img\",\n attrs: {\n src: _vm.getFileIconUrl(row.fileType),\n alt: \"\"\n }\n }),\n _c(\"span\", [_vm._v(_vm._s(row.title))])\n ])\n ]\n }\n }\n ])\n }),\n _c(\"el-table-column\", {\n attrs: {\n label: \"类型\",\n prop: \"fileType\",\n width: \"100\",\n align: \"center\"\n },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(ref) {\n var row = ref.row\n return [\n _c(\n \"el-tag\",\n { attrs: { size: \"mini\", effect: \"plain\" } },\n [_vm._v(_vm._s(row.fileType))]\n )\n ]\n }\n }\n ])\n }),\n _c(\"el-table-column\", {\n attrs: { label: \"大小\", width: \"100\", align: \"center\" },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(ref) {\n var row = ref.row\n return [_vm._v(_vm._s(_vm.formatSize(row.fileSize)))]\n }\n }\n ])\n }),\n _c(\"el-table-column\", {\n attrs: { label: \"索引状态\", width: \"110\", align: \"center\" },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(ref) {\n var row = ref.row\n return [\n _c(\n \"el-tag\",\n {\n attrs: {\n type: _vm.indexTagType(row.indexStatus),\n size: \"small\",\n effect: \"plain\"\n }\n },\n [\n _vm._v(\n \" \" +\n _vm._s(_vm.indexTagText(row.indexStatus)) +\n \" \"\n )\n ]\n )\n ]\n }\n }\n ])\n }),\n _c(\"el-table-column\", {\n attrs: { label: \"创建时间\", width: \"165\", align: \"center\" },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(ref) {\n var row = ref.row\n return [_vm._v(_vm._s(_vm.formatTime(row.createTime)))]\n }\n }\n ])\n }),\n _c(\"el-table-column\", {\n attrs: {\n label: \"操作\",\n width: \"380\",\n fixed: \"right\",\n align: \"center\"\n },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(ref) {\n var row = ref.row\n return [\n _c(\n \"el-button\",\n {\n attrs: {\n size: \"mini\",\n type: \"text\",\n icon: \"el-icon-view\"\n },\n on: {\n click: function($event) {\n return _vm.handlePreview(row)\n }\n }\n },\n [_vm._v(\"预览\")]\n ),\n _c(\n \"el-button\",\n {\n attrs: {\n size: \"mini\",\n type: \"text\",\n icon: \"el-icon-edit\"\n },\n on: {\n click: function($event) {\n return _vm.handleEdit(row)\n }\n }\n },\n [_vm._v(\"编辑\")]\n ),\n row.indexStatus !== 2\n ? _c(\n \"el-button\",\n {\n staticClass: \"kb-index-btn\",\n attrs: {\n size: \"mini\",\n type: \"text\",\n icon: \"el-icon-coin\"\n },\n on: {\n click: function($event) {\n return _vm.handleIndex(row)\n }\n }\n },\n [\n _vm._v(\n _vm._s(\n row.indexStatus === 1 ? \"重建\" : \"索引\"\n )\n )\n ]\n )\n : _vm._e(),\n _c(\n \"el-button\",\n {\n staticStyle: { color: \"#f56c6c\" },\n attrs: {\n size: \"mini\",\n type: \"text\",\n icon: \"el-icon-delete\"\n },\n on: {\n click: function($event) {\n return _vm.handleDelete(row)\n }\n }\n },\n [_vm._v(\"删除\")]\n )\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"div\",\n { staticClass: \"doc-pagination\" },\n [\n _c(\"el-pagination\", {\n attrs: {\n \"current-page\": _vm.page,\n \"page-sizes\": [10, 20, 50, 100],\n \"page-size\": _vm.pageSize,\n layout: \"total, sizes, prev, pager, next, jumper\",\n total: _vm.total,\n background: \"\"\n },\n on: {\n \"size-change\": _vm.handleSizeChange,\n \"current-change\": _vm.handleCurrentChange\n }\n })\n ],\n 1\n ),\n _c(\"DocumentForm\", {\n ref: \"docFormRef\",\n attrs: { \"company-id\": _vm.companyId, \"folder-list\": _vm.categoryList }\n }),\n _c(\n \"el-dialog\",\n {\n attrs: {\n visible: _vm.previewVisible,\n width: \"1080px\",\n top: \"8vh\",\n \"close-on-click-modal\": false,\n \"custom-class\": \"wps-preview-dialog\"\n },\n on: {\n \"update:visible\": function($event) {\n _vm.previewVisible = $event\n }\n }\n },\n [\n _c(\"template\", { slot: \"title\" }, [\n _c(\"div\", { staticClass: \"wps-dialog-header\" }, [\n _c(\"div\", { staticClass: \"wps-dialog-left\" }, [\n _c(\"img\", {\n staticClass: \"wps-dialog-icon-img\",\n attrs: {\n src: _vm.getFileIconUrl(\n _vm.previewFile && _vm.previewFile.fileType\n ),\n alt: \"\"\n }\n }),\n _c(\"span\", { staticClass: \"wps-dialog-name\" }, [\n _vm._v(\n _vm._s(\n _vm.previewFile\n ? _vm.previewFile.title ||\n _vm.previewFile.fileName ||\n \"在线预览\"\n : \"在线预览\"\n )\n )\n ]),\n _c(\"span\", { staticClass: \"wps-dialog-badge\" }, [\n _c(\"i\", { staticClass: \"el-icon-view\" }),\n _vm._v(\" 只读预览\")\n ])\n ])\n ])\n ]),\n _c(\n \"div\",\n { staticClass: \"preview-body\" },\n [\n _vm.previewType === \"image\"\n ? _c(\"div\", { staticClass: \"preview-center\" }, [\n _c(\"img\", {\n staticStyle: {\n \"max-width\": \"100%\",\n \"max-height\": \"100%\"\n },\n attrs: { src: _vm.previewFile.fileUrl }\n })\n ])\n : _vm.previewType === \"pdf\"\n ? _c(\"div\", { staticClass: \"preview-page-canvas\" }, [\n _c(\"div\", { staticClass: \"preview-page paper-pdf\" }, [\n _c(\"iframe\", {\n staticClass: \"preview-frame\",\n attrs: { src: _vm.pdfBlobUrl }\n })\n ])\n ])\n : _vm.previewType === \"xlsx\"\n ? _c(\"div\", { staticClass: \"preview-page-canvas\" }, [\n _c(\n \"div\",\n { staticClass: \"preview-page\" },\n [\n _vm.xlsxLoading\n ? _c(\"div\", { staticClass: \"preview-loading\" }, [\n _c(\"i\", { staticClass: \"el-icon-loading\" }),\n _vm._v(\" 正在解析 Excel 文件...\")\n ])\n : [\n _c(\n \"div\",\n { staticClass: \"preview-xlsx-toolbar\" },\n _vm._l(_vm.xlsxSheetNames, function(name) {\n return _c(\n \"span\",\n {\n key: name,\n staticClass: \"preview-xlsx-tab\",\n class: {\n active: _vm.xlsxCurrentSheet === name\n },\n on: {\n click: function($event) {\n _vm.xlsxCurrentSheet = name\n _vm.renderXlsxSheet()\n }\n }\n },\n [_vm._v(_vm._s(name))]\n )\n }),\n 0\n ),\n _c(\n \"div\",\n { staticClass: \"preview-xlsx-table-wrap\" },\n [\n _vm.hasMoreRows\n ? _c(\n \"div\",\n { staticClass: \"preview-xlsx-notice\" },\n [\n _vm._v(\n \" 预览仅显示前 \" +\n _vm._s(_vm.maxPreviewRows) +\n \" 行数据(共更多行),完整数据请下载后查看 \"\n )\n ]\n )\n : _vm._e(),\n _vm.xlsxTableData.length\n ? _c(\n \"table\",\n {\n staticClass: \"preview-xlsx-table\",\n attrs: { contenteditable: \"false\" }\n },\n [\n _c(\"thead\", [\n _c(\n \"tr\",\n _vm._l(_vm.xlsxCols, function(\n col,\n ci\n ) {\n return _c(\"th\", { key: ci }, [\n _vm._v(_vm._s(col))\n ])\n }),\n 0\n )\n ]),\n _c(\n \"tbody\",\n _vm._l(_vm.xlsxTableData, function(\n row,\n ri\n ) {\n return _c(\n \"tr\",\n { key: ri },\n _vm._l(_vm.xlsxCols, function(\n col,\n ci\n ) {\n return _c(\"td\", { key: ci }, [\n _vm._v(_vm._s(row[ci]))\n ])\n }),\n 0\n )\n }),\n 0\n )\n ]\n )\n : _c(\"el-empty\", {\n attrs: {\n description: \"当前 Sheet 无数据\"\n }\n })\n ],\n 1\n )\n ]\n ],\n 2\n )\n ])\n : _vm.previewType === \"docx\"\n ? _c(\"div\", { staticClass: \"preview-page-canvas\" }, [\n _c(\"div\", { staticClass: \"preview-page\" }, [\n _vm.docxLoading\n ? _c(\"div\", { staticClass: \"preview-loading\" }, [\n _c(\"i\", { staticClass: \"el-icon-loading\" }),\n _vm._v(\" 正在解析 Word 文件...\")\n ])\n : _c(\"div\", {\n staticClass: \"preview-docx-content\",\n attrs: { contenteditable: \"false\" },\n domProps: { innerHTML: _vm._s(_vm.docxHtml) }\n })\n ])\n ])\n : _vm.previewType === \"text\"\n ? _c(\"div\", { staticClass: \"preview-page-canvas\" }, [\n _c(\"div\", { staticClass: \"preview-page\" }, [\n _c(\"div\", {\n staticClass: \"preview-markdown\",\n attrs: { contenteditable: \"false\" },\n domProps: { innerHTML: _vm._s(_vm.previewHtml) }\n })\n ])\n ])\n : _c(\"el-empty\", {\n attrs: { description: \"该文件类型暂不支持在线预览\" }\n })\n ],\n 1\n )\n ],\n 2\n ),\n _c(\n \"el-dialog\",\n {\n attrs: {\n title: \"批量移动文件\",\n visible: _vm.moveVisible,\n width: \"420px\",\n \"close-on-click-modal\": false,\n \"append-to-body\": \"\",\n \"custom-class\": \"kb-move-dialog\"\n },\n on: {\n \"update:visible\": function($event) {\n _vm.moveVisible = $event\n }\n }\n },\n [\n _c(\"div\", { staticClass: \"move-tip\" }, [\n _vm._v(\" 已选 \"),\n _c(\"span\", { staticClass: \"move-count\" }, [\n _vm._v(_vm._s(_vm.selectedRows.length))\n ]),\n _vm._v(\" 个文件,移动到: \"),\n _c(\n \"span\",\n { class: _vm.moveFolderId ? \"move-target\" : \"move-target-empty\" },\n [_vm._v(_vm._s(_vm.moveTargetName || \"请选择文件夹\"))]\n )\n ]),\n _c(\n \"div\",\n { staticClass: \"move-folder-wrap\" },\n [\n _c(\"el-tree\", {\n ref: \"moveTreeRef\",\n attrs: {\n data: _vm.moveFolderTree,\n props: _vm.folderTreeProps,\n \"node-key\": \"id\",\n \"highlight-current\": \"\",\n \"expand-on-click-node\": false,\n \"default-expand-all\": \"\"\n },\n on: { \"node-click\": _vm.handleMoveFolderSelect }\n })\n ],\n 1\n ),\n _c(\n \"div\",\n { attrs: { slot: \"footer\" }, slot: \"footer\" },\n [\n _c(\n \"el-button\",\n {\n attrs: { size: \"small\" },\n on: {\n click: function($event) {\n _vm.moveVisible = false\n }\n }\n },\n [_vm._v(\"取消\")]\n ),\n _c(\n \"el-button\",\n {\n attrs: {\n size: \"small\",\n type: \"primary\",\n loading: _vm.moving,\n disabled: !_vm.moveFolderId\n },\n on: { click: _vm.handleMoveConfirm }\n },\n [_vm._v(\"确定移动\")]\n )\n ],\n 1\n )\n ]\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/DocumentList.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%2268609640-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1159
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"kb-document-list\" },\n [\n _c(\"div\", { staticClass: \"doc-toolbar\" }, [\n _c(\n \"div\",\n { staticClass: \"doc-toolbar-left\" },\n [\n !_vm.isMobile\n ? [\n _c(\"el-input\", {\n staticClass: \"search-input\",\n attrs: {\n placeholder: \"搜索文件标题...\",\n \"prefix-icon\": \"el-icon-search\",\n size: \"small\",\n clearable: \"\"\n },\n on: { clear: _vm.handleSearch },\n nativeOn: {\n keyup: function($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k(\n $event.keyCode,\n \"enter\",\n 13,\n $event.key,\n \"Enter\"\n )\n ) {\n return null\n }\n return _vm.handleSearch.apply(null, arguments)\n }\n },\n model: {\n value: _vm.searchKeyword,\n callback: function($$v) {\n _vm.searchKeyword = $$v\n },\n expression: \"searchKeyword\"\n }\n }),\n _c(\n \"el-button\",\n {\n attrs: {\n type: \"primary\",\n size: \"small\",\n icon: \"el-icon-search\",\n disabled: !_vm.companyId\n },\n on: { click: _vm.handleSearch }\n },\n [_vm._v(\"搜索\")]\n )\n ]\n : [\n _c(\n \"div\",\n {\n staticClass: \"doc-m-search\",\n class: { \"doc-m-search--inline\": _vm.isLandscape }\n },\n [\n _c(\n \"svg\",\n {\n staticClass: \"doc-m-search-icon\",\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"#909399\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M15.5 14h-.79l-.28-.27a6.5 6.5 0 0 0 1.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 0 0-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 0 0 5.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"\n }\n })\n ]\n ),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.searchKeyword,\n expression: \"searchKeyword\"\n }\n ],\n staticClass: \"doc-m-search-input\",\n attrs: { placeholder: \"搜索文件标题...\" },\n domProps: { value: _vm.searchKeyword },\n on: {\n keyup: function($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k(\n $event.keyCode,\n \"enter\",\n 13,\n $event.key,\n \"Enter\"\n )\n ) {\n return null\n }\n return _vm.handleSearch.apply(null, arguments)\n },\n input: function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.searchKeyword = $event.target.value\n }\n }\n }),\n _c(\n \"button\",\n {\n staticClass: \"doc-m-search-btn\",\n attrs: { disabled: !_vm.companyId },\n on: { click: _vm.handleSearch }\n },\n [_vm._v(\"搜索\")]\n )\n ]\n ),\n _vm.isLandscape\n ? [\n _c(\n \"button\",\n {\n staticClass: \"doc-m-tbtn add\",\n on: { click: _vm.handleAdd }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"14\",\n height: \"14\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d: \"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\n }\n })\n ]\n ),\n _vm._v(\" 新增文档 \")\n ]\n ),\n _vm.selectedRows.length\n ? _c(\n \"button\",\n {\n staticClass: \"doc-m-tbtn danger\",\n on: { click: _vm.handleBatchDelete }\n },\n [\n _vm._v(\n \"删除 (\" +\n _vm._s(_vm.selectedRows.length) +\n \")\"\n )\n ]\n )\n : _vm._e(),\n _vm.selectedRows.length\n ? _c(\n \"button\",\n {\n staticClass: \"doc-m-tbtn warning\",\n on: { click: _vm.handleBatchMove }\n },\n [\n _vm._v(\n \"移动 (\" +\n _vm._s(_vm.selectedRows.length) +\n \")\"\n )\n ]\n )\n : _vm._e()\n ]\n : _vm._e()\n ],\n !_vm.isMobile\n ? [\n _c(\n \"el-button\",\n {\n staticClass: \"kb-add-doc-btn\",\n attrs: {\n type: \"success\",\n size: \"small\",\n icon: \"el-icon-plus\"\n },\n on: { click: _vm.handleAdd }\n },\n [_vm._v(\"新增文档\")]\n ),\n _c(\n \"el-button\",\n {\n attrs: {\n type: \"danger\",\n size: \"small\",\n icon: \"el-icon-delete\",\n disabled: !_vm.selectedRows.length\n },\n on: { click: _vm.handleBatchDelete }\n },\n [\n _vm._v(\n \" 批量删除\" +\n _vm._s(\n _vm.selectedRows.length\n ? \" (\" + _vm.selectedRows.length + \")\"\n : \"\"\n ) +\n \" \"\n )\n ]\n ),\n _c(\n \"el-button\",\n {\n attrs: {\n type: \"warning\",\n size: \"small\",\n icon: \"el-icon-folder-opened\",\n disabled: !_vm.selectedRows.length\n },\n on: { click: _vm.handleBatchMove }\n },\n [\n _vm._v(\n \" 批量移动\" +\n _vm._s(\n _vm.selectedRows.length\n ? \" (\" + _vm.selectedRows.length + \")\"\n : \"\"\n ) +\n \" \"\n )\n ]\n )\n ]\n : _vm._e()\n ],\n 2\n )\n ]),\n _vm.isMobile && !_vm.isLandscape\n ? _c(\"div\", { staticClass: \"doc-toolbar-m\" }, [\n _c(\n \"button\",\n { staticClass: \"doc-m-tbtn add\", on: { click: _vm.handleAdd } },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"14\",\n height: \"14\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: { d: \"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" }\n })\n ]\n ),\n _vm._v(\" 新增文档 \")\n ]\n ),\n _vm.selectedRows.length\n ? _c(\n \"button\",\n {\n staticClass: \"doc-m-tbtn danger\",\n on: { click: _vm.handleBatchDelete }\n },\n [_vm._v(\"删除 (\" + _vm._s(_vm.selectedRows.length) + \")\")]\n )\n : _vm._e(),\n _vm.selectedRows.length\n ? _c(\n \"button\",\n {\n staticClass: \"doc-m-tbtn warning\",\n on: { click: _vm.handleBatchMove }\n },\n [_vm._v(\"移动 (\" + _vm._s(_vm.selectedRows.length) + \")\")]\n )\n : _vm._e()\n ])\n : _vm._e(),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"loading\",\n rawName: \"v-loading\",\n value: _vm.loading,\n expression: \"loading\"\n }\n ],\n staticClass: \"doc-table-wrap\"\n },\n [\n !_vm.isMobile\n ? _c(\n \"el-table\",\n {\n ref: \"tableRef\",\n attrs: {\n data: _vm.list,\n stripe: \"\",\n height: \"100%\",\n \"header-cell-style\": {\n background: \"#f5f7fa\",\n color: \"#333\",\n fontWeight: \"600\"\n }\n },\n on: { \"selection-change\": _vm.handleSelectionChange }\n },\n [\n _c(\"el-table-column\", {\n attrs: {\n type: \"selection\",\n width: \"48\",\n align: \"center\",\n selectable: _vm.rowSelectable\n }\n }),\n _c(\"el-table-column\", {\n attrs: {\n label: \"ID\",\n prop: \"id\",\n width: \"70\",\n align: \"center\"\n }\n }),\n _c(\"el-table-column\", {\n attrs: {\n label: \"文件标题\",\n prop: \"title\",\n \"min-width\": \"200\",\n \"show-overflow-tooltip\": \"\"\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var row = ref.row\n return [\n _c(\"div\", { staticClass: \"file-title-cell\" }, [\n _c(\"img\", {\n staticClass: \"file-icon-img\",\n attrs: {\n src: _vm.getFileIconUrl(row.fileType),\n alt: \"\"\n }\n }),\n _c(\"span\", [_vm._v(_vm._s(row.title))])\n ])\n ]\n }\n }\n ],\n null,\n false,\n 2271877784\n )\n }),\n _c(\"el-table-column\", {\n attrs: {\n label: \"类型\",\n prop: \"fileType\",\n width: \"100\",\n align: \"center\"\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var row = ref.row\n return [\n _c(\n \"el-tag\",\n { attrs: { size: \"mini\", effect: \"plain\" } },\n [_vm._v(_vm._s(row.fileType))]\n )\n ]\n }\n }\n ],\n null,\n false,\n 1434489073\n )\n }),\n _c(\"el-table-column\", {\n attrs: { label: \"大小\", width: \"100\", align: \"center\" },\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var row = ref.row\n return [\n _vm._v(_vm._s(_vm.formatSize(row.fileSize)))\n ]\n }\n }\n ],\n null,\n false,\n 1973057115\n )\n }),\n _c(\"el-table-column\", {\n attrs: { label: \"索引状态\", width: \"110\", align: \"center\" },\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var row = ref.row\n return [\n _c(\n \"el-tag\",\n {\n attrs: {\n type: _vm.indexTagType(row.indexStatus),\n size: \"small\",\n effect: \"plain\"\n }\n },\n [\n _vm._v(\n \" \" +\n _vm._s(\n _vm.indexTagText(row.indexStatus)\n ) +\n \" \"\n )\n ]\n )\n ]\n }\n }\n ],\n null,\n false,\n 2960107196\n )\n }),\n _c(\"el-table-column\", {\n attrs: { label: \"创建时间\", width: \"165\", align: \"center\" },\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var row = ref.row\n return [\n _vm._v(_vm._s(_vm.formatTime(row.createTime)))\n ]\n }\n }\n ],\n null,\n false,\n 3593352281\n )\n }),\n _c(\"el-table-column\", {\n attrs: {\n label: \"操作\",\n width: \"380\",\n fixed: \"right\",\n align: \"center\"\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"default\",\n fn: function(ref) {\n var row = ref.row\n return [\n _c(\n \"el-button\",\n {\n attrs: {\n size: \"mini\",\n type: \"text\",\n icon: \"el-icon-view\"\n },\n on: {\n click: function($event) {\n return _vm.handlePreview(row)\n }\n }\n },\n [_vm._v(\"预览\")]\n ),\n _c(\n \"el-button\",\n {\n attrs: {\n size: \"mini\",\n type: \"text\",\n icon: \"el-icon-edit\"\n },\n on: {\n click: function($event) {\n return _vm.handleEdit(row)\n }\n }\n },\n [_vm._v(\"编辑\")]\n ),\n row.indexStatus !== 2\n ? _c(\n \"el-button\",\n {\n staticClass: \"kb-index-btn\",\n attrs: {\n size: \"mini\",\n type: \"text\",\n icon: \"el-icon-coin\"\n },\n on: {\n click: function($event) {\n return _vm.handleIndex(row)\n }\n }\n },\n [\n _vm._v(\n _vm._s(\n row.indexStatus === 1\n ? \"重建\"\n : \"索引\"\n )\n )\n ]\n )\n : _vm._e(),\n _c(\n \"el-button\",\n {\n staticStyle: { color: \"#f56c6c\" },\n attrs: {\n size: \"mini\",\n type: \"text\",\n icon: \"el-icon-delete\"\n },\n on: {\n click: function($event) {\n return _vm.handleDelete(row)\n }\n }\n },\n [_vm._v(\"删除\")]\n )\n ]\n }\n }\n ],\n null,\n false,\n 3695529472\n )\n })\n ],\n 1\n )\n : !_vm.isLandscape\n ? _c(\n \"div\",\n { staticClass: \"doc-m-list\" },\n [\n _vm._l(_vm.list, function(row) {\n return _c(\n \"div\",\n {\n key: row.id,\n staticClass: \"doc-m-card\",\n class: { selected: _vm.docMSelected(row) },\n on: {\n click: function($event) {\n return _vm.handlePreview(row)\n }\n }\n },\n [\n _c(\"input\", {\n staticClass: \"doc-m-check\",\n attrs: {\n type: \"checkbox\",\n disabled: row.indexStatus === 2\n },\n domProps: { checked: _vm.docMSelected(row) },\n on: {\n click: function($event) {\n $event.stopPropagation()\n },\n change: function($event) {\n return _vm.toggleMSelected(row)\n }\n }\n }),\n _c(\"img\", {\n staticClass: \"doc-m-icon\",\n attrs: {\n src: _vm.getFileIconUrl(row.fileType),\n alt: \"\"\n }\n }),\n _c(\"div\", { staticClass: \"doc-m-info\" }, [\n _c(\"div\", { staticClass: \"doc-m-title\" }, [\n _vm._v(_vm._s(row.title))\n ]),\n _c(\"div\", { staticClass: \"doc-m-meta\" }, [\n _c(\n \"span\",\n {\n staticClass: \"doc-m-tag\",\n class:\n \"tag-\" + _vm.indexTagType(row.indexStatus)\n },\n [\n _vm._v(\n _vm._s(_vm.indexTagText(row.indexStatus))\n )\n ]\n ),\n _c(\"span\", [\n _vm._v(_vm._s(_vm.formatSize(row.fileSize)))\n ]),\n _c(\"span\", [\n _vm._v(_vm._s(_vm.formatTime(row.createTime)))\n ])\n ])\n ]),\n _c(\"div\", { staticClass: \"doc-m-actions\" }, [\n _c(\n \"span\",\n {\n staticClass: \"doc-m-btn\",\n on: {\n click: function($event) {\n $event.stopPropagation()\n return _vm.handleEdit(row)\n }\n }\n },\n [_vm._v(\"编辑\")]\n ),\n row.indexStatus !== 2\n ? _c(\n \"span\",\n {\n staticClass: \"doc-m-btn\",\n on: {\n click: function($event) {\n $event.stopPropagation()\n return _vm.handleIndex(row)\n }\n }\n },\n [\n _vm._v(\n _vm._s(\n row.indexStatus === 1 ? \"重建\" : \"索引\"\n )\n )\n ]\n )\n : _vm._e(),\n _c(\n \"span\",\n {\n staticClass: \"doc-m-btn doc-m-del\",\n on: {\n click: function($event) {\n $event.stopPropagation()\n return _vm.handleDelete(row)\n }\n }\n },\n [_vm._v(\"删除\")]\n )\n ])\n ]\n )\n }),\n !_vm.loading && _vm.list.length === 0\n ? _c(\"div\", { staticClass: \"doc-m-empty\" }, [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"36\",\n height: \"36\",\n fill: \"#c0c4cc\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zm-1 7V3.5L18.5 9H13zM6 20V4h5v7h7v9H6z\"\n }\n })\n ]\n ),\n _c(\"div\", [_vm._v(\"暂无文档\")])\n ])\n : _vm._e()\n ],\n 2\n )\n : _c(\"div\", { staticClass: \"doc-m-table-wrap\" }, [\n _c(\"table\", { staticClass: \"doc-m-table\" }, [\n _c(\"colgroup\", [\n _c(\"col\", { staticStyle: { width: \"44px\" } }),\n _c(\"col\", { staticStyle: { width: \"52px\" } }),\n _c(\"col\"),\n _c(\"col\", { staticStyle: { width: \"78px\" } }),\n _c(\"col\", { staticStyle: { width: \"76px\" } }),\n _c(\"col\", { staticStyle: { width: \"88px\" } }),\n _c(\"col\", { staticStyle: { width: \"138px\" } }),\n _c(\"col\", { staticStyle: { width: \"220px\" } })\n ]),\n _c(\"thead\", [\n _c(\"tr\", [\n _c(\"th\", { staticClass: \"col-check\" }, [\n _c(\"input\", {\n staticClass: \"doc-m-check\",\n attrs: {\n type: \"checkbox\",\n indeterminate: _vm.isIndeterminate\n },\n domProps: { checked: _vm.isAllSelected },\n on: { change: _vm.toggleSelectAll }\n })\n ]),\n _c(\"th\", [_vm._v(\"ID\")]),\n _c(\"th\", [_vm._v(\"文件标题\")]),\n _c(\"th\", [_vm._v(\"类型\")]),\n _c(\"th\", [_vm._v(\"大小\")]),\n _c(\"th\", [_vm._v(\"索引状态\")]),\n _c(\"th\", [_vm._v(\"创建时间\")]),\n _c(\"th\", [_vm._v(\"操作\")])\n ])\n ]),\n _c(\n \"tbody\",\n _vm._l(_vm.list, function(row) {\n return _c(\n \"tr\",\n {\n key: row.id,\n class: {\n selected:\n _vm.rowSelectable(row) && _vm.docMSelected(row)\n }\n },\n [\n _c(\"td\", { staticClass: \"col-check\" }, [\n _c(\"input\", {\n staticClass: \"doc-m-check\",\n attrs: {\n type: \"checkbox\",\n disabled: !_vm.rowSelectable(row)\n },\n domProps: { checked: _vm.docMSelected(row) },\n on: {\n change: function($event) {\n return _vm.toggleMSelected(row)\n }\n }\n })\n ]),\n _c(\"td\", { staticClass: \"col-id\" }, [\n _vm._v(_vm._s(row.id))\n ]),\n _c(\n \"td\",\n {\n staticClass: \"col-title\",\n attrs: { title: row.title },\n on: {\n click: function($event) {\n return _vm.handlePreview(row)\n }\n }\n },\n [\n _c(\"img\", {\n staticClass: \"doc-m-tb-icon\",\n attrs: {\n src: _vm.getFileIconUrl(row.fileType),\n alt: \"\"\n }\n }),\n _c(\"span\", { staticClass: \"doc-m-tb-title\" }, [\n _vm._v(_vm._s(row.title))\n ])\n ]\n ),\n _c(\"td\", { staticClass: \"col-center\" }, [\n _c(\"span\", { staticClass: \"doc-m-tb-tag\" }, [\n _vm._v(_vm._s(row.fileType))\n ])\n ]),\n _c(\"td\", { staticClass: \"col-center\" }, [\n _vm._v(_vm._s(_vm.formatSize(row.fileSize)))\n ]),\n _c(\"td\", { staticClass: \"col-center\" }, [\n _c(\n \"span\",\n {\n staticClass: \"doc-m-tb-tag\",\n class:\n \"tag-\" + _vm.indexTagType(row.indexStatus)\n },\n [\n _vm._v(\n _vm._s(_vm.indexTagText(row.indexStatus))\n )\n ]\n )\n ]),\n _c(\"td\", { staticClass: \"col-center col-time\" }, [\n _vm._v(_vm._s(_vm.formatTime(row.createTime)))\n ]),\n _c(\"td\", { staticClass: \"col-ops\" }, [\n _c(\n \"button\",\n {\n staticClass: \"doc-m-tb-btn\",\n on: {\n click: function($event) {\n $event.stopPropagation()\n return _vm.handlePreview(row)\n }\n }\n },\n [_vm._v(\"预览\")]\n ),\n _c(\n \"button\",\n {\n staticClass: \"doc-m-tb-btn\",\n on: {\n click: function($event) {\n $event.stopPropagation()\n return _vm.handleEdit(row)\n }\n }\n },\n [_vm._v(\"编辑\")]\n ),\n row.indexStatus !== 2\n ? _c(\n \"button\",\n {\n staticClass: \"doc-m-tb-btn\",\n on: {\n click: function($event) {\n $event.stopPropagation()\n return _vm.handleIndex(row)\n }\n }\n },\n [\n _vm._v(\n _vm._s(\n row.indexStatus === 1 ? \"重建\" : \"索引\"\n )\n )\n ]\n )\n : _vm._e(),\n _c(\n \"button\",\n {\n staticClass: \"doc-m-tb-btn doc-m-del\",\n on: {\n click: function($event) {\n $event.stopPropagation()\n return _vm.handleDelete(row)\n }\n }\n },\n [_vm._v(\"删除\")]\n )\n ])\n ]\n )\n }),\n 0\n )\n ]),\n !_vm.loading && _vm.list.length === 0\n ? _c(\"div\", { staticClass: \"doc-m-empty\" }, [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"36\",\n height: \"36\",\n fill: \"#c0c4cc\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zm-1 7V3.5L18.5 9H13zM6 20V4h5v7h7v9H6z\"\n }\n })\n ]\n ),\n _c(\"div\", [_vm._v(\"暂无文档\")])\n ])\n : _vm._e()\n ])\n ],\n 1\n ),\n !_vm.isMobile\n ? _c(\n \"div\",\n { staticClass: \"doc-pagination\" },\n [\n _c(\"el-pagination\", {\n attrs: {\n \"current-page\": _vm.page,\n \"page-sizes\": [10, 20, 50, 100],\n \"page-size\": _vm.pageSize,\n layout: \"total, sizes, prev, pager, next, jumper\",\n total: _vm.total,\n background: \"\"\n },\n on: {\n \"size-change\": _vm.handleSizeChange,\n \"current-change\": _vm.handleCurrentChange\n }\n })\n ],\n 1\n )\n : _vm.isLandscape\n ? _c(\"div\", { staticClass: \"doc-m-pager\" }, [\n _c(\"span\", { staticClass: \"doc-m-pager-total\" }, [\n _vm._v(\"共 \" + _vm._s(_vm.total) + \" 条\")\n ]),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.number\",\n value: _vm.pageSize,\n expression: \"pageSize\",\n modifiers: { number: true }\n }\n ],\n staticClass: \"doc-m-pager-select\",\n on: {\n change: [\n function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return _vm._n(val)\n })\n _vm.pageSize = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n },\n function($event) {\n return _vm.handleSizeChange(_vm.pageSize)\n }\n ]\n }\n },\n [\n _c(\"option\", { domProps: { value: 10 } }, [_vm._v(\"10 条/页\")]),\n _c(\"option\", { domProps: { value: 20 } }, [_vm._v(\"20 条/页\")]),\n _c(\"option\", { domProps: { value: 50 } }, [_vm._v(\"50 条/页\")]),\n _c(\"option\", { domProps: { value: 100 } }, [\n _vm._v(\"100 条/页\")\n ])\n ]\n ),\n _c(\n \"button\",\n {\n staticClass: \"doc-m-pager-btn\",\n attrs: { disabled: _vm.page <= 1 },\n on: {\n click: function($event) {\n return _vm.handleCurrentChange(_vm.page - 1)\n }\n }\n },\n [_vm._v(\"上一页\")]\n ),\n _c(\"span\", { staticClass: \"doc-m-pager-cur\" }, [\n _vm._v(_vm._s(_vm.page) + \" / \" + _vm._s(_vm.totalPages))\n ]),\n _c(\n \"button\",\n {\n staticClass: \"doc-m-pager-btn\",\n attrs: { disabled: _vm.page >= _vm.totalPages },\n on: {\n click: function($event) {\n return _vm.handleCurrentChange(_vm.page + 1)\n }\n }\n },\n [_vm._v(\"下一页\")]\n )\n ])\n : !_vm.loading && _vm.list.length < _vm.total\n ? _c(\n \"div\",\n { staticClass: \"doc-m-more\", on: { click: _vm.loadMore } },\n [\n _vm._v(\n \" 加载更多(\" +\n _vm._s(_vm.list.length) +\n \"/\" +\n _vm._s(_vm.total) +\n \") \"\n )\n ]\n )\n : _vm._e(),\n _c(\"DocumentForm\", {\n ref: \"docFormRef\",\n attrs: {\n \"company-id\": _vm.companyId,\n \"folder-list\": _vm.categoryList,\n \"is-mobile\": _vm.isMobile\n }\n }),\n !_vm.isMobile\n ? _c(\n \"el-dialog\",\n {\n attrs: {\n visible: _vm.previewVisible,\n width: \"1080px\",\n top: \"8vh\",\n fullscreen: !!_vm.isMobile,\n \"close-on-click-modal\": false,\n \"custom-class\": \"wps-preview-dialog\"\n },\n on: {\n \"update:visible\": function($event) {\n _vm.previewVisible = $event\n }\n }\n },\n [\n _c(\"template\", { slot: \"title\" }, [\n _c(\"div\", { staticClass: \"wps-dialog-header\" }, [\n _c(\"div\", { staticClass: \"wps-dialog-left\" }, [\n _c(\"img\", {\n staticClass: \"wps-dialog-icon-img\",\n attrs: {\n src: _vm.getFileIconUrl(\n _vm.previewFile && _vm.previewFile.fileType\n ),\n alt: \"\"\n }\n }),\n _c(\"span\", { staticClass: \"wps-dialog-name\" }, [\n _vm._v(\n _vm._s(\n _vm.previewFile\n ? _vm.previewFile.title ||\n _vm.previewFile.fileName ||\n \"在线预览\"\n : \"在线预览\"\n )\n )\n ]),\n _c(\"span\", { staticClass: \"wps-dialog-badge\" }, [\n _c(\"i\", { staticClass: \"el-icon-view\" }),\n _vm._v(\" 只读预览\")\n ])\n ])\n ])\n ]),\n _c(\n \"div\",\n { staticClass: \"preview-body\" },\n [\n _vm.previewType === \"image\"\n ? _c(\"div\", { staticClass: \"preview-center\" }, [\n _c(\"img\", {\n staticStyle: {\n \"max-width\": \"100%\",\n \"max-height\": \"100%\"\n },\n attrs: { src: _vm.previewFile.fileUrl }\n })\n ])\n : _vm.previewType === \"pdf\"\n ? _c(\"div\", { staticClass: \"preview-page-canvas\" }, [\n _c(\"div\", { staticClass: \"preview-page paper-pdf\" }, [\n _c(\"iframe\", {\n staticClass: \"preview-frame\",\n attrs: { src: _vm.pdfBlobUrl }\n })\n ])\n ])\n : _vm.previewType === \"xlsx\"\n ? _c(\"div\", { staticClass: \"preview-page-canvas\" }, [\n _c(\n \"div\",\n { staticClass: \"preview-page\" },\n [\n _vm.xlsxLoading\n ? _c(\"div\", { staticClass: \"preview-loading\" }, [\n _c(\"i\", { staticClass: \"el-icon-loading\" }),\n _vm._v(\" 正在解析 Excel 文件...\")\n ])\n : [\n _c(\n \"div\",\n { staticClass: \"preview-xlsx-toolbar\" },\n _vm._l(_vm.xlsxSheetNames, function(name) {\n return _c(\n \"span\",\n {\n key: name,\n staticClass: \"preview-xlsx-tab\",\n class: {\n active:\n _vm.xlsxCurrentSheet === name\n },\n on: {\n click: function($event) {\n _vm.xlsxCurrentSheet = name\n _vm.renderXlsxSheet()\n }\n }\n },\n [_vm._v(_vm._s(name))]\n )\n }),\n 0\n ),\n _c(\n \"div\",\n { staticClass: \"preview-xlsx-table-wrap\" },\n [\n _vm.hasMoreRows\n ? _c(\n \"div\",\n {\n staticClass: \"preview-xlsx-notice\"\n },\n [\n _vm._v(\n \" 预览仅显示前 \" +\n _vm._s(_vm.maxPreviewRows) +\n \" 行数据(共更多行),完整数据请下载后查看 \"\n )\n ]\n )\n : _vm._e(),\n _vm.xlsxTableData.length\n ? _c(\n \"table\",\n {\n staticClass: \"preview-xlsx-table\",\n attrs: {\n contenteditable: \"false\"\n }\n },\n [\n _c(\"thead\", [\n _c(\n \"tr\",\n _vm._l(_vm.xlsxCols, function(\n col,\n ci\n ) {\n return _c(\n \"th\",\n { key: ci },\n [_vm._v(_vm._s(col))]\n )\n }),\n 0\n )\n ]),\n _c(\n \"tbody\",\n _vm._l(\n _vm.xlsxTableData,\n function(row, ri) {\n return _c(\n \"tr\",\n { key: ri },\n _vm._l(\n _vm.xlsxCols,\n function(col, ci) {\n return _c(\n \"td\",\n { key: ci },\n [\n _vm._v(\n _vm._s(row[ci])\n )\n ]\n )\n }\n ),\n 0\n )\n }\n ),\n 0\n )\n ]\n )\n : _c(\"el-empty\", {\n attrs: {\n description: \"当前 Sheet 无数据\"\n }\n })\n ],\n 1\n )\n ]\n ],\n 2\n )\n ])\n : _vm.previewType === \"docx\"\n ? _c(\"div\", { staticClass: \"preview-page-canvas\" }, [\n _c(\"div\", { staticClass: \"preview-page\" }, [\n _vm.docxLoading\n ? _c(\"div\", { staticClass: \"preview-loading\" }, [\n _c(\"i\", { staticClass: \"el-icon-loading\" }),\n _vm._v(\" 正在解析 Word 文件...\")\n ])\n : _c(\"div\", {\n staticClass: \"preview-docx-content\",\n attrs: { contenteditable: \"false\" },\n domProps: { innerHTML: _vm._s(_vm.docxHtml) }\n })\n ])\n ])\n : _vm.previewType === \"text\"\n ? _c(\"div\", { staticClass: \"preview-page-canvas\" }, [\n _c(\"div\", { staticClass: \"preview-page\" }, [\n _c(\"div\", {\n staticClass: \"preview-markdown\",\n attrs: { contenteditable: \"false\" },\n domProps: { innerHTML: _vm._s(_vm.previewHtml) }\n })\n ])\n ])\n : _c(\"el-empty\", {\n attrs: { description: \"该文件类型暂不支持在线预览\" }\n })\n ],\n 1\n )\n ],\n 2\n )\n : _vm._e(),\n _vm.isMobile\n ? _c(\n \"MobileDialog\",\n {\n attrs: {\n visible: _vm.previewVisible,\n title: _vm.previewFile\n ? _vm.previewFile.title ||\n _vm.previewFile.fileName ||\n \"在线预览\"\n : \"在线预览\",\n fullscreen: \"\"\n },\n on: {\n \"update:visible\": function($event) {\n _vm.previewVisible = $event\n }\n }\n },\n [\n _c(\"div\", { staticClass: \"preview-body preview-body--m\" }, [\n _vm.previewType === \"image\"\n ? _c(\"div\", { staticClass: \"preview-center\" }, [\n _c(\"img\", {\n staticStyle: {\n \"max-width\": \"100%\",\n \"max-height\": \"100%\"\n },\n attrs: { src: _vm.previewFile.fileUrl }\n })\n ])\n : _vm.previewType === \"pdf\"\n ? _c(\"div\", { staticClass: \"preview-page-canvas\" }, [\n _c(\"div\", { staticClass: \"preview-page paper-pdf\" }, [\n _c(\"iframe\", {\n staticClass: \"preview-frame\",\n attrs: { src: _vm.pdfBlobUrl }\n })\n ])\n ])\n : _vm.previewType === \"xlsx\"\n ? _c(\"div\", { staticClass: \"preview-page-canvas\" }, [\n _c(\n \"div\",\n { staticClass: \"preview-page\" },\n [\n _vm.xlsxLoading\n ? _c(\"div\", { staticClass: \"kbm-loading\" }, [\n _vm._v(\"正在解析 Excel 文件...\")\n ])\n : [\n _c(\n \"div\",\n { staticClass: \"preview-xlsx-toolbar\" },\n _vm._l(_vm.xlsxSheetNames, function(name) {\n return _c(\n \"span\",\n {\n key: name,\n staticClass: \"preview-xlsx-tab\",\n class: {\n active: _vm.xlsxCurrentSheet === name\n },\n on: {\n click: function($event) {\n _vm.xlsxCurrentSheet = name\n _vm.renderXlsxSheet()\n }\n }\n },\n [_vm._v(_vm._s(name))]\n )\n }),\n 0\n ),\n _c(\n \"div\",\n { staticClass: \"preview-xlsx-table-wrap\" },\n [\n _vm.hasMoreRows\n ? _c(\n \"div\",\n {\n staticClass: \"preview-xlsx-notice\"\n },\n [\n _vm._v(\n \" 预览仅显示前 \" +\n _vm._s(_vm.maxPreviewRows) +\n \" 行数据(共更多行),完整数据请下载后查看 \"\n )\n ]\n )\n : _vm._e(),\n _vm.xlsxTableData.length\n ? _c(\n \"table\",\n {\n staticClass: \"preview-xlsx-table\",\n attrs: { contenteditable: \"false\" }\n },\n [\n _c(\"thead\", [\n _c(\n \"tr\",\n _vm._l(_vm.xlsxCols, function(\n col,\n ci\n ) {\n return _c(\"th\", { key: ci }, [\n _vm._v(_vm._s(col))\n ])\n }),\n 0\n )\n ]),\n _c(\n \"tbody\",\n _vm._l(\n _vm.xlsxTableData,\n function(row, ri) {\n return _c(\n \"tr\",\n { key: ri },\n _vm._l(\n _vm.xlsxCols,\n function(col, ci) {\n return _c(\n \"td\",\n { key: ci },\n [\n _vm._v(\n _vm._s(row[ci])\n )\n ]\n )\n }\n ),\n 0\n )\n }\n ),\n 0\n )\n ]\n )\n : _c(\n \"div\",\n { staticClass: \"kbm-empty\" },\n [_vm._v(\"当前 Sheet 无数据\")]\n )\n ]\n )\n ]\n ],\n 2\n )\n ])\n : _vm.previewType === \"docx\"\n ? _c(\"div\", { staticClass: \"preview-page-canvas\" }, [\n _c(\"div\", { staticClass: \"preview-page\" }, [\n _vm.docxLoading\n ? _c(\"div\", { staticClass: \"kbm-loading\" }, [\n _vm._v(\"正在解析 Word 文件...\")\n ])\n : _c(\"div\", {\n staticClass: \"preview-docx-content\",\n attrs: { contenteditable: \"false\" },\n domProps: { innerHTML: _vm._s(_vm.docxHtml) }\n })\n ])\n ])\n : _vm.previewType === \"text\"\n ? _c(\"div\", { staticClass: \"preview-page-canvas\" }, [\n _c(\"div\", { staticClass: \"preview-page\" }, [\n _c(\"div\", {\n staticClass: \"preview-markdown\",\n attrs: { contenteditable: \"false\" },\n domProps: { innerHTML: _vm._s(_vm.previewHtml) }\n })\n ])\n ])\n : _c(\"div\", { staticClass: \"kbm-empty\" }, [\n _vm._v(\"该文件类型暂不支持在线预览\")\n ])\n ])\n ]\n )\n : _vm._e(),\n !_vm.isMobile\n ? _c(\n \"el-dialog\",\n {\n attrs: {\n title: \"批量移动文件\",\n visible: _vm.moveVisible,\n width: \"420px\",\n \"close-on-click-modal\": false,\n \"append-to-body\": \"\",\n \"custom-class\": \"kb-move-dialog\"\n },\n on: {\n \"update:visible\": function($event) {\n _vm.moveVisible = $event\n }\n }\n },\n [\n _c(\"div\", { staticClass: \"move-tip\" }, [\n _vm._v(\" 已选 \"),\n _c(\"span\", { staticClass: \"move-count\" }, [\n _vm._v(_vm._s(_vm.selectedRows.length))\n ]),\n _vm._v(\" 个文件,移动到: \"),\n _c(\n \"span\",\n {\n class: _vm.moveFolderId\n ? \"move-target\"\n : \"move-target-empty\"\n },\n [_vm._v(_vm._s(_vm.moveTargetName || \"请选择文件夹\"))]\n )\n ]),\n _c(\n \"div\",\n { staticClass: \"move-folder-wrap\" },\n [\n _c(\"el-tree\", {\n ref: \"moveTreeRef\",\n attrs: {\n data: _vm.moveFolderTree,\n props: _vm.folderTreeProps,\n \"node-key\": \"id\",\n \"highlight-current\": \"\",\n \"expand-on-click-node\": false,\n \"default-expand-all\": \"\"\n },\n on: { \"node-click\": _vm.handleMoveFolderSelect }\n })\n ],\n 1\n ),\n _c(\n \"div\",\n { attrs: { slot: \"footer\" }, slot: \"footer\" },\n [\n _c(\n \"el-button\",\n {\n attrs: { size: \"small\" },\n on: {\n click: function($event) {\n _vm.moveVisible = false\n }\n }\n },\n [_vm._v(\"取消\")]\n ),\n _c(\n \"el-button\",\n {\n attrs: {\n size: \"small\",\n type: \"primary\",\n loading: _vm.moving,\n disabled: !_vm.moveFolderId\n },\n on: { click: _vm.handleMoveConfirm }\n },\n [_vm._v(\"确定移动\")]\n )\n ],\n 1\n )\n ]\n )\n : _vm._e(),\n _vm.isMobile\n ? _c(\n \"MobileDialog\",\n {\n attrs: { visible: _vm.moveVisible, title: \"批量移动文件\" },\n on: {\n \"update:visible\": function($event) {\n _vm.moveVisible = $event\n }\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"footer\",\n fn: function() {\n return [\n _c(\n \"button\",\n {\n staticClass: \"kbm-btn\",\n on: {\n click: function($event) {\n _vm.moveVisible = false\n }\n }\n },\n [_vm._v(\"取消\")]\n ),\n _c(\n \"button\",\n {\n staticClass: \"kbm-btn primary\",\n attrs: {\n disabled: !_vm.moveFolderId || _vm.moving\n },\n on: { click: _vm.handleMoveConfirm }\n },\n [\n _vm._v(\n _vm._s(_vm.moving ? \"移动中...\" : \"确定移动\")\n )\n ]\n )\n ]\n },\n proxy: true\n }\n ],\n null,\n false,\n 3294445435\n )\n },\n [\n _c(\"div\", { staticClass: \"move-tip\" }, [\n _vm._v(\" 已选 \"),\n _c(\"span\", { staticClass: \"move-count\" }, [\n _vm._v(_vm._s(_vm.selectedRows.length))\n ]),\n _vm._v(\" 个文件,移动到: \"),\n _c(\n \"span\",\n {\n class: _vm.moveFolderId\n ? \"move-target\"\n : \"move-target-empty\"\n },\n [_vm._v(_vm._s(_vm.moveTargetName || \"请选择文件夹\"))]\n )\n ]),\n _c(\n \"div\",\n { staticClass: \"kbm-move-list\" },\n _vm._l(_vm.moveFolderFlat, function(f) {\n return _c(\n \"div\",\n {\n key: f.node.id,\n staticClass: \"kbm-move-row\",\n class: { active: _vm.moveFolderId === f.node.id },\n style: { paddingLeft: 10 + f.depth * 16 + \"px\" },\n on: {\n click: function($event) {\n return _vm.handleMoveFolderSelect(f.node)\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"15\",\n height: \"15\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M10 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z\"\n }\n })\n ]\n ),\n _c(\"span\", { staticClass: \"kbm-move-name\" }, [\n _vm._v(_vm._s(f.node.name))\n ])\n ]\n )\n }),\n 0\n )\n ]\n )\n : _vm._e()\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/DocumentList.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%2268609640-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1148
1160
|
|
|
1149
1161
|
/***/ }),
|
|
1150
1162
|
|
|
@@ -1156,7 +1168,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
|
|
|
1156
1168
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
1157
1169
|
|
|
1158
1170
|
"use strict";
|
|
1159
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"kb-chat-root\" }, [\n _c(\n \"div\",\n {\n staticClass: \"kb-chat-sidebar\",\n class: {\n collapsed: _vm.sidebarCollapsed || _vm.sessionList.length === 0\n }\n },\n [\n _c(\"div\", { staticClass: \"sidebar-header\" }, [\n _c(\n \"div\",\n { staticClass: \"sidebar-title\", attrs: { title: \"会话列表\" } },\n [_vm._v(\"会话列表\")]\n ),\n _c(\n \"button\",\n {\n staticClass: \"new-chat-btn\",\n attrs: { title: \"新建会话\", disabled: _vm.noDocument },\n on: { click: _vm.handleNewSession }\n },\n [_c(\"i\", { staticClass: \"el-icon-circle-plus-outline\" })]\n )\n ]),\n _c(\n \"div\",\n { staticClass: \"sidebar-list\" },\n [\n _vm._l(_vm.sessionList, function(item) {\n return _c(\n \"div\",\n {\n key: item.sessionId,\n staticClass: \"session-item\",\n class: {\n active: item.sessionId === _vm.activeSessionId,\n \"is-locked\": _vm.noDocument\n },\n on: {\n click: function($event) {\n return _vm.handleSelectSession(item)\n }\n }\n },\n [\n _c(\"div\", { staticClass: \"session-item-main\" }, [\n _c(\n \"div\",\n {\n staticClass: \"session-item-title\",\n attrs: { title: item.title }\n },\n [_vm._v(_vm._s(item.title || \"新对话\"))]\n ),\n _c(\n \"div\",\n {\n staticClass: \"session-item-sub\",\n attrs: { title: item.lastContent }\n },\n [_vm._v(_vm._s(item.lastContent || \"暂无消息\"))]\n )\n ]),\n _c(\n \"div\",\n { staticClass: \"session-item-right\" },\n [\n _c(\"div\", { staticClass: \"session-item-time\" }, [\n _vm._v(\n _vm._s(\n _vm.formatTime(\n item.lastTime ||\n item.updateTime ||\n item.createTime\n )\n )\n )\n ]),\n _c(\n \"el-dropdown\",\n {\n staticClass: \"session-more-menu\",\n attrs: { trigger: \"click\" },\n on: {\n command: function(cmd) {\n return _vm.handleSessionMenu(cmd, item)\n }\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass: \"session-more-btn\",\n on: {\n click: function($event) {\n $event.stopPropagation()\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"\n }\n })\n ]\n )\n ]\n ),\n _c(\n \"el-dropdown-menu\",\n { attrs: { slot: \"dropdown\" }, slot: \"dropdown\" },\n [\n _c(\n \"el-dropdown-item\",\n {\n attrs: {\n command: \"rename\",\n icon: \"el-icon-edit-outline\"\n }\n },\n [_vm._v(\"重命名\")]\n ),\n _vm.sessionList.length > 1\n ? _c(\n \"el-dropdown-item\",\n {\n attrs: {\n command: \"delete\",\n icon: \"el-icon-delete\",\n divided: \"\"\n }\n },\n [_vm._v(\"删除\")]\n )\n : _vm._e()\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n ]\n )\n }),\n _vm.sessionList.length === 0\n ? _c(\"div\", { staticClass: \"sidebar-empty\" }, [\n _vm._v(\"暂无会话,点击「新对话」开始\")\n ])\n : _vm._e()\n ],\n 2\n )\n ]\n ),\n _c(\"div\", { staticClass: \"kb-chat-main\" }, [\n _vm.sessionList.length > 0\n ? _c(\n \"button\",\n {\n staticClass: \"sidebar-toggle-btn\",\n class: { collapsed: _vm.sidebarCollapsed },\n attrs: { title: \"收起/展开会话列表\" },\n on: {\n click: function($event) {\n _vm.sidebarCollapsed = !_vm.sidebarCollapsed\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"18\",\n height: \"18\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d: \"M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z\"\n }\n })\n ]\n )\n ]\n )\n : _vm._e(),\n _c(\"div\", { staticClass: \"chat-header\" }, [\n _c(\"div\", { staticClass: \"header-left\" }, [\n _c(\"div\", { staticClass: \"agent-info\" }, [\n _c(\"div\", { staticClass: \"agent-avatar\" }, [\n _c(\"img\", {\n staticClass: \"avatar-image\",\n attrs: { src: _vm.aiAvatar, alt: \"AI\" }\n })\n ]),\n _vm._m(0)\n ])\n ])\n ]),\n _c(\n \"div\",\n { ref: \"messagesRef\", staticClass: \"chat-body\" },\n [\n !_vm.activeSessionId\n ? _c(\"div\", { staticClass: \"welcome welcome-loading\" }, [\n _c(\"div\", { staticClass: \"welcome-title\" }, [\n _vm._v(\"知识库 AI 助手\")\n ]),\n _c(\"div\", { staticClass: \"welcome-text\" }, [\n _vm._v(\"正在初始化会话...\")\n ])\n ])\n : _vm.messages.length === 0\n ? _c(\"div\", { staticClass: \"chat-empty-welcome\" }, [\n _c(\"div\", { staticClass: \"welcome-card\" }, [\n _c(\"div\", { staticClass: \"welcome-avatar-box\" }, [\n _c(\"div\", {\n staticClass: \"welcome-avatar has-chat-agent-img\",\n style: { backgroundImage: \"url(\" + _vm.aiAvatar + \")\" }\n })\n ]),\n _vm._m(1)\n ]),\n _c(\"div\", { staticClass: \"guess-box\" }, [\n _c(\"div\", { staticClass: \"guess-title\" }, [\n _c(\n \"svg\",\n {\n attrs: {\n width: \"16\",\n height: \"16\",\n viewBox: \"0 0 24 24\",\n fill: \"#1677ff\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-1-13h2v6h-2zm0 8h2v2h-2z\"\n }\n })\n ]\n ),\n _c(\"span\", [_vm._v(\"猜您想问\")])\n ]),\n _c(\n \"div\",\n { staticClass: \"tag-wrap\" },\n _vm._l(_vm.suggestedQuestions, function(question) {\n return _c(\n \"div\",\n {\n key: question,\n staticClass: \"quick-tag\",\n on: {\n click: function($event) {\n return _vm.handleSend(question)\n }\n }\n },\n [_vm._v(\" \" + _vm._s(question) + \" \")]\n )\n }),\n 0\n )\n ])\n ])\n : _vm._l(_vm.messages, function(msg, idx) {\n return _c(\n \"div\",\n {\n key: msg._key || \"m-\" + idx,\n staticClass: \"msg-row\",\n class: msg.role\n },\n [\n _c(\"div\", { staticClass: \"msg-main\" }, [\n msg.role === \"assistant\"\n ? _c(\"img\", {\n staticClass: \"message-avatar\",\n attrs: { src: _vm.aiAvatar, alt: \"AI\" }\n })\n : _vm.hasUserAvatar\n ? _c(\"img\", {\n staticClass: \"message-avatar\",\n attrs: { src: _vm.userAvatar, alt: \"用户\" }\n })\n : _c(\n \"div\",\n { staticClass: \"message-avatar user-text-avatar\" },\n [_vm._v(_vm._s(_vm.userAvatarText))]\n ),\n _c(\"div\", { staticClass: \"msg-content\" }, [\n _c(\"div\", { staticClass: \"bubble\", class: msg.role }, [\n msg.role === \"assistant\" && msg.thinking\n ? _c(\n \"details\",\n {\n staticClass: \"thinking-details\",\n attrs: { open: msg.loading }\n },\n [\n _c(\n \"summary\",\n { staticClass: \"thinking-summary\" },\n [_vm._v(\"💭 思考过程\")]\n ),\n _c(\"div\", {\n staticClass: \"thinking-body\",\n domProps: {\n innerHTML: _vm._s(\n _vm.escapeHtml(msg.thinking)\n )\n }\n })\n ]\n )\n : _vm._e(),\n msg.loading && msg.content\n ? _c(\"div\", {\n staticClass: \"final-content\",\n attrs: { \"aria-live\": \"polite\" },\n domProps: {\n innerHTML: _vm._s(\n _vm.renderStreaming(msg.content, msg._key)\n )\n }\n })\n : msg.content\n ? _c(\"div\", {\n staticClass: \"final-content\",\n domProps: {\n innerHTML: _vm._s(\n _vm.renderMarkdown(msg.content)\n )\n }\n })\n : _vm._e(),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n _vm.showToolInfo &&\n msg.toolCalls &&\n msg.toolCalls.length,\n expression:\n \"showToolInfo && msg.toolCalls && msg.toolCalls.length\"\n }\n ],\n staticClass: \"tool-calls\"\n },\n _vm._l(msg.toolCalls, function(tc, ti) {\n return _c(\n \"div\",\n { key: ti, staticClass: \"tool-item\" },\n [\n _c(\"span\", { staticClass: \"tool-badge\" }, [\n _vm._v(\"工具返回\")\n ]),\n _c(\"pre\", [\n _vm._v(\n _vm._s(tc.substring(0, 300)) +\n _vm._s(tc.length > 300 ? \"...\" : \"\")\n )\n ])\n ]\n )\n }),\n 0\n ),\n msg.loading && !msg.content\n ? _c(\"div\", { staticClass: \"typing\" }, [\n _c(\"span\", { staticClass: \"phrase\" }, [\n _vm._v(\"思考中\")\n ]),\n _vm._m(2, true)\n ])\n : _vm._e()\n ]),\n msg.role === \"assistant\" && msg.content && !msg.loading\n ? _c(\"div\", { staticClass: \"msg-actions\" }, [\n _c(\n \"span\",\n {\n staticClass: \"action-btn\",\n on: {\n click: function($event) {\n return _vm.copyText(msg.content)\n }\n }\n },\n [_vm._v(\"复制\")]\n ),\n _c(\"span\", { staticClass: \"ai-badge\" }, [\n _vm._v(\"AI 生成(仅供参考)\")\n ])\n ])\n : _vm._e()\n ])\n ])\n ]\n )\n })\n ],\n 2\n ),\n _c(\"div\", { staticClass: \"chat-footer\" }, [\n _c(\"div\", { staticClass: \"input-area\" }, [\n _c(\"textarea\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.inputText,\n expression: \"inputText\"\n }\n ],\n ref: \"taRef\",\n staticClass: \"chat-textarea\",\n attrs: {\n placeholder: \"请输入消息\",\n maxlength: \"300\",\n disabled: !_vm.activeSessionId || _vm.streaming\n },\n domProps: { value: _vm.inputText },\n on: {\n input: [\n function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.inputText = $event.target.value\n },\n _vm.autoResizeTextarea\n ],\n keydown: [\n function($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k($event.keyCode, \"enter\", 13, $event.key, \"Enter\")\n ) {\n return null\n }\n if (\n $event.ctrlKey ||\n $event.shiftKey ||\n $event.altKey ||\n $event.metaKey\n ) {\n return null\n }\n $event.preventDefault()\n return _vm.handleSend.apply(null, arguments)\n },\n function($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k($event.keyCode, \"enter\", 13, $event.key, \"Enter\")\n ) {\n return null\n }\n if (!$event.ctrlKey) {\n return null\n }\n return _vm.newLine.apply(null, arguments)\n }\n ]\n }\n }),\n !_vm.streaming\n ? _c(\n \"button\",\n {\n staticClass: \"send-btn\",\n class: { active: _vm.inputText.trim() },\n attrs: {\n disabled: !_vm.activeSessionId || !_vm.inputText.trim()\n },\n on: { click: _vm.handleSend }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"20\",\n height: \"20\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: { d: \"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\" }\n })\n ]\n )\n ]\n )\n : _vm._e(),\n _vm.streaming\n ? _c(\n \"button\",\n { staticClass: \"stop-btn\", on: { click: _vm.handleStop } },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"18\",\n height: \"18\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"rect\", {\n attrs: {\n x: \"6\",\n y: \"6\",\n width: \"12\",\n height: \"12\",\n rx: \"2\"\n }\n })\n ]\n )\n ]\n )\n : _vm._e()\n ])\n ]),\n _vm.noDocument\n ? _c(\"div\", { staticClass: \"kb-no-doc-mask\" }, [_vm._m(3)])\n : _vm._e()\n ])\n ])\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"agent-text\" }, [\n _c(\"div\", { staticClass: \"agent-name\" }, [_vm._v(\"知识库 AI\")]),\n _c(\"div\", { staticClass: \"agent-desc\" }, [\n _vm._v(\"基于企业知识库智能问答\")\n ])\n ])\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"welcome-text-group\" }, [\n _c(\"div\", { staticClass: \"text-sm\" }, [_vm._v(\"您好,我是知识库 AI\")]),\n _c(\"div\", { staticClass: \"text-lg\" }, [\n _vm._v(\"我可以帮您快速查找和解读企业知识\")\n ])\n ])\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"span\", { staticClass: \"dots\" }, [\n _c(\"span\"),\n _c(\"span\"),\n _c(\"span\")\n ])\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"kb-no-doc-box\" }, [\n _c(\"div\", { staticClass: \"kb-no-doc-icon\" }, [\n _c(\"i\", { staticClass: \"el-icon-lock\" })\n ]),\n _c(\"div\", { staticClass: \"kb-no-doc-text\" }, [\n _vm._v(\"当前知识库没有资料,请联系管理员上传\")\n ])\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/KbChatMain.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%2268609640-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1171
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n {\n staticClass: \"kb-chat-root\",\n class: {\n \"is-mobile\": _vm.isMobileActive,\n \"h5-list-mode\": _vm.isMobileActive && _vm.showH5List\n }\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"kb-chat-sidebar\",\n class: {\n collapsed: _vm.sidebarCollapsed || _vm.sessionList.length === 0\n }\n },\n [\n _c(\"div\", { staticClass: \"sidebar-header\" }, [\n _c(\n \"div\",\n { staticClass: \"sidebar-title\", attrs: { title: \"会话列表\" } },\n [_vm._v(\"会话列表\")]\n ),\n _c(\n \"button\",\n {\n staticClass: \"new-chat-btn\",\n attrs: { title: \"新建会话\", disabled: _vm.noDocument },\n on: { click: _vm.handleNewSession }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"18\",\n height: \"18\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11h-4v4h-2v-4H7v-2h4V7h2v4h4v2z\"\n }\n })\n ]\n )\n ]\n )\n ]),\n _c(\n \"div\",\n { staticClass: \"sidebar-list\" },\n [\n _vm._l(_vm.sessionList, function(item) {\n return _c(\n \"div\",\n {\n key: item.sessionId,\n staticClass: \"session-item\",\n class: {\n active: item.sessionId === _vm.activeSessionId,\n \"is-locked\": _vm.noDocument\n },\n on: {\n click: function($event) {\n return _vm.handleSelectSession(item)\n }\n }\n },\n [\n _c(\"div\", { staticClass: \"session-item-main\" }, [\n _c(\n \"div\",\n {\n staticClass: \"session-item-title\",\n attrs: { title: item.title }\n },\n [_vm._v(_vm._s(item.title || \"新对话\"))]\n ),\n _c(\n \"div\",\n {\n staticClass: \"session-item-sub\",\n attrs: { title: item.lastContent }\n },\n [_vm._v(_vm._s(item.lastContent || \"暂无消息\"))]\n )\n ]),\n _c(\n \"div\",\n { staticClass: \"session-item-right\" },\n [\n _c(\"div\", { staticClass: \"session-item-time\" }, [\n _vm._v(\n _vm._s(\n _vm.formatTime(\n item.lastTime ||\n item.updateTime ||\n item.createTime\n )\n )\n )\n ]),\n !_vm.isMobileActive\n ? [\n _c(\n \"el-dropdown\",\n {\n staticClass: \"session-more-menu\",\n attrs: { trigger: \"click\" },\n on: {\n command: function(cmd) {\n return _vm.handleSessionMenu(cmd, item)\n }\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass: \"session-more-btn\",\n on: {\n click: function($event) {\n $event.stopPropagation()\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"\n }\n })\n ]\n )\n ]\n ),\n _c(\n \"el-dropdown-menu\",\n {\n attrs: { slot: \"dropdown\" },\n slot: \"dropdown\"\n },\n [\n _c(\n \"el-dropdown-item\",\n {\n attrs: {\n command: \"rename\",\n icon: \"el-icon-edit-outline\"\n }\n },\n [_vm._v(\"重命名\")]\n ),\n _vm.sessionList.length > 1\n ? _c(\n \"el-dropdown-item\",\n {\n attrs: {\n command: \"delete\",\n icon: \"el-icon-delete\",\n divided: \"\"\n }\n },\n [_vm._v(\"删除\")]\n )\n : _vm._e()\n ],\n 1\n )\n ],\n 1\n )\n ]\n : _c(\n \"button\",\n {\n staticClass:\n \"session-more-btn session-more-btn--m\",\n on: {\n click: function($event) {\n $event.stopPropagation()\n return _vm.openMobileAction(item)\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"\n }\n })\n ]\n )\n ]\n )\n ],\n 2\n )\n ]\n )\n }),\n _vm.sessionList.length === 0\n ? _c(\"div\", { staticClass: \"sidebar-empty\" }, [\n _vm._v(\"暂无会话,点击「新对话」开始\")\n ])\n : _vm._e()\n ],\n 2\n )\n ]\n ),\n _c(\"div\", { staticClass: \"kb-chat-main\" }, [\n !_vm.isMobileActive && _vm.sessionList.length > 0\n ? _c(\n \"button\",\n {\n staticClass: \"sidebar-toggle-btn\",\n class: { collapsed: _vm.sidebarCollapsed },\n attrs: { title: \"收起/展开会话列表\" },\n on: {\n click: function($event) {\n _vm.sidebarCollapsed = !_vm.sidebarCollapsed\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"18\",\n height: \"18\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d: \"M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z\"\n }\n })\n ]\n )\n ]\n )\n : _vm._e(),\n _vm.isMobileActive\n ? _c(\n \"button\",\n {\n staticClass: \"kb-m-chat-back\",\n attrs: { title: \"返回会话列表\" },\n on: { click: _vm.handleMobileBack }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"20\",\n height: \"20\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d: \"M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z\"\n }\n })\n ]\n )\n ]\n )\n : _vm._e(),\n _c(\"div\", { staticClass: \"chat-header\" }, [\n _c(\"div\", { staticClass: \"header-left\" }, [\n _c(\"div\", { staticClass: \"agent-info\" }, [\n _c(\"div\", { staticClass: \"agent-avatar\" }, [\n _c(\"img\", {\n staticClass: \"avatar-image\",\n attrs: { src: _vm.aiAvatar, alt: \"AI\" }\n })\n ]),\n _vm._m(0)\n ])\n ])\n ]),\n _c(\n \"div\",\n { ref: \"messagesRef\", staticClass: \"chat-body\" },\n [\n !_vm.activeSessionId\n ? _c(\"div\", { staticClass: \"welcome welcome-loading\" }, [\n _c(\"div\", { staticClass: \"welcome-title\" }, [\n _vm._v(\"知识库 AI 助手\")\n ]),\n _c(\"div\", { staticClass: \"welcome-text\" }, [\n _vm._v(\"正在初始化会话...\")\n ])\n ])\n : _vm.messages.length === 0\n ? _c(\"div\", { staticClass: \"chat-empty-welcome\" }, [\n _c(\"div\", { staticClass: \"welcome-card\" }, [\n _c(\"div\", { staticClass: \"welcome-avatar-box\" }, [\n _c(\"div\", {\n staticClass: \"welcome-avatar has-chat-agent-img\",\n style: { backgroundImage: \"url(\" + _vm.aiAvatar + \")\" }\n })\n ]),\n _vm._m(1)\n ]),\n _c(\"div\", { staticClass: \"guess-box\" }, [\n _c(\"div\", { staticClass: \"guess-title\" }, [\n _c(\n \"svg\",\n {\n attrs: {\n width: \"16\",\n height: \"16\",\n viewBox: \"0 0 24 24\",\n fill: \"#1677ff\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-1-13h2v6h-2zm0 8h2v2h-2z\"\n }\n })\n ]\n ),\n _c(\"span\", [_vm._v(\"猜您想问\")])\n ]),\n _c(\n \"div\",\n { staticClass: \"tag-wrap\" },\n _vm._l(_vm.suggestedQuestions, function(question) {\n return _c(\n \"div\",\n {\n key: question,\n staticClass: \"quick-tag\",\n on: {\n click: function($event) {\n return _vm.handleSend(question)\n }\n }\n },\n [_vm._v(\" \" + _vm._s(question) + \" \")]\n )\n }),\n 0\n )\n ]),\n _vm.isMobileActive\n ? _c(\"div\", { staticClass: \"kb-m-guide-mask\" }, [\n _c(\"div\", { staticClass: \"kb-m-guide-line\" }),\n _c(\"div\", { staticClass: \"kb-m-guide-tip\" }, [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"15\",\n height: \"15\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-1-13h2v6h-2zm0 8h2v2h-2z\"\n }\n })\n ]\n ),\n _c(\"span\", [\n _vm._v(\"在下方输入框输入问题,立即开始对话\")\n ])\n ])\n ])\n : _vm._e()\n ])\n : _vm._l(_vm.messages, function(msg, idx) {\n return _c(\n \"div\",\n {\n key: msg._key || \"m-\" + idx,\n staticClass: \"msg-row\",\n class: msg.role\n },\n [\n _c(\"div\", { staticClass: \"msg-main\" }, [\n msg.role === \"assistant\"\n ? _c(\"img\", {\n staticClass: \"message-avatar\",\n attrs: { src: _vm.aiAvatar, alt: \"AI\" }\n })\n : _vm.hasUserAvatar\n ? _c(\"img\", {\n staticClass: \"message-avatar\",\n attrs: { src: _vm.userAvatar, alt: \"用户\" }\n })\n : _c(\n \"div\",\n {\n staticClass: \"message-avatar user-text-avatar\"\n },\n [_vm._v(_vm._s(_vm.userAvatarText))]\n ),\n _c(\"div\", { staticClass: \"msg-content\" }, [\n _c(\n \"div\",\n { staticClass: \"bubble\", class: msg.role },\n [\n msg.role === \"assistant\" && msg.thinking\n ? _c(\n \"details\",\n {\n staticClass: \"thinking-details\",\n attrs: { open: msg.loading }\n },\n [\n _c(\n \"summary\",\n { staticClass: \"thinking-summary\" },\n [_vm._v(\"💭 思考过程\")]\n ),\n _c(\"div\", {\n staticClass: \"thinking-body\",\n domProps: {\n innerHTML: _vm._s(\n _vm.escapeHtml(msg.thinking)\n )\n }\n })\n ]\n )\n : _vm._e(),\n msg.loading && msg.content\n ? _c(\"div\", {\n staticClass: \"final-content\",\n attrs: { \"aria-live\": \"polite\" },\n domProps: {\n innerHTML: _vm._s(\n _vm.renderStreaming(\n msg.content,\n msg._key\n )\n )\n }\n })\n : msg.content\n ? _c(\"div\", {\n staticClass: \"final-content\",\n domProps: {\n innerHTML: _vm._s(\n _vm.renderMarkdown(msg.content)\n )\n }\n })\n : _vm._e(),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n _vm.showToolInfo &&\n msg.toolCalls &&\n msg.toolCalls.length,\n expression:\n \"showToolInfo && msg.toolCalls && msg.toolCalls.length\"\n }\n ],\n staticClass: \"tool-calls\"\n },\n _vm._l(msg.toolCalls, function(tc, ti) {\n return _c(\n \"div\",\n { key: ti, staticClass: \"tool-item\" },\n [\n _c(\n \"span\",\n { staticClass: \"tool-badge\" },\n [_vm._v(\"工具返回\")]\n ),\n _c(\"pre\", [\n _vm._v(\n _vm._s(tc.substring(0, 300)) +\n _vm._s(tc.length > 300 ? \"...\" : \"\")\n )\n ])\n ]\n )\n }),\n 0\n ),\n msg.loading && !msg.content\n ? _c(\"div\", { staticClass: \"typing\" }, [\n _c(\"span\", { staticClass: \"phrase\" }, [\n _vm._v(\"思考中\")\n ]),\n _vm._m(2, true)\n ])\n : _vm._e()\n ]\n ),\n msg.role === \"assistant\" &&\n msg.content &&\n !msg.loading\n ? _c(\"div\", { staticClass: \"msg-actions\" }, [\n _c(\n \"span\",\n {\n staticClass: \"action-btn\",\n on: {\n click: function($event) {\n return _vm.copyText(msg.content)\n }\n }\n },\n [_vm._v(\"复制\")]\n ),\n _c(\"span\", { staticClass: \"ai-badge\" }, [\n _vm._v(\"AI 生成(仅供参考)\")\n ])\n ])\n : _vm._e()\n ])\n ])\n ]\n )\n })\n ],\n 2\n ),\n _c(\"div\", { staticClass: \"chat-footer\" }, [\n _c(\"div\", { staticClass: \"input-area\" }, [\n _c(\"textarea\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.inputText,\n expression: \"inputText\"\n }\n ],\n ref: \"taRef\",\n staticClass: \"chat-textarea\",\n attrs: {\n placeholder: \"请输入消息\",\n maxlength: \"300\",\n disabled: !_vm.activeSessionId || _vm.streaming\n },\n domProps: { value: _vm.inputText },\n on: {\n input: [\n function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.inputText = $event.target.value\n },\n _vm.autoResizeTextarea\n ],\n keydown: [\n function($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k($event.keyCode, \"enter\", 13, $event.key, \"Enter\")\n ) {\n return null\n }\n if (\n $event.ctrlKey ||\n $event.shiftKey ||\n $event.altKey ||\n $event.metaKey\n ) {\n return null\n }\n $event.preventDefault()\n return _vm.handleSend.apply(null, arguments)\n },\n function($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k($event.keyCode, \"enter\", 13, $event.key, \"Enter\")\n ) {\n return null\n }\n if (!$event.ctrlKey) {\n return null\n }\n return _vm.newLine.apply(null, arguments)\n }\n ]\n }\n }),\n !_vm.streaming\n ? _c(\n \"button\",\n {\n staticClass: \"send-btn\",\n class: { active: _vm.inputText.trim() },\n attrs: {\n disabled: !_vm.activeSessionId || !_vm.inputText.trim()\n },\n on: { click: _vm.handleSend }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"20\",\n height: \"20\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: { d: \"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\" }\n })\n ]\n )\n ]\n )\n : _vm._e(),\n _vm.streaming\n ? _c(\n \"button\",\n { staticClass: \"stop-btn\", on: { click: _vm.handleStop } },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"18\",\n height: \"18\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"rect\", {\n attrs: {\n x: \"6\",\n y: \"6\",\n width: \"12\",\n height: \"12\",\n rx: \"2\"\n }\n })\n ]\n )\n ]\n )\n : _vm._e()\n ])\n ]),\n _vm.noDocument\n ? _c(\"div\", { staticClass: \"kb-no-doc-mask\" }, [\n _c(\"div\", { staticClass: \"kb-no-doc-box\" }, [\n _c(\"div\", { staticClass: \"kb-no-doc-icon\" }, [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"34\",\n height: \"34\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zM9 8V6c0-1.66 1.34-3 3-3s3 1.34 3 3v2H9z\"\n }\n })\n ]\n )\n ]),\n _c(\"div\", { staticClass: \"kb-no-doc-text\" }, [\n _vm._v(\"当前知识库没有资料,请联系管理员上传\")\n ]),\n _vm.isMobileActive\n ? _c(\"div\", { staticClass: \"kb-no-doc-mobile-tip\" }, [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"14\",\n height: \"14\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"\n }\n })\n ]\n ),\n _c(\"span\", [_vm._v(\"上传并完成索引后,即可开始智能问答\")])\n ])\n : _vm._e()\n ])\n ])\n : _vm._e()\n ]),\n _vm.isMobileActive && _vm.mobileAction\n ? _c(\n \"div\",\n {\n staticClass: \"kb-m-actionsheet\",\n on: {\n click: function($event) {\n if ($event.target !== $event.currentTarget) {\n return null\n }\n _vm.mobileAction = null\n }\n }\n },\n [\n _c(\"div\", { staticClass: \"kb-m-actionsheet-box\" }, [\n _c(\n \"div\",\n {\n staticClass: \"kb-m-actionsheet-title\",\n attrs: { title: _vm.mobileAction.title || \"新对话\" }\n },\n [\n _vm._v(\n \" \" + _vm._s(_vm.mobileAction.title || \"新对话\") + \" \"\n )\n ]\n ),\n _c(\n \"div\",\n {\n staticClass: \"kb-m-actionsheet-item\",\n on: {\n click: function($event) {\n return _vm.doMobileRename(_vm.mobileAction)\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04a.996.996 0 0 0 0-1.41l-2.34-2.34a.996.996 0 0 0-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z\"\n }\n })\n ]\n ),\n _vm._v(\"重命名 \")\n ]\n ),\n _vm.sessionList.length > 1\n ? _c(\n \"div\",\n {\n staticClass: \"kb-m-actionsheet-item danger\",\n on: {\n click: function($event) {\n return _vm.doMobileDelete(_vm.mobileAction)\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\"\n }\n })\n ]\n ),\n _vm._v(\"删除 \")\n ]\n )\n : _vm._e(),\n _c(\n \"div\",\n {\n staticClass: \"kb-m-actionsheet-cancel\",\n on: {\n click: function($event) {\n _vm.mobileAction = null\n }\n }\n },\n [_vm._v(\"取消\")]\n )\n ])\n ]\n )\n : _vm._e()\n ]\n )\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"agent-text\" }, [\n _c(\"div\", { staticClass: \"agent-name\" }, [_vm._v(\"知识库 AI\")]),\n _c(\"div\", { staticClass: \"agent-desc\" }, [\n _vm._v(\"基于企业知识库智能问答\")\n ])\n ])\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"welcome-text-group\" }, [\n _c(\"div\", { staticClass: \"text-sm\" }, [_vm._v(\"您好,我是知识库 AI\")]),\n _c(\"div\", { staticClass: \"text-lg\" }, [\n _vm._v(\"我可以帮您快速查找和解读企业知识\")\n ])\n ])\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"span\", { staticClass: \"dots\" }, [\n _c(\"span\"),\n _c(\"span\"),\n _c(\"span\")\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/KbChatMain.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%2268609640-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1160
1172
|
|
|
1161
1173
|
/***/ }),
|
|
1162
1174
|
|
|
@@ -1168,7 +1180,19 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
|
|
|
1168
1180
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
1169
1181
|
|
|
1170
1182
|
"use strict";
|
|
1171
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"kb-root\" },\n [\n _vm.hasPermission\n ? [\n _c(\"div\", { staticClass: \"kb-tabs\" }, [\n _c(\n \"button\",\n {\n staticClass: \"kb-tab\",\n class: { active: _vm.viewMode === \"manage\" },\n on: {\n click: function($event) {\n _vm.viewMode = \"manage\"\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zm-1 7V3.5L18.5 9H13zM6 20V4h5v7h7v9H6z\"\n }\n })\n ]\n ),\n _vm._v(\" 知识库管理 \")\n ]\n ),\n _c(\n \"button\",\n {\n staticClass: \"kb-tab\",\n class: { active: _vm.viewMode === \"chat\" },\n on: {\n click: function($event) {\n _vm.viewMode = \"chat\"\n }\n }\n },\n [\n _c(\"i\", { staticClass: \"el-icon-chat-dot-round\" }),\n _vm._v(\" 知识库 AI \")\n ]\n )\n ]),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.viewMode === \"manage\",\n expression: \"viewMode === 'manage'\"\n }\n ],\n staticClass: \"kb-layout\"\n },\n [\n _c(\n \"div\",\n { staticClass: \"kb-sidebar\" },\n [\n _c(\"CategoryManager\", {\n ref: \"categoryRef\",\n attrs: { \"company-id\": _vm.currentCompanyId },\n on: {\n select: _vm.handleCategorySelect,\n list: _vm.setCategoryList\n }\n })\n ],\n 1\n ),\n _c(\n \"div\",\n { staticClass: \"kb-main\" },\n [\n _c(\"DocumentList\", {\n ref: \"docListRef\",\n attrs: {\n \"selected-category\": _vm.currentCategory,\n \"category-list\": _vm.categoryList,\n \"company-id\": _vm.currentCompanyId\n },\n on: { \"move-target\": _vm.handleMoveTarget }\n })\n ],\n 1\n )\n ]\n ),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.viewMode === \"chat\",\n expression: \"viewMode === 'chat'\"\n }\n ],\n staticClass: \"kb-chat-view\"\n },\n [\n _c(\"KbChatMain\", {\n key: \"kb-chat-\" + _vm.currentCompanyId + \"-\" + _vm.userno,\n attrs: {\n \"company-id\": _vm.currentCompanyId,\n userno: _vm.userno,\n \"im-account\": _vm.imAccount,\n \"user-name\": _vm.userName\n }\n })\n ],\n 1\n )\n ]\n : [\n _c(\"KbChatMain\", {\n key: \"kb-chat-\" + _vm.currentCompanyId + \"-\" + _vm.userno,\n attrs: {\n \"company-id\": _vm.currentCompanyId,\n userno: _vm.userno,\n \"im-account\": _vm.imAccount,\n \"user-name\": _vm.userName\n }\n })\n ],\n _c(\"NewFeatureGuide\", {\n attrs: {\n visible: _vm.showGuide,\n steps: _vm.guideSteps,\n isFirstStep: _vm.isGuideFirstStep,\n isLastStep: _vm.isGuideLastStep\n },\n on: {\n \"update:isFirstStep\": function($event) {\n _vm.isGuideFirstStep = $event\n },\n \"update:is-first-step\": function($event) {\n _vm.isGuideFirstStep = $event\n },\n \"update:isLastStep\": function($event) {\n _vm.isGuideLastStep = $event\n },\n \"update:is-last-step\": function($event) {\n _vm.isGuideLastStep = $event\n },\n skip: _vm.onGuideSkip,\n complete: _vm.onGuideComplete,\n closed: _vm.handleGuideClosed\n }\n })\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/KnowledgeBaseMain.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%2268609640-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1183
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"kb-root\" },\n [\n _vm.hasPermission\n ? [\n _c(\"div\", { staticClass: \"kb-tabs\" }, [\n _c(\n \"button\",\n {\n staticClass: \"kb-tab\",\n class: { active: _vm.viewMode === \"manage\" },\n on: {\n click: function($event) {\n _vm.viewMode = \"manage\"\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zm-1 7V3.5L18.5 9H13zM6 20V4h5v7h7v9H6z\"\n }\n })\n ]\n ),\n _vm._v(\" 知识库管理 \")\n ]\n ),\n _c(\n \"button\",\n {\n staticClass: \"kb-tab\",\n class: { active: _vm.viewMode === \"chat\" },\n on: {\n click: function($event) {\n _vm.viewMode = \"chat\"\n }\n }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"16\",\n height: \"16\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-2 12H6v-2h12v2zm0-3H6V9h12v2zm0-3H6V6h12v2z\"\n }\n })\n ]\n ),\n _vm._v(\" 知识库 AI \")\n ]\n )\n ]),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.viewMode === \"manage\" && !_vm.isMobile,\n expression: \"viewMode === 'manage' && !isMobile\"\n }\n ],\n staticClass: \"kb-layout\"\n },\n [\n _c(\n \"div\",\n { staticClass: \"kb-sidebar\" },\n [\n _c(\"CategoryManager\", {\n ref: \"categoryRef\",\n attrs: {\n \"company-id\": _vm.currentCompanyId,\n \"is-mobile\": false\n },\n on: {\n select: _vm.handleCategorySelect,\n list: _vm.setCategoryList\n }\n })\n ],\n 1\n ),\n _c(\n \"div\",\n { staticClass: \"kb-main\" },\n [\n _c(\"DocumentList\", {\n ref: \"docListRef\",\n attrs: {\n \"selected-category\": _vm.currentCategory,\n \"category-list\": _vm.categoryList,\n \"company-id\": _vm.currentCompanyId,\n \"is-mobile\": false\n },\n on: { \"move-target\": _vm.handleMoveTarget }\n })\n ],\n 1\n )\n ]\n ),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.viewMode === \"manage\" && _vm.isMobile,\n expression: \"viewMode === 'manage' && isMobile\"\n }\n ],\n staticClass: \"kb-m-layout\"\n },\n [\n _c(\"div\", { staticClass: \"kb-m-navbar\" }, [\n _c(\n \"button\",\n {\n staticClass: \"kb-m-back\",\n class: { ghost: _vm.manageView === \"categories\" },\n on: { click: _vm.mobileManageBack }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"20\",\n height: \"20\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d: \"M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z\"\n }\n })\n ]\n )\n ]\n ),\n _c(\"span\", { staticClass: \"kb-m-nav-title\" }, [\n _vm._v(\n _vm._s(\n _vm.manageView === \"docs\" && _vm.currentCategory\n ? _vm.currentCategory.name || \"全部文件\"\n : _vm.manageView === \"docs\"\n ? \"全部文件\"\n : \"知识库管理\"\n )\n )\n ])\n ]),\n _c(\n \"div\",\n { staticClass: \"kb-m-page\" },\n [\n _vm.manageView === \"categories\"\n ? _c(\"CategoryManager\", {\n ref: \"categoryRef\",\n staticClass: \"kb-m-full\",\n attrs: {\n \"company-id\": _vm.currentCompanyId,\n \"is-mobile\": true\n },\n on: {\n select: _vm.handleCategorySelect,\n list: _vm.setCategoryList,\n \"docs-entry\": _vm.handleMobileGoDocs\n }\n })\n : _c(\"DocumentList\", {\n ref: \"docListRef\",\n staticClass: \"kb-m-full\",\n attrs: {\n \"selected-category\": _vm.currentCategory,\n \"category-list\": _vm.categoryList,\n \"company-id\": _vm.currentCompanyId,\n \"is-mobile\": true\n },\n on: { \"move-target\": _vm.handleMoveTarget }\n })\n ],\n 1\n )\n ]\n ),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.viewMode === \"chat\",\n expression: \"viewMode === 'chat'\"\n }\n ],\n staticClass: \"kb-chat-view\",\n class: { \"kb-chat-view--mobile\": _vm.isMobile }\n },\n [\n _c(\"KbChatMain\", {\n key: \"kb-chat-\" + _vm.currentCompanyId + \"-\" + _vm.userno,\n attrs: {\n \"company-id\": _vm.currentCompanyId,\n userno: _vm.userno,\n \"im-account\": _vm.imAccount,\n \"user-name\": _vm.userName,\n \"is-mobile\": _vm.isMobile\n }\n })\n ],\n 1\n )\n ]\n : [\n _c(\"KbChatMain\", {\n key: \"kb-chat-\" + _vm.currentCompanyId + \"-\" + _vm.userno,\n attrs: {\n \"company-id\": _vm.currentCompanyId,\n userno: _vm.userno,\n \"im-account\": _vm.imAccount,\n \"user-name\": _vm.userName\n }\n })\n ],\n _c(\"NewFeatureGuide\", {\n attrs: {\n visible: _vm.showGuide,\n steps: _vm.guideSteps,\n \"is-mobile\": _vm.isMobile,\n isFirstStep: _vm.isGuideFirstStep,\n isLastStep: _vm.isGuideLastStep\n },\n on: {\n \"update:isFirstStep\": function($event) {\n _vm.isGuideFirstStep = $event\n },\n \"update:is-first-step\": function($event) {\n _vm.isGuideFirstStep = $event\n },\n \"update:isLastStep\": function($event) {\n _vm.isGuideLastStep = $event\n },\n \"update:is-last-step\": function($event) {\n _vm.isGuideLastStep = $event\n },\n skip: _vm.onGuideSkip,\n complete: _vm.onGuideComplete,\n closed: _vm.handleGuideClosed\n }\n })\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/KnowledgeBaseMain.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%2268609640-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1184
|
+
|
|
1185
|
+
/***/ }),
|
|
1186
|
+
|
|
1187
|
+
/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"68609640-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/lib/knowledgeBase/MobileDialog.vue?vue&type=template&id=e31817a6&scoped=true&":
|
|
1188
|
+
/*!************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
1189
|
+
!*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"68609640-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/lib/knowledgeBase/MobileDialog.vue?vue&type=template&id=e31817a6&scoped=true& ***!
|
|
1190
|
+
\************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
|
|
1191
|
+
/*! exports provided: render, staticRenderFns */
|
|
1192
|
+
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
1193
|
+
|
|
1194
|
+
"use strict";
|
|
1195
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n [\n _c(\"transition\", { attrs: { name: \"kbm-dialog-fade\" } }, [\n _vm.visible\n ? _c(\"div\", {\n staticClass: \"kbm-dialog__mask\",\n on: { click: _vm.handleMaskClick }\n })\n : _vm._e()\n ]),\n _c(\"transition\", { attrs: { name: \"kbm-dialog-slide\" } }, [\n _vm.visible\n ? _c(\n \"div\",\n {\n staticClass: \"kbm-dialog\",\n class: { fullscreen: _vm.fullscreen }\n },\n [\n _c(\"div\", { staticClass: \"kbm-dialog__header\" }, [\n _c(\"span\", { staticClass: \"kbm-dialog__title\" }, [\n _vm._v(_vm._s(_vm.title))\n ]),\n _c(\n \"button\",\n {\n staticClass: \"kbm-dialog__close\",\n on: { click: _vm.close }\n },\n [\n _c(\n \"svg\",\n {\n attrs: {\n viewBox: \"0 0 24 24\",\n width: \"18\",\n height: \"18\",\n fill: \"currentColor\"\n }\n },\n [\n _c(\"path\", {\n attrs: {\n d:\n \"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\n }\n })\n ]\n )\n ]\n )\n ]),\n _c(\n \"div\",\n { staticClass: \"kbm-dialog__body\" },\n [_vm._t(\"default\")],\n 2\n ),\n _vm.$slots.footer || _vm.$scopedSlots.footer\n ? _c(\n \"div\",\n { staticClass: \"kbm-dialog__footer\" },\n [_vm._t(\"footer\")],\n 2\n )\n : _vm._e()\n ]\n )\n : _vm._e()\n ])\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/MobileDialog.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%2268609640-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1172
1196
|
|
|
1173
1197
|
/***/ }),
|
|
1174
1198
|
|
|
@@ -1686,7 +1710,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../.
|
|
|
1686
1710
|
/*! no static exports found */
|
|
1687
1711
|
/***/ (function(module, exports, __webpack_require__) {
|
|
1688
1712
|
|
|
1689
|
-
eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.kb-category-manager[data-v-9baf7408] {\\n height: 100%;\\n display: flex;\\n flex-direction: column;\\n background: #fafbfc;\\n}\\n.kb-category-manager[data-v-9baf7408],\\n.kb-category-manager *[data-v-9baf7408],\\n.kb-category-manager *[data-v-9baf7408]::before,\\n.kb-category-manager *[data-v-9baf7408]::after {\\n font-size: 16px !important;\\n}\\n.category-header[data-v-9baf7408] {\\n display: flex;\\n justify-content: space-between;\\n align-items: center;\\n padding: 14px 2px 14px 16px;\\n font-weight: 600;\\n font-size: 17px;\\n color: #303133;\\n border-bottom: 1px solid #ebeef5;\\n background: #fafbfc;\\n}\\n.category-header .category-title[data-v-9baf7408] {\\n display: inline-flex;\\n align-items: center;\\n gap: 8px;\\n}\\n.category-header .category-title[data-v-9baf7408]::before {\\n content: '';\\n width: 4px;\\n height: 16px;\\n border-radius: 2px;\\n background: linear-gradient(180deg, #409eff, #79bbff);\\n}\\n.category-header > div[data-v-9baf7408] {\\n display: flex;\\n align-items: center;\\n gap: 2px;\\n}\\n\\n/* 新建根文件夹按钮(裸图标) */\\n.add-folder-btn[data-v-9baf7408] {\\n width: 28px;\\n height: 32px;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n border: none;\\n background: transparent;\\n color: #909399;\\n cursor: pointer;\\n padding: 0;\\n font-size: 20px;\\n transition: all 0.2s;\\n}\\n.add-folder-btn[data-v-9baf7408]:hover {\\n color: #409eff;\\n}\\n.add-folder-btn[data-v-9baf7408]:active {\\n color: #3a8ee6;\\n}\\n.add-folder-btn[data-v-9baf7408]:disabled {\\n cursor: not-allowed;\\n opacity: 0.5;\\n color: #c0c4cc;\\n}\\n\\n/* 猜你想问按钮 */\\n.suggest-btn[data-v-9baf7408] {\\n width: 28px;\\n height: 32px;\\n padding: 0;\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n margin-right: 4px;\\n border: none;\\n background: transparent;\\n color: #606266;\\n cursor: pointer;\\n font-size: 20px;\\n transition: all 0.2s;\\n}\\n.suggest-btn[data-v-9baf7408]:hover {\\n color: #409eff;\\n}\\n.suggest-btn[data-v-9baf7408]:disabled {\\n cursor: not-allowed;\\n opacity: 0.5;\\n color: #c0c4cc;\\n}\\n\\n/* 弹框细节微调 */\\n[data-v-9baf7408] .kb-suggest-dialog .el-dialog__body {\\n padding-top: 14px;\\n padding-bottom: 10px;\\n}\\n[data-v-9baf7408] .kb-suggest-dialog .el-form-item {\\n margin-bottom: 14px;\\n}\\n[data-v-9baf7408] .kb-suggest-dialog .el-form-item:last-child {\\n margin-bottom: 4px;\\n}\\n[data-v-9baf7408] .kb-suggest-dialog .el-form-item__label {\\n color: #606266;\\n}\\n\\n/* 列表细滚动条 */\\n.suggest-list[data-v-9baf7408]::-webkit-scrollbar {\\n width: 6px;\\n}\\n.suggest-list[data-v-9baf7408]::-webkit-scrollbar-track {\\n background: transparent;\\n}\\n.suggest-list[data-v-9baf7408]::-webkit-scrollbar-thumb {\\n background: #dcdfe6;\\n border-radius: 3px;\\n}\\n.suggest-list[data-v-9baf7408]::-webkit-scrollbar-thumb:hover {\\n background: #c0c4cc;\\n}\\n\\n/* 添加问题虚线块 */\\n.suggest-add-btn[data-v-9baf7408] {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n gap: 6px;\\n width: 100%;\\n padding: 9px 0;\\n border: 1px dashed #dcdfe6;\\n border-radius: 8px;\\n color: #909399;\\n cursor: pointer;\\n transition: all 0.2s;\\n}\\n.suggest-add-btn[data-v-9baf7408]:hover {\\n border-color: #409eff;\\n color: #409eff;\\n background: #ecf5ff;\\n}\\n.suggest-add-btn.disabled[data-v-9baf7408] {\\n cursor: not-allowed;\\n opacity: 0.5;\\n}\\n.suggest-add-btn.disabled[data-v-9baf7408]:hover {\\n border-color: #dcdfe6;\\n color: #909399;\\n background: transparent;\\n}\\n\\n/* 猜你想问小节标题 */\\n.suggest-section-header[data-v-9baf7408] {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n margin: 2px 0 8px;\\n}\\n.suggest-section-title[data-v-9baf7408] {\\n display: flex;\\n align-items: center;\\n font-weight: 600;\\n color: #303133;\\n}\\n.suggest-section-title[data-v-9baf7408]::before {\\n content: '';\\n width: 3px;\\n height: 14px;\\n margin-right: 6px;\\n border-radius: 2px;\\n background: #409eff;\\n}\\n.category-L-button i[data-v-9baf7408]::before {\\n font-size: 21px!important;\\n}\\n.suggest-count[data-v-9baf7408] {\\n padding: 0 8px;\\n border-radius: 10px;\\n background: #f0f2f5;\\n color: #909399;\\n font-size: 12px !important;\\n line-height: 20px;\\n}\\n\\n/* 猜你想问列表 */\\n.suggest-list[data-v-9baf7408] {\\n max-height: 260px;\\n overflow-y: auto;\\n min-height: 60px;\\n background: #fafbfc;\\n border-radius: 8px;\\n padding: 6px 8px;\\n}\\n.suggest-item[data-v-9baf7408] {\\n display: flex;\\n align-items: center;\\n padding: 8px 10px;\\n border-radius: 6px;\\n transition: background 0.2s;\\n}\\n.suggest-item + .suggest-item[data-v-9baf7408] {\\n margin-top: 2px;\\n}\\n.suggest-item[data-v-9baf7408]:hover {\\n background: #ecf5ff;\\n}\\n.suggest-index[data-v-9baf7408] {\\n flex-shrink: 0;\\n width: 20px;\\n height: 20px;\\n margin-right: 8px;\\n border-radius: 50%;\\n background: #e8f1fd;\\n color: #409eff;\\n font-size: 12px !important;\\n text-align: center;\\n line-height: 20px;\\n}\\n.suggest-text[data-v-9baf7408] {\\n flex: 1;\\n min-width: 0;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n color: #303133;\\n}\\n.suggest-delete[data-v-9baf7408] {\\n flex-shrink: 0;\\n color: #c0c4cc;\\n margin-left: 8px;\\n}\\n.suggest-delete[data-v-9baf7408]:hover {\\n color: #f56c6c;\\n}\\n.suggest-empty[data-v-9baf7408] {\\n text-align: center;\\n padding: 22px 0;\\n color: #909399;\\n}\\n.suggest-empty i[data-v-9baf7408] {\\n font-size: 26px !important;\\n color: #c0c4cc;\\n}\\n.suggest-empty div[data-v-9baf7408] {\\n margin-top: 6px;\\n}\\n.suggest-input-row[data-v-9baf7408] {\\n display: flex;\\n align-items: center;\\n width: 100%;\\n gap: 4px;\\n}\\n.suggest-input-row .el-input[data-v-9baf7408] {\\n flex: 1;\\n}\\n.suggest-input-remove[data-v-9baf7408] {\\n color: #c0c4cc;\\n}\\n.suggest-input-remove[data-v-9baf7408]:hover {\\n color: #f56c6c;\\n}\\n.category-list[data-v-9baf7408] {\\n flex: 1;\\n overflow-y: auto;\\n padding: 10px 8px;\\n}\\n\\n/* 滚动条 */\\n.category-list[data-v-9baf7408]::-webkit-scrollbar {\\n width: 6px;\\n}\\n.category-list[data-v-9baf7408]::-webkit-scrollbar-track {\\n background: transparent;\\n}\\n.category-list[data-v-9baf7408]::-webkit-scrollbar-thumb {\\n background: #dcdfe6;\\n border-radius: 3px;\\n}\\n.category-list[data-v-9baf7408]::-webkit-scrollbar-thumb:hover {\\n background: #c0c4cc;\\n}\\n.tree-node[data-v-9baf7408] {\\n flex: 1;\\n display: flex;\\n align-items: center;\\n font-size: 16px;\\n padding-right: 8px;\\n overflow: hidden;\\n color: #606266;\\n}\\n.tree-icon[data-v-9baf7408] {\\n margin-right: 0px;\\n color: #909399;\\n flex-shrink: 0;\\n font-size: 16px;\\n transition: color 0.2s;\\n}\\n.tree-node:hover .tree-icon[data-v-9baf7408] {\\n color: #409eff;\\n}\\n.tree-label[data-v-9baf7408] {\\n flex: 1;\\n min-width: 0;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n font-weight: 500;\\n transition: color 0.2s;\\n}\\n\\n/* 操作按钮:默认不占宽,鼠标划上节点时才展开占据空间 */\\n.tree-actions[data-v-9baf7408] {\\n flex-shrink: 0;\\n width: 0;\\n overflow: hidden;\\n opacity: 0;\\n transition: opacity 0.2s;\\n margin-left: 0;\\n white-space: nowrap;\\n display: flex;\\n align-items: center;\\n gap: 2px;\\n}\\n\\n/* 操作按钮 */\\n.tree-actions[data-v-9baf7408] .el-button--mini,\\n.category-header[data-v-9baf7408] .el-button--mini {\\n padding: 6px;\\n font-size: 16px;\\n border-radius: 6px;\\n transition: all 0.2s;\\n border: none;\\n background: transparent;\\n margin-left: 0;\\n}\\n.tree-actions[data-v-9baf7408] .el-button--mini + .el-button--mini {\\n margin-left: 2px;\\n}\\n.tree-actions[data-v-9baf7408] .el-button--mini:hover {\\n background: #ecf5ff;\\n color: #409eff;\\n}\\n.tree-actions[data-v-9baf7408] .el-button--mini[style*=\\\"color: #f56c6c\\\"]:hover {\\n background: #fef0f0;\\n color: #f56c6c;\\n}\\n.category-header[data-v-9baf7408] .el-button--mini:hover {\\n background: #ecf5ff;\\n color: #409eff;\\n}\\n.tree-node:hover .tree-actions[data-v-9baf7408] {\\n width: auto;\\n opacity: 1;\\n margin-left: 8px;\\n}\\n.show-all-btn[data-v-9baf7408] {\\n width: 100%;\\n margin: 0;\\n padding: 12px;\\n border-top: 1px solid #fafbfc;\\n border-radius: 0;\\n color: #409eff;\\n background: #fafbfc;\\n font-weight: 500;\\n font-size: 16px;\\n transition: all 0.2s;\\n}\\n.show-all-btn[data-v-9baf7408]:hover {\\n background: #ecf5ff;\\n}\\n.show-all-btn[data-v-9baf7408]:disabled {\\n color: #c0c4cc;\\n background: #fff;\\n opacity: 0.5;\\n}\\n.category-empty[data-v-9baf7408] {\\n text-align: center;\\n padding: 40px 16px;\\n color: #909399;\\n font-size: 16px;\\n}\\n\\n/* Element UI 树组件 */\\n.kb-category-manager[data-v-9baf7408] .el-tree {\\n background: transparent;\\n color: #606266;\\n}\\n.kb-category-manager[data-v-9baf7408] .el-tree-node__content {\\n background: transparent;\\n border-radius: 8px;\\n transition: background 0.2s;\\n padding: 0 4px 0 2px;\\n height: auto;\\n min-height: 34px;\\n margin-bottom: 2px;\\n position: relative;\\n}\\n.kb-category-manager[data-v-9baf7408] .el-tree-node__content:hover {\\n background: #f5f7fa;\\n}\\n.kb-category-manager[data-v-9baf7408] .el-tree-node.is-current > .el-tree-node__content {\\n background: #ecf5ff;\\n color: #409eff;\\n}\\n.kb-category-manager[data-v-9baf7408] .el-tree-node.is-current > .el-tree-node__content::before {\\n content: '';\\n position: absolute;\\n left: 0;\\n top: 50%;\\n transform: translateY(-50%);\\n width: 3px;\\n height: 16px;\\n border-radius: 2px;\\n background: #409eff;\\n}\\n.kb-category-manager[data-v-9baf7408] .el-tree-node.is-current > .el-tree-node__content .tree-label,\\n.kb-category-manager[data-v-9baf7408] .el-tree-node.is-current > .el-tree-node__content .tree-icon {\\n color: #409eff;\\n}\\n.kb-category-manager[data-v-9baf7408] .el-tree-node__expand-icon {\\n color: #c0c4cc;\\n font-size: 16px;\\n transition: color 0.2s;\\n}\\n.kb-category-manager[data-v-9baf7408] .el-tree-node__expand-icon:hover {\\n color: #409eff;\\n}\\n\\n/* 无子级文件夹:隐藏展开图标 */\\n.kb-category-manager[data-v-9baf7408] .el-tree-node__expand-icon.is-leaf {\\n color: transparent;\\n cursor: default;\\n}\\n.kb-category-manager[data-v-9baf7408] .el-tree-node__expand-icon.expanded {\\n color: #409eff;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/CategoryManager.vue?./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1713
|
+
eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.kb-category-manager[data-v-9baf7408] {\\n height: 100%;\\n display: flex;\\n flex-direction: column;\\n background: #fafbfc;\\n}\\n.kb-category-manager[data-v-9baf7408],\\n.kb-category-manager *[data-v-9baf7408],\\n.kb-category-manager *[data-v-9baf7408]::before,\\n.kb-category-manager *[data-v-9baf7408]::after {\\n font-size: 16px !important;\\n}\\n.category-header[data-v-9baf7408] {\\n display: flex;\\n justify-content: space-between;\\n align-items: center;\\n padding: 14px 2px 14px 16px;\\n font-weight: 600;\\n font-size: 17px;\\n color: #303133;\\n border-bottom: 1px solid #ebeef5;\\n background: #fafbfc;\\n}\\n.category-header .category-title[data-v-9baf7408] {\\n display: inline-flex;\\n align-items: center;\\n gap: 8px;\\n}\\n.category-header .category-title[data-v-9baf7408]::before {\\n content: '';\\n width: 4px;\\n height: 16px;\\n border-radius: 2px;\\n background: linear-gradient(180deg, #409eff, #79bbff);\\n}\\n.category-header > div[data-v-9baf7408] {\\n display: flex;\\n align-items: center;\\n gap: 2px;\\n}\\n\\n/* 新建根文件夹按钮(裸图标) */\\n.add-folder-btn[data-v-9baf7408] {\\n width: 28px;\\n height: 32px;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n border: none;\\n background: transparent;\\n color: #909399;\\n cursor: pointer;\\n padding: 0;\\n font-size: 20px;\\n transition: all 0.2s;\\n}\\n.add-folder-btn[data-v-9baf7408]:hover {\\n color: #409eff;\\n}\\n.add-folder-btn[data-v-9baf7408]:active {\\n color: #3a8ee6;\\n}\\n.add-folder-btn[data-v-9baf7408]:disabled {\\n cursor: not-allowed;\\n opacity: 0.5;\\n color: #c0c4cc;\\n}\\n\\n/* 猜你想问按钮 */\\n.suggest-btn[data-v-9baf7408] {\\n width: 28px;\\n height: 32px;\\n padding: 0;\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n margin-right: 4px;\\n border: none;\\n background: transparent;\\n color: #606266;\\n cursor: pointer;\\n font-size: 20px;\\n transition: all 0.2s;\\n}\\n.suggest-btn[data-v-9baf7408]:hover {\\n color: #409eff;\\n}\\n.suggest-btn[data-v-9baf7408]:disabled {\\n cursor: not-allowed;\\n opacity: 0.5;\\n color: #c0c4cc;\\n}\\n\\n/* 弹框细节微调 */\\n[data-v-9baf7408] .kb-suggest-dialog .el-dialog__body {\\n padding-top: 14px;\\n padding-bottom: 10px;\\n}\\n[data-v-9baf7408] .kb-suggest-dialog .el-form-item {\\n margin-bottom: 14px;\\n}\\n[data-v-9baf7408] .kb-suggest-dialog .el-form-item:last-child {\\n margin-bottom: 4px;\\n}\\n[data-v-9baf7408] .kb-suggest-dialog .el-form-item__label {\\n color: #606266;\\n}\\n\\n/* 列表细滚动条 */\\n.suggest-list[data-v-9baf7408]::-webkit-scrollbar {\\n width: 6px;\\n}\\n.suggest-list[data-v-9baf7408]::-webkit-scrollbar-track {\\n background: transparent;\\n}\\n.suggest-list[data-v-9baf7408]::-webkit-scrollbar-thumb {\\n background: #dcdfe6;\\n border-radius: 3px;\\n}\\n.suggest-list[data-v-9baf7408]::-webkit-scrollbar-thumb:hover {\\n background: #c0c4cc;\\n}\\n\\n/* 添加问题虚线块 */\\n.suggest-add-btn[data-v-9baf7408] {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n gap: 6px;\\n width: 100%;\\n padding: 9px 0;\\n border: 1px dashed #dcdfe6;\\n border-radius: 8px;\\n color: #909399;\\n cursor: pointer;\\n transition: all 0.2s;\\n}\\n.suggest-add-btn[data-v-9baf7408]:hover {\\n border-color: #409eff;\\n color: #409eff;\\n background: #ecf5ff;\\n}\\n.suggest-add-btn.disabled[data-v-9baf7408] {\\n cursor: not-allowed;\\n opacity: 0.5;\\n}\\n.suggest-add-btn.disabled[data-v-9baf7408]:hover {\\n border-color: #dcdfe6;\\n color: #909399;\\n background: transparent;\\n}\\n\\n/* 猜你想问小节标题 */\\n.suggest-section-header[data-v-9baf7408] {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n margin: 2px 0 8px;\\n}\\n.suggest-section-title[data-v-9baf7408] {\\n display: flex;\\n align-items: center;\\n font-weight: 600;\\n color: #303133;\\n}\\n.suggest-section-title[data-v-9baf7408]::before {\\n content: '';\\n width: 3px;\\n height: 14px;\\n margin-right: 6px;\\n border-radius: 2px;\\n background: #409eff;\\n}\\n.category-L-button i[data-v-9baf7408]::before {\\n font-size: 21px!important;\\n}\\n.suggest-count[data-v-9baf7408] {\\n padding: 0 8px;\\n border-radius: 10px;\\n background: #f0f2f5;\\n color: #909399;\\n font-size: 12px !important;\\n line-height: 20px;\\n}\\n\\n/* 猜你想问列表 */\\n.suggest-list[data-v-9baf7408] {\\n max-height: 260px;\\n overflow-y: auto;\\n min-height: 60px;\\n background: #fafbfc;\\n border-radius: 8px;\\n padding: 6px 8px;\\n}\\n.suggest-item[data-v-9baf7408] {\\n display: flex;\\n align-items: center;\\n padding: 8px 10px;\\n border-radius: 6px;\\n transition: background 0.2s;\\n}\\n.suggest-item + .suggest-item[data-v-9baf7408] {\\n margin-top: 2px;\\n}\\n.suggest-item[data-v-9baf7408]:hover {\\n background: #ecf5ff;\\n}\\n.suggest-index[data-v-9baf7408] {\\n flex-shrink: 0;\\n width: 20px;\\n height: 20px;\\n margin-right: 8px;\\n border-radius: 50%;\\n background: #e8f1fd;\\n color: #409eff;\\n font-size: 12px !important;\\n text-align: center;\\n line-height: 20px;\\n}\\n.suggest-text[data-v-9baf7408] {\\n flex: 1;\\n min-width: 0;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n color: #303133;\\n}\\n.suggest-delete[data-v-9baf7408] {\\n flex-shrink: 0;\\n color: #c0c4cc;\\n margin-left: 8px;\\n}\\n.suggest-delete[data-v-9baf7408]:hover {\\n color: #f56c6c;\\n}\\n.suggest-empty[data-v-9baf7408] {\\n text-align: center;\\n padding: 22px 0;\\n color: #909399;\\n}\\n.suggest-empty i[data-v-9baf7408] {\\n font-size: 26px !important;\\n color: #c0c4cc;\\n}\\n.suggest-empty div[data-v-9baf7408] {\\n margin-top: 6px;\\n}\\n.suggest-input-row[data-v-9baf7408] {\\n display: flex;\\n align-items: center;\\n width: 100%;\\n gap: 4px;\\n}\\n.suggest-input-row .el-input[data-v-9baf7408] {\\n flex: 1;\\n}\\n.suggest-input-remove[data-v-9baf7408] {\\n color: #c0c4cc;\\n}\\n.suggest-input-remove[data-v-9baf7408]:hover {\\n color: #f56c6c;\\n}\\n.category-list[data-v-9baf7408] {\\n flex: 1;\\n overflow-y: auto;\\n padding: 10px 8px;\\n}\\n\\n/* 滚动条 */\\n.category-list[data-v-9baf7408]::-webkit-scrollbar {\\n width: 6px;\\n}\\n.category-list[data-v-9baf7408]::-webkit-scrollbar-track {\\n background: transparent;\\n}\\n.category-list[data-v-9baf7408]::-webkit-scrollbar-thumb {\\n background: #dcdfe6;\\n border-radius: 3px;\\n}\\n.category-list[data-v-9baf7408]::-webkit-scrollbar-thumb:hover {\\n background: #c0c4cc;\\n}\\n.tree-node[data-v-9baf7408] {\\n flex: 1;\\n display: flex;\\n align-items: center;\\n font-size: 16px;\\n padding-right: 8px;\\n overflow: hidden;\\n color: #606266;\\n}\\n.tree-icon[data-v-9baf7408] {\\n margin-right: 0px;\\n color: #909399;\\n flex-shrink: 0;\\n font-size: 16px;\\n transition: color 0.2s;\\n}\\n.tree-node:hover .tree-icon[data-v-9baf7408] {\\n color: #409eff;\\n}\\n.tree-label[data-v-9baf7408] {\\n flex: 1;\\n min-width: 0;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n font-weight: 500;\\n transition: color 0.2s;\\n}\\n\\n/* 操作按钮:默认不占宽,鼠标划上节点时才展开占据空间 */\\n.tree-actions[data-v-9baf7408] {\\n flex-shrink: 0;\\n width: 0;\\n overflow: hidden;\\n opacity: 0;\\n transition: opacity 0.2s;\\n margin-left: 0;\\n white-space: nowrap;\\n display: flex;\\n align-items: center;\\n gap: 2px;\\n}\\n\\n/* 操作按钮 */\\n.tree-actions[data-v-9baf7408] .el-button--mini,\\n.category-header[data-v-9baf7408] .el-button--mini {\\n padding: 6px;\\n font-size: 16px;\\n border-radius: 6px;\\n transition: all 0.2s;\\n border: none;\\n background: transparent;\\n margin-left: 0;\\n}\\n.tree-actions[data-v-9baf7408] .el-button--mini + .el-button--mini {\\n margin-left: 2px;\\n}\\n.tree-actions[data-v-9baf7408] .el-button--mini:hover {\\n background: #ecf5ff;\\n color: #409eff;\\n}\\n.tree-actions[data-v-9baf7408] .el-button--mini[style*=\\\"color: #f56c6c\\\"]:hover {\\n background: #fef0f0;\\n color: #f56c6c;\\n}\\n.category-header[data-v-9baf7408] .el-button--mini:hover {\\n background: #ecf5ff;\\n color: #409eff;\\n}\\n.tree-node:hover .tree-actions[data-v-9baf7408] {\\n width: auto;\\n opacity: 1;\\n margin-left: 8px;\\n}\\n.show-all-btn[data-v-9baf7408] {\\n width: 100%;\\n margin: 0;\\n padding: 12px;\\n border-top: 1px solid #fafbfc;\\n border-radius: 0;\\n color: #409eff;\\n background: #fafbfc;\\n font-weight: 500;\\n font-size: 16px;\\n transition: all 0.2s;\\n}\\n.show-all-btn[data-v-9baf7408]:hover {\\n background: #ecf5ff;\\n}\\n.show-all-btn[data-v-9baf7408]:disabled {\\n color: #c0c4cc;\\n background: #fff;\\n opacity: 0.5;\\n}\\n.category-empty[data-v-9baf7408] {\\n text-align: center;\\n padding: 40px 16px;\\n color: #909399;\\n font-size: 16px;\\n}\\n\\n/* Element UI 树组件 */\\n.kb-category-manager[data-v-9baf7408] .el-tree {\\n background: transparent;\\n color: #606266;\\n}\\n.kb-category-manager[data-v-9baf7408] .el-tree-node__content {\\n background: transparent;\\n border-radius: 8px;\\n transition: background 0.2s;\\n padding: 0 4px 0 2px;\\n height: auto;\\n min-height: 34px;\\n margin-bottom: 2px;\\n position: relative;\\n}\\n.kb-category-manager[data-v-9baf7408] .el-tree-node__content:hover {\\n background: #f5f7fa;\\n}\\n.kb-category-manager[data-v-9baf7408] .el-tree-node.is-current > .el-tree-node__content {\\n background: #ecf5ff;\\n color: #409eff;\\n}\\n.kb-category-manager[data-v-9baf7408] .el-tree-node.is-current > .el-tree-node__content::before {\\n content: '';\\n position: absolute;\\n left: 0;\\n top: 50%;\\n transform: translateY(-50%);\\n width: 3px;\\n height: 16px;\\n border-radius: 2px;\\n background: #409eff;\\n}\\n.kb-category-manager[data-v-9baf7408] .el-tree-node.is-current > .el-tree-node__content .tree-label,\\n.kb-category-manager[data-v-9baf7408] .el-tree-node.is-current > .el-tree-node__content .tree-icon {\\n color: #409eff;\\n}\\n.kb-category-manager[data-v-9baf7408] .el-tree-node__expand-icon {\\n color: #c0c4cc;\\n font-size: 16px;\\n transition: color 0.2s;\\n}\\n.kb-category-manager[data-v-9baf7408] .el-tree-node__expand-icon:hover {\\n color: #409eff;\\n}\\n\\n/* 无子级文件夹:隐藏展开图标 */\\n.kb-category-manager[data-v-9baf7408] .el-tree-node__expand-icon.is-leaf {\\n color: transparent;\\n cursor: default;\\n}\\n.kb-category-manager[data-v-9baf7408] .el-tree-node__expand-icon.expanded {\\n color: #409eff;\\n}\\n\\n/* ===== 移动端文件夹列表 ===== */\\n.kb-m-category-list[data-v-9baf7408] {\\n padding: 8px 12px 16px;\\n}\\n.kb-m-folder-row[data-v-9baf7408] {\\n display: flex;\\n align-items: center;\\n gap: 10px;\\n padding: 14px 12px;\\n margin-bottom: 8px;\\n border-radius: 10px;\\n background: #ffffff;\\n color: #303133;\\n cursor: pointer;\\n transition: background 0.2s;\\n border: 1px solid #f0f2f5;\\n}\\n.kb-m-folder-row[data-v-9baf7408]:active {\\n transform: scale(0.99);\\n}\\n.kb-m-folder-row.active[data-v-9baf7408] {\\n background: #ecf5ff;\\n border-color: #cfe4ff;\\n color: #409eff;\\n}\\n.kb-m-folder-icon[data-v-9baf7408] {\\n flex-shrink: 0;\\n font-size: 18px !important;\\n color: #f7ba2a;\\n}\\n.kb-m-folder-row.active .kb-m-folder-icon[data-v-9baf7408] {\\n color: #409eff;\\n}\\n.kb-m-folder-all .kb-m-folder-icon[data-v-9baf7408] {\\n color: #409eff;\\n}\\n.kb-m-folder-name[data-v-9baf7408] {\\n flex: 1;\\n min-width: 0;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n font-size: 16px;\\n font-weight: 500;\\n}\\n.kb-m-folder-arrow[data-v-9baf7408] {\\n flex-shrink: 0;\\n color: #909399;\\n}\\n.kb-m-folder-more[data-v-9baf7408] {\\n flex-shrink: 0;\\n width: 32px;\\n height: 32px;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n border-radius: 8px;\\n color: #909399;\\n}\\n.kb-m-folder-more[data-v-9baf7408]:active {\\n background: #f0f2f5;\\n}\\n\\n/* 移动端操作单 */\\n.kb-m-mask[data-v-9baf7408] {\\n position: fixed;\\n top: 0;\\n right: 0;\\n bottom: 0;\\n left: 0;\\n z-index: 3000;\\n background: rgba(0, 0, 0, 0.45);\\n}\\n.kb-m-actionsheet[data-v-9baf7408] {\\n position: fixed;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n z-index: 3001;\\n background: #ffffff;\\n border-radius: 16px 16px 0 0;\\n padding: 8px 0 calc(12px + env(safe-area-inset-bottom));\\n}\\n.kb-m-actionsheet-title[data-v-9baf7408] {\\n padding: 12px 16px 8px;\\n font-size: 13px;\\n color: #909399;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.kb-m-actionsheet-item[data-v-9baf7408] {\\n display: flex;\\n align-items: center;\\n gap: 10px;\\n padding: 14px 20px;\\n font-size: 16px;\\n color: #303133;\\n border-top: 1px solid #f0f2f5;\\n}\\n.kb-m-actionsheet-item[data-v-9baf7408]:active {\\n background: #f5f7fa;\\n}\\n.kb-m-actionsheet-item i[data-v-9baf7408] {\\n font-size: 18px !important;\\n color: #606266;\\n}\\n.kb-m-actionsheet-danger[data-v-9baf7408] {\\n color: #f56c6c !important;\\n}\\n.kb-m-actionsheet-danger i[data-v-9baf7408] {\\n color: #f56c6c !important;\\n}\\n.kb-m-actionsheet-cancel[data-v-9baf7408] {\\n margin-top: 8px;\\n padding: 14px 0;\\n text-align: center;\\n font-size: 16px;\\n color: #606266;\\n border-top: 1px solid #f0f2f5;\\n}\\n.kb-m-actionsheet-cancel[data-v-9baf7408]:active {\\n background: #f5f7fa;\\n}\\n\\n/* 移动端操作单过渡 */\\n.kb-m-fade-enter-active[data-v-9baf7408],\\n.kb-m-fade-leave-active[data-v-9baf7408] {\\n transition: opacity 0.2s;\\n}\\n.kb-m-fade-enter[data-v-9baf7408],\\n.kb-m-fade-leave-to[data-v-9baf7408] {\\n opacity: 0;\\n}\\n.kb-m-slide-enter-active[data-v-9baf7408],\\n.kb-m-slide-leave-active[data-v-9baf7408] {\\n transition: transform 0.25s ease;\\n}\\n.kb-m-slide-enter[data-v-9baf7408],\\n.kb-m-slide-leave-to[data-v-9baf7408] {\\n transform: translateY(100%);\\n}\\n\\n/* 移动端:弹框全屏化 */\\n@media (max-width: 768px) {\\n.kb-category-manager[data-v-9baf7408] .kb-folder-dialog,\\n .kb-category-manager[data-v-9baf7408] .kb-suggest-dialog {\\n width: 100% !important;\\n margin: 0 !important;\\n border-radius: 0;\\n}\\n.kb-category-manager[data-v-9baf7408] .kb-folder-dialog .el-dialog__header,\\n .kb-category-manager[data-v-9baf7408] .kb-suggest-dialog .el-dialog__header {\\n padding: 16px 16px 0;\\n}\\n.kb-category-manager[data-v-9baf7408] .kb-folder-dialog .el-dialog__body,\\n .kb-category-manager[data-v-9baf7408] .kb-suggest-dialog .el-dialog__body {\\n padding: 16px;\\n}\\n\\n /* 头部按钮触控区加大、内边距规整 */\\n.category-header[data-v-9baf7408] {\\n padding: 10px 10px 10px 16px;\\n}\\n.add-folder-btn[data-v-9baf7408],\\n .suggest-btn[data-v-9baf7408] {\\n width: 34px;\\n height: 36px;\\n}\\n}\\n\\n/* 移动端文件夹列表(DOM 仅移动端渲染,不加媒体查询——平板横屏也生效) */\\n.kb-m-category-list[data-v-9baf7408] {\\n background: #fafbfc;\\n -webkit-overflow-scrolling: touch;\\n}\\n\\n/* ===== 移动端自绘弹框表单控件(MobileDialog 内使用) ===== */\\n.kbm-field[data-v-9baf7408] {\\n margin-bottom: 14px;\\n}\\n.kbm-field-label[data-v-9baf7408] {\\n display: block;\\n margin-bottom: 6px;\\n font-size: 14px;\\n color: #303133;\\n}\\n.kbm-field-row[data-v-9baf7408] {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n}\\n.kbm-field-row .kbm-input[data-v-9baf7408] {\\n flex: 1;\\n}\\n.kbm-input[data-v-9baf7408] {\\n width: 100%;\\n height: 38px;\\n padding: 0 10px;\\n border: 1px solid #dcdfe6;\\n border-radius: 6px;\\n background: #fff;\\n font-size: 14px;\\n color: #303133;\\n outline: none;\\n box-sizing: border-box;\\n -webkit-appearance: none;\\n -moz-appearance: none;\\n appearance: none;\\n}\\n.kbm-input[data-v-9baf7408]:focus {\\n border-color: #1677ff;\\n}\\n.kbm-field-remove[data-v-9baf7408] {\\n flex-shrink: 0;\\n width: 30px;\\n height: 30px;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n border: none;\\n background: transparent;\\n color: #909399;\\n border-radius: 50%;\\n}\\n.kbm-btn[data-v-9baf7408] {\\n flex: 1;\\n height: 40px;\\n border: 1px solid #dcdfe6;\\n border-radius: 6px;\\n background: #fff;\\n font-size: 15px;\\n color: #606266;\\n}\\n.kbm-btn.primary[data-v-9baf7408] {\\n border-color: #1677ff;\\n background: #1677ff;\\n color: #fff;\\n}\\n.kbm-btn[data-v-9baf7408]:disabled {\\n opacity: 0.6;\\n}\\n.kbm-loading[data-v-9baf7408] {\\n padding: 20px 0;\\n text-align: center;\\n font-size: 13px;\\n color: #909399;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/CategoryManager.vue?./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1690
1714
|
|
|
1691
1715
|
/***/ }),
|
|
1692
1716
|
|
|
@@ -1697,7 +1721,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../.
|
|
|
1697
1721
|
/*! no static exports found */
|
|
1698
1722
|
/***/ (function(module, exports, __webpack_require__) {
|
|
1699
1723
|
|
|
1700
|
-
eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.el-upload__tip[data-v-4b2b74bc] {\\n line-height: 1.5;\\n color: #909399;\\n font-size: 12px;\\n}\\n/* 所属文件夹下拉树选择 */\\n.folder-picker-input[data-v-4b2b74bc] {\\n width: 100%;\\n}\\n.folder-picker-input-el[data-v-4b2b74bc] {\\n width: 100%;\\n}\\n.folder-tree-wrap[data-v-4b2b74bc] {\\n max-height: 280px;\\n overflow-y: auto;\\n padding: 4px;\\n}\\n.folder-tree-wrap[data-v-4b2b74bc] .el-tree {\\n background: transparent;\\n color: #606266;\\n}\\n.folder-tree-wrap[data-v-4b2b74bc] .el-tree-node__content {\\n height: 30px;\\n border-radius: 4px;\\n}\\n.folder-tree-wrap[data-v-4b2b74bc] .el-tree-node__content:hover {\\n background: #f5f7fa;\\n}\\n.folder-tree-wrap[data-v-4b2b74bc] .el-tree-node.is-current > .el-tree-node__content {\\n background: #ecf5ff;\\n color: #409eff;\\n}\\n.md-editor-wrap[data-v-4b2b74bc] {\\n border: 1px solid #e4e7ed;\\n border-radius: 8px;\\n overflow: hidden;\\n background: #fff;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\\n}\\n.md-editor-toolbar[data-v-4b2b74bc] {\\n display: flex;\\n align-items: center;\\n border-bottom: 1px solid #e4e7ed;\\n background: #fafbfc;\\n}\\n.md-editor-tab[data-v-4b2b74bc] {\\n padding: 10px 20px;\\n font-size: 13px;\\n cursor: pointer;\\n border-bottom: 2px solid transparent;\\n transition: all 0.2s;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n color: #606266;\\n}\\n.md-editor-tab[data-v-4b2b74bc]:hover {\\n color: #409eff;\\n}\\n.md-editor-tab.active[data-v-4b2b74bc] {\\n color: #409eff;\\n border-bottom-color: #409eff;\\n background: #fff;\\n}\\n.md-editor-status[data-v-4b2b74bc] {\\n margin-left: auto;\\n padding-right: 16px;\\n font-size: 12px;\\n color: #909399;\\n}\\n.md-textarea[data-v-4b2b74bc] {\\n width: 100%;\\n height: 450px;\\n border: 0;\\n outline: none;\\n resize: vertical;\\n padding: 16px;\\n font-size: 16px;\\n line-height: 1.7;\\n font-family: 'SF Mono', 'Monaco', 'Menlo', 'Consolas', 'Courier New', monospace;\\n box-sizing: border-box;\\n color: #1f2937;\\n background: #fafbfc;\\n}\\n.md-textarea[data-v-4b2b74bc]:focus {\\n background: #fff;\\n}\\n.md-preview[data-v-4b2b74bc] {\\n height: 450px;\\n overflow: auto;\\n padding: 16px 20px;\\n font-size: 16px;\\n line-height: 1.8;\\n color: #333;\\n background: #fff;\\n box-sizing: border-box;\\n}\\n/* 滚动条 */\\n.md-preview[data-v-4b2b74bc]::-webkit-scrollbar,\\n.md-textarea[data-v-4b2b74bc]::-webkit-scrollbar {\\n width: 6px;\\n height: 6px;\\n}\\n.md-preview[data-v-4b2b74bc]::-webkit-scrollbar-thumb,\\n.md-textarea[data-v-4b2b74bc]::-webkit-scrollbar-thumb {\\n background: #d0d5dd;\\n border-radius: 3px;\\n}\\n.md-preview[data-v-4b2b74bc]::-webkit-scrollbar-thumb:hover,\\n.md-textarea[data-v-4b2b74bc]::-webkit-scrollbar-thumb:hover {\\n background: #b0b5bd;\\n}\\n/* 标题 */\\n.md-preview h1[data-v-4b2b74bc] {\\n font-size: 24px;\\n margin: 20px 0 10px;\\n border-bottom: 2px solid #e8eaed;\\n padding-bottom: 8px;\\n color: #1a1a2e;\\n}\\n.md-preview h2[data-v-4b2b74bc] {\\n font-size: 20px;\\n margin: 18px 0 8px;\\n padding-bottom: 4px;\\n border-bottom: 1px solid #f0f0f0;\\n color: #1a1a2e;\\n}\\n.md-preview h3[data-v-4b2b74bc] {\\n font-size: 17px;\\n margin: 14px 0 6px;\\n color: #2c3e50;\\n}\\n.md-preview h4[data-v-4b2b74bc] {\\n font-size: 17px;\\n margin: 12px 0 4px;\\n color: #34495e;\\n}\\n.md-preview p[data-v-4b2b74bc] {\\n margin: 10px 0;\\n}\\n.md-preview ul[data-v-4b2b74bc], .md-preview ol[data-v-4b2b74bc] {\\n padding-left: 26px;\\n margin: 10px 0;\\n}\\n.md-preview li[data-v-4b2b74bc] {\\n margin: 4px 0;\\n}\\n.md-preview li > ul[data-v-4b2b74bc], .md-preview li > ol[data-v-4b2b74bc] {\\n margin: 2px 0;\\n}\\n/* 行内代码 */\\n.md-preview code[data-v-4b2b74bc]:not(pre code) {\\n background: #f0f2f5;\\n padding: 2px 8px;\\n border-radius: 4px;\\n font-size: 13px;\\n color: #c7254e;\\n border: 1px solid #e8eaed;\\n}\\n/* 代码块 */\\n.md-preview pre[data-v-4b2b74bc] {\\n background: #1e1e2e;\\n color: #cdd6f4;\\n padding: 18px 20px;\\n border-radius: 8px;\\n overflow-x: auto;\\n font-size: 13px;\\n line-height: 1.65;\\n margin: 14px 0;\\n border: 0;\\n}\\n.md-preview pre code[data-v-4b2b74bc] {\\n background: none;\\n padding: 0;\\n color: inherit;\\n font-size: inherit;\\n border: 0;\\n}\\n/* 引用 */\\n.md-preview blockquote[data-v-4b2b74bc] {\\n border-left: 4px solid #409eff;\\n padding: 10px 18px;\\n margin: 14px 0;\\n background: #f0f7ff;\\n color: #555;\\n border-radius: 0 4px 4px 0;\\n}\\n.md-preview blockquote p[data-v-4b2b74bc] {\\n margin: 6px 0;\\n}\\n/* 表格 */\\n.md-preview table[data-v-4b2b74bc] {\\n border-collapse: collapse;\\n width: 100%;\\n margin: 14px 0;\\n font-size: 13px;\\n}\\n.md-preview th[data-v-4b2b74bc], .md-preview td[data-v-4b2b74bc] {\\n border: 1px solid #e0e2e6;\\n padding: 10px 14px;\\n text-align: left;\\n}\\n.md-preview th[data-v-4b2b74bc] {\\n background: #f5f7fa;\\n font-weight: 600;\\n color: #1f2937;\\n}\\n.md-preview tr[data-v-4b2b74bc]:nth-child(even) {\\n background: #fafbfc;\\n}\\n.md-preview tr[data-v-4b2b74bc]:hover {\\n background: #f0f7ff;\\n}\\n/* 图片 */\\n.md-preview img[data-v-4b2b74bc] {\\n max-width: 100%;\\n border-radius: 6px;\\n margin: 8px 0;\\n box-shadow: 0 1px 4px rgba(0,0,0,0.1);\\n}\\n/* 链接 */\\n.md-preview a[data-v-4b2b74bc] {\\n color: #409eff;\\n text-decoration: none;\\n}\\n.md-preview a[data-v-4b2b74bc]:hover {\\n text-decoration: underline;\\n color: #2a7de1;\\n}\\n/* 分割线 */\\n.md-preview hr[data-v-4b2b74bc] {\\n border: none;\\n border-top: 1px solid #e8eaed;\\n margin: 20px 0;\\n}\\n/* 任务列表 */\\n.md-preview input[type=\\\"checkbox\\\"][data-v-4b2b74bc] {\\n margin-right: 6px;\\n}\\n\\n/* ==================== Excel 编辑器样式 ==================== */\\n.xlsx-editor-wrap[data-v-4b2b74bc] {\\n border: 1px solid #e4e7ed;\\n border-radius: 8px;\\n overflow: hidden;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\\n}\\n.xlsx-toolbar[data-v-4b2b74bc] {\\n display: flex;\\n align-items: center;\\n flex-wrap: wrap;\\n gap: 8px;\\n padding: 8px 12px;\\n background: #fafbfc;\\n border-bottom: 1px solid #e4e7ed;\\n}\\n.xlsx-sheet-tabs[data-v-4b2b74bc] {\\n display: flex;\\n align-items: center;\\n gap: 2px;\\n}\\n.xlsx-sheet-tab[data-v-4b2b74bc] {\\n padding: 4px 12px;\\n font-size: 12px;\\n cursor: pointer;\\n border: 1px solid transparent;\\n border-radius: 3px 3px 0 0;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n color: #606266;\\n background: #f0f2f5;\\n}\\n.xlsx-sheet-tab[data-v-4b2b74bc]:hover {\\n color: #409eff;\\n}\\n.xlsx-sheet-tab.active[data-v-4b2b74bc] {\\n color: #409eff;\\n background: #fff;\\n border-color: #dcdfe6;\\n border-bottom-color: #fff;\\n}\\n.xlsx-actions[data-v-4b2b74bc] {\\n display: flex;\\n align-items: center;\\n gap: 6px;\\n margin-left: auto;\\n flex-wrap: wrap;\\n}\\n.xlsx-info[data-v-4b2b74bc] {\\n font-size: 12px;\\n color: #909399;\\n margin-left: 4px;\\n white-space: nowrap;\\n}\\n.xlsx-table-wrap[data-v-4b2b74bc] {\\n overflow-x: auto;\\n padding: 4px;\\n}\\n.xlsx-table-wrap .el-table[data-v-4b2b74bc] {\\n font-size: 12px;\\n}\\n.xlsx-table-wrap .el-input__inner[data-v-4b2b74bc] {\\n border: 1px solid transparent;\\n background: transparent;\\n padding: 0 4px;\\n height: 28px;\\n line-height: 28px;\\n border-radius: 2px;\\n}\\n.xlsx-table-wrap .el-input__inner[data-v-4b2b74bc]:hover {\\n border-color: #c0c4cc;\\n}\\n.xlsx-table-wrap .el-input__inner[data-v-4b2b74bc]:focus {\\n border-color: #409eff;\\n background: #fff;\\n}\\n.xlsx-empty[data-v-4b2b74bc] {\\n padding: 40px 0;\\n}\\n.xlsx-loading[data-v-4b2b74bc] {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n padding: 60px 0;\\n color: #909399;\\n font-size: 16px;\\n gap: 8px;\\n}\\n\\n/* ==================== Word 编辑器样式 ==================== */\\n.word-editor-wrap[data-v-4b2b74bc] {\\n border: 1px solid #e4e7ed;\\n border-radius: 8px;\\n overflow: hidden;\\n background: #fff;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\\n}\\n.word-loading[data-v-4b2b74bc] {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n padding: 60px 0;\\n color: #909399;\\n font-size: 16px;\\n gap: 8px;\\n}\\n.word-header[data-v-4b2b74bc] {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n padding: 8px 14px;\\n background: #fafbfc;\\n border-bottom: 1px solid #e4e7ed;\\n font-size: 13px;\\n}\\n.word-filename[data-v-4b2b74bc] {\\n display: flex;\\n align-items: center;\\n gap: 6px;\\n color: #303133;\\n font-weight: 500;\\n max-width: 60%;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.word-filename .el-icon-document[data-v-4b2b74bc] {\\n color: #409eff;\\n font-size: 17px;\\n}\\n.word-stats[data-v-4b2b74bc] {\\n color: #909399;\\n font-size: 12px;\\n flex-shrink: 0;\\n}\\n.word-toolbar[data-v-4b2b74bc] {\\n display: flex;\\n align-items: center;\\n flex-wrap: wrap;\\n gap: 1px;\\n padding: 5px 10px;\\n background: #fafbfc;\\n border-bottom: 1px solid #e8eaed;\\n}\\n.word-tb-btn[data-v-4b2b74bc] {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n width: 30px;\\n height: 28px;\\n border: 1px solid transparent;\\n background: transparent;\\n border-radius: 4px;\\n cursor: pointer;\\n color: #5f6368;\\n outline: none;\\n transition: all 0.15s;\\n}\\n.word-tb-btn[data-v-4b2b74bc]:hover {\\n background: #e8eaed;\\n color: #202124;\\n}\\n.word-tb-btn[data-v-4b2b74bc]:active {\\n background: #d2d5d9;\\n}\\n.word-tb-btn-heading[data-v-4b2b74bc] {\\n font-size: 11px;\\n font-weight: 600;\\n font-family: 'Segoe UI', Arial, sans-serif;\\n width: 32px;\\n}\\n.word-tb-sep[data-v-4b2b74bc] {\\n display: inline-block;\\n width: 1px;\\n height: 18px;\\n background: #dcdfe6;\\n margin: 0 5px;\\n flex-shrink: 0;\\n}\\n.word-editor-content[data-v-4b2b74bc] {\\n min-height: 380px;\\n max-height: 500px;\\n overflow-y: auto;\\n padding: 18px 22px;\\n font-size: 16px;\\n line-height: 1.8;\\n color: #333;\\n outline: none;\\n -moz-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n -webkit-user-select: text;\\n}\\n.word-editor-content[data-v-4b2b74bc]:focus {\\n background: #fff;\\n}\\n.word-editor-content h1[data-v-4b2b74bc] {\\n font-size: 22px;\\n font-weight: 700;\\n margin: 20px 0 10px;\\n padding-bottom: 6px;\\n border-bottom: 2px solid #e8eaed;\\n color: #1a1a2e;\\n}\\n.word-editor-content h2[data-v-4b2b74bc] {\\n font-size: 18px;\\n font-weight: 600;\\n margin: 16px 0 8px;\\n padding-bottom: 4px;\\n border-bottom: 1px solid #e8eaed;\\n color: #1a1a2e;\\n}\\n.word-editor-content h3[data-v-4b2b74bc] {\\n font-size: 16px;\\n font-weight: 600;\\n margin: 14px 0 6px;\\n color: #2c3e50;\\n}\\n.word-editor-content p[data-v-4b2b74bc] {\\n margin: 8px 0;\\n}\\n.word-editor-content ul[data-v-4b2b74bc], .word-editor-content ol[data-v-4b2b74bc] {\\n padding-left: 24px;\\n margin: 8px 0;\\n}\\n.word-editor-content li[data-v-4b2b74bc] {\\n margin: 3px 0;\\n}\\n.word-editor-content blockquote[data-v-4b2b74bc] {\\n border-left: 3px solid #409eff;\\n padding: 6px 14px;\\n margin: 10px 0;\\n background: #f0f7ff;\\n color: #555;\\n border-radius: 0 4px 4px 0;\\n}\\n.word-editor-content pre[data-v-4b2b74bc] {\\n background: #f5f7fa;\\n padding: 12px 16px;\\n border-radius: 6px;\\n overflow-x: auto;\\n font-size: 13px;\\n border: 1px solid #e8eaed;\\n margin: 10px 0;\\n font-family: 'Cascadia Code', 'Fira Code', 'Consolas', monospace;\\n}\\n.word-editor-content a[data-v-4b2b74bc] {\\n color: #409eff;\\n text-decoration: underline;\\n}\\n.word-editor-content img[data-v-4b2b74bc] {\\n max-width: 100%;\\n border-radius: 4px;\\n margin: 6px 0;\\n}\\n.word-editor-content[data-v-4b2b74bc] ::-moz-selection {\\n background: #c7dbff;\\n}\\n.word-editor-content[data-v-4b2b74bc] ::selection {\\n background: #c7dbff;\\n}\\n\\n/* ==================== 弹窗整体美化 ==================== */\\n.document-form-dialog[data-v-4b2b74bc] {\\n border-radius: 12px;\\n box-shadow: 0 12px 32px rgba(0, 0, 0, 0.12);\\n overflow: hidden;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__header {\\n padding: 16px 24px;\\n border-bottom: 1px solid #ebeef5;\\n position: relative;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__title {\\n display: inline-flex;\\n align-items: center;\\n gap: 8px;\\n font-size: 16px;\\n font-weight: 600;\\n color: #303133;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__title::before {\\n content: '';\\n width: 4px;\\n height: 16px;\\n border-radius: 2px;\\n background: linear-gradient(180deg, #409eff, #79bbff);\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__headerbtn {\\n top: 16px;\\n right: 20px;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__headerbtn .el-dialog__close {\\n color: #909399;\\n font-size: 18px;\\n transition: color 0.2s;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__headerbtn .el-dialog__close:hover {\\n color: #303133;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__body {\\n padding: 20px 24px;\\n max-height: 70vh;\\n overflow-y: auto;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__footer {\\n padding: 12px 24px;\\n border-top: 1px solid #ebeef5;\\n background: #fafbfc;\\n}\\n\\n/* 滚动条 */\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__body::-webkit-scrollbar {\\n width: 6px;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__body::-webkit-scrollbar-thumb {\\n background: #dcdfe6;\\n border-radius: 3px;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__body::-webkit-scrollbar-thumb:hover {\\n background: #c0c4cc;\\n}\\n\\n/* 表单 */\\n.document-form-dialog[data-v-4b2b74bc] .el-form-item__label {\\n color: #606266;\\n font-weight: 500;\\n}\\n\\n/* 上传区 */\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger {\\n border: 1px dashed #c0c4cc;\\n border-radius: 10px;\\n background: #fafbfc;\\n transition: all 0.2s;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger:hover {\\n border-color: #409eff;\\n background: #f0f7ff;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger .el-icon-upload {\\n color: #409eff;\\n font-size: 56px;\\n margin-bottom: 8px;\\n}\\n\\n/* 标题输入 */\\n.document-form-dialog[data-v-4b2b74bc] .el-input.doc-title-input .el-input__inner {\\n border-radius: 6px;\\n transition: all 0.2s;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-input.doc-title-input .el-input__inner:hover {\\n border-color: #c0c4cc;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-input.doc-title-input .el-input__inner:focus {\\n border-color: #409eff;\\n}\\n\\n/* 所属文件夹选择 */\\n.document-form-dialog[data-v-4b2b74bc] .el-input.folder-picker-input-el .el-input__inner {\\n border-radius: 6px;\\n background: #fafbfc;\\n cursor: pointer;\\n color: #606266;\\n transition: all 0.2s;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-input.folder-picker-input-el .el-input__inner:hover {\\n border-color: #c0c4cc;\\n background: #fff;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-input.folder-picker-input-el .el-input__inner:focus {\\n border-color: #409eff;\\n background: #fff;\\n}\\n\\n/* 上传区(新增文档) */\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger {\\n border: 1px dashed #c0c4cc;\\n border-radius: 10px;\\n background: #fafbfc;\\n padding: 28px 16px;\\n transition: all 0.2s;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger:hover {\\n border-color: #409eff;\\n background: #f5faff;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger .el-icon-upload {\\n color: #409eff;\\n font-size: 60px;\\n margin-bottom: 10px;\\n transition: transform 0.2s;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger:hover .el-icon-upload {\\n transform: translateY(-2px);\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger .el-upload__text {\\n font-size: 16px;\\n color: #606266;\\n margin-bottom: 6px;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger .el-upload__text em {\\n font-style: normal;\\n color: #409eff;\\n font-weight: 600;\\n padding: 0 8px;\\n height: 26px;\\n line-height: 26px;\\n border: 1px solid #b3d8ff;\\n border-radius: 13px;\\n display: inline-block;\\n vertical-align: middle;\\n background: #ecf5ff;\\n transition: all 0.2s;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger:hover .el-upload__text em {\\n background: #409eff;\\n color: #fff;\\n border-color: #409eff;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger .el-upload__tip {\\n margin-top: 12px;\\n font-size: 12px;\\n color: #909399;\\n}\\n\\n/* 上传文件列表内简化看板 */\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-list {\\n margin-top: 12px;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-list__item {\\n border-radius: 6px;\\n transition: background 0.2s;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-list__item:hover {\\n background: #f5f7fa;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-list__item-name {\\n color: #303133;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/DocumentForm.vue?./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1724
|
+
eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.el-upload__tip[data-v-4b2b74bc] {\\n line-height: 1.5;\\n color: #909399;\\n font-size: 12px;\\n}\\n/* 所属文件夹下拉树选择 */\\n.folder-picker-input[data-v-4b2b74bc] {\\n width: 100%;\\n}\\n.folder-picker-input-el[data-v-4b2b74bc] {\\n width: 100%;\\n}\\n.folder-tree-wrap[data-v-4b2b74bc] {\\n max-height: 280px;\\n overflow-y: auto;\\n padding: 4px;\\n}\\n.folder-tree-wrap[data-v-4b2b74bc] .el-tree {\\n background: transparent;\\n color: #606266;\\n}\\n.folder-tree-wrap[data-v-4b2b74bc] .el-tree-node__content {\\n height: 30px;\\n border-radius: 4px;\\n}\\n.folder-tree-wrap[data-v-4b2b74bc] .el-tree-node__content:hover {\\n background: #f5f7fa;\\n}\\n.folder-tree-wrap[data-v-4b2b74bc] .el-tree-node.is-current > .el-tree-node__content {\\n background: #ecf5ff;\\n color: #409eff;\\n}\\n.md-editor-wrap[data-v-4b2b74bc] {\\n border: 1px solid #e4e7ed;\\n border-radius: 8px;\\n overflow: hidden;\\n background: #fff;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\\n}\\n.md-editor-toolbar[data-v-4b2b74bc] {\\n display: flex;\\n align-items: center;\\n border-bottom: 1px solid #e4e7ed;\\n background: #fafbfc;\\n}\\n.md-editor-tab[data-v-4b2b74bc] {\\n padding: 10px 20px;\\n font-size: 13px;\\n cursor: pointer;\\n border-bottom: 2px solid transparent;\\n transition: all 0.2s;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n color: #606266;\\n}\\n.md-editor-tab[data-v-4b2b74bc]:hover {\\n color: #409eff;\\n}\\n.md-editor-tab.active[data-v-4b2b74bc] {\\n color: #409eff;\\n border-bottom-color: #409eff;\\n background: #fff;\\n}\\n.md-editor-status[data-v-4b2b74bc] {\\n margin-left: auto;\\n padding-right: 16px;\\n font-size: 12px;\\n color: #909399;\\n}\\n.md-textarea[data-v-4b2b74bc] {\\n width: 100%;\\n height: 450px;\\n border: 0;\\n outline: none;\\n resize: vertical;\\n padding: 16px;\\n font-size: 16px;\\n line-height: 1.7;\\n font-family: 'SF Mono', 'Monaco', 'Menlo', 'Consolas', 'Courier New', monospace;\\n box-sizing: border-box;\\n color: #1f2937;\\n background: #fafbfc;\\n}\\n.md-textarea[data-v-4b2b74bc]:focus {\\n background: #fff;\\n}\\n.md-preview[data-v-4b2b74bc] {\\n height: 450px;\\n overflow: auto;\\n padding: 16px 20px;\\n font-size: 16px;\\n line-height: 1.8;\\n color: #333;\\n background: #fff;\\n box-sizing: border-box;\\n}\\n/* 滚动条 */\\n.md-preview[data-v-4b2b74bc]::-webkit-scrollbar,\\n.md-textarea[data-v-4b2b74bc]::-webkit-scrollbar {\\n width: 6px;\\n height: 6px;\\n}\\n.md-preview[data-v-4b2b74bc]::-webkit-scrollbar-thumb,\\n.md-textarea[data-v-4b2b74bc]::-webkit-scrollbar-thumb {\\n background: #d0d5dd;\\n border-radius: 3px;\\n}\\n.md-preview[data-v-4b2b74bc]::-webkit-scrollbar-thumb:hover,\\n.md-textarea[data-v-4b2b74bc]::-webkit-scrollbar-thumb:hover {\\n background: #b0b5bd;\\n}\\n/* 标题 */\\n.md-preview h1[data-v-4b2b74bc] {\\n font-size: 24px;\\n margin: 20px 0 10px;\\n border-bottom: 2px solid #e8eaed;\\n padding-bottom: 8px;\\n color: #1a1a2e;\\n}\\n.md-preview h2[data-v-4b2b74bc] {\\n font-size: 20px;\\n margin: 18px 0 8px;\\n padding-bottom: 4px;\\n border-bottom: 1px solid #f0f0f0;\\n color: #1a1a2e;\\n}\\n.md-preview h3[data-v-4b2b74bc] {\\n font-size: 17px;\\n margin: 14px 0 6px;\\n color: #2c3e50;\\n}\\n.md-preview h4[data-v-4b2b74bc] {\\n font-size: 17px;\\n margin: 12px 0 4px;\\n color: #34495e;\\n}\\n.md-preview p[data-v-4b2b74bc] {\\n margin: 10px 0;\\n}\\n.md-preview ul[data-v-4b2b74bc], .md-preview ol[data-v-4b2b74bc] {\\n padding-left: 26px;\\n margin: 10px 0;\\n}\\n.md-preview li[data-v-4b2b74bc] {\\n margin: 4px 0;\\n}\\n.md-preview li > ul[data-v-4b2b74bc], .md-preview li > ol[data-v-4b2b74bc] {\\n margin: 2px 0;\\n}\\n/* 行内代码 */\\n.md-preview code[data-v-4b2b74bc]:not(pre code) {\\n background: #f0f2f5;\\n padding: 2px 8px;\\n border-radius: 4px;\\n font-size: 13px;\\n color: #c7254e;\\n border: 1px solid #e8eaed;\\n}\\n/* 代码块 */\\n.md-preview pre[data-v-4b2b74bc] {\\n background: #1e1e2e;\\n color: #cdd6f4;\\n padding: 18px 20px;\\n border-radius: 8px;\\n overflow-x: auto;\\n font-size: 13px;\\n line-height: 1.65;\\n margin: 14px 0;\\n border: 0;\\n}\\n.md-preview pre code[data-v-4b2b74bc] {\\n background: none;\\n padding: 0;\\n color: inherit;\\n font-size: inherit;\\n border: 0;\\n}\\n/* 引用 */\\n.md-preview blockquote[data-v-4b2b74bc] {\\n border-left: 4px solid #409eff;\\n padding: 10px 18px;\\n margin: 14px 0;\\n background: #f0f7ff;\\n color: #555;\\n border-radius: 0 4px 4px 0;\\n}\\n.md-preview blockquote p[data-v-4b2b74bc] {\\n margin: 6px 0;\\n}\\n/* 表格 */\\n.md-preview table[data-v-4b2b74bc] {\\n border-collapse: collapse;\\n width: 100%;\\n margin: 14px 0;\\n font-size: 13px;\\n}\\n.md-preview th[data-v-4b2b74bc], .md-preview td[data-v-4b2b74bc] {\\n border: 1px solid #e0e2e6;\\n padding: 10px 14px;\\n text-align: left;\\n}\\n.md-preview th[data-v-4b2b74bc] {\\n background: #f5f7fa;\\n font-weight: 600;\\n color: #1f2937;\\n}\\n.md-preview tr[data-v-4b2b74bc]:nth-child(even) {\\n background: #fafbfc;\\n}\\n.md-preview tr[data-v-4b2b74bc]:hover {\\n background: #f0f7ff;\\n}\\n/* 图片 */\\n.md-preview img[data-v-4b2b74bc] {\\n max-width: 100%;\\n border-radius: 6px;\\n margin: 8px 0;\\n box-shadow: 0 1px 4px rgba(0,0,0,0.1);\\n}\\n/* 链接 */\\n.md-preview a[data-v-4b2b74bc] {\\n color: #409eff;\\n text-decoration: none;\\n}\\n.md-preview a[data-v-4b2b74bc]:hover {\\n text-decoration: underline;\\n color: #2a7de1;\\n}\\n/* 分割线 */\\n.md-preview hr[data-v-4b2b74bc] {\\n border: none;\\n border-top: 1px solid #e8eaed;\\n margin: 20px 0;\\n}\\n/* 任务列表 */\\n.md-preview input[type=\\\"checkbox\\\"][data-v-4b2b74bc] {\\n margin-right: 6px;\\n}\\n\\n/* ==================== Excel 编辑器样式 ==================== */\\n.xlsx-editor-wrap[data-v-4b2b74bc] {\\n border: 1px solid #e4e7ed;\\n border-radius: 8px;\\n overflow: hidden;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\\n}\\n.xlsx-toolbar[data-v-4b2b74bc] {\\n display: flex;\\n align-items: center;\\n flex-wrap: wrap;\\n gap: 8px;\\n padding: 8px 12px;\\n background: #fafbfc;\\n border-bottom: 1px solid #e4e7ed;\\n}\\n.xlsx-sheet-tabs[data-v-4b2b74bc] {\\n display: flex;\\n align-items: center;\\n gap: 2px;\\n}\\n.xlsx-sheet-tab[data-v-4b2b74bc] {\\n padding: 4px 12px;\\n font-size: 12px;\\n cursor: pointer;\\n border: 1px solid transparent;\\n border-radius: 3px 3px 0 0;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n color: #606266;\\n background: #f0f2f5;\\n}\\n.xlsx-sheet-tab[data-v-4b2b74bc]:hover {\\n color: #409eff;\\n}\\n.xlsx-sheet-tab.active[data-v-4b2b74bc] {\\n color: #409eff;\\n background: #fff;\\n border-color: #dcdfe6;\\n border-bottom-color: #fff;\\n}\\n.xlsx-actions[data-v-4b2b74bc] {\\n display: flex;\\n align-items: center;\\n gap: 6px;\\n margin-left: auto;\\n flex-wrap: wrap;\\n}\\n.xlsx-info[data-v-4b2b74bc] {\\n font-size: 12px;\\n color: #909399;\\n margin-left: 4px;\\n white-space: nowrap;\\n}\\n.xlsx-table-wrap[data-v-4b2b74bc] {\\n overflow-x: auto;\\n padding: 4px;\\n}\\n.xlsx-table-wrap .el-table[data-v-4b2b74bc] {\\n font-size: 12px;\\n}\\n.xlsx-table-wrap .el-input__inner[data-v-4b2b74bc] {\\n border: 1px solid transparent;\\n background: transparent;\\n padding: 0 4px;\\n height: 28px;\\n line-height: 28px;\\n border-radius: 2px;\\n}\\n.xlsx-table-wrap .el-input__inner[data-v-4b2b74bc]:hover {\\n border-color: #c0c4cc;\\n}\\n.xlsx-table-wrap .el-input__inner[data-v-4b2b74bc]:focus {\\n border-color: #409eff;\\n background: #fff;\\n}\\n.xlsx-empty[data-v-4b2b74bc] {\\n padding: 40px 0;\\n}\\n.xlsx-loading[data-v-4b2b74bc] {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n padding: 60px 0;\\n color: #909399;\\n font-size: 16px;\\n gap: 8px;\\n}\\n\\n/* ==================== Word 编辑器样式 ==================== */\\n.word-editor-wrap[data-v-4b2b74bc] {\\n border: 1px solid #e4e7ed;\\n border-radius: 8px;\\n overflow: hidden;\\n background: #fff;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\\n}\\n.word-loading[data-v-4b2b74bc] {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n padding: 60px 0;\\n color: #909399;\\n font-size: 16px;\\n gap: 8px;\\n}\\n.word-header[data-v-4b2b74bc] {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n padding: 8px 14px;\\n background: #fafbfc;\\n border-bottom: 1px solid #e4e7ed;\\n font-size: 13px;\\n}\\n.word-filename[data-v-4b2b74bc] {\\n display: flex;\\n align-items: center;\\n gap: 6px;\\n color: #303133;\\n font-weight: 500;\\n max-width: 60%;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.word-filename .el-icon-document[data-v-4b2b74bc] {\\n color: #409eff;\\n font-size: 17px;\\n}\\n.word-stats[data-v-4b2b74bc] {\\n color: #909399;\\n font-size: 12px;\\n flex-shrink: 0;\\n}\\n.word-toolbar[data-v-4b2b74bc] {\\n display: flex;\\n align-items: center;\\n flex-wrap: wrap;\\n gap: 1px;\\n padding: 5px 10px;\\n background: #fafbfc;\\n border-bottom: 1px solid #e8eaed;\\n}\\n.word-tb-btn[data-v-4b2b74bc] {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n width: 30px;\\n height: 28px;\\n border: 1px solid transparent;\\n background: transparent;\\n border-radius: 4px;\\n cursor: pointer;\\n color: #5f6368;\\n outline: none;\\n transition: all 0.15s;\\n}\\n.word-tb-btn[data-v-4b2b74bc]:hover {\\n background: #e8eaed;\\n color: #202124;\\n}\\n.word-tb-btn[data-v-4b2b74bc]:active {\\n background: #d2d5d9;\\n}\\n.word-tb-btn-heading[data-v-4b2b74bc] {\\n font-size: 11px;\\n font-weight: 600;\\n font-family: 'Segoe UI', Arial, sans-serif;\\n width: 32px;\\n}\\n.word-tb-sep[data-v-4b2b74bc] {\\n display: inline-block;\\n width: 1px;\\n height: 18px;\\n background: #dcdfe6;\\n margin: 0 5px;\\n flex-shrink: 0;\\n}\\n.word-editor-content[data-v-4b2b74bc] {\\n min-height: 380px;\\n max-height: 500px;\\n overflow-y: auto;\\n padding: 18px 22px;\\n font-size: 16px;\\n line-height: 1.8;\\n color: #333;\\n outline: none;\\n -moz-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n -webkit-user-select: text;\\n}\\n.word-editor-content[data-v-4b2b74bc]:focus {\\n background: #fff;\\n}\\n.word-editor-content h1[data-v-4b2b74bc] {\\n font-size: 22px;\\n font-weight: 700;\\n margin: 20px 0 10px;\\n padding-bottom: 6px;\\n border-bottom: 2px solid #e8eaed;\\n color: #1a1a2e;\\n}\\n.word-editor-content h2[data-v-4b2b74bc] {\\n font-size: 18px;\\n font-weight: 600;\\n margin: 16px 0 8px;\\n padding-bottom: 4px;\\n border-bottom: 1px solid #e8eaed;\\n color: #1a1a2e;\\n}\\n.word-editor-content h3[data-v-4b2b74bc] {\\n font-size: 16px;\\n font-weight: 600;\\n margin: 14px 0 6px;\\n color: #2c3e50;\\n}\\n.word-editor-content p[data-v-4b2b74bc] {\\n margin: 8px 0;\\n}\\n.word-editor-content ul[data-v-4b2b74bc], .word-editor-content ol[data-v-4b2b74bc] {\\n padding-left: 24px;\\n margin: 8px 0;\\n}\\n.word-editor-content li[data-v-4b2b74bc] {\\n margin: 3px 0;\\n}\\n.word-editor-content blockquote[data-v-4b2b74bc] {\\n border-left: 3px solid #409eff;\\n padding: 6px 14px;\\n margin: 10px 0;\\n background: #f0f7ff;\\n color: #555;\\n border-radius: 0 4px 4px 0;\\n}\\n.word-editor-content pre[data-v-4b2b74bc] {\\n background: #f5f7fa;\\n padding: 12px 16px;\\n border-radius: 6px;\\n overflow-x: auto;\\n font-size: 13px;\\n border: 1px solid #e8eaed;\\n margin: 10px 0;\\n font-family: 'Cascadia Code', 'Fira Code', 'Consolas', monospace;\\n}\\n.word-editor-content a[data-v-4b2b74bc] {\\n color: #409eff;\\n text-decoration: underline;\\n}\\n.word-editor-content img[data-v-4b2b74bc] {\\n max-width: 100%;\\n border-radius: 4px;\\n margin: 6px 0;\\n}\\n.word-editor-content[data-v-4b2b74bc] ::-moz-selection {\\n background: #c7dbff;\\n}\\n.word-editor-content[data-v-4b2b74bc] ::selection {\\n background: #c7dbff;\\n}\\n\\n/* ==================== 弹窗整体美化 ==================== */\\n.document-form-dialog[data-v-4b2b74bc] {\\n border-radius: 12px;\\n box-shadow: 0 12px 32px rgba(0, 0, 0, 0.12);\\n overflow: hidden;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__header {\\n padding: 16px 24px;\\n border-bottom: 1px solid #ebeef5;\\n position: relative;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__title {\\n display: inline-flex;\\n align-items: center;\\n gap: 8px;\\n font-size: 16px;\\n font-weight: 600;\\n color: #303133;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__title::before {\\n content: '';\\n width: 4px;\\n height: 16px;\\n border-radius: 2px;\\n background: linear-gradient(180deg, #409eff, #79bbff);\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__headerbtn {\\n top: 16px;\\n right: 20px;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__headerbtn .el-dialog__close {\\n color: #909399;\\n font-size: 18px;\\n transition: color 0.2s;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__headerbtn .el-dialog__close:hover {\\n color: #303133;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__body {\\n padding: 20px 24px;\\n max-height: 70vh;\\n overflow-y: auto;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__footer {\\n padding: 12px 24px;\\n border-top: 1px solid #ebeef5;\\n background: #fafbfc;\\n}\\n\\n/* 滚动条 */\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__body::-webkit-scrollbar {\\n width: 6px;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__body::-webkit-scrollbar-thumb {\\n background: #dcdfe6;\\n border-radius: 3px;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__body::-webkit-scrollbar-thumb:hover {\\n background: #c0c4cc;\\n}\\n\\n/* 表单 */\\n.document-form-dialog[data-v-4b2b74bc] .el-form-item__label {\\n color: #606266;\\n font-weight: 500;\\n}\\n\\n/* 上传区 */\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger {\\n border: 1px dashed #c0c4cc;\\n border-radius: 10px;\\n background: #fafbfc;\\n transition: all 0.2s;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger:hover {\\n border-color: #409eff;\\n background: #f0f7ff;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger .el-icon-upload {\\n color: #409eff;\\n font-size: 56px;\\n margin-bottom: 8px;\\n}\\n\\n/* 标题输入 */\\n.document-form-dialog[data-v-4b2b74bc] .el-input.doc-title-input .el-input__inner {\\n border-radius: 6px;\\n transition: all 0.2s;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-input.doc-title-input .el-input__inner:hover {\\n border-color: #c0c4cc;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-input.doc-title-input .el-input__inner:focus {\\n border-color: #409eff;\\n}\\n\\n/* 所属文件夹选择 */\\n.document-form-dialog[data-v-4b2b74bc] .el-input.folder-picker-input-el .el-input__inner {\\n border-radius: 6px;\\n background: #fafbfc;\\n cursor: pointer;\\n color: #606266;\\n transition: all 0.2s;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-input.folder-picker-input-el .el-input__inner:hover {\\n border-color: #c0c4cc;\\n background: #fff;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-input.folder-picker-input-el .el-input__inner:focus {\\n border-color: #409eff;\\n background: #fff;\\n}\\n\\n/* 上传区(新增文档) */\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger {\\n border: 1px dashed #c0c4cc;\\n border-radius: 10px;\\n background: #fafbfc;\\n padding: 28px 16px;\\n transition: all 0.2s;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger:hover {\\n border-color: #409eff;\\n background: #f5faff;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger .el-icon-upload {\\n color: #409eff;\\n font-size: 60px;\\n margin-bottom: 10px;\\n transition: transform 0.2s;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger:hover .el-icon-upload {\\n transform: translateY(-2px);\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger .el-upload__text {\\n font-size: 16px;\\n color: #606266;\\n margin-bottom: 6px;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger .el-upload__text em {\\n font-style: normal;\\n color: #409eff;\\n font-weight: 600;\\n padding: 0 8px;\\n height: 26px;\\n line-height: 26px;\\n border: 1px solid #b3d8ff;\\n border-radius: 13px;\\n display: inline-block;\\n vertical-align: middle;\\n background: #ecf5ff;\\n transition: all 0.2s;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger:hover .el-upload__text em {\\n background: #409eff;\\n color: #fff;\\n border-color: #409eff;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger .el-upload__tip {\\n margin-top: 12px;\\n font-size: 12px;\\n color: #909399;\\n}\\n\\n/* 上传文件列表内简化看板 */\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-list {\\n margin-top: 12px;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-list__item {\\n border-radius: 6px;\\n transition: background 0.2s;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-list__item:hover {\\n background: #f5f7fa;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-list__item-name {\\n color: #303133;\\n}\\n\\n/* ===== 移动端:表单全屏 + 标签堆叠 ===== */\\n@media (max-width: 768px) {\\n.document-form-dialog[data-v-4b2b74bc] {\\n width: 100% !important;\\n margin: 0 !important;\\n max-width: 100% !important;\\n top: 0 !important;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__header {\\n padding: 14px 16px;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__headerbtn {\\n top: 12px;\\n right: 12px;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-dialog__body {\\n padding: 16px;\\n max-height: calc(100vh - 120px);\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-form-item__label {\\n float: none;\\n display: block;\\n width: auto !important;\\n text-align: left;\\n line-height: 24px;\\n padding-bottom: 4px;\\n height: auto;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-form-item__content {\\n margin-left: 0 !important;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-form-item {\\n margin-bottom: 14px;\\n}\\n.document-form-dialog[data-v-4b2b74bc] .el-upload-dragger .el-upload__tip {\\n white-space: normal;\\n}\\n /* Excel 表格列过窄时允许横向滚动 */\\n.document-form-dialog[data-v-4b2b74bc] .xlsx-table-wrap {\\n overflow-x: auto;\\n}\\n}\\n\\n/* ===== H5 自绘上传/表格编辑(无 Element UI 依赖) ===== */\\n.kbm-upload[data-v-4b2b74bc] {\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n gap: 8px;\\n padding: 26px 16px;\\n border: 1px dashed #c0c4cc;\\n border-radius: 10px;\\n background: #fafbfc;\\n color: #606266;\\n cursor: pointer;\\n}\\n.kbm-upload[data-v-4b2b74bc]:active {\\n border-color: #1677ff;\\n background: #f0f7ff;\\n}\\n.kbm-upload-input[data-v-4b2b74bc] {\\n display: none;\\n}\\n.kbm-upload-text[data-v-4b2b74bc] {\\n font-size: 14px;\\n}\\n.kbm-upload-tip[data-v-4b2b74bc] {\\n margin-top: 8px;\\n font-size: 12px;\\n line-height: 1.6;\\n color: #909399;\\n}\\n.kbm-file-row[data-v-4b2b74bc] {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n gap: 8px;\\n padding: 8px 10px;\\n margin-top: 8px;\\n background: #f5f7fa;\\n border-radius: 6px;\\n font-size: 13px;\\n color: #303133;\\n}\\n.kbm-file-name[data-v-4b2b74bc] {\\n flex: 1;\\n min-width: 0;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.kbm-required[data-v-4b2b74bc] {\\n margin-left: 2px;\\n color: #f56c6c;\\n}\\n.kbm-mini-btn[data-v-4b2b74bc] {\\n height: 26px;\\n padding: 0 10px;\\n border: 1px solid #dcdfe6;\\n border-radius: 13px;\\n background: #fff;\\n font-size: 12px;\\n color: #606266;\\n}\\n.kbm-mini-btn.danger[data-v-4b2b74bc] {\\n border-color: #ffccc7;\\n color: #f5222d;\\n}\\n.kbm-mini-btn.warning[data-v-4b2b74bc] {\\n border-color: #ffe58f;\\n color: #d48806;\\n}\\n.kbm-xlsx-scroll[data-v-4b2b74bc] {\\n overflow-x: auto;\\n -webkit-overflow-scrolling: touch;\\n}\\n.kbm-xlsx-table[data-v-4b2b74bc] {\\n border-collapse: collapse;\\n width: -webkit-max-content;\\n width: -moz-max-content;\\n width: max-content;\\n min-width: 100%;\\n font-size: 12px;\\n}\\n.kbm-xlsx-table th[data-v-4b2b74bc],\\n.kbm-xlsx-table td[data-v-4b2b74bc] {\\n border: 1px solid #e4e7ed;\\n padding: 2px 4px;\\n background: #fff;\\n}\\n.kbm-xlsx-table th[data-v-4b2b74bc] {\\n background: #f5f7fa;\\n font-weight: 600;\\n color: #303133;\\n white-space: nowrap;\\n}\\n.kbm-xlsx-cell[data-v-4b2b74bc] {\\n width: 96px;\\n height: 26px;\\n border: 1px solid transparent;\\n border-radius: 4px;\\n background: transparent;\\n font-size: 12px;\\n color: #303133;\\n outline: none;\\n}\\n.kbm-xlsx-cell[data-v-4b2b74bc]:focus {\\n border-color: #1677ff;\\n background: #fff;\\n}\\n.kbm-xlsx-op[data-v-4b2b74bc] {\\n width: 44px;\\n text-align: center;\\n}\\n.kbm-cell-del[data-v-4b2b74bc] {\\n width: 24px;\\n height: 24px;\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n border: none;\\n border-radius: 50%;\\n background: transparent;\\n color: #f56c6c;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/DocumentForm.vue?./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1701
1725
|
|
|
1702
1726
|
/***/ }),
|
|
1703
1727
|
|
|
@@ -1708,7 +1732,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../.
|
|
|
1708
1732
|
/*! no static exports found */
|
|
1709
1733
|
/***/ (function(module, exports, __webpack_require__) {
|
|
1710
1734
|
|
|
1711
|
-
eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.kb-document-list[data-v-0e636c7c] {\\n height: 100%;\\n display: flex;\\n flex-direction: column;\\n padding: 24px;\\n box-sizing: border-box;\\n background: #fff;\\n}\\n.kb-document-list[data-v-0e636c7c],\\n.kb-document-list *[data-v-0e636c7c],\\n.kb-document-list *[data-v-0e636c7c]::before,\\n.kb-document-list *[data-v-0e636c7c]::after {\\n font-size: 16px !important;\\n}\\n\\n/* ===== 工具栏 ===== */\\n.doc-toolbar[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n margin-bottom: 20px;\\n flex-shrink: 0;\\n}\\n.doc-toolbar-left[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n gap: 12px;\\n}\\n.doc-toolbar-right[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n gap: 12px;\\n}\\n\\n/* 搜索输入框 */\\n.doc-toolbar[data-v-0e636c7c] .search-input {\\n width: 280px;\\n}\\n.doc-toolbar[data-v-0e636c7c] .search-input .el-input__inner {\\n background: #fff;\\n border: 1px solid #dcdfe6;\\n border-radius: 4px;\\n transition: all 0.2s;\\n height: 36px;\\n line-height: 34px;\\n}\\n.doc-toolbar[data-v-0e636c7c] .search-input .el-input__inner:focus {\\n border-color: #409eff;\\n box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.1);\\n}\\n\\n/* 按钮 */\\n.doc-toolbar[data-v-0e636c7c] .el-button--small {\\n height: 36px;\\n padding: 0 16px;\\n border-radius: 4px;\\n font-weight: 500;\\n transition: all 0.2s;\\n}\\n.doc-toolbar[data-v-0e636c7c] .el-button--primary {\\n background: #409eff;\\n border-color: #409eff;\\n}\\n.doc-toolbar[data-v-0e636c7c] .el-button--primary:hover {\\n background: #66b1ff;\\n border-color: #66b1ff;\\n}\\n.doc-toolbar[data-v-0e636c7c] .el-button--success {\\n background: #67c23a;\\n border-color: #67c23a;\\n}\\n.doc-toolbar[data-v-0e636c7c] .el-button--success:hover {\\n background: #85ce61;\\n border-color: #85ce61;\\n}\\n.doc-toolbar[data-v-0e636c7c] .el-button--default {\\n background: #fff;\\n border-color: #dcdfe6;\\n color: #606266;\\n}\\n.doc-toolbar[data-v-0e636c7c] .el-button--default:hover {\\n color: #409eff;\\n border-color: #c6e2ff;\\n background: #ecf5ff;\\n}\\n\\n/* ===== 表格容器 ===== */\\n.doc-table-wrap[data-v-0e636c7c] {\\n flex: 1;\\n overflow: hidden;\\n min-height: 0;\\n background: #fff;\\n border-radius: 4px;\\n border: 1px solid #ebeef5;\\n}\\n\\n/* 表格 */\\n.doc-table-wrap[data-v-0e636c7c] .el-table {\\n font-size: 16px;\\n}\\n.doc-table-wrap[data-v-0e636c7c] .el-table th.el-table__cell {\\n background: #f5f7fa !important;\\n color: #303133 !important;\\n font-weight: 600 !important;\\n border-bottom: 1px solid #ebeef5;\\n}\\n.doc-table-wrap[data-v-0e636c7c] .el-table__row:hover {\\n background: #f5f7fa !important;\\n}\\n.doc-table-wrap[data-v-0e636c7c] .el-table td.el-table__cell {\\n border-bottom: 1px solid #ebeef5;\\n color: #606266;\\n}\\n.doc-table-wrap[data-v-0e636c7c] .el-table--striped .el-table__body tr.el-table__row--striped td {\\n background: #fafafa;\\n}\\n\\n/* 文件标题单元格 */\\n.file-title-cell[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n}\\n.file-icon-img[data-v-0e636c7c] {\\n flex-shrink: 0;\\n width: 35px;\\n height: 35px;\\n -o-object-fit: contain;\\n object-fit: contain;\\n vertical-align: middle;\\n}\\n.doc-table-wrap[data-v-0e636c7c] .el-table__row:hover .file-icon-img {\\n transform: scale(1.08);\\n}\\n\\n/* 文件夹名称 */\\n.folder-name[data-v-0e636c7c] {\\n color: #909399;\\n font-size: 13px;\\n}\\n\\n/* Tag */\\n.doc-table-wrap[data-v-0e636c7c] .el-tag {\\n border-radius: 4px;\\n font-weight: 500;\\n}\\n\\n/* 操作按钮 */\\n.doc-table-wrap[data-v-0e636c7c] .el-button--mini.el-button--text {\\n padding: 6px 10px;\\n font-weight: 500;\\n}\\n.doc-table-wrap[data-v-0e636c7c] .el-button--mini.el-button--text:hover {\\n background: #ecf5ff;\\n color: #409eff;\\n}\\n.doc-table-wrap[data-v-0e636c7c] .el-button--mini.el-button--text[style*=\\\"color: #f56c6c\\\"]:hover {\\n background: #fef0f0;\\n color: #f56c6c;\\n}\\n\\n/* ===== 分页 ===== */\\n.doc-pagination[data-v-0e636c7c] {\\n display: flex;\\n justify-content: flex-end;\\n padding-top: 16px;\\n flex-shrink: 0;\\n}\\n.doc-pagination[data-v-0e636c7c] .el-pagination.is-background .el-pager li {\\n background: #ffffff;\\n border-radius: 4px;\\n margin: 0 3px;\\n}\\n.doc-pagination[data-v-0e636c7c] .el-pagination.is-background .el-pager li:hover {\\n color: #409eff;\\n}\\n.doc-pagination[data-v-0e636c7c] .el-pagination.is-background .el-pager li.active {\\n /* background: #f4f4f5; */\\n background: #ffffff;\\n color: #fff;\\n}\\n/* ==================== 预览弹框头部(WPS 风格) ==================== */\\n.wps-dialog-header[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n height: 52px;\\n padding: 0 54px 0 20px;\\n background: #f5f7fa;\\n box-sizing: border-box;\\n}\\n.wps-dialog-left[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n min-width: 0;\\n}\\n.wps-dialog-icon-img[data-v-0e636c7c] {\\n width: 22px;\\n height: 22px;\\n -o-object-fit: contain;\\n object-fit: contain;\\n flex-shrink: 0;\\n}\\n.wps-dialog-name[data-v-0e636c7c] {\\n font-size: 17px;\\n font-weight: 600;\\n color: #1f2329;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n max-width: 520px;\\n}\\n.wps-dialog-badge[data-v-0e636c7c] {\\n display: inline-flex;\\n align-items: center;\\n gap: 4px;\\n margin-left: 8px;\\n padding: 2px 10px;\\n font-size: 12px;\\n color: #909399;\\n background: #fff;\\n border: 1px solid #dcdfe6;\\n border-radius: 12px;\\n flex-shrink: 0;\\n}\\n.preview-body[data-v-0e636c7c] {\\n height: calc(90vh - 120px);\\n display: flex;\\n flex-direction: column;\\n background: #fff;\\n}\\n/* ==================== WPS 白色纸张页面观感 ==================== */\\n.preview-page-canvas[data-v-0e636c7c] {\\n flex: 1;\\n overflow: auto;\\n background: #fafbfc; /* 页面背景色 */\\n padding: 32px 24px;\\n margin-bottom: 10px; /* 外边框底部留 10px 边界 */\\n display: flex;\\n justify-content: center;\\n align-items: flex-start;\\n}\\n/* 白色纸张页面 */\\n.preview-page[data-v-0e636c7c] {\\n width: 100%;\\n max-width: 820px; /* 约 A4 宽度 */\\n min-height: 640px;\\n box-sizing: border-box;\\n background: #fff;\\n border-radius: 2px;\\n box-shadow: 0 3px 12px rgba(0, 0, 0, 0.10), 0 1px 2px rgba(0, 0, 0, 0.06);\\n padding: 40px 56px;\\n position: relative;\\n}\\n.preview-page.paper-pdf[data-v-0e636c7c] {\\n height: 100%;\\n min-height: 0;\\n padding: 0;\\n overflow: hidden;\\n}\\n.preview-frame[data-v-0e636c7c] {\\n width: 100%;\\n height: 100%;\\n border: 0;\\n background: #fff;\\n}\\n.preview-center[data-v-0e636c7c] {\\n height: 100%;\\n overflow: auto;\\n text-align: center;\\n background: #e8eaed;\\n border-radius: 4px;\\n padding: 16px;\\n}\\n.preview-center img[data-v-0e636c7c] {\\n box-shadow: 0 3px 12px rgba(0, 0, 0, 0.10), 0 1px 2px rgba(0, 0, 0, 0.06);\\n border-radius: 2px;\\n}\\n.preview-text[data-v-0e636c7c] {\\n height: 100%;\\n overflow: auto;\\n background: #f5f7fa;\\n border-radius: 4px;\\n padding: 16px;\\n}\\n.preview-text pre[data-v-0e636c7c] {\\n white-space: pre-wrap;\\n word-break: break-all;\\n font-size: 13px;\\n line-height: 1.8;\\n margin: 0;\\n}\\n.preview-markdown[data-v-0e636c7c] {\\n font-size: 16px;\\n line-height: 1.8;\\n color: #333;\\n}\\n.preview-markdown h1[data-v-0e636c7c] { font-size: 22px; margin: 16px 0 8px; border-bottom: 1px solid #eee; padding-bottom: 6px;\\n}\\n.preview-markdown h2[data-v-0e636c7c] { font-size: 19px; margin: 14px 0 6px;\\n}\\n.preview-markdown h3[data-v-0e636c7c] { font-size: 16px; margin: 12px 0 4px;\\n}\\n.preview-markdown p[data-v-0e636c7c] { margin: 8px 0;\\n}\\n.preview-markdown ul[data-v-0e636c7c], .preview-markdown ol[data-v-0e636c7c] { padding-left: 24px; margin: 8px 0;\\n}\\n.preview-markdown code[data-v-0e636c7c] {\\n background: #f0f0f0;\\n padding: 2px 6px;\\n border-radius: 3px;\\n font-size: 13px;\\n color: #d63384;\\n}\\n.preview-markdown pre[data-v-0e636c7c] {\\n background: #282c34;\\n color: #abb2bf;\\n padding: 16px;\\n border-radius: 6px;\\n overflow-x: auto;\\n font-size: 13px;\\n line-height: 1.6;\\n margin: 12px 0;\\n}\\n.preview-markdown pre code[data-v-0e636c7c] {\\n background: none;\\n padding: 0;\\n color: inherit;\\n font-size: inherit;\\n}\\n.preview-markdown blockquote[data-v-0e636c7c] {\\n border-left: 4px solid #409eff;\\n padding: 8px 16px;\\n margin: 12px 0;\\n background: #f5f7fa;\\n color: #666;\\n}\\n.preview-markdown table[data-v-0e636c7c] {\\n border-collapse: collapse;\\n width: 100%;\\n margin: 12px 0;\\n}\\n.preview-markdown th[data-v-0e636c7c], .preview-markdown td[data-v-0e636c7c] {\\n border: 1px solid #ddd;\\n padding: 8px 12px;\\n text-align: left;\\n}\\n.preview-markdown th[data-v-0e636c7c] {\\n background: #f5f7fa;\\n font-weight: bold;\\n}\\n.preview-markdown img[data-v-0e636c7c] {\\n max-width: 100%;\\n border-radius: 4px;\\n}\\n.preview-markdown a[data-v-0e636c7c] {\\n color: #409eff;\\n}\\n\\n/* ==================== Excel 预览样式 ==================== */\\n.preview-xlsx-wrap[data-v-0e636c7c] {\\n height: 100%;\\n display: flex;\\n flex-direction: column;\\n background: #fff;\\n border-radius: 4px;\\n border: 1px solid #e8eaed;\\n}\\n.preview-loading[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n padding: 60px 0;\\n color: #909399;\\n font-size: 16px;\\n gap: 8px;\\n}\\n.preview-xlsx-toolbar[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n gap: 2px;\\n padding: 8px 12px;\\n background: #f8f9fb;\\n border-bottom: 1px solid #e8eaed;\\n flex-shrink: 0;\\n}\\n.preview-xlsx-tab[data-v-0e636c7c] {\\n padding: 4px 14px;\\n font-size: 12px;\\n cursor: pointer;\\n border: 1px solid transparent;\\n border-radius: 3px 3px 0 0;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n color: #606266;\\n background: #f0f2f5;\\n}\\n.preview-xlsx-tab[data-v-0e636c7c]:hover {\\n color: #409eff;\\n}\\n.preview-xlsx-tab.active[data-v-0e636c7c] {\\n color: #409eff;\\n background: #fff;\\n border-color: #dcdfe6;\\n border-bottom-color: #fff;\\n}\\n.preview-xlsx-table-wrap[data-v-0e636c7c] {\\n max-height: 680px;\\n overflow: auto;\\n padding: 8px;\\n border: 1px solid #e8eaed;\\n border-radius: 4px;\\n}\\n.preview-xlsx-notice[data-v-0e636c7c] {\\n padding: 6px 12px;\\n margin-bottom: 8px;\\n font-size: 12px;\\n color: #e6a23c;\\n background: #fdf6ec;\\n border: 1px solid #faecd8;\\n border-radius: 4px;\\n}\\n.preview-xlsx-table[data-v-0e636c7c] {\\n border-collapse: collapse;\\n width: 100%;\\n font-size: 13px;\\n}\\n.preview-xlsx-table th[data-v-0e636c7c],\\n.preview-xlsx-table td[data-v-0e636c7c] {\\n border: 1px solid #dcdfe6;\\n padding: 6px 10px;\\n text-align: left;\\n white-space: nowrap;\\n min-width: 80px;\\n}\\n.preview-xlsx-table th[data-v-0e636c7c] {\\n background: #f5f7fa;\\n font-weight: 600;\\n color: #1f2937;\\n position: sticky;\\n top: 0;\\n}\\n.preview-xlsx-table tr[data-v-0e636c7c]:nth-child(even) {\\n background: #fafbfc;\\n}\\n.preview-xlsx-table tr[data-v-0e636c7c]:hover {\\n background: #f0f7ff;\\n}\\n\\n/* ==================== Word 预览样式 ==================== */\\n.preview-docx-wrap[data-v-0e636c7c] {\\n height: 100%;\\n overflow: auto;\\n background: #fff;\\n border-radius: 4px;\\n border: 1px solid #e8eaed;\\n}\\n.preview-docx-content[data-v-0e636c7c] {\\n padding: 0;\\n font-size: 16px;\\n line-height: 1.8;\\n color: #333;\\n min-height: 0;\\n -webkit-user-select: text;\\n -moz-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n}\\n.preview-docx-content h1[data-v-0e636c7c] {\\n font-size: 22px;\\n font-weight: 700;\\n margin: 20px 0 10px;\\n padding-bottom: 6px;\\n border-bottom: 2px solid #e8eaed;\\n color: #1a1a2e;\\n}\\n.preview-docx-content h2[data-v-0e636c7c] {\\n font-size: 18px;\\n font-weight: 600;\\n margin: 16px 0 8px;\\n padding-bottom: 4px;\\n border-bottom: 1px solid #e8eaed;\\n color: #1a1a2e;\\n}\\n.preview-docx-content h3[data-v-0e636c7c] {\\n font-size: 16px;\\n font-weight: 600;\\n margin: 14px 0 6px;\\n color: #2c3e50;\\n}\\n.preview-docx-content p[data-v-0e636c7c] {\\n margin: 8px 0;\\n}\\n.preview-docx-content ul[data-v-0e636c7c],\\n.preview-docx-content ol[data-v-0e636c7c] {\\n padding-left: 24px;\\n margin: 8px 0;\\n}\\n.preview-docx-content li[data-v-0e636c7c] {\\n margin: 3px 0;\\n}\\n.preview-docx-content blockquote[data-v-0e636c7c] {\\n border-left: 3px solid #409eff;\\n padding: 6px 14px;\\n margin: 10px 0;\\n background: #f0f7ff;\\n color: #555;\\n border-radius: 0 4px 4px 0;\\n}\\n.preview-docx-content pre[data-v-0e636c7c] {\\n background: #f5f7fa;\\n padding: 12px 16px;\\n border-radius: 6px;\\n overflow-x: auto;\\n font-size: 13px;\\n border: 1px solid #e8eaed;\\n margin: 10px 0;\\n}\\n.preview-docx-content a[data-v-0e636c7c] {\\n color: #409eff;\\n text-decoration: underline;\\n}\\n.preview-docx-content img[data-v-0e636c7c] {\\n max-width: 100%;\\n border-radius: 4px;\\n margin: 6px 0;\\n}\\n.preview-docx-content table[data-v-0e636c7c] {\\n border-collapse: collapse;\\n width: 100%;\\n margin: 12px 0;\\n font-size: 13px;\\n}\\n.preview-docx-content th[data-v-0e636c7c],\\n.preview-docx-content td[data-v-0e636c7c] {\\n border: 1px solid #dcdfe6;\\n padding: 8px 12px;\\n text-align: left;\\n}\\n.preview-docx-content th[data-v-0e636c7c] {\\n background: #f5f7fa;\\n font-weight: 600;\\n}\\n\\n/* ==================== 批量移动弹窗 ==================== */\\n.move-tip[data-v-0e636c7c] {\\n margin-bottom: 12px;\\n padding: 10px 12px;\\n background: #f5f7fa;\\n border-radius: 4px;\\n font-size: 16px;\\n color: #606266;\\n}\\n.move-count[data-v-0e636c7c] {\\n color: #409eff;\\n font-weight: 600;\\n}\\n.move-target[data-v-0e636c7c] {\\n color: #67c23a;\\n font-weight: 600;\\n}\\n.move-target-empty[data-v-0e636c7c] {\\n color: #e6a23c;\\n}\\n.move-folder-wrap[data-v-0e636c7c] {\\n max-height: 420px;\\n overflow: auto;\\n border: 1px solid #e8eaed;\\n border-radius: 4px;\\n padding: 8px;\\n}\\n.move-folder-wrap[data-v-0e636c7c] .el-tree-node__content {\\n height: 32px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/DocumentList.vue?./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1735
|
+
eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.kb-document-list[data-v-0e636c7c] {\\n height: 100%;\\n display: flex;\\n flex-direction: column;\\n padding: 24px;\\n box-sizing: border-box;\\n background: #fff;\\n}\\n.kb-document-list[data-v-0e636c7c],\\n.kb-document-list *[data-v-0e636c7c],\\n.kb-document-list *[data-v-0e636c7c]::before,\\n.kb-document-list *[data-v-0e636c7c]::after {\\n font-size: 16px !important;\\n}\\n\\n/* ===== 工具栏 ===== */\\n.doc-toolbar[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n margin-bottom: 20px;\\n flex-shrink: 0;\\n}\\n.doc-toolbar-left[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n gap: 12px;\\n}\\n.doc-toolbar-right[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n gap: 12px;\\n}\\n\\n/* 搜索输入框 */\\n.doc-toolbar[data-v-0e636c7c] .search-input {\\n width: 280px;\\n}\\n.doc-toolbar[data-v-0e636c7c] .search-input .el-input__inner {\\n background: #fff;\\n border: 1px solid #dcdfe6;\\n border-radius: 4px;\\n transition: all 0.2s;\\n height: 36px;\\n line-height: 34px;\\n}\\n.doc-toolbar[data-v-0e636c7c] .search-input .el-input__inner:focus {\\n border-color: #409eff;\\n box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.1);\\n}\\n\\n/* 按钮 */\\n.doc-toolbar[data-v-0e636c7c] .el-button--small {\\n height: 36px;\\n padding: 0 16px;\\n border-radius: 4px;\\n font-weight: 500;\\n transition: all 0.2s;\\n}\\n.doc-toolbar[data-v-0e636c7c] .el-button--primary {\\n background: #409eff;\\n border-color: #409eff;\\n}\\n.doc-toolbar[data-v-0e636c7c] .el-button--primary:hover {\\n background: #66b1ff;\\n border-color: #66b1ff;\\n}\\n.doc-toolbar[data-v-0e636c7c] .el-button--success {\\n background: #67c23a;\\n border-color: #67c23a;\\n}\\n.doc-toolbar[data-v-0e636c7c] .el-button--success:hover {\\n background: #85ce61;\\n border-color: #85ce61;\\n}\\n.doc-toolbar[data-v-0e636c7c] .el-button--default {\\n background: #fff;\\n border-color: #dcdfe6;\\n color: #606266;\\n}\\n.doc-toolbar[data-v-0e636c7c] .el-button--default:hover {\\n color: #409eff;\\n border-color: #c6e2ff;\\n background: #ecf5ff;\\n}\\n\\n/* ===== 表格容器 ===== */\\n.doc-table-wrap[data-v-0e636c7c] {\\n flex: 1;\\n overflow: hidden;\\n min-height: 0;\\n background: #fff;\\n border-radius: 4px;\\n border: 1px solid #ebeef5;\\n}\\n\\n/* 表格 */\\n.doc-table-wrap[data-v-0e636c7c] .el-table {\\n font-size: 16px;\\n}\\n.doc-table-wrap[data-v-0e636c7c] .el-table th.el-table__cell {\\n background: #f5f7fa !important;\\n color: #303133 !important;\\n font-weight: 600 !important;\\n border-bottom: 1px solid #ebeef5;\\n}\\n.doc-table-wrap[data-v-0e636c7c] .el-table__row:hover {\\n background: #f5f7fa !important;\\n}\\n.doc-table-wrap[data-v-0e636c7c] .el-table td.el-table__cell {\\n border-bottom: 1px solid #ebeef5;\\n color: #606266;\\n}\\n.doc-table-wrap[data-v-0e636c7c] .el-table--striped .el-table__body tr.el-table__row--striped td {\\n background: #fafafa;\\n}\\n\\n/* 文件标题单元格 */\\n.file-title-cell[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n}\\n.file-icon-img[data-v-0e636c7c] {\\n flex-shrink: 0;\\n width: 35px;\\n height: 35px;\\n -o-object-fit: contain;\\n object-fit: contain;\\n vertical-align: middle;\\n}\\n.doc-table-wrap[data-v-0e636c7c] .el-table__row:hover .file-icon-img {\\n transform: scale(1.08);\\n}\\n\\n/* 文件夹名称 */\\n.folder-name[data-v-0e636c7c] {\\n color: #909399;\\n font-size: 13px;\\n}\\n\\n/* Tag */\\n.doc-table-wrap[data-v-0e636c7c] .el-tag {\\n border-radius: 4px;\\n font-weight: 500;\\n}\\n\\n/* 操作按钮 */\\n.doc-table-wrap[data-v-0e636c7c] .el-button--mini.el-button--text {\\n padding: 6px 10px;\\n font-weight: 500;\\n}\\n.doc-table-wrap[data-v-0e636c7c] .el-button--mini.el-button--text:hover {\\n background: #ecf5ff;\\n color: #409eff;\\n}\\n.doc-table-wrap[data-v-0e636c7c] .el-button--mini.el-button--text[style*=\\\"color: #f56c6c\\\"]:hover {\\n background: #fef0f0;\\n color: #f56c6c;\\n}\\n\\n/* ===== 分页 ===== */\\n.doc-pagination[data-v-0e636c7c] {\\n display: flex;\\n justify-content: flex-end;\\n padding-top: 16px;\\n flex-shrink: 0;\\n}\\n.doc-pagination[data-v-0e636c7c] .el-pagination.is-background .el-pager li {\\n background: #ffffff;\\n border-radius: 4px;\\n margin: 0 3px;\\n}\\n.doc-pagination[data-v-0e636c7c] .el-pagination.is-background .el-pager li:hover {\\n color: #409eff;\\n}\\n.doc-pagination[data-v-0e636c7c] .el-pagination.is-background .el-pager li.active {\\n /* background: #f4f4f5; */\\n background: #ffffff;\\n color: #fff;\\n}\\n/* ==================== 预览弹框头部(WPS 风格) ==================== */\\n.wps-dialog-header[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n height: 52px;\\n padding: 0 54px 0 20px;\\n background: #f5f7fa;\\n box-sizing: border-box;\\n}\\n.wps-dialog-left[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n min-width: 0;\\n}\\n.wps-dialog-icon-img[data-v-0e636c7c] {\\n width: 22px;\\n height: 22px;\\n -o-object-fit: contain;\\n object-fit: contain;\\n flex-shrink: 0;\\n}\\n.wps-dialog-name[data-v-0e636c7c] {\\n font-size: 17px;\\n font-weight: 600;\\n color: #1f2329;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n max-width: 520px;\\n}\\n.wps-dialog-badge[data-v-0e636c7c] {\\n display: inline-flex;\\n align-items: center;\\n gap: 4px;\\n margin-left: 8px;\\n padding: 2px 10px;\\n font-size: 12px;\\n color: #909399;\\n background: #fff;\\n border: 1px solid #dcdfe6;\\n border-radius: 12px;\\n flex-shrink: 0;\\n}\\n.preview-body[data-v-0e636c7c] {\\n height: calc(90vh - 120px);\\n display: flex;\\n flex-direction: column;\\n background: #fff;\\n}\\n/* ==================== WPS 白色纸张页面观感 ==================== */\\n.preview-page-canvas[data-v-0e636c7c] {\\n flex: 1;\\n overflow: auto;\\n background: #fafbfc; /* 页面背景色 */\\n padding: 32px 24px;\\n margin-bottom: 10px; /* 外边框底部留 10px 边界 */\\n display: flex;\\n justify-content: center;\\n align-items: flex-start;\\n}\\n/* 白色纸张页面 */\\n.preview-page[data-v-0e636c7c] {\\n width: 100%;\\n max-width: 820px; /* 约 A4 宽度 */\\n min-height: 640px;\\n box-sizing: border-box;\\n background: #fff;\\n border-radius: 2px;\\n box-shadow: 0 3px 12px rgba(0, 0, 0, 0.10), 0 1px 2px rgba(0, 0, 0, 0.06);\\n padding: 40px 56px;\\n position: relative;\\n}\\n.preview-page.paper-pdf[data-v-0e636c7c] {\\n height: 100%;\\n min-height: 0;\\n padding: 0;\\n overflow: hidden;\\n}\\n.preview-frame[data-v-0e636c7c] {\\n width: 100%;\\n height: 100%;\\n border: 0;\\n background: #fff;\\n}\\n.preview-center[data-v-0e636c7c] {\\n height: 100%;\\n overflow: auto;\\n text-align: center;\\n background: #e8eaed;\\n border-radius: 4px;\\n padding: 16px;\\n}\\n.preview-center img[data-v-0e636c7c] {\\n box-shadow: 0 3px 12px rgba(0, 0, 0, 0.10), 0 1px 2px rgba(0, 0, 0, 0.06);\\n border-radius: 2px;\\n}\\n.preview-text[data-v-0e636c7c] {\\n height: 100%;\\n overflow: auto;\\n background: #f5f7fa;\\n border-radius: 4px;\\n padding: 16px;\\n}\\n.preview-text pre[data-v-0e636c7c] {\\n white-space: pre-wrap;\\n word-break: break-all;\\n font-size: 13px;\\n line-height: 1.8;\\n margin: 0;\\n}\\n.preview-markdown[data-v-0e636c7c] {\\n font-size: 16px;\\n line-height: 1.8;\\n color: #333;\\n}\\n.preview-markdown h1[data-v-0e636c7c] { font-size: 22px; margin: 16px 0 8px; border-bottom: 1px solid #eee; padding-bottom: 6px;\\n}\\n.preview-markdown h2[data-v-0e636c7c] { font-size: 19px; margin: 14px 0 6px;\\n}\\n.preview-markdown h3[data-v-0e636c7c] { font-size: 16px; margin: 12px 0 4px;\\n}\\n.preview-markdown p[data-v-0e636c7c] { margin: 8px 0;\\n}\\n.preview-markdown ul[data-v-0e636c7c], .preview-markdown ol[data-v-0e636c7c] { padding-left: 24px; margin: 8px 0;\\n}\\n.preview-markdown code[data-v-0e636c7c] {\\n background: #f0f0f0;\\n padding: 2px 6px;\\n border-radius: 3px;\\n font-size: 13px;\\n color: #d63384;\\n}\\n.preview-markdown pre[data-v-0e636c7c] {\\n background: #282c34;\\n color: #abb2bf;\\n padding: 16px;\\n border-radius: 6px;\\n overflow-x: auto;\\n font-size: 13px;\\n line-height: 1.6;\\n margin: 12px 0;\\n}\\n.preview-markdown pre code[data-v-0e636c7c] {\\n background: none;\\n padding: 0;\\n color: inherit;\\n font-size: inherit;\\n}\\n.preview-markdown blockquote[data-v-0e636c7c] {\\n border-left: 4px solid #409eff;\\n padding: 8px 16px;\\n margin: 12px 0;\\n background: #f5f7fa;\\n color: #666;\\n}\\n.preview-markdown table[data-v-0e636c7c] {\\n border-collapse: collapse;\\n width: 100%;\\n margin: 12px 0;\\n}\\n.preview-markdown th[data-v-0e636c7c], .preview-markdown td[data-v-0e636c7c] {\\n border: 1px solid #ddd;\\n padding: 8px 12px;\\n text-align: left;\\n}\\n.preview-markdown th[data-v-0e636c7c] {\\n background: #f5f7fa;\\n font-weight: bold;\\n}\\n.preview-markdown img[data-v-0e636c7c] {\\n max-width: 100%;\\n border-radius: 4px;\\n}\\n.preview-markdown a[data-v-0e636c7c] {\\n color: #409eff;\\n}\\n\\n/* ==================== Excel 预览样式 ==================== */\\n.preview-xlsx-wrap[data-v-0e636c7c] {\\n height: 100%;\\n display: flex;\\n flex-direction: column;\\n background: #fff;\\n border-radius: 4px;\\n border: 1px solid #e8eaed;\\n}\\n.preview-loading[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n padding: 60px 0;\\n color: #909399;\\n font-size: 16px;\\n gap: 8px;\\n}\\n.preview-xlsx-toolbar[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n gap: 2px;\\n padding: 8px 12px;\\n background: #f8f9fb;\\n border-bottom: 1px solid #e8eaed;\\n flex-shrink: 0;\\n}\\n.preview-xlsx-tab[data-v-0e636c7c] {\\n padding: 4px 14px;\\n font-size: 12px;\\n cursor: pointer;\\n border: 1px solid transparent;\\n border-radius: 3px 3px 0 0;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n color: #606266;\\n background: #f0f2f5;\\n}\\n.preview-xlsx-tab[data-v-0e636c7c]:hover {\\n color: #409eff;\\n}\\n.preview-xlsx-tab.active[data-v-0e636c7c] {\\n color: #409eff;\\n background: #fff;\\n border-color: #dcdfe6;\\n border-bottom-color: #fff;\\n}\\n.preview-xlsx-table-wrap[data-v-0e636c7c] {\\n max-height: 680px;\\n overflow: auto;\\n padding: 8px;\\n border: 1px solid #e8eaed;\\n border-radius: 4px;\\n}\\n.preview-xlsx-notice[data-v-0e636c7c] {\\n padding: 6px 12px;\\n margin-bottom: 8px;\\n font-size: 12px;\\n color: #e6a23c;\\n background: #fdf6ec;\\n border: 1px solid #faecd8;\\n border-radius: 4px;\\n}\\n.preview-xlsx-table[data-v-0e636c7c] {\\n border-collapse: collapse;\\n width: 100%;\\n font-size: 13px;\\n}\\n.preview-xlsx-table th[data-v-0e636c7c],\\n.preview-xlsx-table td[data-v-0e636c7c] {\\n border: 1px solid #dcdfe6;\\n padding: 6px 10px;\\n text-align: left;\\n white-space: nowrap;\\n min-width: 80px;\\n}\\n.preview-xlsx-table th[data-v-0e636c7c] {\\n background: #f5f7fa;\\n font-weight: 600;\\n color: #1f2937;\\n position: sticky;\\n top: 0;\\n}\\n.preview-xlsx-table tr[data-v-0e636c7c]:nth-child(even) {\\n background: #fafbfc;\\n}\\n.preview-xlsx-table tr[data-v-0e636c7c]:hover {\\n background: #f0f7ff;\\n}\\n\\n/* ==================== Word 预览样式 ==================== */\\n.preview-docx-wrap[data-v-0e636c7c] {\\n height: 100%;\\n overflow: auto;\\n background: #fff;\\n border-radius: 4px;\\n border: 1px solid #e8eaed;\\n}\\n.preview-docx-content[data-v-0e636c7c] {\\n padding: 0;\\n font-size: 16px;\\n line-height: 1.8;\\n color: #333;\\n min-height: 0;\\n -webkit-user-select: text;\\n -moz-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n}\\n.preview-docx-content h1[data-v-0e636c7c] {\\n font-size: 22px;\\n font-weight: 700;\\n margin: 20px 0 10px;\\n padding-bottom: 6px;\\n border-bottom: 2px solid #e8eaed;\\n color: #1a1a2e;\\n}\\n.preview-docx-content h2[data-v-0e636c7c] {\\n font-size: 18px;\\n font-weight: 600;\\n margin: 16px 0 8px;\\n padding-bottom: 4px;\\n border-bottom: 1px solid #e8eaed;\\n color: #1a1a2e;\\n}\\n.preview-docx-content h3[data-v-0e636c7c] {\\n font-size: 16px;\\n font-weight: 600;\\n margin: 14px 0 6px;\\n color: #2c3e50;\\n}\\n.preview-docx-content p[data-v-0e636c7c] {\\n margin: 8px 0;\\n}\\n.preview-docx-content ul[data-v-0e636c7c],\\n.preview-docx-content ol[data-v-0e636c7c] {\\n padding-left: 24px;\\n margin: 8px 0;\\n}\\n.preview-docx-content li[data-v-0e636c7c] {\\n margin: 3px 0;\\n}\\n.preview-docx-content blockquote[data-v-0e636c7c] {\\n border-left: 3px solid #409eff;\\n padding: 6px 14px;\\n margin: 10px 0;\\n background: #f0f7ff;\\n color: #555;\\n border-radius: 0 4px 4px 0;\\n}\\n.preview-docx-content pre[data-v-0e636c7c] {\\n background: #f5f7fa;\\n padding: 12px 16px;\\n border-radius: 6px;\\n overflow-x: auto;\\n font-size: 13px;\\n border: 1px solid #e8eaed;\\n margin: 10px 0;\\n}\\n.preview-docx-content a[data-v-0e636c7c] {\\n color: #409eff;\\n text-decoration: underline;\\n}\\n.preview-docx-content img[data-v-0e636c7c] {\\n max-width: 100%;\\n border-radius: 4px;\\n margin: 6px 0;\\n}\\n.preview-docx-content table[data-v-0e636c7c] {\\n border-collapse: collapse;\\n width: 100%;\\n margin: 12px 0;\\n font-size: 13px;\\n}\\n.preview-docx-content th[data-v-0e636c7c],\\n.preview-docx-content td[data-v-0e636c7c] {\\n border: 1px solid #dcdfe6;\\n padding: 8px 12px;\\n text-align: left;\\n}\\n.preview-docx-content th[data-v-0e636c7c] {\\n background: #f5f7fa;\\n font-weight: 600;\\n}\\n\\n/* ==================== 批量移动弹窗 ==================== */\\n.move-tip[data-v-0e636c7c] {\\n margin-bottom: 12px;\\n padding: 10px 12px;\\n background: #f5f7fa;\\n border-radius: 4px;\\n font-size: 16px;\\n color: #606266;\\n}\\n.move-count[data-v-0e636c7c] {\\n color: #409eff;\\n font-weight: 600;\\n}\\n.move-target[data-v-0e636c7c] {\\n color: #67c23a;\\n font-weight: 600;\\n}\\n.move-target-empty[data-v-0e636c7c] {\\n color: #e6a23c;\\n}\\n.move-folder-wrap[data-v-0e636c7c] {\\n max-height: 420px;\\n overflow: auto;\\n border: 1px solid #e8eaed;\\n border-radius: 4px;\\n padding: 8px;\\n}\\n.move-folder-wrap[data-v-0e636c7c] .el-tree-node__content {\\n height: 32px;\\n}\\n\\n/* ===== 移动端:操作条(DOM 由 v-if=\\\"isMobile\\\" 控制,与宽度无关,PC 不渲染无需隐藏) ===== */\\n.doc-toolbar-m[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n gap: 10px;\\n margin-bottom: 14px;\\n}\\n.doc-toolbar-m[data-v-0e636c7c] .el-button--small {\\n height: 34px;\\n padding: 0 14px;\\n}\\n\\n/* ===== 移动端:卡片列表 ===== */\\n.doc-m-list[data-v-0e636c7c] {\\n padding: 4px 2px 20px;\\n /* 卡片列表自身滚动(DOM 仅移动端渲染,不加媒体查询——平板横屏宽度>768 也必须生效,\\n 否则被 .doc-table-wrap 的 overflow:hidden 裁掉导致列表无法滑动) */\\n height: 100%;\\n overflow-y: auto;\\n -webkit-overflow-scrolling: touch;\\n}\\n.doc-m-list[data-v-0e636c7c]::-webkit-scrollbar {\\n width: 0;\\n}\\n.doc-m-card[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n gap: 10px;\\n padding: 14px 12px;\\n margin-bottom: 10px;\\n background: #fff;\\n border: 1px solid #f0f2f5;\\n border-radius: 10px;\\n transition: all 0.2s;\\n}\\n.doc-m-card.selected[data-v-0e636c7c] {\\n background: #ecf5ff;\\n border-color: #cfe4ff;\\n}\\n.doc-m-card[data-v-0e636c7c]:active {\\n transform: scale(0.99);\\n}\\n.doc-m-check[data-v-0e636c7c] {\\n flex-shrink: 0;\\n width: 18px;\\n height: 18px;\\n accent-color: #409eff;\\n}\\n.doc-m-icon[data-v-0e636c7c] {\\n flex-shrink: 0;\\n width: 34px;\\n height: 34px;\\n -o-object-fit: contain;\\n object-fit: contain;\\n}\\n.doc-m-info[data-v-0e636c7c] {\\n flex: 1;\\n min-width: 0;\\n}\\n.doc-m-title[data-v-0e636c7c] {\\n font-size: 16px;\\n font-weight: 500;\\n color: #303133;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.doc-m-meta[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n margin-top: 5px;\\n font-size: 12px !important;\\n color: #909399;\\n}\\n.doc-m-tag[data-v-0e636c7c] {\\n flex-shrink: 0;\\n padding: 0 6px;\\n border-radius: 4px;\\n font-size: 11px !important;\\n line-height: 18px;\\n background: #f0f2f5;\\n color: #909399;\\n}\\n.doc-m-tag.tag-success[data-v-0e636c7c] {\\n background: #f0f9eb;\\n color: #67c23a;\\n}\\n.doc-m-tag.tag-warning[data-v-0e636c7c] {\\n background: #fdf6ec;\\n color: #e6a23c;\\n}\\n.doc-m-tag.tag-danger[data-v-0e636c7c] {\\n background: #fef0f0;\\n color: #f56c6c;\\n}\\n.doc-m-tag.tag-info[data-v-0e636c7c] {\\n background: #f4f4f5;\\n color: #909399;\\n}\\n.doc-m-actions[data-v-0e636c7c] {\\n flex-shrink: 0;\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n gap: 4px;\\n margin-left: 4px;\\n}\\n.doc-m-btn[data-v-0e636c7c] {\\n padding: 2px 10px;\\n font-size: 13px !important;\\n color: #409eff;\\n border-radius: 4px;\\n white-space: nowrap;\\n}\\n.doc-m-btn[data-v-0e636c7c]:active {\\n background: #ecf5ff;\\n}\\n.doc-m-btn.doc-m-del[data-v-0e636c7c] {\\n color: #f56c6c;\\n}\\n.doc-m-empty[data-v-0e636c7c] {\\n text-align: center;\\n padding: 50px 0;\\n color: #909399;\\n font-size: 16px;\\n}\\n.doc-m-empty i[data-v-0e636c7c] {\\n font-size: 30px !important;\\n color: #c0c4cc;\\n}\\n.doc-m-empty div[data-v-0e636c7c] {\\n margin-top: 8px;\\n}\\n\\n/* ===== 移动端:加载更多 ===== */\\n.doc-m-more[data-v-0e636c7c] {\\n margin: 8px 0 12px;\\n padding: 12px 0;\\n text-align: center;\\n font-size: 15px !important;\\n color: #409eff;\\n background: #f5f7fa;\\n border-radius: 8px;\\n}\\n.doc-m-more[data-v-0e636c7c]:active {\\n background: #ecf5ff;\\n}\\n\\n/* ===== 移动端横屏:自绘表格(对齐 PC 布局,无 Element UI 依赖) ===== */\\n.doc-m-table-wrap[data-v-0e636c7c] {\\n height: 100%;\\n overflow: auto;\\n -webkit-overflow-scrolling: touch;\\n background: #fff;\\n}\\n.doc-m-table[data-v-0e636c7c] {\\n width: 100%;\\n min-width: 900px;\\n border-collapse: collapse;\\n font-size: 13px;\\n color: #303133;\\n}\\n.doc-m-table thead th[data-v-0e636c7c] {\\n position: sticky;\\n top: 0;\\n z-index: 1;\\n height: 42px;\\n padding: 0 8px;\\n background: #f5f7fa;\\n color: #333;\\n font-weight: 600;\\n text-align: left;\\n white-space: nowrap;\\n border-bottom: 1px solid #ebeef5;\\n}\\n.doc-m-table tbody td[data-v-0e636c7c] {\\n height: 48px;\\n padding: 0 8px;\\n border-bottom: 1px solid #f0f2f5;\\n vertical-align: middle;\\n}\\n.doc-m-table tbody tr[data-v-0e636c7c]:nth-child(even) {\\n background: #fafafa;\\n}\\n.doc-m-table tbody tr.selected[data-v-0e636c7c] {\\n background: #ecf5ff;\\n}\\n.doc-m-table .col-check[data-v-0e636c7c] {\\n text-align: center;\\n}\\n.doc-m-table .col-center[data-v-0e636c7c] {\\n text-align: center;\\n}\\n.doc-m-table .col-id[data-v-0e636c7c] {\\n text-align: center;\\n color: #909399;\\n}\\n.doc-m-table .col-time[data-v-0e636c7c] {\\n font-size: 12px;\\n color: #909399;\\n white-space: nowrap;\\n}\\n.doc-m-table .col-title[data-v-0e636c7c] {\\n cursor: pointer;\\n}\\n.doc-m-tb-icon[data-v-0e636c7c] {\\n width: 16px;\\n height: 16px;\\n vertical-align: -3px;\\n margin-right: 6px;\\n flex-shrink: 0;\\n}\\n.doc-m-tb-title[data-v-0e636c7c] {\\n display: inline-block;\\n max-width: 100%;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n vertical-align: middle;\\n}\\n.doc-m-tb-tag[data-v-0e636c7c] {\\n display: inline-block;\\n padding: 1px 8px;\\n border-radius: 4px;\\n font-size: 12px;\\n background: #f4f4f5;\\n color: #909399;\\n border: 1px solid #e9e9eb;\\n white-space: nowrap;\\n}\\n.doc-m-table .col-ops[data-v-0e636c7c] {\\n white-space: nowrap;\\n text-align: center;\\n padding-left: 4px;\\n padding-right: 4px;\\n}\\n.doc-m-tb-btn[data-v-0e636c7c] {\\n padding: 0 5px;\\n border: none;\\n background: transparent;\\n color: #1677ff;\\n font-size: 12px;\\n white-space: nowrap;\\n}\\n.doc-m-tb-btn[data-v-0e636c7c]:active {\\n opacity: 0.6;\\n}\\n.doc-m-tb-btn.doc-m-del[data-v-0e636c7c] {\\n color: #f56c6c;\\n}\\n.doc-m-table-wrap .doc-m-empty[data-v-0e636c7c] {\\n padding: 60px 0;\\n}\\n\\n/* 移动端横屏:自绘分页条 */\\n.doc-m-pager[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n justify-content: flex-end;\\n gap: 10px;\\n margin-top: 12px;\\n font-size: 13px;\\n color: #606266;\\n}\\n.doc-m-pager-total[data-v-0e636c7c] {\\n margin-right: auto;\\n color: #909399;\\n}\\n.doc-m-pager-select[data-v-0e636c7c] {\\n height: 30px;\\n padding: 0 6px;\\n border: 1px solid #dcdfe6;\\n border-radius: 4px;\\n background: #fff;\\n color: #606266;\\n font-size: 13px;\\n}\\n.doc-m-pager-btn[data-v-0e636c7c] {\\n height: 30px;\\n padding: 0 12px;\\n border: 1px solid #dcdfe6;\\n border-radius: 4px;\\n background: #fff;\\n color: #606266;\\n font-size: 13px;\\n}\\n.doc-m-pager-btn[data-v-0e636c7c]:disabled {\\n color: #c0c4cc;\\n cursor: not-allowed;\\n}\\n.doc-m-pager-cur[data-v-0e636c7c] {\\n min-width: 56px;\\n text-align: center;\\n}\\n\\n/* ===== 移动端:管理页布局优化(不影响 PC) ===== */\\n@media (max-width: 768px) {\\n /* 根容器收窄内边距 */\\n.kb-document-list[data-v-0e636c7c] {\\n padding: 12px;\\n}\\n\\n /* 搜索行可换行,输入框占满剩余宽度,避免横向溢出 */\\n.doc-toolbar[data-v-0e636c7c] {\\n margin-bottom: 10px;\\n}\\n.doc-toolbar-left[data-v-0e636c7c] {\\n flex-wrap: wrap;\\n gap: 8px;\\n width: 100%;\\n}\\n.doc-toolbar[data-v-0e636c7c] .search-input {\\n flex: 1;\\n width: auto;\\n min-width: 0;\\n}\\n.doc-toolbar[data-v-0e636c7c] .el-input__inner {\\n height: 34px;\\n line-height: 32px;\\n}\\n.doc-toolbar[data-v-0e636c7c] .el-button--small {\\n height: 34px;\\n padding: 0 12px;\\n}\\n\\n /* 去掉桌面表格容器边框,移动端卡片直接铺在页面上 */\\n.doc-table-wrap[data-v-0e636c7c] {\\n border: none;\\n background: transparent;\\n border-radius: 0;\\n}\\n}\\n\\n/* ===== H5 自绘搜索/操作条/移动弹框控件(无 Element UI 依赖) ===== */\\n.doc-m-search[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n gap: 6px;\\n width: 100%;\\n height: 36px;\\n padding: 0 10px;\\n background: #fff;\\n border: 1px solid #e4e7ed;\\n border-radius: 18px;\\n box-sizing: border-box;\\n}\\n.doc-m-search-icon[data-v-0e636c7c] {\\n flex-shrink: 0;\\n}\\n.doc-m-search-input[data-v-0e636c7c] {\\n flex: 1;\\n min-width: 0;\\n height: 100%;\\n border: none;\\n outline: none;\\n background: transparent;\\n font-size: 14px;\\n color: #303133;\\n}\\n.doc-m-search-btn[data-v-0e636c7c] {\\n flex-shrink: 0;\\n height: 28px;\\n padding: 0 14px;\\n border: none;\\n border-radius: 14px;\\n background: #1677ff;\\n color: #fff;\\n font-size: 13px;\\n}\\n.doc-m-search-btn[data-v-0e636c7c]:disabled {\\n opacity: 0.5;\\n}\\n/* 横屏:搜索框占剩余宽度,操作按钮同行排列 */\\n.doc-m-search--inline[data-v-0e636c7c] {\\n flex: 1;\\n min-width: 0;\\n width: auto;\\n}\\n.doc-m-tbtn[data-v-0e636c7c] {\\n display: inline-flex;\\n align-items: center;\\n gap: 4px;\\n height: 32px;\\n padding: 0 14px;\\n border: 1px solid #b7eb8f;\\n border-radius: 16px;\\n background: #f6ffed;\\n color: #52c41a;\\n font-size: 13px;\\n}\\n.doc-m-tbtn.danger[data-v-0e636c7c] {\\n border-color: #ffccc7;\\n background: #fff1f0;\\n color: #f5222d;\\n}\\n.doc-m-tbtn.warning[data-v-0e636c7c] {\\n border-color: #ffe58f;\\n background: #fffbe6;\\n color: #d48806;\\n}\\n.doc-m-tbtn[data-v-0e636c7c]:active {\\n opacity: 0.8;\\n}\\n.kbm-move-list[data-v-0e636c7c] {\\n border: 1px solid #f0f2f5;\\n border-radius: 8px;\\n background: #fafbfc;\\n max-height: 46vh;\\n overflow-y: auto;\\n -webkit-overflow-scrolling: touch;\\n}\\n.kbm-move-row[data-v-0e636c7c] {\\n display: flex;\\n align-items: center;\\n gap: 6px;\\n padding: 11px 10px;\\n font-size: 14px;\\n color: #303133;\\n border-bottom: 1px solid #f5f7fa;\\n}\\n.kbm-move-row[data-v-0e636c7c]:last-child {\\n border-bottom: none;\\n}\\n.kbm-move-row svg[data-v-0e636c7c] {\\n color: #1677ff;\\n flex-shrink: 0;\\n}\\n.kbm-move-name[data-v-0e636c7c] {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.kbm-move-row.active[data-v-0e636c7c] {\\n background: #e8f3ff;\\n color: #1677ff;\\n}\\n.kbm-empty[data-v-0e636c7c] {\\n padding: 30px 0;\\n text-align: center;\\n font-size: 13px;\\n color: #909399;\\n}\\n/* 移动端预览:填满全屏弹框,去掉 PC 固定高度造成的底部留白 */\\n.preview-body--m[data-v-0e636c7c] {\\n height: 100%;\\n padding: 0;\\n}\\n.preview-body--m .preview-page-canvas[data-v-0e636c7c] {\\n padding: 12px;\\n margin-bottom: 0;\\n}\\n.preview-body--m .preview-page[data-v-0e636c7c] {\\n min-height: 0;\\n padding: 16px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/DocumentList.vue?./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1712
1736
|
|
|
1713
1737
|
/***/ }),
|
|
1714
1738
|
|
|
@@ -1719,7 +1743,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../.
|
|
|
1719
1743
|
/*! no static exports found */
|
|
1720
1744
|
/***/ (function(module, exports, __webpack_require__) {
|
|
1721
1745
|
|
|
1722
|
-
eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.wps-preview-dialog.el-dialog {\\n border-radius: 10px;\\n overflow: hidden;\\n box-shadow: 0 12px 32px rgba(0, 0, 0, 0.18), 0 3px 8px rgba(0, 0, 0, 0.10);\\n background: #fff;\\n}\\n.wps-preview-dialog .el-dialog__header {\\n padding: 0;\\n margin: 0;\\n border-bottom: 1px solid #e5e6eb;\\n background: #f5f7fa;\\n}\\n.wps-preview-dialog .el-dialog__title {\\n display: none;\\n}\\n.wps-preview-dialog .el-dialog__headerbtn {\\n top: 14px;\\n right: 16px;\\n}\\n.wps-preview-dialog .el-dialog__body {\\n padding: 0;\\n}\\n.wps-preview-dialog .el-dialog__headerbtn .el-dialog__close {\\n color: #909399;\\n font-size: 18px;\\n}\\n.wps-preview-dialog .el-dialog__headerbtn:hover .el-dialog__close {\\n color: #409eff;\\n}\\n\\n/* 批量移动弹窗:字体跟随知识库管理(16px) */\\n.kb-move-dialog .el-dialog__title {\\n font-size: 16px;\\n}\\n.kb-move-dialog .el-dialog__body,\\n.kb-move-dialog .el-dialog__body *,\\n.kb-move-dialog .el-dialog__footer .el-button {\\n font-size: 16px !important;\\n}\\n\\n/* 批量删除/确认弹窗($confirm 的 MessageBox):字体跟随知识库管理(16px) */\\n.kb-message-box {\\n font-size: 16px;\\n}\\n.kb-message-box .el-message-box__title,\\n.kb-message-box .el-message-box__message,\\n.kb-message-box .el-message-box__message * {\\n font-size: 16px !important;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/DocumentList.vue?./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1746
|
+
eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.wps-preview-dialog.el-dialog {\\n border-radius: 10px;\\n overflow: hidden;\\n box-shadow: 0 12px 32px rgba(0, 0, 0, 0.18), 0 3px 8px rgba(0, 0, 0, 0.10);\\n background: #fff;\\n}\\n.wps-preview-dialog .el-dialog__header {\\n padding: 0;\\n margin: 0;\\n border-bottom: 1px solid #e5e6eb;\\n background: #f5f7fa;\\n}\\n.wps-preview-dialog .el-dialog__title {\\n display: none;\\n}\\n.wps-preview-dialog .el-dialog__headerbtn {\\n top: 14px;\\n right: 16px;\\n}\\n.wps-preview-dialog .el-dialog__body {\\n padding: 0;\\n}\\n.wps-preview-dialog .el-dialog__headerbtn .el-dialog__close {\\n color: #909399;\\n font-size: 18px;\\n}\\n.wps-preview-dialog .el-dialog__headerbtn:hover .el-dialog__close {\\n color: #409eff;\\n}\\n\\n/* 批量移动弹窗:字体跟随知识库管理(16px) */\\n.kb-move-dialog .el-dialog__title {\\n font-size: 16px;\\n}\\n.kb-move-dialog .el-dialog__body,\\n.kb-move-dialog .el-dialog__body *,\\n.kb-move-dialog .el-dialog__footer .el-button {\\n font-size: 16px !important;\\n}\\n\\n/* 批量删除/确认弹窗($confirm 的 MessageBox):字体跟随知识库管理(16px) */\\n.kb-message-box {\\n font-size: 16px;\\n}\\n.kb-message-box .el-message-box__title,\\n.kb-message-box .el-message-box__message,\\n.kb-message-box .el-message-box__message * {\\n font-size: 16px !important;\\n}\\n\\n/* ===== 移动端:预览 / 批量移动弹窗全屏化 ===== */\\n@media (max-width: 768px) {\\n.wps-preview-dialog.el-dialog,\\n .kb-move-dialog.el-dialog {\\n width: 100% !important;\\n margin: 0 !important;\\n border-radius: 0;\\n top: 0 !important;\\n}\\n.wps-preview-dialog .preview-body {\\n height: calc(100vh - 56px);\\n}\\n.wps-preview-dialog .el-dialog__headerbtn {\\n top: 12px;\\n right: 12px;\\n}\\n.wps-dialog-name {\\n max-width: 60vw;\\n}\\n.preview-page-canvas {\\n padding: 12px 8px;\\n}\\n.preview-page {\\n padding: 20px 16px;\\n}\\n.kb-move-dialog .el-dialog__body,\\n .kb-move-dialog .el-dialog__footer {\\n padding: 12px 16px;\\n}\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/DocumentList.vue?./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1723
1747
|
|
|
1724
1748
|
/***/ }),
|
|
1725
1749
|
|
|
@@ -1730,7 +1754,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../.
|
|
|
1730
1754
|
/*! no static exports found */
|
|
1731
1755
|
/***/ (function(module, exports, __webpack_require__) {
|
|
1732
1756
|
|
|
1733
|
-
eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.kb-chat-root[data-v-1ce90f0b] {\\n flex: 1;\\n display: flex;\\n flex-direction: row;\\n min-width: 0;\\n min-height: 0;\\n}\\n\\n/* 完全隔离主应用 lib-flexible 的影响 - 强制所有子元素使用 px 单位 */\\n.kb-chat-root[data-v-1ce90f0b],\\n.kb-chat-root *[data-v-1ce90f0b],\\n.kb-chat-root *[data-v-1ce90f0b]::before,\\n.kb-chat-root *[data-v-1ce90f0b]::after {\\n font-size: 14px !important;\\n}\\n\\n/* ===== 左侧会话列表 ===== */\\n.kb-chat-sidebar[data-v-1ce90f0b] {\\n width: clamp(240px, 20vw, 280px);\\n flex-shrink: 0;\\n display: flex;\\n flex-direction: column;\\n background: #f7f8fa;\\n border-right: 1px solid #e8e8e8;\\n transition: width 0.2s ease;\\n overflow: hidden;\\n}\\n.kb-chat-sidebar.collapsed[data-v-1ce90f0b] {\\n width: 0;\\n border-right: none;\\n}\\n.sidebar-header[data-v-1ce90f0b] {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n padding: 14px 12px 10px;\\n flex-shrink: 0;\\n}\\n.sidebar-title[data-v-1ce90f0b] {\\n display: flex;\\n align-items: center;\\n gap: 6px;\\n font-size: 16px!important;\\n font-weight: 600;\\n color: #333;\\n white-space: nowrap;\\n}\\n.sidebar-title[data-v-1ce90f0b]::before {\\n content: '';\\n flex-shrink: 0;\\n width: 4px;\\n height: 16px;\\n border-radius: 2px;\\n background: linear-gradient(180deg, #409eff, #79bbff);\\n}\\n.new-chat-btn[data-v-1ce90f0b] {\\n width: 30px;\\n height: 32px;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n border: none;\\n background: transparent;\\n color: #909399;\\n cursor: pointer;\\n padding: 0;\\n font-size: 32px!important;\\n transition: all 0.2s;\\n}\\n.new-chat-btn[data-v-1ce90f0b]:hover {\\n background: transparent;\\n color: #409eff;\\n}\\n.new-chat-btn[data-v-1ce90f0b]:disabled {\\n cursor: not-allowed;\\n opacity: 0.45;\\n}\\n.new-chat-btn[data-v-1ce90f0b]:disabled:hover {\\n color: #909399;\\n}\\n.new-chat-btn i[data-v-1ce90f0b]::before {\\n font-size: 21px!important;\\n}\\n.sidebar-list[data-v-1ce90f0b] {\\n flex: 1;\\n overflow-y: auto;\\n padding: 0 8px 12px;\\n}\\n.session-item[data-v-1ce90f0b] {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n padding: 10px 10px;\\n border-radius: 8px;\\n cursor: pointer;\\n transition: background 0.2s;\\n margin-bottom: 2px;\\n}\\n.session-item[data-v-1ce90f0b]:hover {\\n background: #eef1f5;\\n}\\n.session-item.active[data-v-1ce90f0b] {\\n background: #e6f0ff;\\n}\\n/* 无资料遮罩期间:会话列表不可切换 */\\n.session-item.is-locked[data-v-1ce90f0b] {\\n cursor: not-allowed;\\n}\\n.session-item.is-locked[data-v-1ce90f0b]:hover {\\n background: transparent;\\n}\\n.session-item.is-locked.active[data-v-1ce90f0b]:hover {\\n background: #e6f0ff;\\n}\\n.session-item.is-locked .session-more-menu[data-v-1ce90f0b] {\\n display: none;\\n}\\n.session-item-main[data-v-1ce90f0b] {\\n flex: 1;\\n min-width: 0;\\n}\\n.session-item-title[data-v-1ce90f0b] {\\n font-size: 14px;\\n color: #333;\\n font-weight: 500;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.session-item.active .session-item-title[data-v-1ce90f0b] {\\n color: #1677ff;\\n font-weight: 600;\\n}\\n.session-item-sub[data-v-1ce90f0b] {\\n font-size: 12px;\\n color: #999;\\n margin-top: 2px;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.session-item-right[data-v-1ce90f0b] {\\n position: relative;\\n display: flex;\\n flex-direction: column;\\n align-items: flex-end;\\n gap: 4px;\\n flex-shrink: 0;\\n}\\n.session-item-time[data-v-1ce90f0b] {\\n font-size: 11px;\\n color: #bbb;\\n white-space: nowrap;\\n}\\n/* 悬浮显示的「…」按钮绝对定位覆盖在时间区域上,不参与文档流,\\n 避免 hover 时撑高会话项导致列表整体变高 */\\n.session-more-menu[data-v-1ce90f0b] {\\n display: none;\\n line-height: 1;\\n position: absolute;\\n top: 0;\\n right: 0;\\n}\\n.session-item:hover .session-more-menu[data-v-1ce90f0b] {\\n display: block;\\n}\\n.session-item:hover .session-item-time[data-v-1ce90f0b] {\\n visibility: hidden;\\n}\\n.session-more-btn[data-v-1ce90f0b] {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 22px;\\n height: 22px;\\n border-radius: 4px;\\n color: #999;\\n cursor: pointer;\\n transition: all 0.2s;\\n}\\n.session-more-btn[data-v-1ce90f0b]:hover {\\n color: #1677ff;\\n background: #eef4ff;\\n}\\n.sidebar-empty[data-v-1ce90f0b] {\\n padding: 30px 10px;\\n text-align: center;\\n font-size: 13px;\\n color: #bbb;\\n}\\n\\n/* ===== 右侧聊天主区 ===== */\\n.kb-chat-main[data-v-1ce90f0b] {\\n flex: 1;\\n min-width: 0;\\n position: relative;\\n display: flex;\\n flex-direction: column;\\n}\\n\\n/* ===== 无知识库资料遮罩 ===== */\\n.kb-no-doc-mask[data-v-1ce90f0b] {\\n position: absolute;\\n top: 0;\\n right: 0;\\n bottom: 0;\\n left: 0;\\n z-index: 20;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n padding: 24px;\\n background: rgba(255, 255, 255, 0.5);\\n -webkit-backdrop-filter: blur(2px);\\n backdrop-filter: blur(2px);\\n}\\n.kb-no-doc-box[data-v-1ce90f0b] {\\n position: relative;\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n gap: 26px;\\n max-width: 560px;\\n padding: 64px 76px;\\n background: rgba(255, 255, 255, 0.94);\\n border: 1px solid rgba(255, 255, 255, 0.9);\\n border-radius: 24px;\\n box-shadow: 0 16px 48px rgba(31, 45, 61, 0.14), 0 2px 8px rgba(31, 45, 61, 0.04);\\n text-align: center;\\n overflow: hidden;\\n -webkit-animation: kb-no-doc-in-data-v-1ce90f0b 0.2s ease-out;\\n animation: kb-no-doc-in-data-v-1ce90f0b 0.2s ease-out;\\n}\\n\\n/* 卡片顶部柔光:呼应红色图标的暖色氛围 */\\n.kb-no-doc-box[data-v-1ce90f0b]::before {\\n content: '';\\n position: absolute;\\n top: -80px;\\n left: 50%;\\n width: 280px;\\n height: 190px;\\n transform: translateX(-50%);\\n background: radial-gradient(closest-side, rgba(245, 108, 108, 0.18), rgba(245, 108, 108, 0));\\n pointer-events: none;\\n}\\n.kb-no-doc-icon[data-v-1ce90f0b] {\\n position: relative;\\n width: 76px;\\n height: 76px;\\n border-radius: 50%;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n background: linear-gradient(135deg, #ff9f9f, #ef5a5a);\\n border: none;\\n color: #fff;\\n font-size: 32px !important;\\n box-shadow: 0 0 0 8px rgba(239, 90, 90, 0.08), 0 10px 24px rgba(239, 90, 90, 0.3);\\n}\\n.kb-no-doc-icon[data-v-1ce90f0b] ::before {\\n font-size: 28px !important;\\n}\\n.kb-no-doc-text[data-v-1ce90f0b] {\\n font-size: 16px !important;\\n line-height: 1.6;\\n letter-spacing: 0.2px;\\n color: #606266;\\n}\\n@-webkit-keyframes kb-no-doc-in-data-v-1ce90f0b {\\nfrom {\\n opacity: 0;\\n transform: translateY(8px);\\n}\\nto {\\n opacity: 1;\\n transform: translateY(0);\\n}\\n}\\n@keyframes kb-no-doc-in-data-v-1ce90f0b {\\nfrom {\\n opacity: 0;\\n transform: translateY(8px);\\n}\\nto {\\n opacity: 1;\\n transform: translateY(0);\\n}\\n}\\n\\n/* ===== 聊天头部 ===== */\\n.chat-header[data-v-1ce90f0b] {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n padding: 10px 20px;\\n background: #fff;\\n border-bottom: 1px solid #e8e8e8;\\n flex-shrink: 0;\\n z-index: 10;\\n}\\n.sidebar-toggle-btn[data-v-1ce90f0b] {\\n position: absolute;\\n left: 0;\\n top: 50%;\\n transform: translateY(-50%);\\n width: 20px;\\n height: 64px;\\n z-index: 20;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n border: none;\\n background: #fff;\\n color: #606266;\\n border: 1px solid #dcdfe6;\\n border-left: none;\\n border-radius: 0 8px 8px 0;\\n box-shadow: 2px 0 8px rgba(0,0,0,.08);\\n cursor: pointer;\\n flex-shrink: 0;\\n transition: background 0.2s, color 0.2s, box-shadow 0.2s;\\n}\\n.sidebar-toggle-btn[data-v-1ce90f0b]:hover {\\n background: #ecf5ff;\\n color: #409eff;\\n box-shadow: 2px 0 10px rgba(64,158,255,.25);\\n}\\n.sidebar-toggle-btn svg[data-v-1ce90f0b] {\\n transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1);\\n}\\n/* 展开时箭头朝左(收起方向);收起时旋转 180° 朝右(展开方向),并轻微横向弹动强调 */\\n.sidebar-toggle-btn svg[data-v-1ce90f0b] {\\n transform: rotate(0deg);\\n}\\n.sidebar-toggle-btn.collapsed svg[data-v-1ce90f0b] {\\n transform: rotate(180deg);\\n}\\n@-webkit-keyframes toggle-bounce-data-v-1ce90f0b {\\n0% { transform: rotate(0deg) translateX(0);\\n}\\n60% { transform: rotate(0deg) translateX(-3px);\\n}\\n100% { transform: rotate(0deg) translateX(0);\\n}\\n}\\n@keyframes toggle-bounce-data-v-1ce90f0b {\\n0% { transform: rotate(0deg) translateX(0);\\n}\\n60% { transform: rotate(0deg) translateX(-3px);\\n}\\n100% { transform: rotate(0deg) translateX(0);\\n}\\n}\\n.sidebar-toggle-btn:active svg[data-v-1ce90f0b] {\\n -webkit-animation: toggle-bounce-data-v-1ce90f0b 0.3s ease;\\n animation: toggle-bounce-data-v-1ce90f0b 0.3s ease;\\n}\\n.header-left[data-v-1ce90f0b] { display: flex; align-items: center; gap: 10px; min-width: 0; flex: 1;\\n}\\n.agent-info[data-v-1ce90f0b] { display: flex; align-items: center; gap: 10px;\\n}\\n.agent-avatar[data-v-1ce90f0b] { width: 36px; height: 36px; border-radius: 50%; overflow: hidden; display: flex; align-items: center; justify-content: center; flex-shrink: 0; background: #fff;\\n}\\n.avatar-image[data-v-1ce90f0b] { width: 100%; height: 100%; -o-object-fit: cover; object-fit: cover; display: block;\\n}\\n.agent-text[data-v-1ce90f0b] { min-width: 0;\\n}\\n.agent-name[data-v-1ce90f0b] { font-size: 15px; font-weight: 600; color: #333; line-height: 1.3;\\n}\\n.agent-desc[data-v-1ce90f0b] { font-size: 12px; color: #999; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: min(300px, 45vw);\\n}\\n\\n/* ===== 消息列表 ===== */\\n.chat-body[data-v-1ce90f0b] {\\n flex: 1;\\n overflow-y: auto;\\n padding: 16px clamp(12px, 3vw, 40px);\\n scroll-behavior: auto;\\n position: relative;\\n -webkit-overflow-scrolling: touch;\\n background: url(https://qiguanbang.obs.cn-east-3.myhuaweicloud.com/production/image/AlAgent/agentbackground.png) 100% no-repeat;\\n background-size: cover;\\n background-position: center;\\n min-height: 0;\\n}\\n\\n/* 欢迎页 */\\n.welcome[data-v-1ce90f0b] { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: #bbb; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; margin: 0 -20px;\\n}\\n.welcome-icon[data-v-1ce90f0b] { margin-bottom: 12px; opacity: .7;\\n}\\n.welcome-title[data-v-1ce90f0b] { font-size: 20px; font-weight: 600; color: #333; margin-bottom: 8px;\\n}\\n.welcome-text[data-v-1ce90f0b] { font-size: 15px; color: #bbb;\\n}\\n@-webkit-keyframes pulse-data-v-1ce90f0b {\\n0%, 100% { opacity: 1;\\n}\\n50% { opacity: 0.4;\\n}\\n}\\n@keyframes pulse-data-v-1ce90f0b {\\n0%, 100% { opacity: 1;\\n}\\n50% { opacity: 0.4;\\n}\\n}\\n\\n/* 空消息欢迎卡片 */\\n.chat-empty-welcome[data-v-1ce90f0b] {\\n width: 100%;\\n padding: 40px 20px;\\n box-sizing: border-box;\\n display: flex;\\n flex-direction: column;\\n gap: 0;\\n max-width: 600px;\\n margin: 80px auto;\\n}\\n.welcome-card[data-v-1ce90f0b] {\\n position: relative;\\n background: linear-gradient(296deg, #D6EDFF 20%, #E8EBFF 80%);\\n border-radius: 16px 16px 0 0;\\n padding: 24px 24px 24px 150px;\\n overflow: visible;\\n}\\n.welcome-avatar-box[data-v-1ce90f0b] {\\n position: absolute;\\n left: 15px;\\n bottom: 0;\\n width: 110px;\\n height: 137px;\\n}\\n.welcome-avatar[data-v-1ce90f0b] {\\n width: 100%;\\n height: 100%;\\n border-radius: 12px;\\n background-size: cover;\\n background-position: center;\\n background-repeat: no-repeat;\\n}\\n.welcome-text-group[data-v-1ce90f0b] { display: flex; flex-direction: column; gap: 6px;\\n}\\n.welcome-text-group .text-sm[data-v-1ce90f0b] { font-weight: 400; color: #666; font-size: 12px; text-align: left;\\n}\\n.welcome-text-group .text-lg[data-v-1ce90f0b] { color: #000; font-size: 16px; font-weight: 500;\\n}\\n\\n/* 猜您想问 */\\n.guess-box[data-v-1ce90f0b] {\\n border-top: 1px solid #fff;\\n padding: 20px;\\n background: linear-gradient(180deg, #b8dcff 0%, #dff0ff 50%, #fff 100%);\\n border-radius: 0 0 16px 16px;\\n}\\n.guess-title[data-v-1ce90f0b] { display: flex; align-items: center; gap: 6px; margin-bottom: 16px; color: #222; font-size: 16px; font-weight: 500;\\n}\\n.tag-wrap[data-v-1ce90f0b] { display: flex; flex-wrap: wrap; gap: 10px;\\n}\\n.quick-tag[data-v-1ce90f0b] { padding: 8px 14px; background: #f2faff; border: 1px solid #e0eaff; border-radius: 8px; color: #333; cursor: pointer; font-size: 14px; white-space: nowrap; transition: all .2s;\\n}\\n.quick-tag[data-v-1ce90f0b]:hover { background: #f0f7ff; border-color: #1677ff;\\n}\\n\\n/* ── Thinking ── */\\n.thinking-details[data-v-1ce90f0b] { margin-bottom: 10px; border: 1px solid #e8e8e8; border-radius: 8px; overflow: hidden; background: #fafafa;\\n}\\n.thinking-summary[data-v-1ce90f0b] { font-size: 12px; color: #888; cursor: pointer; padding: 6px 10px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;\\n}\\n.thinking-summary[data-v-1ce90f0b]:hover { color: #1677ff;\\n}\\n.thinking-body[data-v-1ce90f0b] { font-size: 14px; color: #999; padding: 8px 12px; line-height: 1.6; border-top: 1px solid #f0f0f0; text-align: left; white-space: pre-wrap; word-break: break-word; overflow-wrap: break-word; overflow-wrap: anywhere;\\n}\\n.final-content[data-v-1ce90f0b] { word-break: break-word; overflow-wrap: break-word; overflow-wrap: anywhere; white-space: normal; font-size: 16px; line-height: 1.7;\\n}\\n/* markdown 内容子元素样式 */\\n.final-content[data-v-1ce90f0b] h1, .final-content[data-v-1ce90f0b] h2, .final-content[data-v-1ce90f0b] h3, .final-content[data-v-1ce90f0b] h4, .final-content[data-v-1ce90f0b] h5, .final-content[data-v-1ce90f0b] h6 { margin: 12px 0 6px; font-weight: 600; line-height: 1.5;\\n}\\n.final-content[data-v-1ce90f0b] h1 { font-size: 24px;\\n}\\n.final-content[data-v-1ce90f0b] h2 { font-size: 20px;\\n}\\n.final-content[data-v-1ce90f0b] h3 { font-size: 18px;\\n}\\n.final-content[data-v-1ce90f0b] h4, .final-content[data-v-1ce90f0b] h5, .final-content[data-v-1ce90f0b] h6 { font-size: 16px;\\n}\\n.final-content[data-v-1ce90f0b] strong { font-weight: 700;\\n}\\n.final-content[data-v-1ce90f0b] em { font-style: italic;\\n}\\n.final-content[data-v-1ce90f0b] blockquote { margin: 8px 0; padding: 4px 12px; border-left: 3px solid #b3d8ff; color: #666; background: #f6f8fa;\\n}\\n.final-content[data-v-1ce90f0b] a { color: #1677ff;\\n}\\n.final-content[data-v-1ce90f0b] p { margin: 6px 0;\\n}\\n.final-content[data-v-1ce90f0b] ul, .final-content[data-v-1ce90f0b] ol { padding-left: 20px; margin: 4px 0;\\n}\\n.final-content[data-v-1ce90f0b] li { margin: 2px 0;\\n}\\n.final-content[data-v-1ce90f0b] table { border-collapse: collapse; width: 100%; margin: 6px 0; font-size: 14px;\\n}\\n.final-content[data-v-1ce90f0b] th, .final-content[data-v-1ce90f0b] td { border: 1px solid #e8e8e8; padding: 5px 8px; text-align: left;\\n}\\n.final-content[data-v-1ce90f0b] th { background: #fafafa; font-weight: 600;\\n}\\n.final-content[data-v-1ce90f0b] code { padding: 1px 5px; border-radius: 3px; font-size: 14px;\\n}\\n.final-content[data-v-1ce90f0b] pre { background: #f6f8fa; color: #333; padding: 12px; border-radius: 6px; overflow-x: auto; font-size: 13px; border: 1px solid #e8e8e8; margin: 8px 0; line-height: 1.5; white-space: pre;\\n}\\n.final-content[data-v-1ce90f0b] pre code { padding: 0; font-size: inherit;\\n}\\n\\n/* 消息行 */\\n.msg-row[data-v-1ce90f0b] { width: 100%; display: flex; justify-content: center; padding: 20px 16px; box-sizing: border-box; align-items: center;\\n}\\n.msg-main[data-v-1ce90f0b] { display: flex; align-items: flex-start; gap: 10px; width: min(100%, 860px) !important; max-width: 860px;\\n}\\n.msg-row.user .msg-main[data-v-1ce90f0b] { flex-direction: row-reverse;\\n}\\n.msg-row.assistant .msg-main[data-v-1ce90f0b] { flex-direction: row;\\n}\\n\\n/* 头像 */\\n.message-avatar[data-v-1ce90f0b] { width: 36px; height: 36px; border-radius: 50%; flex-shrink: 0; -o-object-fit: cover; object-fit: cover;\\n}\\n/* 无头像时的文字头像(与 zjkjAvatar 一致:蓝底白字) */\\n.user-text-avatar[data-v-1ce90f0b] { display: flex; align-items: center; justify-content: center; background: #007fff; color: #fff; font-size: 12px; line-height: 1;\\n}\\n\\n/* 消息内容区域 */\\n.msg-content[data-v-1ce90f0b] { width: 100% !important; max-width: 100%; box-sizing: border-box; overflow: hidden; display: flex; flex-direction: column;\\n}\\n.msg-row.user .msg-content[data-v-1ce90f0b] { align-items: flex-end;\\n}\\n.msg-row.assistant .msg-content[data-v-1ce90f0b] { align-items: flex-start;\\n}\\n\\n/* 气泡 */\\n.bubble[data-v-1ce90f0b] { max-width: 100%; min-width: 30px; width: -webkit-fit-content; width: -moz-fit-content; width: fit-content; padding: 8px 14px; border-radius: 12px; line-height: 1.4; font-size: 15px; word-break: break-word; white-space: normal; text-align: left; overflow-wrap: anywhere;\\n}\\n.bubble.assistant[data-v-1ce90f0b] { background: #fff; color: #333; border-bottom-left-radius: 4px; box-shadow: 0 1px 4px rgba(0,0,0,.06); width: 100%; box-sizing: border-box;\\n}\\n.bubble.user[data-v-1ce90f0b] { background: #1677ff; color: #fff; border-bottom-right-radius: 4px; box-shadow: 0 2px 8px rgba(22,119,255,.15); float: none; margin-left: auto; max-width: min(100%, 520px);\\n}\\n\\n/* ── Tool Calls(与 AI 助理 ChatDetail 完全一致)── */\\n.tool-calls[data-v-1ce90f0b] { margin-top: 8px;\\n}\\n.tool-item[data-v-1ce90f0b] { background: #f5f5f5; border-radius: 6px; padding: 6px 10px; margin-bottom: 4px; font-size: 12px;\\n}\\n.tool-badge[data-v-1ce90f0b] { display: inline-block; margin-bottom: 2px; font-size: 11px; color: #fa8c16; font-weight: 500;\\n}\\n.tool-item pre[data-v-1ce90f0b] { margin: 0; white-space: pre-wrap; word-break: break-all; font-size: 12px; color: #666; max-height: 120px; overflow-y: auto;\\n}\\n\\n/* 消息操作区 */\\n.msg-actions[data-v-1ce90f0b] { display: flex; gap: 4px; margin-top: 4px; padding-left: 4px; align-items: center; justify-content: space-between;\\n}\\n.action-btn[data-v-1ce90f0b] { font-size: 12px; color: #999; cursor: pointer; padding: 2px 6px 2px 0; border-radius: 4px; transition: all .2s; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;\\n}\\n.action-btn[data-v-1ce90f0b]:hover { color: #1677ff; background: #f0f5ff;\\n}\\n.ai-badge[data-v-1ce90f0b] { font-size: 11px; color: #999; padding: 1px 6px; border-radius: 3px; white-space: nowrap; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; margin-left: auto;\\n}\\n\\n/* 流式打字动画 */\\n.typing[data-v-1ce90f0b] { display: flex; align-items: center; gap: 6px; padding: 4px 0;\\n}\\n.phrase[data-v-1ce90f0b] { font-size: 14px; color: #999;\\n}\\n.dots[data-v-1ce90f0b] { display: flex; align-items: center; gap: 3px;\\n}\\n.dots span[data-v-1ce90f0b] { width: 6px; height: 6px; border-radius: 50%; background: #bbb; display: inline-block; -webkit-animation: dot-bounce-data-v-1ce90f0b 1.4s infinite ease-in-out both; animation: dot-bounce-data-v-1ce90f0b 1.4s infinite ease-in-out both;\\n}\\n.dots span[data-v-1ce90f0b]:nth-child(1) { -webkit-animation-delay: -0.32s; animation-delay: -0.32s;\\n}\\n.dots span[data-v-1ce90f0b]:nth-child(2) { -webkit-animation-delay: -0.16s; animation-delay: -0.16s;\\n}\\n@-webkit-keyframes dot-bounce-data-v-1ce90f0b {\\n0%, 80%, 100% { transform: scale(0);\\n}\\n40% { transform: scale(1);\\n}\\n}\\n@keyframes dot-bounce-data-v-1ce90f0b {\\n0%, 80%, 100% { transform: scale(0);\\n}\\n40% { transform: scale(1);\\n}\\n}\\n\\n/* ===== 输入区域 ===== */\\n.chat-footer[data-v-1ce90f0b] { flex-shrink: 0; border-top: none; padding: 30px 0; display: flex; align-items: center; justify-content: center; margin: 0 auto; width: 100%;\\n}\\n.input-area[data-v-1ce90f0b] { position: relative; display: flex; align-items: flex-end; gap: 6px; background: #fff; border-radius: 24px; margin: 0 24px; padding: 18px 20px; border: 1px solid #b3d8ff; transition: border-color .2s; flex-wrap: wrap; width: min(100%, 1000px) !important; box-sizing: border-box;\\n}\\n.input-area[data-v-1ce90f0b]:focus-within { border-color: #1677ff; background: #fff; box-shadow: none;\\n}\\n.input-area[data-v-1ce90f0b]::after { content: \\\"Enter 发送,Ctrl+Enter 换行\\\"; position: absolute; right: 100px; bottom: 28px; font-size: 14px; color: #8c8c8c; pointer-events: none;\\n}\\n.chat-textarea[data-v-1ce90f0b] { flex: 1 1 320px; min-width: 0; border: none; outline: none; background: transparent; resize: none; font-size: 16px; line-height: 24px; min-height: 38px; height: 100px; max-height: 180px; overflow-y: auto; padding: 0; box-sizing: border-box; font-family: inherit; color: #333;\\n}\\n.chat-textarea[data-v-1ce90f0b]::-moz-placeholder { color: #999; font-size: 16px;\\n}\\n.chat-textarea[data-v-1ce90f0b]:-ms-input-placeholder { color: #999; font-size: 16px;\\n}\\n.chat-textarea[data-v-1ce90f0b]::placeholder { color: #999; font-size: 16px;\\n}\\n.chat-textarea[data-v-1ce90f0b]:disabled { cursor: not-allowed; opacity: .5;\\n}\\n.send-btn[data-v-1ce90f0b] { width: auto; height: 40px; padding: 0 21px; border-radius: 6px; border: none; display: flex; align-items: center; justify-content: center; cursor: pointer; flex-shrink: 0; transition: all .2s; background: #1677ff; color: #fff; font-size: 14px;\\n}\\n.send-btn svg[data-v-1ce90f0b] { display: none;\\n}\\n.send-btn[data-v-1ce90f0b]::after { content: \\\"发送\\\";\\n}\\n.send-btn.active[data-v-1ce90f0b] { background: #1677ff;\\n}\\n.send-btn.active[data-v-1ce90f0b]:hover { background: #4096ff;\\n}\\n.send-btn[data-v-1ce90f0b]:disabled { background: #88bfff; cursor: not-allowed;\\n}\\n.stop-btn[data-v-1ce90f0b] { width: 35px; height: 35px; border-radius: 50%; border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; background: #ff4d4f; color: #fff; flex-shrink: 0; transition: all .2s;\\n}\\n.stop-btn[data-v-1ce90f0b]:hover { background: #ff7875;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/KbChatMain.vue?./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1757
|
+
eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.kb-chat-root[data-v-1ce90f0b] {\\n flex: 1;\\n display: flex;\\n flex-direction: row;\\n min-width: 0;\\n min-height: 0;\\n}\\n\\n/* 完全隔离主应用 lib-flexible 的影响 - 强制所有子元素使用 px 单位 */\\n.kb-chat-root[data-v-1ce90f0b],\\n.kb-chat-root *[data-v-1ce90f0b],\\n.kb-chat-root *[data-v-1ce90f0b]::before,\\n.kb-chat-root *[data-v-1ce90f0b]::after {\\n font-size: 14px !important;\\n}\\n\\n/* ===== 左侧会话列表 ===== */\\n.kb-chat-sidebar[data-v-1ce90f0b] {\\n width: clamp(240px, 20vw, 280px);\\n flex-shrink: 0;\\n display: flex;\\n flex-direction: column;\\n background: #f7f8fa;\\n border-right: 1px solid #e8e8e8;\\n transition: width 0.2s ease;\\n overflow: hidden;\\n}\\n.kb-chat-sidebar.collapsed[data-v-1ce90f0b] {\\n width: 0;\\n border-right: none;\\n}\\n.sidebar-header[data-v-1ce90f0b] {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n padding: 14px 12px 10px;\\n flex-shrink: 0;\\n}\\n.sidebar-title[data-v-1ce90f0b] {\\n display: flex;\\n align-items: center;\\n gap: 6px;\\n font-size: 16px!important;\\n font-weight: 600;\\n color: #333;\\n white-space: nowrap;\\n}\\n.sidebar-title[data-v-1ce90f0b]::before {\\n content: '';\\n flex-shrink: 0;\\n width: 4px;\\n height: 16px;\\n border-radius: 2px;\\n background: linear-gradient(180deg, #409eff, #79bbff);\\n}\\n.new-chat-btn[data-v-1ce90f0b] {\\n width: 30px;\\n height: 32px;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n border: none;\\n background: transparent;\\n color: #909399;\\n cursor: pointer;\\n padding: 0;\\n font-size: 32px!important;\\n transition: all 0.2s;\\n}\\n.new-chat-btn[data-v-1ce90f0b]:hover {\\n background: transparent;\\n color: #409eff;\\n}\\n.new-chat-btn[data-v-1ce90f0b]:disabled {\\n cursor: not-allowed;\\n opacity: 0.45;\\n}\\n.new-chat-btn[data-v-1ce90f0b]:disabled:hover {\\n color: #909399;\\n}\\n.new-chat-btn i[data-v-1ce90f0b]::before {\\n font-size: 21px!important;\\n}\\n.sidebar-list[data-v-1ce90f0b] {\\n flex: 1;\\n overflow-y: auto;\\n padding: 0 8px 12px;\\n}\\n.session-item[data-v-1ce90f0b] {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n padding: 10px 10px;\\n border-radius: 8px;\\n cursor: pointer;\\n transition: background 0.2s;\\n margin-bottom: 2px;\\n}\\n.session-item[data-v-1ce90f0b]:hover {\\n background: #eef1f5;\\n}\\n.session-item.active[data-v-1ce90f0b] {\\n background: #e6f0ff;\\n}\\n/* 无资料遮罩期间:会话列表不可切换 */\\n.session-item.is-locked[data-v-1ce90f0b] {\\n cursor: not-allowed;\\n}\\n.session-item.is-locked[data-v-1ce90f0b]:hover {\\n background: transparent;\\n}\\n.session-item.is-locked.active[data-v-1ce90f0b]:hover {\\n background: #e6f0ff;\\n}\\n.session-item.is-locked .session-more-menu[data-v-1ce90f0b] {\\n display: none;\\n}\\n.session-item-main[data-v-1ce90f0b] {\\n flex: 1;\\n min-width: 0;\\n}\\n.session-item-title[data-v-1ce90f0b] {\\n font-size: 14px;\\n color: #333;\\n font-weight: 500;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.session-item.active .session-item-title[data-v-1ce90f0b] {\\n color: #1677ff;\\n font-weight: 600;\\n}\\n.session-item-sub[data-v-1ce90f0b] {\\n font-size: 12px;\\n color: #999;\\n margin-top: 2px;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.session-item-right[data-v-1ce90f0b] {\\n position: relative;\\n display: flex;\\n flex-direction: column;\\n align-items: flex-end;\\n gap: 4px;\\n flex-shrink: 0;\\n}\\n.session-item-time[data-v-1ce90f0b] {\\n font-size: 11px;\\n color: #bbb;\\n white-space: nowrap;\\n}\\n/* 悬浮显示的「…」按钮绝对定位覆盖在时间区域上,不参与文档流,\\n 避免 hover 时撑高会话项导致列表整体变高 */\\n.session-more-menu[data-v-1ce90f0b] {\\n display: none;\\n line-height: 1;\\n position: absolute;\\n top: 0;\\n right: 0;\\n}\\n.session-item:hover .session-more-menu[data-v-1ce90f0b] {\\n display: block;\\n}\\n.session-item:hover .session-item-time[data-v-1ce90f0b] {\\n visibility: hidden;\\n}\\n.session-more-btn[data-v-1ce90f0b] {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 22px;\\n height: 22px;\\n border-radius: 4px;\\n color: #999;\\n cursor: pointer;\\n transition: all 0.2s;\\n}\\n.session-more-btn[data-v-1ce90f0b]:hover {\\n color: #1677ff;\\n background: #eef4ff;\\n}\\n.sidebar-empty[data-v-1ce90f0b] {\\n padding: 30px 10px;\\n text-align: center;\\n font-size: 13px;\\n color: #bbb;\\n}\\n\\n/* ===== 右侧聊天主区 ===== */\\n.kb-chat-main[data-v-1ce90f0b] {\\n flex: 1;\\n min-width: 0;\\n position: relative;\\n display: flex;\\n flex-direction: column;\\n}\\n\\n/* ===== 无知识库资料遮罩 ===== */\\n.kb-no-doc-mask[data-v-1ce90f0b] {\\n position: absolute;\\n top: 0;\\n right: 0;\\n bottom: 0;\\n left: 0;\\n z-index: 20;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n padding: 24px;\\n background: rgba(255, 255, 255, 0.5);\\n -webkit-backdrop-filter: blur(2px);\\n backdrop-filter: blur(2px);\\n}\\n.kb-no-doc-box[data-v-1ce90f0b] {\\n position: relative;\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n gap: 26px;\\n max-width: 560px;\\n padding: 64px 76px;\\n background: rgba(255, 255, 255, 0.94);\\n border: 1px solid rgba(255, 255, 255, 0.9);\\n border-radius: 24px;\\n box-shadow: 0 16px 48px rgba(31, 45, 61, 0.14), 0 2px 8px rgba(31, 45, 61, 0.04);\\n text-align: center;\\n overflow: hidden;\\n -webkit-animation: kb-no-doc-in-data-v-1ce90f0b 0.2s ease-out;\\n animation: kb-no-doc-in-data-v-1ce90f0b 0.2s ease-out;\\n}\\n\\n/* 卡片顶部柔光:呼应红色图标的暖色氛围 */\\n.kb-no-doc-box[data-v-1ce90f0b]::before {\\n content: '';\\n position: absolute;\\n top: -80px;\\n left: 50%;\\n width: 280px;\\n height: 190px;\\n transform: translateX(-50%);\\n background: radial-gradient(closest-side, rgba(245, 108, 108, 0.18), rgba(245, 108, 108, 0));\\n pointer-events: none;\\n}\\n.kb-no-doc-icon[data-v-1ce90f0b] {\\n position: relative;\\n width: 76px;\\n height: 76px;\\n border-radius: 50%;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n background: linear-gradient(135deg, #ff9f9f, #ef5a5a);\\n border: none;\\n color: #fff;\\n font-size: 32px !important;\\n box-shadow: 0 0 0 8px rgba(239, 90, 90, 0.08), 0 10px 24px rgba(239, 90, 90, 0.3);\\n}\\n.kb-no-doc-icon[data-v-1ce90f0b] ::before {\\n font-size: 28px !important;\\n}\\n.kb-no-doc-text[data-v-1ce90f0b] {\\n font-size: 16px !important;\\n line-height: 1.6;\\n letter-spacing: 0.2px;\\n color: #606266;\\n}\\n@-webkit-keyframes kb-no-doc-in-data-v-1ce90f0b {\\nfrom {\\n opacity: 0;\\n transform: translateY(8px);\\n}\\nto {\\n opacity: 1;\\n transform: translateY(0);\\n}\\n}\\n@keyframes kb-no-doc-in-data-v-1ce90f0b {\\nfrom {\\n opacity: 0;\\n transform: translateY(8px);\\n}\\nto {\\n opacity: 1;\\n transform: translateY(0);\\n}\\n}\\n\\n/* ===== 聊天头部 ===== */\\n.chat-header[data-v-1ce90f0b] {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n padding: 10px 20px;\\n background: #fff;\\n border-bottom: 1px solid #e8e8e8;\\n flex-shrink: 0;\\n z-index: 10;\\n}\\n.sidebar-toggle-btn[data-v-1ce90f0b] {\\n position: absolute;\\n left: 0;\\n top: 50%;\\n transform: translateY(-50%);\\n width: 20px;\\n height: 64px;\\n z-index: 20;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n border: none;\\n background: #fff;\\n color: #606266;\\n border: 1px solid #dcdfe6;\\n border-left: none;\\n border-radius: 0 8px 8px 0;\\n box-shadow: 2px 0 8px rgba(0,0,0,.08);\\n cursor: pointer;\\n flex-shrink: 0;\\n transition: background 0.2s, color 0.2s, box-shadow 0.2s;\\n}\\n.sidebar-toggle-btn[data-v-1ce90f0b]:hover {\\n background: #ecf5ff;\\n color: #409eff;\\n box-shadow: 2px 0 10px rgba(64,158,255,.25);\\n}\\n.sidebar-toggle-btn svg[data-v-1ce90f0b] {\\n transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1);\\n}\\n/* 展开时箭头朝左(收起方向);收起时旋转 180° 朝右(展开方向),并轻微横向弹动强调 */\\n.sidebar-toggle-btn svg[data-v-1ce90f0b] {\\n transform: rotate(0deg);\\n}\\n.sidebar-toggle-btn.collapsed svg[data-v-1ce90f0b] {\\n transform: rotate(180deg);\\n}\\n@-webkit-keyframes toggle-bounce-data-v-1ce90f0b {\\n0% { transform: rotate(0deg) translateX(0);\\n}\\n60% { transform: rotate(0deg) translateX(-3px);\\n}\\n100% { transform: rotate(0deg) translateX(0);\\n}\\n}\\n@keyframes toggle-bounce-data-v-1ce90f0b {\\n0% { transform: rotate(0deg) translateX(0);\\n}\\n60% { transform: rotate(0deg) translateX(-3px);\\n}\\n100% { transform: rotate(0deg) translateX(0);\\n}\\n}\\n.sidebar-toggle-btn:active svg[data-v-1ce90f0b] {\\n -webkit-animation: toggle-bounce-data-v-1ce90f0b 0.3s ease;\\n animation: toggle-bounce-data-v-1ce90f0b 0.3s ease;\\n}\\n.header-left[data-v-1ce90f0b] { display: flex; align-items: center; gap: 10px; min-width: 0; flex: 1;\\n}\\n.agent-info[data-v-1ce90f0b] { display: flex; align-items: center; gap: 10px;\\n}\\n.agent-avatar[data-v-1ce90f0b] { width: 36px; height: 36px; border-radius: 50%; overflow: hidden; display: flex; align-items: center; justify-content: center; flex-shrink: 0; background: #fff;\\n}\\n.avatar-image[data-v-1ce90f0b] { width: 100%; height: 100%; -o-object-fit: cover; object-fit: cover; display: block;\\n}\\n.agent-text[data-v-1ce90f0b] { min-width: 0;\\n}\\n.agent-name[data-v-1ce90f0b] { font-size: 15px; font-weight: 600; color: #333; line-height: 1.3;\\n}\\n.agent-desc[data-v-1ce90f0b] { font-size: 12px; color: #999; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: min(300px, 45vw);\\n}\\n\\n/* ===== 消息列表 ===== */\\n.chat-body[data-v-1ce90f0b] {\\n flex: 1;\\n overflow-y: auto;\\n padding: 16px clamp(12px, 3vw, 40px);\\n scroll-behavior: auto;\\n position: relative;\\n -webkit-overflow-scrolling: touch;\\n background: url(https://qiguanbang.obs.cn-east-3.myhuaweicloud.com/production/image/AlAgent/agentbackground.png) 100% no-repeat;\\n background-size: cover;\\n background-position: center;\\n min-height: 0;\\n}\\n\\n/* 欢迎页 */\\n.welcome[data-v-1ce90f0b] { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: #bbb; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; margin: 0 -20px;\\n}\\n.welcome-icon[data-v-1ce90f0b] { margin-bottom: 12px; opacity: .7;\\n}\\n.welcome-title[data-v-1ce90f0b] { font-size: 20px; font-weight: 600; color: #333; margin-bottom: 8px;\\n}\\n.welcome-text[data-v-1ce90f0b] { font-size: 15px; color: #bbb;\\n}\\n@-webkit-keyframes pulse-data-v-1ce90f0b {\\n0%, 100% { opacity: 1;\\n}\\n50% { opacity: 0.4;\\n}\\n}\\n@keyframes pulse-data-v-1ce90f0b {\\n0%, 100% { opacity: 1;\\n}\\n50% { opacity: 0.4;\\n}\\n}\\n\\n/* 空消息欢迎卡片 */\\n.chat-empty-welcome[data-v-1ce90f0b] {\\n width: 100%;\\n padding: 40px 20px;\\n box-sizing: border-box;\\n display: flex;\\n flex-direction: column;\\n gap: 0;\\n max-width: 600px;\\n margin: 80px auto;\\n}\\n.welcome-card[data-v-1ce90f0b] {\\n position: relative;\\n background: linear-gradient(296deg, #D6EDFF 20%, #E8EBFF 80%);\\n border-radius: 16px 16px 0 0;\\n padding: 24px 24px 24px 150px;\\n overflow: visible;\\n}\\n.welcome-avatar-box[data-v-1ce90f0b] {\\n position: absolute;\\n left: 15px;\\n bottom: 0;\\n width: 110px;\\n height: 137px;\\n}\\n.welcome-avatar[data-v-1ce90f0b] {\\n width: 100%;\\n height: 100%;\\n border-radius: 12px;\\n background-size: cover;\\n background-position: center;\\n background-repeat: no-repeat;\\n}\\n.welcome-text-group[data-v-1ce90f0b] { display: flex; flex-direction: column; gap: 6px;\\n}\\n.welcome-text-group .text-sm[data-v-1ce90f0b] { font-weight: 400; color: #666; font-size: 12px; text-align: left;\\n}\\n.welcome-text-group .text-lg[data-v-1ce90f0b] { color: #000; font-size: 16px; font-weight: 500;\\n}\\n\\n/* 猜您想问 */\\n.guess-box[data-v-1ce90f0b] {\\n border-top: 1px solid #fff;\\n padding: 20px;\\n background: linear-gradient(180deg, #b8dcff 0%, #dff0ff 50%, #fff 100%);\\n border-radius: 0 0 16px 16px;\\n}\\n.guess-title[data-v-1ce90f0b] { display: flex; align-items: center; gap: 6px; margin-bottom: 16px; color: #222; font-size: 16px; font-weight: 500;\\n}\\n.tag-wrap[data-v-1ce90f0b] { display: flex; flex-wrap: wrap; gap: 10px;\\n}\\n.quick-tag[data-v-1ce90f0b] { padding: 8px 14px; background: #f2faff; border: 1px solid #e0eaff; border-radius: 8px; color: #333; cursor: pointer; font-size: 14px; white-space: nowrap; transition: all .2s;\\n}\\n.quick-tag[data-v-1ce90f0b]:hover { background: #f0f7ff; border-color: #1677ff;\\n}\\n\\n/* ── Thinking ── */\\n.thinking-details[data-v-1ce90f0b] { margin-bottom: 10px; border: 1px solid #e8e8e8; border-radius: 8px; overflow: hidden; background: #fafafa;\\n}\\n.thinking-summary[data-v-1ce90f0b] { font-size: 12px; color: #888; cursor: pointer; padding: 6px 10px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;\\n}\\n.thinking-summary[data-v-1ce90f0b]:hover { color: #1677ff;\\n}\\n.thinking-body[data-v-1ce90f0b] { font-size: 14px; color: #999; padding: 8px 12px; line-height: 1.6; border-top: 1px solid #f0f0f0; text-align: left; white-space: pre-wrap; word-break: break-word; overflow-wrap: break-word; overflow-wrap: anywhere;\\n}\\n.final-content[data-v-1ce90f0b] { word-break: break-word; overflow-wrap: break-word; overflow-wrap: anywhere; white-space: normal; font-size: 16px; line-height: 1.7;\\n}\\n/* markdown 内容子元素样式 */\\n.final-content[data-v-1ce90f0b] h1, .final-content[data-v-1ce90f0b] h2, .final-content[data-v-1ce90f0b] h3, .final-content[data-v-1ce90f0b] h4, .final-content[data-v-1ce90f0b] h5, .final-content[data-v-1ce90f0b] h6 { margin: 12px 0 6px; font-weight: 600; line-height: 1.5;\\n}\\n.final-content[data-v-1ce90f0b] h1 { font-size: 24px;\\n}\\n.final-content[data-v-1ce90f0b] h2 { font-size: 20px;\\n}\\n.final-content[data-v-1ce90f0b] h3 { font-size: 18px;\\n}\\n.final-content[data-v-1ce90f0b] h4, .final-content[data-v-1ce90f0b] h5, .final-content[data-v-1ce90f0b] h6 { font-size: 16px;\\n}\\n.final-content[data-v-1ce90f0b] strong { font-weight: 700;\\n}\\n.final-content[data-v-1ce90f0b] em { font-style: italic;\\n}\\n.final-content[data-v-1ce90f0b] blockquote { margin: 8px 0; padding: 4px 12px; border-left: 3px solid #b3d8ff; color: #666; background: #f6f8fa;\\n}\\n.final-content[data-v-1ce90f0b] a { color: #1677ff;\\n}\\n.final-content[data-v-1ce90f0b] p { margin: 6px 0;\\n}\\n.final-content[data-v-1ce90f0b] ul, .final-content[data-v-1ce90f0b] ol { padding-left: 20px; margin: 4px 0;\\n}\\n.final-content[data-v-1ce90f0b] li { margin: 2px 0;\\n}\\n.final-content[data-v-1ce90f0b] table { border-collapse: collapse; width: 100%; margin: 6px 0; font-size: 14px;\\n}\\n.final-content[data-v-1ce90f0b] th, .final-content[data-v-1ce90f0b] td { border: 1px solid #e8e8e8; padding: 5px 8px; text-align: left;\\n}\\n.final-content[data-v-1ce90f0b] th { background: #fafafa; font-weight: 600;\\n}\\n.final-content[data-v-1ce90f0b] code { padding: 1px 5px; border-radius: 3px; font-size: 14px;\\n}\\n.final-content[data-v-1ce90f0b] pre { background: #f6f8fa; color: #333; padding: 12px; border-radius: 6px; overflow-x: auto; font-size: 13px; border: 1px solid #e8e8e8; margin: 8px 0; line-height: 1.5; white-space: pre;\\n}\\n.final-content[data-v-1ce90f0b] pre code { padding: 0; font-size: inherit;\\n}\\n\\n/* 消息行 */\\n.msg-row[data-v-1ce90f0b] { width: 100%; display: flex; justify-content: center; padding: 20px 16px; box-sizing: border-box; align-items: center;\\n}\\n.msg-main[data-v-1ce90f0b] { display: flex; align-items: flex-start; gap: 10px; width: min(100%, 860px) !important; max-width: 860px;\\n}\\n.msg-row.user .msg-main[data-v-1ce90f0b] { flex-direction: row-reverse;\\n}\\n.msg-row.assistant .msg-main[data-v-1ce90f0b] { flex-direction: row;\\n}\\n\\n/* 头像 */\\n.message-avatar[data-v-1ce90f0b] { width: 36px; height: 36px; border-radius: 50%; flex-shrink: 0; -o-object-fit: cover; object-fit: cover;\\n}\\n/* 无头像时的文字头像(与 zjkjAvatar 一致:蓝底白字) */\\n.user-text-avatar[data-v-1ce90f0b] { display: flex; align-items: center; justify-content: center; background: #007fff; color: #fff; font-size: 12px; line-height: 1;\\n}\\n\\n/* 消息内容区域 */\\n.msg-content[data-v-1ce90f0b] { width: 100% !important; max-width: 100%; box-sizing: border-box; overflow: hidden; display: flex; flex-direction: column;\\n}\\n.msg-row.user .msg-content[data-v-1ce90f0b] { align-items: flex-end;\\n}\\n.msg-row.assistant .msg-content[data-v-1ce90f0b] { align-items: flex-start;\\n}\\n\\n/* 气泡 */\\n.bubble[data-v-1ce90f0b] { max-width: 100%; min-width: 30px; width: -webkit-fit-content; width: -moz-fit-content; width: fit-content; padding: 8px 14px; border-radius: 12px; line-height: 1.4; font-size: 15px; word-break: break-word; white-space: normal; text-align: left; overflow-wrap: anywhere;\\n}\\n.bubble.assistant[data-v-1ce90f0b] { background: #fff; color: #333; border-bottom-left-radius: 4px; box-shadow: 0 1px 4px rgba(0,0,0,.06); width: 100%; box-sizing: border-box;\\n}\\n.bubble.user[data-v-1ce90f0b] { background: #1677ff; color: #fff; border-bottom-right-radius: 4px; box-shadow: 0 2px 8px rgba(22,119,255,.15); float: none; margin-left: auto; max-width: min(100%, 520px);\\n}\\n\\n/* ── Tool Calls(与 AI 助理 ChatDetail 完全一致)── */\\n.tool-calls[data-v-1ce90f0b] { margin-top: 8px;\\n}\\n.tool-item[data-v-1ce90f0b] { background: #f5f5f5; border-radius: 6px; padding: 6px 10px; margin-bottom: 4px; font-size: 12px;\\n}\\n.tool-badge[data-v-1ce90f0b] { display: inline-block; margin-bottom: 2px; font-size: 11px; color: #fa8c16; font-weight: 500;\\n}\\n.tool-item pre[data-v-1ce90f0b] { margin: 0; white-space: pre-wrap; word-break: break-all; font-size: 12px; color: #666; max-height: 120px; overflow-y: auto;\\n}\\n\\n/* 消息操作区 */\\n.msg-actions[data-v-1ce90f0b] { display: flex; gap: 4px; margin-top: 4px; padding-left: 4px; align-items: center; justify-content: space-between;\\n}\\n.action-btn[data-v-1ce90f0b] { font-size: 12px; color: #999; cursor: pointer; padding: 2px 6px 2px 0; border-radius: 4px; transition: all .2s; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;\\n}\\n.action-btn[data-v-1ce90f0b]:hover { color: #1677ff; background: #f0f5ff;\\n}\\n.ai-badge[data-v-1ce90f0b] { font-size: 11px; color: #999; padding: 1px 6px; border-radius: 3px; white-space: nowrap; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; margin-left: auto;\\n}\\n\\n/* 流式打字动画 */\\n.typing[data-v-1ce90f0b] { display: flex; align-items: center; gap: 6px; padding: 4px 0;\\n}\\n.phrase[data-v-1ce90f0b] { font-size: 14px; color: #999;\\n}\\n.dots[data-v-1ce90f0b] { display: flex; align-items: center; gap: 3px;\\n}\\n.dots span[data-v-1ce90f0b] { width: 6px; height: 6px; border-radius: 50%; background: #bbb; display: inline-block; -webkit-animation: dot-bounce-data-v-1ce90f0b 1.4s infinite ease-in-out both; animation: dot-bounce-data-v-1ce90f0b 1.4s infinite ease-in-out both;\\n}\\n.dots span[data-v-1ce90f0b]:nth-child(1) { -webkit-animation-delay: -0.32s; animation-delay: -0.32s;\\n}\\n.dots span[data-v-1ce90f0b]:nth-child(2) { -webkit-animation-delay: -0.16s; animation-delay: -0.16s;\\n}\\n@-webkit-keyframes dot-bounce-data-v-1ce90f0b {\\n0%, 80%, 100% { transform: scale(0);\\n}\\n40% { transform: scale(1);\\n}\\n}\\n@keyframes dot-bounce-data-v-1ce90f0b {\\n0%, 80%, 100% { transform: scale(0);\\n}\\n40% { transform: scale(1);\\n}\\n}\\n\\n/* ===== 输入区域 ===== */\\n.chat-footer[data-v-1ce90f0b] { flex-shrink: 0; border-top: none; padding: 30px 0; display: flex; align-items: center; justify-content: center; margin: 0 auto; width: 100%;\\n}\\n.input-area[data-v-1ce90f0b] { position: relative; display: flex; align-items: flex-end; gap: 6px; background: #fff; border-radius: 24px; margin: 0 24px; padding: 18px 20px; border: 1px solid #b3d8ff; transition: border-color .2s; flex-wrap: wrap; width: min(100%, 1000px) !important; box-sizing: border-box;\\n}\\n.input-area[data-v-1ce90f0b]:focus-within { border-color: #1677ff; background: #fff; box-shadow: none;\\n}\\n.input-area[data-v-1ce90f0b]::after { content: \\\"Enter 发送,Ctrl+Enter 换行\\\"; position: absolute; right: 100px; bottom: 28px; font-size: 14px; color: #8c8c8c; pointer-events: none;\\n}\\n.chat-textarea[data-v-1ce90f0b] { flex: 1 1 320px; min-width: 0; border: none; outline: none; background: transparent; resize: none; font-size: 16px; line-height: 24px; min-height: 38px; height: 100px; max-height: 180px; overflow-y: auto; padding: 0; box-sizing: border-box; font-family: inherit; color: #333;\\n}\\n.chat-textarea[data-v-1ce90f0b]::-moz-placeholder { color: #999; font-size: 16px;\\n}\\n.chat-textarea[data-v-1ce90f0b]:-ms-input-placeholder { color: #999; font-size: 16px;\\n}\\n.chat-textarea[data-v-1ce90f0b]::placeholder { color: #999; font-size: 16px;\\n}\\n.chat-textarea[data-v-1ce90f0b]:disabled { cursor: not-allowed; opacity: .5;\\n}\\n.send-btn[data-v-1ce90f0b] { width: auto; height: 40px; padding: 0 21px; border-radius: 6px; border: none; display: flex; align-items: center; justify-content: center; cursor: pointer; flex-shrink: 0; transition: all .2s; background: #1677ff; color: #fff; font-size: 14px;\\n}\\n.send-btn svg[data-v-1ce90f0b] { display: none;\\n}\\n.send-btn[data-v-1ce90f0b]::after { content: \\\"发送\\\";\\n}\\n.send-btn.active[data-v-1ce90f0b] { background: #1677ff;\\n}\\n.send-btn.active[data-v-1ce90f0b]:hover { background: #4096ff;\\n}\\n.send-btn[data-v-1ce90f0b]:disabled { background: #88bfff; cursor: not-allowed;\\n}\\n.stop-btn[data-v-1ce90f0b] { width: 35px; height: 35px; border-radius: 50%; border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; background: #ff4d4f; color: #fff; flex-shrink: 0; transition: all .2s;\\n}\\n.stop-btn[data-v-1ce90f0b]:hover { background: #ff7875;\\n}\\n\\n/* ===== 移动端布局(仿 AI 助理:列表页 ⇄ 聊天详情页) ===== */\\n.kb-chat-root.is-mobile[data-v-1ce90f0b] {\\n position: relative;\\n display: block;\\n width: 100%;\\n max-width: 100%;\\n height: 100%;\\n overflow: hidden;\\n}\\n\\n/* 移动端会话列表页:全屏占位;详情页时滑出隐藏 */\\n.kb-chat-root.is-mobile .kb-chat-sidebar[data-v-1ce90f0b] {\\n position: absolute;\\n top: 0;\\n bottom: 0;\\n left: 0;\\n width: 100%;\\n border-right: none;\\n z-index: 5;\\n background: #fff;\\n}\\n.kb-chat-root.is-mobile:not(.h5-list-mode) .kb-chat-sidebar[data-v-1ce90f0b] {\\n transform: translateX(-100%);\\n}\\n\\n/* 移动端聊天主区:默认全屏;\\n h5-list-mode(列表页)时隐藏聊天主区,避免残留 */\\n.kb-chat-root.is-mobile .kb-chat-main[data-v-1ce90f0b] {\\n width: 100%;\\n max-width: 100%;\\n height: 100%;\\n overflow: hidden;\\n}\\n\\n/* 移动端输入框收窄边距,防止横向溢出被裁(.is-mobile 由 v-if/v-class 控制,与宽度无关,不需媒体查询) */\\n.kb-chat-root.is-mobile .chat-footer[data-v-1ce90f0b] {\\n padding: 16px 0;\\n}\\n.kb-chat-root.is-mobile .input-area[data-v-1ce90f0b] {\\n margin: 0 10px;\\n padding: 14px 14px;\\n width: calc(100% - 20px) !important;\\n}\\n.kb-chat-root.is-mobile .input-area[data-v-1ce90f0b]::after {\\n display: none;\\n}\\n.kb-chat-root.is-mobile.h5-list-mode .kb-chat-main[data-v-1ce90f0b] {\\n display: none;\\n}\\n\\n/* 移动端「返回」按钮 */\\n.kb-m-chat-back[data-v-1ce90f0b] {\\n position: absolute;\\n top: 10px;\\n left: 10px;\\n z-index: 20;\\n width: 36px;\\n height: 36px;\\n border: 1px solid #e8e8e8;\\n background: #f5f6f8;\\n color: #303133;\\n border-radius: 50%;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n cursor: pointer;\\n transition: background 0.2s;\\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08);\\n}\\n.kb-m-chat-back[data-v-1ce90f0b]:active { background: #e8eaed;\\n}\\n\\n/* 移动端详情页:头部左侧为返回按钮让位,避免头像/标题被遮挡(.is-mobile 已限定,不需媒体查询) */\\n.kb-chat-root.is-mobile:not(.h5-list-mode) .chat-header[data-v-1ce90f0b] {\\n padding-left: 56px;\\n}\\n\\n/* ===== 移动端引导遮罩(仅 .is-mobile 渲染,PC 不受影响) ===== */\\n.kb-m-guide-mask[data-v-1ce90f0b] {\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n gap: 10px;\\n margin-top: 28px;\\n}.kb-m-guide-line[data-v-1ce90f0b] {\\n width: 1px;\\n height: 22px;\\n background: linear-gradient(to bottom, rgba(22, 119, 255, 0), rgba(22, 119, 255, 0.45));\\n}\\n.kb-m-guide-tip[data-v-1ce90f0b] {\\n display: inline-flex;\\n align-items: center;\\n gap: 6px;\\n max-width: 100%;\\n padding: 8px 14px;\\n border-radius: 18px;\\n background: rgba(22, 119, 255, 0.08);\\n border: 1px dashed rgba(22, 119, 255, 0.35);\\n color: #1677ff;\\n font-size: 12px;\\n line-height: 1.5;\\n -webkit-animation: kbGuideBreath-data-v-1ce90f0b 2s ease-in-out infinite;\\n animation: kbGuideBreath-data-v-1ce90f0b 2s ease-in-out infinite;\\n}\\n.kb-m-guide-tip svg[data-v-1ce90f0b] {\\n flex-shrink: 0;\\n}\\n@-webkit-keyframes kbGuideBreath-data-v-1ce90f0b {\\n0%, 100% { opacity: 0.72;\\n}\\n50% { opacity: 1;\\n}\\n}\\n@keyframes kbGuideBreath-data-v-1ce90f0b {\\n0%, 100% { opacity: 0.72;\\n}\\n50% { opacity: 1;\\n}\\n}\\n\\n/* 移动端无文档遮罩:补充说明文案 */\\n.kb-no-doc-mobile-tip[data-v-1ce90f0b] {\\n display: inline-flex;\\n align-items: center;\\n gap: 6px;\\n margin-top: 14px;\\n padding: 8px 14px;\\n border-radius: 10px;\\n background: #f5f7fa;\\n color: #909399;\\n font-size: 12px;\\n line-height: 1.5;\\n}\\n.kb-no-doc-mobile-tip svg[data-v-1ce90f0b] {\\n flex-shrink: 0;\\n color: #1677ff;\\n}\\n/* 移动端无文档卡片收窄内边距,适配小屏 */\\n.kb-chat-root.is-mobile .kb-no-doc-mask[data-v-1ce90f0b] {\\n padding: 16px;\\n}\\n/* 移动端引导区收窄外边距,保证引导遮罩在首屏可见 */\\n.kb-chat-root.is-mobile .chat-empty-welcome[data-v-1ce90f0b] {\\n margin: 24px auto;\\n padding: 16px 14px;\\n}\\n.kb-chat-root.is-mobile .welcome-card[data-v-1ce90f0b] {\\n padding: 18px 16px 18px 118px;\\n border-radius: 14px 14px 0 0;\\n}\\n.kb-chat-root.is-mobile .welcome-avatar-box[data-v-1ce90f0b] {\\n left: 8px;\\n width: 96px;\\n height: 120px;\\n}\\n.kb-chat-root.is-mobile .kb-no-doc-box[data-v-1ce90f0b] {\\n gap: 16px;\\n max-width: 100%;\\n padding: 36px 24px;\\n border-radius: 18px;\\n}\\n.kb-chat-root.is-mobile .kb-no-doc-icon[data-v-1ce90f0b] {\\n width: 60px;\\n height: 60px;\\n}\\n.kb-chat-root.is-mobile .kb-no-doc-text[data-v-1ce90f0b] {\\n font-size: 14px !important;\\n}\\n\\n/* 移动端会话「…」按钮 */\\n.session-more-btn--m[data-v-1ce90f0b] {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 26px;\\n height: 26px;\\n border-radius: 6px;\\n border: none;\\n background: transparent;\\n color: #909399;\\n cursor: pointer;\\n}\\n\\n/* 移动端会话操作单 */\\n.kb-m-actionsheet[data-v-1ce90f0b] {\\n position: absolute;\\n top: 0;\\n right: 0;\\n bottom: 0;\\n left: 0;\\n z-index: 40;\\n display: flex;\\n align-items: flex-end;\\n justify-content: center;\\n background: rgba(0, 0, 0, 0.35);\\n -webkit-animation: kb-m-fade-data-v-1ce90f0b 0.15s ease-out;\\n animation: kb-m-fade-data-v-1ce90f0b 0.15s ease-out;\\n}\\n.kb-m-actionsheet-box[data-v-1ce90f0b] {\\n width: 100%;\\n max-width: 520px;\\n box-sizing: border-box;\\n padding: 8px;\\n background: #f2f3f5;\\n border-radius: 12px 12px 0 0;\\n}\\n.kb-m-actionsheet-title[data-v-1ce90f0b] {\\n padding: 12px 14px;\\n font-size: 13px;\\n color: #909399;\\n text-align: center;\\n word-break: break-all;\\n}\\n.kb-m-actionsheet-item[data-v-1ce90f0b] {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n gap: 6px;\\n height: 50px;\\n background: #fff;\\n border-radius: 8px;\\n font-size: 16px;\\n color: #303133;\\n margin-bottom: 8px;\\n}\\n.kb-m-actionsheet-item.danger[data-v-1ce90f0b] { color: #ff4d4f;\\n}\\n.kb-m-actionsheet-item[data-v-1ce90f0b]:active { background: #f5f6f8;\\n}\\n.kb-m-actionsheet-cancel[data-v-1ce90f0b] {\\n height: 50px;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n background: #fff;\\n border-radius: 8px;\\n font-size: 16px;\\n color: #303133;\\n}\\n.kb-m-actionsheet-cancel[data-v-1ce90f0b]:active { background: #f5f6f8;\\n}\\n@-webkit-keyframes kb-m-fade-data-v-1ce90f0b {\\nfrom { opacity: 0;\\n}\\nto { opacity: 1;\\n}\\n}\\n@keyframes kb-m-fade-data-v-1ce90f0b {\\nfrom { opacity: 0;\\n}\\nto { opacity: 1;\\n}\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/KbChatMain.vue?./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1734
1758
|
|
|
1735
1759
|
/***/ }),
|
|
1736
1760
|
|
|
@@ -1741,7 +1765,29 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../.
|
|
|
1741
1765
|
/*! no static exports found */
|
|
1742
1766
|
/***/ (function(module, exports, __webpack_require__) {
|
|
1743
1767
|
|
|
1744
|
-
eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.kb-root[data-v-84b8c396] {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n height: 100%;\\r\\n min-height: 400px;\\r\\n background: #fafbfc;\\r\\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;\\r\\n font-size: 16px !important;\\r\\n color: #303133;\\n}\\r\\n\\r\\n/* 完全隔离主应用 lib-flexible 的影响 */\\n.kb-root[data-v-84b8c396],\\r\\n.kb-root *[data-v-84b8c396],\\r\\n.kb-root *[data-v-84b8c396]::before,\\r\\n.kb-root *[data-v-84b8c396]::after {\\r\\n font-size: 16px !important;\\n}\\r\\n\\r\\n/* ===== 顶部切换栏 ===== */\\n.kb-tabs[data-v-84b8c396] {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 0;\\r\\n height: 48px;\\r\\n padding: 0 20px;\\r\\n background: #fff;\\r\\n border-bottom: 1px solid #ebeef5;\\r\\n flex-shrink: 0;\\n}\\n.kb-tab[data-v-84b8c396] {\\r\\n height: 100%;\\r\\n padding: 0 20px;\\r\\n border: none;\\r\\n background: transparent;\\r\\n font-size: 16px !important;\\r\\n color: #909399;\\r\\n cursor: pointer;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 8px;\\r\\n position: relative;\\r\\n transition: all 0.2s;\\r\\n white-space: nowrap;\\r\\n font-weight: 500;\\n}\\n.kb-tab[data-v-84b8c396]:hover {\\r\\n color: #303133;\\n}\\n.kb-tab.active[data-v-84b8c396] {\\r\\n color: #409eff;\\r\\n font-weight: 600;\\n}\\n.kb-tab.active[data-v-84b8c396]::after {\\r\\n content: '';\\r\\n position: absolute;\\r\\n bottom: 0;\\r\\n left: 50%;\\r\\n transform: translateX(-50%);\\r\\n width: 60%;\\r\\n height: 2px;\\r\\n background: #409eff;\\n}\\n.kb-tab svg[data-v-84b8c396],\\r\\n.kb-tab i[data-v-84b8c396] {\\r\\n flex-shrink: 0;\\r\\n transition: transform 0.2s;\\n}\\n.kb-tab:hover svg[data-v-84b8c396],\\r\\n.kb-tab:hover i[data-v-84b8c396] {\\r\\n transform: scale(1.1);\\n}\\r\\n\\r\\n/* ===== 管理布局 ===== */\\n.kb-layout[data-v-84b8c396] {\\r\\n display: flex;\\r\\n align-items: flex-start;\\r\\n flex: 1;\\r\\n min-height: 0;\\r\\n overflow: hidden;\\n}\\n.kb-sidebar[data-v-84b8c396] {\\r\\n width: clamp(240px, 20vw, 280px);\\r\\n border-right: 1px solid #ebeef5;\\r\\n background: #fafbfc;\\r\\n flex-shrink: 0;\\r\\n height: 100%;\\r\\n overflow: hidden;\\n}\\n.kb-main[data-v-84b8c396] {\\r\\n flex: 1;\\r\\n min-width: 0;\\r\\n height: 100%;\\r\\n overflow: hidden;\\r\\n background: #fff;\\n}\\n.kb-chat-view[data-v-84b8c396] {\\r\\n display: flex;\\r\\n flex: 1;\\r\\n min-height: 0;\\r\\n overflow: hidden;\\n}\\n.kb-chat-view[data-v-84b8c396] .kb-chat-root {\\r\\n width: 100%;\\n}\\r\\n\\r\\n/* ===== 引导动画:抵消 .kb-root 全局字号强制规则,还原引导组件原始排版 ===== */\\n.kb-root[data-v-84b8c396] .guide-caption-desc {\\r\\n font-size: 13px !important;\\n}\\n.kb-root[data-v-84b8c396] .guide-nav-btn {\\r\\n font-size: 12px !important;\\n}\\n.kb-root[data-v-84b8c396] .guide-skip {\\r\\n font-size: 14px !important;\\n}\\n.kb-root[data-v-84b8c396] .guide-splash-title {\\r\\n font-size: 20px !important;\\n}\\n.kb-root[data-v-84b8c396] .guide-splash-desc {\\r\\n font-size: 14px !important;\\n}\\n.kb-root[data-v-84b8c396] .guide-splash-action-btn {\\r\\n font-size: 15px !important;\\n}\\n.kb-root[data-v-84b8c396] .guide-page-tip {\\r\\n font-size: 13px !important;\\n}\\r\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/KnowledgeBaseMain.vue?./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1768
|
+
eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.kb-root[data-v-84b8c396] {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n width: 100%;\\r\\n max-width: 100%;\\r\\n height: 100%;\\r\\n min-height: 400px;\\r\\n overflow-x: hidden;\\r\\n box-sizing: border-box;\\r\\n background: #fafbfc;\\r\\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;\\r\\n font-size: 16px !important;\\r\\n color: #303133;\\n}\\r\\n\\r\\n/* 完全隔离主应用 lib-flexible 的影响 */\\n.kb-root[data-v-84b8c396],\\r\\n.kb-root *[data-v-84b8c396],\\r\\n.kb-root *[data-v-84b8c396]::before,\\r\\n.kb-root *[data-v-84b8c396]::after {\\r\\n font-size: 16px !important;\\n}\\r\\n\\r\\n/* ===== 顶部切换栏 ===== */\\n.kb-tabs[data-v-84b8c396] {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 0;\\r\\n height: 48px;\\r\\n padding: 0 20px;\\r\\n background: #fff;\\r\\n border-bottom: 1px solid #ebeef5;\\r\\n flex-shrink: 0;\\r\\n min-width: 0;\\r\\n overflow: hidden;\\n}\\n.kb-tab[data-v-84b8c396] {\\r\\n height: 100%;\\r\\n padding: 0 20px;\\r\\n border: none;\\r\\n background: transparent;\\r\\n font-size: 16px !important;\\r\\n color: #909399;\\r\\n cursor: pointer;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 8px;\\r\\n position: relative;\\r\\n transition: all 0.2s;\\r\\n white-space: nowrap;\\r\\n font-weight: 500;\\n}\\n.kb-tab[data-v-84b8c396]:hover {\\r\\n color: #303133;\\n}\\n.kb-tab.active[data-v-84b8c396] {\\r\\n color: #409eff;\\r\\n font-weight: 600;\\n}\\n.kb-tab.active[data-v-84b8c396]::after {\\r\\n content: '';\\r\\n position: absolute;\\r\\n bottom: 0;\\r\\n left: 50%;\\r\\n transform: translateX(-50%);\\r\\n width: 60%;\\r\\n height: 2px;\\r\\n background: #409eff;\\n}\\n.kb-tab svg[data-v-84b8c396],\\r\\n.kb-tab i[data-v-84b8c396] {\\r\\n flex-shrink: 0;\\r\\n transition: transform 0.2s;\\n}\\n.kb-tab:hover svg[data-v-84b8c396],\\r\\n.kb-tab:hover i[data-v-84b8c396] {\\r\\n transform: scale(1.1);\\n}\\r\\n\\r\\n/* ===== 管理布局 ===== */\\n.kb-layout[data-v-84b8c396] {\\r\\n display: flex;\\r\\n align-items: flex-start;\\r\\n flex: 1;\\r\\n min-height: 0;\\r\\n overflow: hidden;\\n}\\n.kb-sidebar[data-v-84b8c396] {\\r\\n width: clamp(240px, 20vw, 280px);\\r\\n border-right: 1px solid #ebeef5;\\r\\n background: #fafbfc;\\r\\n flex-shrink: 0;\\r\\n height: 100%;\\r\\n overflow: hidden;\\n}\\n.kb-main[data-v-84b8c396] {\\r\\n flex: 1;\\r\\n min-width: 0;\\r\\n height: 100%;\\r\\n overflow: hidden;\\r\\n background: #fff;\\n}\\n.kb-chat-view[data-v-84b8c396] {\\r\\n display: flex;\\r\\n flex: 1;\\r\\n min-height: 0;\\r\\n overflow: hidden;\\n}\\n.kb-chat-view[data-v-84b8c396] .kb-chat-root {\\r\\n width: 100%;\\n}\\r\\n\\r\\n/* ===== 引导动画:抵消 .kb-root 全局字号强制规则,还原引导组件原始排版 ===== */\\n.kb-root[data-v-84b8c396] .guide-caption-desc {\\r\\n font-size: 13px !important;\\n}\\n.kb-root[data-v-84b8c396] .guide-nav-btn {\\r\\n font-size: 12px !important;\\n}\\n.kb-root[data-v-84b8c396] .guide-skip {\\r\\n font-size: 14px !important;\\n}\\n.kb-root[data-v-84b8c396] .guide-splash-title {\\r\\n font-size: 20px !important;\\n}\\n.kb-root[data-v-84b8c396] .guide-splash-desc {\\r\\n font-size: 14px !important;\\n}\\n.kb-root[data-v-84b8c396] .guide-splash-action-btn {\\r\\n font-size: 15px !important;\\n}\\n.kb-root[data-v-84b8c396] .guide-page-tip {\\r\\n font-size: 13px !important;\\n}\\r\\n\\r\\n/* ===== 移动端:管理页导航(目录 ⇄ 文档列表) ===== */\\n.kb-chat-view--mobile[data-v-84b8c396] {\\r\\n width: 100%;\\r\\n max-width: 100%;\\r\\n min-width: 0;\\r\\n overflow: hidden;\\n}\\n.kb-chat-view--mobile[data-v-84b8c396] .kb-chat-root {\\r\\n width: 100%;\\n}\\n.kb-m-layout[data-v-84b8c396] {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n flex: 1;\\r\\n min-width: 0;\\r\\n max-width: 100%;\\r\\n min-height: 0;\\r\\n overflow: hidden;\\r\\n background: #fafbfc;\\n}\\n.kb-m-navbar[data-v-84b8c396] {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 8px;\\r\\n height: 48px;\\r\\n padding: 0 8px 0 4px;\\r\\n background: #fff;\\r\\n border-bottom: 1px solid #ebeef5;\\r\\n flex-shrink: 0;\\n}\\n.kb-m-back[data-v-84b8c396] {\\r\\n width: 36px;\\r\\n height: 36px;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n border: none;\\r\\n background: transparent;\\r\\n color: #303133;\\r\\n cursor: pointer;\\r\\n border-radius: 8px;\\r\\n transition: background 0.2s;\\n}\\n.kb-m-back.ghost[data-v-84b8c396] {\\r\\n visibility: hidden;\\r\\n pointer-events: none;\\n}\\n.kb-m-back[data-v-84b8c396]:active {\\r\\n background: #f0f2f5;\\n}\\n.kb-m-nav-title[data-v-84b8c396] {\\r\\n flex: 1;\\r\\n min-width: 0;\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n font-size: 16px;\\r\\n font-weight: 600;\\r\\n color: #303133;\\n}\\n.kb-m-page[data-v-84b8c396] {\\r\\n flex: 1;\\r\\n min-height: 0;\\r\\n overflow: hidden;\\n}\\n.kb-m-full[data-v-84b8c396] {\\r\\n width: 100%;\\r\\n height: 100%;\\n}\\r\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/KnowledgeBaseMain.vue?./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1769
|
+
|
|
1770
|
+
/***/ }),
|
|
1771
|
+
|
|
1772
|
+
/***/ "./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/lib/knowledgeBase/KnowledgeBaseMain.vue?vue&type=style&index=1&lang=css&":
|
|
1773
|
+
/*!***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
1774
|
+
!*** ./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/lib/knowledgeBase/KnowledgeBaseMain.vue?vue&type=style&index=1&lang=css& ***!
|
|
1775
|
+
\***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
|
|
1776
|
+
/*! no static exports found */
|
|
1777
|
+
/***/ (function(module, exports, __webpack_require__) {
|
|
1778
|
+
|
|
1779
|
+
eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\r\\n/* 全局(非 scoped):移动端挂载到 body 的 Element 弹层适配($confirm/$alert 消息框等,scoped 样式无法覆盖)。\\r\\n 仅 768px 以下生效,PC 端不受影响 */\\n@media (max-width: 768px) {\\n.el-message-box {\\r\\n width: 86% !important;\\r\\n max-width: 86vw;\\n}\\n.el-message-box .el-message-box__message {\\r\\n word-break: break-all;\\n}\\n}\\r\\n\\r\\n/* 全局:H5 自绘弹框共享控件样式(MobileDialog 内使用,供各组件复用;不依赖 Element UI) */\\n.kbm-field {\\r\\n margin-bottom: 14px;\\n}\\n.kbm-field-label {\\r\\n display: block;\\r\\n margin-bottom: 6px;\\r\\n font-size: 14px;\\r\\n color: #303133;\\n}\\n.kbm-field-row {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 8px;\\n}\\n.kbm-field-row .kbm-input {\\r\\n flex: 1;\\n}\\n.kbm-field-remove {\\r\\n flex-shrink: 0;\\r\\n width: 30px;\\r\\n height: 30px;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n border: none;\\r\\n background: transparent;\\r\\n color: #909399;\\r\\n border-radius: 50%;\\n}\\n.kbm-input {\\r\\n width: 100%;\\r\\n height: 38px;\\r\\n padding: 0 10px;\\r\\n border: 1px solid #dcdfe6;\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n font-size: 14px;\\r\\n color: #303133;\\r\\n outline: none;\\r\\n box-sizing: border-box;\\r\\n -webkit-appearance: none;\\r\\n -moz-appearance: none;\\r\\n appearance: none;\\n}\\n.kbm-input:focus {\\r\\n border-color: #1677ff;\\n}\\n.kbm-btn {\\r\\n flex: 1;\\r\\n height: 40px;\\r\\n border: 1px solid #dcdfe6;\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n font-size: 15px;\\r\\n color: #606266;\\n}\\n.kbm-btn.primary {\\r\\n border-color: #1677ff;\\r\\n background: #1677ff;\\r\\n color: #fff;\\n}\\n.kbm-btn:disabled {\\r\\n opacity: 0.6;\\n}\\n.kbm-loading {\\r\\n padding: 20px 0;\\r\\n text-align: center;\\r\\n font-size: 13px;\\r\\n color: #909399;\\n}\\n.kbm-empty {\\r\\n padding: 30px 0;\\r\\n text-align: center;\\r\\n font-size: 13px;\\r\\n color: #909399;\\n}\\r\\n/* 自绘下拉选择(替代原生 select:原生弹层宽度不可控,会超出弹框) */\\n.kbm-select {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n gap: 8px;\\r\\n text-align: left;\\n}\\n.kbm-select-placeholder {\\r\\n color: #a8abb2;\\n}\\n.kbm-select-arrow {\\r\\n flex-shrink: 0;\\r\\n color: #c0c4cc;\\n}\\n.kbm-picker-mask {\\r\\n position: fixed;\\r\\n top: 0;\\r\\n right: 0;\\r\\n bottom: 0;\\r\\n left: 0;\\r\\n z-index: 3100;\\r\\n background: rgba(0, 0, 0, 0.45);\\r\\n display: flex;\\r\\n align-items: flex-end;\\r\\n -webkit-animation: kbmPickerFade 0.18s ease;\\r\\n animation: kbmPickerFade 0.18s ease;\\n}\\n.kbm-picker {\\r\\n width: 100%;\\r\\n max-height: 60vh;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n background: #fff;\\r\\n border-radius: 16px 16px 0 0;\\r\\n padding-bottom: env(safe-area-inset-bottom);\\r\\n -webkit-animation: kbmPickerUp 0.22s ease;\\r\\n animation: kbmPickerUp 0.22s ease;\\n}\\n.kbm-picker-title {\\r\\n flex-shrink: 0;\\r\\n padding: 14px 16px 10px;\\r\\n font-size: 13px;\\r\\n color: #909399;\\r\\n text-align: center;\\n}\\n.kbm-picker-list {\\r\\n flex: 1;\\r\\n min-height: 0;\\r\\n overflow-y: auto;\\r\\n -webkit-overflow-scrolling: touch;\\r\\n padding: 0 8px 8px;\\n}\\n.kbm-picker-row {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 8px;\\r\\n padding: 11px 10px;\\r\\n border-radius: 8px;\\r\\n font-size: 15px;\\r\\n color: #303133;\\n}\\n.kbm-picker-row:active {\\r\\n background: #f5f7fa;\\n}\\n.kbm-picker-row.active {\\r\\n background: #e8f3ff;\\r\\n color: #1677ff;\\n}\\n.kbm-picker-row svg {\\r\\n flex-shrink: 0;\\n}\\n.kbm-picker-name {\\r\\n flex: 1;\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\n}\\n.kbm-picker-cancel {\\r\\n flex-shrink: 0;\\r\\n border-top: 1px solid #f0f2f5;\\r\\n padding: 13px 0;\\r\\n text-align: center;\\r\\n font-size: 15px;\\r\\n color: #606266;\\n}\\n.kbm-picker-cancel:active {\\r\\n background: #f5f7fa;\\n}\\n@-webkit-keyframes kbmPickerFade {\\nfrom { opacity: 0;\\n}\\nto { opacity: 1;\\n}\\n}\\n@keyframes kbmPickerFade {\\nfrom { opacity: 0;\\n}\\nto { opacity: 1;\\n}\\n}\\n@-webkit-keyframes kbmPickerUp {\\nfrom { transform: translateY(40%);\\n}\\nto { transform: translateY(0);\\n}\\n}\\n@keyframes kbmPickerUp {\\nfrom { transform: translateY(40%);\\n}\\nto { transform: translateY(0);\\n}\\n}\\r\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/KnowledgeBaseMain.vue?./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1780
|
+
|
|
1781
|
+
/***/ }),
|
|
1782
|
+
|
|
1783
|
+
/***/ "./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/lib/knowledgeBase/MobileDialog.vue?vue&type=style&index=0&id=e31817a6&scoped=true&lang=css&":
|
|
1784
|
+
/*!**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
1785
|
+
!*** ./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/lib/knowledgeBase/MobileDialog.vue?vue&type=style&index=0&id=e31817a6&scoped=true&lang=css& ***!
|
|
1786
|
+
\**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
|
|
1787
|
+
/*! no static exports found */
|
|
1788
|
+
/***/ (function(module, exports, __webpack_require__) {
|
|
1789
|
+
|
|
1790
|
+
eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.kbm-dialog__mask[data-v-e31817a6] {\\n position: fixed;\\n top: 0;\\n right: 0;\\n bottom: 0;\\n left: 0;\\n z-index: 3000;\\n background: rgba(0, 0, 0, 0.45);\\n}\\n.kbm-dialog[data-v-e31817a6] {\\n position: fixed;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n z-index: 3001;\\n display: flex;\\n flex-direction: column;\\n max-height: 80vh;\\n background: #fff;\\n border-radius: 16px 16px 0 0;\\n padding-bottom: env(safe-area-inset-bottom);\\n}\\n.kbm-dialog.fullscreen[data-v-e31817a6] {\\n top: 0;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n max-height: none;\\n border-radius: 0;\\n}\\n.kbm-dialog__header[data-v-e31817a6] {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n flex-shrink: 0;\\n padding: 14px 16px;\\n border-bottom: 1px solid #f0f2f5;\\n}\\n.kbm-dialog__title[data-v-e31817a6] {\\n font-size: 16px;\\n font-weight: 600;\\n color: #303133;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.kbm-dialog__close[data-v-e31817a6] {\\n flex-shrink: 0;\\n width: 30px;\\n height: 30px;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n border: none;\\n background: transparent;\\n color: #909399;\\n border-radius: 50%;\\n}\\n.kbm-dialog__close[data-v-e31817a6]:active {\\n background: #f0f2f5;\\n}\\n.kbm-dialog__body[data-v-e31817a6] {\\n flex: 1;\\n min-height: 0;\\n overflow-y: auto;\\n -webkit-overflow-scrolling: touch;\\n padding: 16px;\\n}\\n.kbm-dialog__footer[data-v-e31817a6] {\\n flex-shrink: 0;\\n display: flex;\\n gap: 10px;\\n padding: 10px 16px;\\n border-top: 1px solid #f0f2f5;\\n}\\n\\n/* 过渡 */\\n.kbm-dialog-fade-enter-active[data-v-e31817a6],\\n.kbm-dialog-fade-leave-active[data-v-e31817a6] {\\n transition: opacity 0.2s;\\n}\\n.kbm-dialog-fade-enter[data-v-e31817a6],\\n.kbm-dialog-fade-leave-to[data-v-e31817a6] {\\n opacity: 0;\\n}\\n.kbm-dialog-slide-enter-active[data-v-e31817a6],\\n.kbm-dialog-slide-leave-active[data-v-e31817a6] {\\n transition: transform 0.25s ease;\\n}\\n.kbm-dialog-slide-enter[data-v-e31817a6],\\n.kbm-dialog-slide-leave-to[data-v-e31817a6] {\\n transform: translateY(100%);\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/MobileDialog.vue?./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
1745
1791
|
|
|
1746
1792
|
/***/ }),
|
|
1747
1793
|
|
|
@@ -14248,6 +14294,28 @@ eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// lo
|
|
|
14248
14294
|
|
|
14249
14295
|
/***/ }),
|
|
14250
14296
|
|
|
14297
|
+
/***/ "./node_modules/vue-style-loader/index.js?!./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/lib/knowledgeBase/KnowledgeBaseMain.vue?vue&type=style&index=1&lang=css&":
|
|
14298
|
+
/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
14299
|
+
!*** ./node_modules/vue-style-loader??ref--6-oneOf-1-0!./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/lib/knowledgeBase/KnowledgeBaseMain.vue?vue&type=style&index=1&lang=css& ***!
|
|
14300
|
+
\*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
|
|
14301
|
+
/*! no static exports found */
|
|
14302
|
+
/***/ (function(module, exports, __webpack_require__) {
|
|
14303
|
+
|
|
14304
|
+
eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src??ref--6-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib??vue-loader-options!./KnowledgeBaseMain.vue?vue&type=style&index=1&lang=css& */ \"./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/lib/knowledgeBase/KnowledgeBaseMain.vue?vue&type=style&index=1&lang=css&\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../node_modules/vue-style-loader/lib/addStylesClient.js */ \"./node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"177e6b42\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(false) {}\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/KnowledgeBaseMain.vue?./node_modules/vue-style-loader??ref--6-oneOf-1-0!./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
14305
|
+
|
|
14306
|
+
/***/ }),
|
|
14307
|
+
|
|
14308
|
+
/***/ "./node_modules/vue-style-loader/index.js?!./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/lib/knowledgeBase/MobileDialog.vue?vue&type=style&index=0&id=e31817a6&scoped=true&lang=css&":
|
|
14309
|
+
/*!************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
14310
|
+
!*** ./node_modules/vue-style-loader??ref--6-oneOf-1-0!./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/lib/knowledgeBase/MobileDialog.vue?vue&type=style&index=0&id=e31817a6&scoped=true&lang=css& ***!
|
|
14311
|
+
\************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
|
|
14312
|
+
/*! no static exports found */
|
|
14313
|
+
/***/ (function(module, exports, __webpack_require__) {
|
|
14314
|
+
|
|
14315
|
+
eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src??ref--6-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib??vue-loader-options!./MobileDialog.vue?vue&type=style&index=0&id=e31817a6&scoped=true&lang=css& */ \"./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/lib/knowledgeBase/MobileDialog.vue?vue&type=style&index=0&id=e31817a6&scoped=true&lang=css&\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../node_modules/vue-style-loader/lib/addStylesClient.js */ \"./node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"60887a62\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(false) {}\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/MobileDialog.vue?./node_modules/vue-style-loader??ref--6-oneOf-1-0!./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
|
|
14316
|
+
|
|
14317
|
+
/***/ }),
|
|
14318
|
+
|
|
14251
14319
|
/***/ "./node_modules/vue-style-loader/index.js?!./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/sass-loader/dist/cjs.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/lib/components/alert/ChatToast/chatToast.vue?vue&type=style&index=0&id=7ee21de6&lang=scss&scoped=true&":
|
|
14252
14320
|
/*!********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
14253
14321
|
!*** ./node_modules/vue-style-loader??ref--8-oneOf-1-0!./node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--8-oneOf-1-2!./node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/lib/components/alert/ChatToast/chatToast.vue?vue&type=style&index=0&id=7ee21de6&lang=scss&scoped=true& ***!
|
|
@@ -14633,7 +14701,7 @@ eval("// Generated by CoffeeScript 1.12.7\n(function() {\n var XMLDocument, XML
|
|
|
14633
14701
|
/*! exports provided: name, version, main, private, scripts, dependencies, devDependencies, browserslist, directories, keywords, license, files, default */
|
|
14634
14702
|
/***/ (function(module) {
|
|
14635
14703
|
|
|
14636
|
-
eval("module.exports = JSON.parse(\"{\\\"name\\\":\\\"zj-plugin-intelligent\\\",\\\"version\\\":\\\"1.2.18-beta.
|
|
14704
|
+
eval("module.exports = JSON.parse(\"{\\\"name\\\":\\\"zj-plugin-intelligent\\\",\\\"version\\\":\\\"1.2.18-beta.5\\\",\\\"main\\\":\\\"lib/ZjPluginIntelligent.umd.min.js\\\",\\\"private\\\":false,\\\"scripts\\\":{\\\"serve\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve\\\",\\\"build\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build\\\",\\\"lib\\\":\\\"node scripts/build-lib.js\\\",\\\"lib:test\\\":\\\"node scripts/build-lib.js test\\\"},\\\"dependencies\\\":{\\\"@jboltai/tokui\\\":\\\"^0.1.6\\\",\\\"crypto-js\\\":\\\"^4.2.0\\\",\\\"docx\\\":\\\"^8.5.0\\\",\\\"html2canvas\\\":\\\"^1.4.1\\\",\\\"mammoth\\\":\\\"^1.6.0\\\",\\\"markdown-it\\\":\\\"^13.0.2\\\",\\\"marked\\\":\\\"^4.3.0\\\",\\\"xlsx\\\":\\\"^0.18.5\\\"},\\\"devDependencies\\\":{\\\"@babel/preset-env\\\":\\\"^7.14.9\\\",\\\"@vue/cli-plugin-babel\\\":\\\"~4.5.0\\\",\\\"@vue/cli-plugin-eslint\\\":\\\"~4.5.0\\\",\\\"@vue/cli-plugin-vuex\\\":\\\"~4.5.0\\\",\\\"@vue/cli-service\\\":\\\"~4.5.0\\\",\\\"axios\\\":\\\"^0.27.2\\\",\\\"babel-eslint\\\":\\\"^10.1.0\\\",\\\"babel-plugin-component\\\":\\\"^1.1.1\\\",\\\"compression-webpack-plugin\\\":\\\"^6.0.3\\\",\\\"core-js\\\":\\\"^3.6.5\\\",\\\"element-ui\\\":\\\"^2.15.4\\\",\\\"eslint\\\":\\\"^6.8.0\\\",\\\"eslint-plugin-vue\\\":\\\"^7.13.0\\\",\\\"js-cookie\\\":\\\"^2.2.1\\\",\\\"obs-upload\\\":\\\"^1.0.4\\\",\\\"pako\\\":\\\"^2.1.0\\\",\\\"reconnecting-websocket\\\":\\\"^4.4.0\\\",\\\"sass\\\":\\\"^1.71.0\\\",\\\"sass-loader\\\":\\\"^8.0.2\\\",\\\"snowflake-id\\\":\\\"^1.1.0\\\",\\\"vue\\\":\\\"^2.6.11\\\",\\\"vue-template-compiler\\\":\\\"^2.6.11\\\",\\\"vuex\\\":\\\"^3.4.0\\\",\\\"webpack-bundle-analyzer\\\":\\\"^4.4.2\\\"},\\\"browserslist\\\":[\\\"> 1%\\\",\\\"last 2 versions\\\",\\\"not dead\\\"],\\\"directories\\\":{\\\"lib\\\":\\\"lib\\\"},\\\"keywords\\\":[],\\\"license\\\":\\\"ISC\\\",\\\"files\\\":[\\\"lib\\\"]}\");\n\n//# sourceURL=webpack://ZjPluginIntelligent/./package.json?");
|
|
14637
14705
|
|
|
14638
14706
|
/***/ }),
|
|
14639
14707
|
|
|
@@ -15130,7 +15198,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod
|
|
|
15130
15198
|
/***/ (function(module, exports, __webpack_require__) {
|
|
15131
15199
|
|
|
15132
15200
|
"use strict";
|
|
15133
|
-
eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.generateGuideSteps = generateGuideSteps;\nexports.generateKbManageGuideSteps = generateKbManageGuideSteps;\n\n/*\n * @Desc: 新功能引导步骤配置\n * 每步可配置标题、描述、目标元素选择器、图标等\n * targetSelector 为可选,不指定则居中显示\n */\n// 基础图标(内联 SVG)\nvar icons = {\n welcome: \"\\n <svg viewBox=\\\"0 0 48 48\\\" width=\\\"48\\\" height=\\\"48\\\">\\n <circle cx=\\\"24\\\" cy=\\\"24\\\" r=\\\"22\\\" fill=\\\"#e6f4ff\\\"/>\\n <path d=\\\"M24 14c-3.3 0-6 2.7-6 6 0 1.3.4 2.5 1.2 3.5l-1.2 3.5 3.5-1.2c1 .7 2.2 1.2 3.5 1.2 3.3 0 6-2.7 6-6s-2.7-6-6-6z\\\" fill=\\\"#0074fd\\\"/>\\n <path d=\\\"M18 34c0-3.3 2.7-6 6-6s6 2.7 6 6\\\" fill=\\\"none\\\" stroke=\\\"#0074fd\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\"/>\\n </svg>\",\n agent: \"\\n <svg viewBox=\\\"0 0 48 48\\\" width=\\\"48\\\" height=\\\"48\\\">\\n <circle cx=\\\"24\\\" cy=\\\"24\\\" r=\\\"22\\\" fill=\\\"#fff7e6\\\"/>\\n <rect x=\\\"10\\\" y=\\\"16\\\" width=\\\"28\\\" height=\\\"18\\\" rx=\\\"4\\\" fill=\\\"#fa8c16\\\" opacity=\\\"0.2\\\"/>\\n <rect x=\\\"14\\\" y=\\\"20\\\" width=\\\"20\\\" height=\\\"10\\\" rx=\\\"2\\\" fill=\\\"#fa8c16\\\"/>\\n <circle cx=\\\"20\\\" cy=\\\"25\\\" r=\\\"2\\\" fill=\\\"#fff\\\"/>\\n <circle cx=\\\"28\\\" cy=\\\"25\\\" r=\\\"2\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"M22 29c1.5 0 2.5-1 4-1s2.5 1 4 1\\\" stroke=\\\"#fff\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\"/>\\n </svg>\",\n chat: \"\\n <svg viewBox=\\\"0 0 48 48\\\" width=\\\"48\\\" height=\\\"48\\\">\\n <circle cx=\\\"24\\\" cy=\\\"24\\\" r=\\\"22\\\" fill=\\\"#f6ffed\\\"/>\\n <path d=\\\"M14 16h20v14H14z\\\" fill=\\\"#52c41a\\\" opacity=\\\"0.15\\\"/>\\n <rect x=\\\"14\\\" y=\\\"16\\\" width=\\\"20\\\" height=\\\"14\\\" rx=\\\"3\\\" fill=\\\"#52c41a\\\"/>\\n <path d=\\\"M18 20h12\\\" stroke=\\\"#fff\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\"/>\\n <path d=\\\"M18 24h8\\\" stroke=\\\"#fff\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\"/>\\n <path d=\\\"M18 28h6\\\" stroke=\\\"#fff\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\"/>\\n </svg>\",\n voice: \"\\n <svg viewBox=\\\"0 0 48 48\\\" width=\\\"48\\\" height=\\\"48\\\">\\n <circle cx=\\\"24\\\" cy=\\\"24\\\" r=\\\"22\\\" fill=\\\"#f0f5ff\\\"/>\\n <path d=\\\"M24 16a4 4 0 00-4 4v4a4 4 0 008 0v-4a4 4 0 00-4-4z\\\" fill=\\\"#0074fd\\\" opacity=\\\"0.3\\\"/>\\n <path d=\\\"M24 16a4 4 0 00-4 4v4a4 4 0 008 0v-4a4 4 0 00-4-4z\\\" fill=\\\"none\\\" stroke=\\\"#0074fd\\\" stroke-width=\\\"2\\\"/>\\n <path d=\\\"M16 24a8 8 0 0016 0\\\" fill=\\\"none\\\" stroke=\\\"#0074fd\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\"/>\\n <rect x=\\\"23\\\" y=\\\"28\\\" width=\\\"2\\\" height=\\\"6\\\" rx=\\\"1\\\" fill=\\\"#0074fd\\\"/>\\n </svg>\",\n complete: \"\\n <svg viewBox=\\\"0 0 48 48\\\" width=\\\"48\\\" height=\\\"48\\\">\\n <circle cx=\\\"24\\\" cy=\\\"24\\\" r=\\\"22\\\" fill=\\\"#f6ffed\\\"/>\\n <circle cx=\\\"24\\\" cy=\\\"24\\\" r=\\\"16\\\" fill=\\\"#52c41a\\\"/>\\n <path d=\\\"M18 24l4 4 8-8\\\" fill=\\\"none\\\" stroke=\\\"#fff\\\" stroke-width=\\\"3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n </svg>\",\n folder: \"\\n <svg viewBox=\\\"0 0 48 48\\\" width=\\\"48\\\" height=\\\"48\\\">\\n <circle cx=\\\"24\\\" cy=\\\"24\\\" r=\\\"22\\\" fill=\\\"#fff7e6\\\"/>\\n <path d=\\\"M12 16a2 2 0 012-2h6l3 3h11a2 2 0 012 2v13a2 2 0 01-2 2H14a2 2 0 01-2-2V16z\\\" fill=\\\"#fa8c16\\\"/>\\n <path d=\\\"M12 22h24\\\" stroke=\\\"#fff\\\" stroke-width=\\\"1.5\\\" opacity=\\\"0.6\\\"/>\\n </svg>\",\n document: \"\\n <svg viewBox=\\\"0 0 48 48\\\" width=\\\"48\\\" height=\\\"48\\\">\\n <circle cx=\\\"24\\\" cy=\\\"24\\\" r=\\\"22\\\" fill=\\\"#f0f5ff\\\"/>\\n <path d=\\\"M18 11h9l7 7v19a2 2 0 01-2 2H18a2 2 0 01-2-2V13a2 2 0 012-2z\\\" fill=\\\"#0074fd\\\"/>\\n <path d=\\\"M27 11v7h7\\\" fill=\\\"#fff\\\" opacity=\\\"0.55\\\"/>\\n <path d=\\\"M21 26h10M21 30h10M21 34h6\\\" stroke=\\\"#fff\\\" stroke-width=\\\"1.6\\\" stroke-linecap=\\\"round\\\"/>\\n </svg>\"\n};\n/**\n * 生成引导步骤配置\n * @param {Object} options\n * @param {boolean} options.isMobile - 是否为移动端\n * @param {boolean} options.isNewUser - 是否新用户(无聊天记录):\n * \"猜你想问\"仅无聊天记录的会话才渲染,停止按钮承接提问后的生成场景,\n * 两者关联出现,仅新用户包含这两步\n * @returns {Array} 步骤配置数组\n */\n\n/**\n * 生成引导步骤配置(PC 端)\n * @param {Object} options\n * @param {boolean} options.isMobile - 是否为移动端(PC 端传 false)\n * @param {boolean} options.isNewUser - 是否新用户(无聊天记录):\n * 新用户流程:欢迎页 → 选 Agent → 猜你想问 → 停止生成 → 输入框\n * 老用户流程:左侧列表 → 输入框\n * @returns {Array} 步骤配置数组\n */\n\nfunction generateGuideSteps() {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref$isMobile = _ref.isMobile,\n isMobile = _ref$isMobile === void 0 ? false : _ref$isMobile,\n _ref$isNewUser = _ref.isNewUser,\n isNewUser = _ref$isNewUser === void 0 ? false : _ref$isNewUser;\n\n // 输入框步骤(新老用户共用)\n var chatStep = {\n title: '输入问题',\n description: '在此输入问题,开始聊天。',\n icon: icons.chat,\n targetSelector: '.chat-footer, .input-area'\n };\n var completeStep = {\n title: '开始体验',\n description: '就是这么简单,现在试试吧!',\n icon: icons.complete\n };\n\n if (isNewUser) {\n // PC 新用户:欢迎页 → 选 Agent → 进入详情页 → 猜你想问 → 停止生成 → 输入框\n return [{\n title: '欢迎使用智能助手',\n description: '请选择 Agent 来发起聊天会话。',\n icon: icons.welcome // 无 targetSelector,居中显示欢迎页\n\n }, {\n title: '选择 Agent',\n description: '在左侧选择合适的 Agent,发起对话。',\n icon: icons.agent,\n // 框选第一个 Agent 项\n targetSelector: '.agent-list > .agent-item:first-child',\n // 点击穿透:选中该 Agent 并创建会话进入详情页\n tapThrough: true\n }, {\n title: '猜你想问',\n description: '点击推荐问题,一键发起提问。',\n icon: icons.session,\n // 框选第一个推荐问题;标签未渲染时退而框选整个猜你想问区域\n targetSelector: '.guess-box .quick-tag:first-of-type',\n fallbackSelector: '.guess-box',\n // 点击穿透:用户点击高亮的问题即真实发送,随后引导停止按钮\n tapThrough: true\n }, {\n title: '停止生成',\n description: 'AI 回复时,这里会变为停止按钮,点击可停止生成。',\n icon: icons.voice,\n // 停止按钮仅在生成中渲染,平时以同位置的发送按钮代替\n targetSelector: '.stop-btn',\n fallbackSelector: '.send-btn',\n // 点击穿透:点击即触发停止按钮关闭 AI 生成\n tapThrough: true\n }, chatStep, completeStep];\n } // PC 老用户:左侧列表 → 进入详情页 → 输入框\n\n\n return [{\n title: '会话列表',\n description: '点击会话,进入聊天页面开始聊天。',\n icon: icons.session,\n // 框选左侧第一个会话项\n targetSelector: '.sidebar-list > .session-item:first-child',\n // 点击穿透:选中该会话进入详情页\n tapThrough: true\n }, chatStep, completeStep];\n}\n/**\n * 生成知识库管理页引导步骤配置\n * 流程:欢迎页 → 新建目录(真实打开弹窗)→ 弹窗内:填名称 → 点确定\n * → 新增文档(真实打开弹窗)→ 弹窗内:选文件 → 选所属文件夹 → 点确定\n * → 列表内:点索引(真实触发索引)→ 完成页\n *\n * 交互式步骤说明:\n * - tapThrough + waitForOpen :轻点高亮区真实打开弹窗/下拉,引导暂时隐藏,弹窗出现后\n * 自动恢复并继续引导弹窗内控件(实现\"一边引导一边操作\")\n * - passthrough + skipIfAbsent:弹窗内步骤只做高亮、不拦截点击,管理员可直接输入 /\n * 选择 / 提交;若弹窗被提前关闭则自动跳过该步\n * - passthrough + waitForOpen:等目标元素出现后自动推进(如选好文件后文件列表出现)\n * - passthrough + waitForClose:引导保持显示,等弹窗关闭(提交成功或取消)后自动推进\n * - tapThrough + waitForClose:轻点高亮区真实触发操作(如索引)并暂时隐藏引导,\n * 等二次确认框关闭后自动推进到完成页\n *\n * 仅首次进入知识库管理页时展示,状态存于 guideHelper 的 ZJKJ_KB_MANAGE_GUIDE\n * @returns {Array} 步骤配置数组\n */\n\n\nfunction generateKbManageGuideSteps() {\n return [{\n title: '欢迎使用知识库管理',\n description: '跟着引导走一遍:先建文件目录,再上传文件文档。',\n icon: icons.welcome // 无 targetSelector,居中显示开屏页\n\n }, {\n title: '第 1 步:新建文件目录',\n description: '轻点此处创建文件夹,按业务分类整理你的资料。',\n icon: icons.folder,\n targetSelector: '.add-folder-btn',\n // 轻点高亮区 → 真实打开\"新增文件夹\"弹窗,弹窗出现后继续引导弹窗内操作\n tapThrough: true,\n waitForOpen: '.kb-folder-dialog'\n }, {\n title: '输入目录名称',\n description: '在弹窗里输入目录名称,例如\"产品资料\"\"售后手册\"。',\n icon: icons.folder,\n targetSelector: '.kb-folder-dialog .kb-folder-name-input',\n // 只高亮不拦截点击,可直接在弹窗内输入\n passthrough: true,\n // 弹窗被提前关闭时直接跳过,不长时间悬空\n skipIfAbsent: true\n }, {\n title: '保存目录',\n description: '填好后点击「确定」,目录就创建好了。',\n icon: icons.complete,\n targetSelector: '.kb-folder-dialog .kb-folder-submit',\n passthrough: true,\n skipIfAbsent: true,\n // 弹窗关闭(创建成功或取消)后自动进入下一步\n waitForClose: '.kb-folder-dialog'\n }, {\n title: '第 2 步:添加文件文档',\n description: '轻点此处上传文件文档,支持 Word、Excel、PDF 等格式。',\n icon: icons.document,\n targetSelector: '.kb-add-doc-btn',\n tapThrough: true,\n waitForOpen: '.document-form-dialog'\n }, {\n title: '选择要上传的文件',\n description: '点击或拖拽文件到此处,单次最多 5 个文件。',\n icon: icons.document,\n targetSelector: '.document-form-dialog .kb-doc-upload .el-upload-dragger',\n passthrough: true,\n skipIfAbsent: true,\n // 选好文件后文件列表出现,出现即自动进入下一步,无需再点「下一步」\n waitForOpen: '.document-form-dialog .el-upload-list__item'\n }, {\n title: '选择所属文件夹',\n description: '轻点此处展开文件夹列表,为文档指定归属目录。',\n icon: icons.folder,\n targetSelector: '.document-form-dialog .folder-picker-input',\n // 轻点高亮区 → 真实展开文件夹下拉,展开后继续引导选择目录\n tapThrough: true,\n waitForOpen: '.folder-tree-wrap'\n }, {\n title: '选择目标目录',\n description: '点击要归属的文件夹,选中后下拉会自动收起。',\n icon: icons.folder,\n targetSelector: '.folder-tree-wrap .el-tree-node',\n passthrough: true,\n skipIfAbsent: true,\n // 选中目录(或点空白收起下拉)后自动进入下一步\n waitForClose: '.folder-tree-wrap'\n }, {\n title: '上传文档',\n description: '文件和所属文件夹都选好了,点击「确定」完成上传。',\n icon: icons.complete,\n targetSelector: '.document-form-dialog .kb-doc-submit',\n passthrough: true,\n skipIfAbsent: true,\n // 弹窗关闭(上传成功或取消)后自动进入下一步\n waitForClose: '.document-form-dialog'\n }, {\n title: '第 3 步:创建文档索引',\n description: '轻点列表中新上传文档的「索引」按钮,让文档可被知识库 AI 检索。',\n icon: icons.document,\n targetSelector: '.kb-index-btn',\n // 轻点高亮区 → 真实触发索引,随后在确认框中点「确定」即可\n tapThrough: true,\n // 确认框关闭(确定或取消)后自动进入完成页\n waitForClose: '.el-message-box'\n }, {\n title: '开始体验',\n description: '目录和文档都建好了,现在试试吧!',\n icon: icons.complete\n }];\n}\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/components/guide/guideConfig.js?");
|
|
15201
|
+
eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.generateGuideSteps = generateGuideSteps;\nexports.generateKbManageGuideSteps = generateKbManageGuideSteps;\nexports.generateKbManageGuideStepsMobile = generateKbManageGuideStepsMobile;\n\n/*\n * @Desc: 新功能引导步骤配置\n * 每步可配置标题、描述、目标元素选择器、图标等\n * targetSelector 为可选,不指定则居中显示\n */\n// 基础图标(内联 SVG)\nvar icons = {\n welcome: \"\\n <svg viewBox=\\\"0 0 48 48\\\" width=\\\"48\\\" height=\\\"48\\\">\\n <circle cx=\\\"24\\\" cy=\\\"24\\\" r=\\\"22\\\" fill=\\\"#e6f4ff\\\"/>\\n <path d=\\\"M24 14c-3.3 0-6 2.7-6 6 0 1.3.4 2.5 1.2 3.5l-1.2 3.5 3.5-1.2c1 .7 2.2 1.2 3.5 1.2 3.3 0 6-2.7 6-6s-2.7-6-6-6z\\\" fill=\\\"#0074fd\\\"/>\\n <path d=\\\"M18 34c0-3.3 2.7-6 6-6s6 2.7 6 6\\\" fill=\\\"none\\\" stroke=\\\"#0074fd\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\"/>\\n </svg>\",\n agent: \"\\n <svg viewBox=\\\"0 0 48 48\\\" width=\\\"48\\\" height=\\\"48\\\">\\n <circle cx=\\\"24\\\" cy=\\\"24\\\" r=\\\"22\\\" fill=\\\"#fff7e6\\\"/>\\n <rect x=\\\"10\\\" y=\\\"16\\\" width=\\\"28\\\" height=\\\"18\\\" rx=\\\"4\\\" fill=\\\"#fa8c16\\\" opacity=\\\"0.2\\\"/>\\n <rect x=\\\"14\\\" y=\\\"20\\\" width=\\\"20\\\" height=\\\"10\\\" rx=\\\"2\\\" fill=\\\"#fa8c16\\\"/>\\n <circle cx=\\\"20\\\" cy=\\\"25\\\" r=\\\"2\\\" fill=\\\"#fff\\\"/>\\n <circle cx=\\\"28\\\" cy=\\\"25\\\" r=\\\"2\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"M22 29c1.5 0 2.5-1 4-1s2.5 1 4 1\\\" stroke=\\\"#fff\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\"/>\\n </svg>\",\n chat: \"\\n <svg viewBox=\\\"0 0 48 48\\\" width=\\\"48\\\" height=\\\"48\\\">\\n <circle cx=\\\"24\\\" cy=\\\"24\\\" r=\\\"22\\\" fill=\\\"#f6ffed\\\"/>\\n <path d=\\\"M14 16h20v14H14z\\\" fill=\\\"#52c41a\\\" opacity=\\\"0.15\\\"/>\\n <rect x=\\\"14\\\" y=\\\"16\\\" width=\\\"20\\\" height=\\\"14\\\" rx=\\\"3\\\" fill=\\\"#52c41a\\\"/>\\n <path d=\\\"M18 20h12\\\" stroke=\\\"#fff\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\"/>\\n <path d=\\\"M18 24h8\\\" stroke=\\\"#fff\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\"/>\\n <path d=\\\"M18 28h6\\\" stroke=\\\"#fff\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\"/>\\n </svg>\",\n voice: \"\\n <svg viewBox=\\\"0 0 48 48\\\" width=\\\"48\\\" height=\\\"48\\\">\\n <circle cx=\\\"24\\\" cy=\\\"24\\\" r=\\\"22\\\" fill=\\\"#f0f5ff\\\"/>\\n <path d=\\\"M24 16a4 4 0 00-4 4v4a4 4 0 008 0v-4a4 4 0 00-4-4z\\\" fill=\\\"#0074fd\\\" opacity=\\\"0.3\\\"/>\\n <path d=\\\"M24 16a4 4 0 00-4 4v4a4 4 0 008 0v-4a4 4 0 00-4-4z\\\" fill=\\\"none\\\" stroke=\\\"#0074fd\\\" stroke-width=\\\"2\\\"/>\\n <path d=\\\"M16 24a8 8 0 0016 0\\\" fill=\\\"none\\\" stroke=\\\"#0074fd\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\"/>\\n <rect x=\\\"23\\\" y=\\\"28\\\" width=\\\"2\\\" height=\\\"6\\\" rx=\\\"1\\\" fill=\\\"#0074fd\\\"/>\\n </svg>\",\n complete: \"\\n <svg viewBox=\\\"0 0 48 48\\\" width=\\\"48\\\" height=\\\"48\\\">\\n <circle cx=\\\"24\\\" cy=\\\"24\\\" r=\\\"22\\\" fill=\\\"#f6ffed\\\"/>\\n <circle cx=\\\"24\\\" cy=\\\"24\\\" r=\\\"16\\\" fill=\\\"#52c41a\\\"/>\\n <path d=\\\"M18 24l4 4 8-8\\\" fill=\\\"none\\\" stroke=\\\"#fff\\\" stroke-width=\\\"3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/>\\n </svg>\",\n folder: \"\\n <svg viewBox=\\\"0 0 48 48\\\" width=\\\"48\\\" height=\\\"48\\\">\\n <circle cx=\\\"24\\\" cy=\\\"24\\\" r=\\\"22\\\" fill=\\\"#fff7e6\\\"/>\\n <path d=\\\"M12 16a2 2 0 012-2h6l3 3h11a2 2 0 012 2v13a2 2 0 01-2 2H14a2 2 0 01-2-2V16z\\\" fill=\\\"#fa8c16\\\"/>\\n <path d=\\\"M12 22h24\\\" stroke=\\\"#fff\\\" stroke-width=\\\"1.5\\\" opacity=\\\"0.6\\\"/>\\n </svg>\",\n document: \"\\n <svg viewBox=\\\"0 0 48 48\\\" width=\\\"48\\\" height=\\\"48\\\">\\n <circle cx=\\\"24\\\" cy=\\\"24\\\" r=\\\"22\\\" fill=\\\"#f0f5ff\\\"/>\\n <path d=\\\"M18 11h9l7 7v19a2 2 0 01-2 2H18a2 2 0 01-2-2V13a2 2 0 012-2z\\\" fill=\\\"#0074fd\\\"/>\\n <path d=\\\"M27 11v7h7\\\" fill=\\\"#fff\\\" opacity=\\\"0.55\\\"/>\\n <path d=\\\"M21 26h10M21 30h10M21 34h6\\\" stroke=\\\"#fff\\\" stroke-width=\\\"1.6\\\" stroke-linecap=\\\"round\\\"/>\\n </svg>\"\n};\n/**\n * 生成引导步骤配置\n * @param {Object} options\n * @param {boolean} options.isMobile - 是否为移动端\n * @param {boolean} options.isNewUser - 是否新用户(无聊天记录):\n * \"猜你想问\"仅无聊天记录的会话才渲染,停止按钮承接提问后的生成场景,\n * 两者关联出现,仅新用户包含这两步\n * @returns {Array} 步骤配置数组\n */\n\n/**\n * 生成引导步骤配置(PC 端)\n * @param {Object} options\n * @param {boolean} options.isMobile - 是否为移动端(PC 端传 false)\n * @param {boolean} options.isNewUser - 是否新用户(无聊天记录):\n * 新用户流程:欢迎页 → 选 Agent → 猜你想问 → 停止生成 → 输入框\n * 老用户流程:左侧列表 → 输入框\n * @returns {Array} 步骤配置数组\n */\n\nfunction generateGuideSteps() {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref$isMobile = _ref.isMobile,\n isMobile = _ref$isMobile === void 0 ? false : _ref$isMobile,\n _ref$isNewUser = _ref.isNewUser,\n isNewUser = _ref$isNewUser === void 0 ? false : _ref$isNewUser;\n\n // 输入框步骤(新老用户共用)\n var chatStep = {\n title: '输入问题',\n description: '在此输入问题,开始聊天。',\n icon: icons.chat,\n targetSelector: '.chat-footer, .input-area'\n };\n var completeStep = {\n title: '开始体验',\n description: '就是这么简单,现在试试吧!',\n icon: icons.complete\n };\n\n if (isNewUser) {\n // PC 新用户:欢迎页 → 选 Agent → 进入详情页 → 猜你想问 → 停止生成 → 输入框\n return [{\n title: '欢迎使用智能助手',\n description: '请选择 Agent 来发起聊天会话。',\n icon: icons.welcome // 无 targetSelector,居中显示欢迎页\n\n }, {\n title: '选择 Agent',\n description: '在左侧选择合适的 Agent,发起对话。',\n icon: icons.agent,\n // 框选第一个 Agent 项\n targetSelector: '.agent-list > .agent-item:first-child',\n // 点击穿透:选中该 Agent 并创建会话进入详情页\n tapThrough: true\n }, {\n title: '猜你想问',\n description: '点击推荐问题,一键发起提问。',\n icon: icons.session,\n // 框选第一个推荐问题;标签未渲染时退而框选整个猜你想问区域\n targetSelector: '.guess-box .quick-tag:first-of-type',\n fallbackSelector: '.guess-box',\n // 点击穿透:用户点击高亮的问题即真实发送,随后引导停止按钮\n tapThrough: true\n }, {\n title: '停止生成',\n description: 'AI 回复时,这里会变为停止按钮,点击可停止生成。',\n icon: icons.voice,\n // 停止按钮仅在生成中渲染,平时以同位置的发送按钮代替\n targetSelector: '.stop-btn',\n fallbackSelector: '.send-btn',\n // 点击穿透:点击即触发停止按钮关闭 AI 生成\n tapThrough: true\n }, chatStep, completeStep];\n } // PC 老用户:左侧列表 → 进入详情页 → 输入框\n\n\n return [{\n title: '会话列表',\n description: '点击会话,进入聊天页面开始聊天。',\n icon: icons.session,\n // 框选左侧第一个会话项\n targetSelector: '.sidebar-list > .session-item:first-child',\n // 点击穿透:选中该会话进入详情页\n tapThrough: true\n }, chatStep, completeStep];\n}\n/**\n * 生成知识库管理页引导步骤配置\n * 流程:欢迎页 → 新建目录(真实打开弹窗)→ 弹窗内:填名称 → 点确定\n * → 新增文档(真实打开弹窗)→ 弹窗内:选文件 → 选所属文件夹 → 点确定\n * → 列表内:点索引(真实触发索引)→ 完成页\n *\n * 交互式步骤说明:\n * - tapThrough + waitForOpen :轻点高亮区真实打开弹窗/下拉,引导暂时隐藏,弹窗出现后\n * 自动恢复并继续引导弹窗内控件(实现\"一边引导一边操作\")\n * - passthrough + skipIfAbsent:弹窗内步骤只做高亮、不拦截点击,管理员可直接输入 /\n * 选择 / 提交;若弹窗被提前关闭则自动跳过该步\n * - passthrough + waitForOpen:等目标元素出现后自动推进(如选好文件后文件列表出现)\n * - passthrough + waitForClose:引导保持显示,等弹窗关闭(提交成功或取消)后自动推进\n * - tapThrough + waitForClose:轻点高亮区真实触发操作(如索引)并暂时隐藏引导,\n * 等二次确认框关闭后自动推进到完成页\n *\n * 仅首次进入知识库管理页时展示,状态存于 guideHelper 的 ZJKJ_KB_MANAGE_GUIDE\n * @returns {Array} 步骤配置数组\n */\n\n\nfunction generateKbManageGuideSteps() {\n return [{\n title: '欢迎使用知识库管理',\n description: '跟着引导走一遍:先建文件目录,再上传文件文档。',\n icon: icons.welcome // 无 targetSelector,居中显示开屏页\n\n }, {\n title: '第 1 步:新建文件目录',\n description: '轻点此处创建文件夹,按业务分类整理你的资料。',\n icon: icons.folder,\n targetSelector: '.add-folder-btn',\n // 轻点高亮区 → 真实打开\"新增文件夹\"弹窗,弹窗出现后继续引导弹窗内操作\n tapThrough: true,\n waitForOpen: '.kb-folder-dialog'\n }, {\n title: '输入目录名称',\n description: '在弹窗里输入目录名称,例如\"产品资料\"\"售后手册\"。',\n icon: icons.folder,\n targetSelector: '.kb-folder-dialog .kb-folder-name-input',\n // 只高亮不拦截点击,可直接在弹窗内输入\n passthrough: true,\n // 弹窗被提前关闭时直接跳过,不长时间悬空\n skipIfAbsent: true\n }, {\n title: '保存目录',\n description: '填好后点击「确定」,目录就创建好了。',\n icon: icons.complete,\n targetSelector: '.kb-folder-dialog .kb-folder-submit',\n passthrough: true,\n skipIfAbsent: true,\n // 弹窗关闭(创建成功或取消)后自动进入下一步\n waitForClose: '.kb-folder-dialog'\n }, {\n title: '第 2 步:添加文件文档',\n description: '轻点此处上传文件文档,支持 Word、Excel、PDF 等格式。',\n icon: icons.document,\n targetSelector: '.kb-add-doc-btn',\n tapThrough: true,\n waitForOpen: '.document-form-dialog'\n }, {\n title: '选择要上传的文件',\n description: '点击或拖拽文件到此处,单次最多 5 个文件。',\n icon: icons.document,\n targetSelector: '.document-form-dialog .kb-doc-upload .el-upload-dragger',\n passthrough: true,\n skipIfAbsent: true,\n // 选好文件后文件列表出现,出现即自动进入下一步,无需再点「下一步」\n waitForOpen: '.document-form-dialog .el-upload-list__item'\n }, {\n title: '选择所属文件夹',\n description: '轻点此处展开文件夹列表,为文档指定归属目录。',\n icon: icons.folder,\n targetSelector: '.document-form-dialog .folder-picker-input',\n // 轻点高亮区 → 真实展开文件夹下拉,展开后继续引导选择目录\n tapThrough: true,\n waitForOpen: '.folder-tree-wrap'\n }, {\n title: '选择目标目录',\n description: '点击要归属的文件夹,选中后下拉会自动收起。',\n icon: icons.folder,\n targetSelector: '.folder-tree-wrap .el-tree-node',\n passthrough: true,\n skipIfAbsent: true,\n // 选中目录(或点空白收起下拉)后自动进入下一步\n waitForClose: '.folder-tree-wrap'\n }, {\n title: '上传文档',\n description: '文件和所属文件夹都选好了,点击「确定」完成上传。',\n icon: icons.complete,\n targetSelector: '.document-form-dialog .kb-doc-submit',\n passthrough: true,\n skipIfAbsent: true,\n // 弹窗关闭(上传成功或取消)后自动进入下一步\n waitForClose: '.document-form-dialog'\n }, {\n title: '第 3 步:创建文档索引',\n description: '轻点列表中新上传文档的「索引」按钮,让文档可被知识库 AI 检索。',\n icon: icons.document,\n targetSelector: '.kb-index-btn',\n // 轻点高亮区 → 真实触发索引,随后在确认框中点「确定」即可\n tapThrough: true,\n // 确认框关闭(确定或取消)后自动进入完成页\n waitForClose: '.el-message-box'\n }, {\n title: '开始体验',\n description: '目录和文档都建好了,现在试试吧!',\n icon: icons.complete\n }];\n}\n/**\n * 生成知识库管理页引导步骤配置(H5 / 移动端自绘 UI 版)\n *\n * 与 PC 版的差异:移动端不使用 Element UI(而是 MobileDialog + .kbm-* 自绘控件),\n * 且「目录页 ⇄ 文档列表页」为两个独立全屏页面,进入文档列表需先点目录行的\n * 「全部文件」;因此选择器与推进方式单独配置,PC 引导流程与选择器保持不变。\n *\n * 流程:欢迎页 → 新建目录(真实打开 MobileDialog)→ 填名称 → 确定\n * → 点「全部文件」进入文档列表页 → 新增文档 → 选文件 → 所属文件夹\n * → 确定 → 列表内点索引 → 完成页\n *\n * 注意:知识库管理页的「PC 分支」与「移动端分支」都是 v-show 控制(非 v-if),\n * 两套 DOM 在 H5 下同时存在于页面中,PC 分支仅 display:none。\n * 因此所有选择器必须用 .kb-m-layout 限定,否则 document.querySelector 会命中\n * 排在更前面的、隐藏的 PC 分支元素,导致点击无效(引导卡住并永久隐藏)。\n * MobileDialog(.kbm-dialog)与自绘选择器(.kbm-picker)只由移动端渲染,无需限定。\n *\n * @returns {Array} 步骤配置数组\n */\n\n\nfunction generateKbManageGuideStepsMobile() {\n return [{\n title: '欢迎使用知识库管理',\n description: '跟着引导走一遍:先建文件目录,再上传文件文档。',\n icon: icons.welcome // 无 targetSelector,居中显示开屏页\n\n }, {\n title: '第 1 步:新建文件目录',\n description: '轻点此处创建文件夹,按业务分类整理你的资料。',\n icon: icons.folder,\n targetSelector: '.kb-m-layout .add-folder-btn',\n // 轻点高亮区 → 真实打开「新增文件夹」移动端弹窗,弹窗出现后继续引导\n tapThrough: true,\n waitForOpen: '.kbm-dialog'\n }, {\n title: '输入目录名称',\n description: '在弹窗里输入目录名称,例如\"产品资料\"\"售后手册\"。',\n icon: icons.folder,\n targetSelector: '.kbm-dialog .kbm-field .kbm-input:not(.kbm-select)',\n // 只高亮不拦截点击,可直接在弹窗内输入\n passthrough: true,\n // 弹窗被提前关闭时直接跳过,不长时间悬空\n skipIfAbsent: true\n }, {\n title: '保存目录',\n description: '填好后点击「确定」,目录就创建好了。',\n icon: icons.complete,\n targetSelector: '.kbm-dialog .kbm-btn.primary',\n passthrough: true,\n skipIfAbsent: true,\n // 弹窗关闭(创建成功或取消)后自动进入下一步\n waitForClose: '.kbm-dialog'\n }, {\n title: '进入文件列表',\n description: '轻点「全部文件」,进入文档列表查看和上传文件。',\n icon: icons.document,\n targetSelector: '.kb-m-layout .kb-m-folder-all',\n // 轻点高亮区 → 真实进入文档列表页,切页后引导自动恢复\n tapThrough: true,\n waitForOpen: '.doc-m-search'\n }, {\n title: '第 2 步:添加文件文档',\n description: '轻点此处上传文件文档,支持 Word、Excel、PDF 等格式。',\n icon: icons.document,\n targetSelector: '.kb-m-layout .doc-m-tbtn.add',\n tapThrough: true,\n waitForOpen: '.kbm-dialog'\n }, {\n title: '选择要上传的文件',\n description: '轻点选择文件,支持多选,单次最多 5 个文件。',\n icon: icons.document,\n targetSelector: '.kbm-dialog .kbm-upload',\n passthrough: true,\n skipIfAbsent: true,\n // 选好文件后文件列表出现,出现即自动进入下一步,无需再点「下一步」\n waitForOpen: '.kbm-dialog .kbm-file-row'\n }, {\n title: '选择所属文件夹',\n description: '轻点此处选择文档归属目录。',\n icon: icons.folder,\n targetSelector: '.kbm-dialog .kbm-select',\n // 轻点高亮区 → 真实展开文件夹选择器,展开后继续引导选择目录\n tapThrough: true,\n waitForOpen: '.kbm-picker'\n }, {\n title: '选择目标目录',\n description: '点击要归属的文件夹,选中后选择器会自动收起。',\n icon: icons.folder,\n targetSelector: '.kbm-picker .kbm-picker-row',\n passthrough: true,\n skipIfAbsent: true,\n // 选中目录(或点遮罩收起)后自动进入下一步\n waitForClose: '.kbm-picker'\n }, {\n title: '上传文档',\n description: '文件和所属文件夹都选好了,点击「确定」完成上传。',\n icon: icons.complete,\n targetSelector: '.kbm-dialog .kbm-btn.primary',\n passthrough: true,\n skipIfAbsent: true,\n // 弹窗关闭(上传成功或取消)后自动进入下一步\n waitForClose: '.kbm-dialog'\n }, {\n title: '第 3 步:创建文档索引',\n description: '轻点列表中新上传文档的「索引」按钮,让文档可被知识库 AI 检索。',\n icon: icons.document,\n // 横屏为表格行内「索引」按钮,竖屏为卡片操作区的「索引」。\n // 同一行内有多个 .doc-m-btn(预览/编辑/索引/删除),用 :nth-child(2) 取第二个\n // (预览固定第 1、索引/重建固定第 2;索引完成后该按钮消失,故用 fallback 兜底跳过)\n targetSelector: '.kb-m-layout .doc-m-table .doc-m-btn:nth-child(2), .kb-m-layout .doc-m-card .doc-m-btn:nth-child(2)',\n fallbackSelector: '.kb-m-layout .doc-m-table .doc-m-btn:last-child, .kb-m-layout .doc-m-card .doc-m-btn:last-child',\n // 轻点高亮区 → 真实触发索引,随后在自绘确认框中点「确定」即可\n tapThrough: true,\n // 该行已索引(无「索引/重建」按钮)时跳过,避免引导悬空\n skipIfAbsent: true,\n // 确认框关闭(确定或取消)后自动进入完成页\n waitForClose: '.kb-confirm-mask'\n }, {\n title: '开始体验',\n description: '目录和文档都建好了,现在试试吧!',\n icon: icons.complete\n }];\n}\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/components/guide/guideConfig.js?");
|
|
15134
15202
|
|
|
15135
15203
|
/***/ }),
|
|
15136
15204
|
|
|
@@ -15237,7 +15305,7 @@ eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@b
|
|
|
15237
15305
|
/***/ (function(module, exports, __webpack_require__) {
|
|
15238
15306
|
|
|
15239
15307
|
"use strict";
|
|
15240
|
-
eval("\n/*\n * @Desc:\n * @Auth: Hrc\n * @Date: 2021-06-03 15:57:36\n */\n// 注册\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _typeof2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/typeof */ \"./node_modules/@babel/runtime/helpers/typeof.js\"));\n\nvar _main = _interopRequireDefault(__webpack_require__(/*! ./layout/main.js */ \"./src/lib/layout/main.js\"));\n\nvar _KnowledgeBaseMain = _interopRequireDefault(__webpack_require__(/*! ./knowledgeBase/KnowledgeBaseMain.vue */ \"./src/lib/knowledgeBase/KnowledgeBaseMain.vue\"));\n\nvar _setting = _interopRequireDefault(__webpack_require__(/*! ./config/setting.js */ \"./src/lib/config/setting.js\"));\n\n__webpack_require__(/*! @style/zj-client.scss */ \"./src/lib/style/zj-client.scss\");\n\n__webpack_require__(/*! @lib/assets/iconfont/iconfont.css */ \"./src/lib/assets/iconfont/iconfont.css\");\n\n__webpack_require__(/*! @jboltai/tokui/dist/tokui.css */ \"./node_modules/@jboltai/tokui/dist/tokui.css\");\n\nvar _ZJKefModule = _interopRequireDefault(__webpack_require__(/*! ./store/module/ZJKefModule.js */ \"./src/lib/store/module/ZJKefModule.js\"));\n\n// 变量声明\nfunction _registerStore() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n // 获取失败提示错误信息\n if (!options.store) {\n if (window.Vuex) return; // 可能是cdn方式引入,等待下载完再注册\n // throw new Error('请在插件注册时传入store!')\n\n return console.error('请在插件注册时传入store');\n }\n\n options.store.registerModule(_setting.default.moduleName, _ZJKefModule.default, {\n preserveState: false\n });\n}\n\nvar intelligent = {\n install: function install(Vue) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n // 注册store\n // _registerStore(options)\n // 注册组件\n if (!intelligent.installed) {\n intelligent.installed = true;\n Vue.use(_main.default); // 知识库组件随 AI 主包一并注册\n\n Vue.component(_KnowledgeBaseMain.default.name, _KnowledgeBaseMain.default);\n }\n }\n}; // 检测环境\n\nif ((typeof window === \"undefined\" ? \"undefined\" : (0, _typeof2.default)(window)) !== undefined && window.Vue) {\n intelligent.install(window.Vue);\n}\n\nvar _default = intelligent;\nexports.default = _default;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/index.js?");
|
|
15308
|
+
eval("\n/*\n * @Desc:\n * @Auth: Hrc\n * @Date: 2021-06-03 15:57:36\n */\n// 注册\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _typeof2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/typeof */ \"./node_modules/@babel/runtime/helpers/typeof.js\"));\n\nvar _main = _interopRequireDefault(__webpack_require__(/*! ./layout/main.js */ \"./src/lib/layout/main.js\"));\n\nvar _KnowledgeBaseMain = _interopRequireDefault(__webpack_require__(/*! ./knowledgeBase/KnowledgeBaseMain.vue */ \"./src/lib/knowledgeBase/KnowledgeBaseMain.vue\"));\n\nvar _setting = _interopRequireDefault(__webpack_require__(/*! ./config/setting.js */ \"./src/lib/config/setting.js\"));\n\nvar _native = __webpack_require__(/*! ./knowledgeBase/native.js */ \"./src/lib/knowledgeBase/native.js\");\n\n__webpack_require__(/*! @style/zj-client.scss */ \"./src/lib/style/zj-client.scss\");\n\n__webpack_require__(/*! @lib/assets/iconfont/iconfont.css */ \"./src/lib/assets/iconfont/iconfont.css\");\n\n__webpack_require__(/*! @jboltai/tokui/dist/tokui.css */ \"./node_modules/@jboltai/tokui/dist/tokui.css\");\n\nvar _ZJKefModule = _interopRequireDefault(__webpack_require__(/*! ./store/module/ZJKefModule.js */ \"./src/lib/store/module/ZJKefModule.js\"));\n\n// 变量声明\nfunction _registerStore() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n // 获取失败提示错误信息\n if (!options.store) {\n if (window.Vuex) return; // 可能是cdn方式引入,等待下载完再注册\n // throw new Error('请在插件注册时传入store!')\n\n return console.error('请在插件注册时传入store');\n }\n\n options.store.registerModule(_setting.default.moduleName, _ZJKefModule.default, {\n preserveState: false\n });\n}\n\nvar intelligent = {\n install: function install(Vue) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n // 注册store\n // _registerStore(options)\n // 注册组件\n if (!intelligent.installed) {\n intelligent.installed = true; // 宿主缺少 $message/$confirm/v-loading 等 Element 能力时(如 H5 无 element-ui),补齐原生极简实现;PC 宿主已有真实现,自动跳过\n\n (0, _native.installNativeFallbacks)(Vue);\n Vue.use(_main.default); // 知识库组件随 AI 主包一并注册\n\n Vue.component(_KnowledgeBaseMain.default.name, _KnowledgeBaseMain.default);\n }\n }\n}; // 检测环境\n\nif ((typeof window === \"undefined\" ? \"undefined\" : (0, _typeof2.default)(window)) !== undefined && window.Vue) {\n intelligent.install(window.Vue);\n}\n\nvar _default = intelligent;\nexports.default = _default;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/index.js?");
|
|
15241
15309
|
|
|
15242
15310
|
/***/ }),
|
|
15243
15311
|
|
|
@@ -15453,7 +15521,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod
|
|
|
15453
15521
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
15454
15522
|
|
|
15455
15523
|
"use strict";
|
|
15456
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _KnowledgeBaseMain_vue_vue_type_template_id_84b8c396_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./KnowledgeBaseMain.vue?vue&type=template&id=84b8c396&scoped=true& */ \"./src/lib/knowledgeBase/KnowledgeBaseMain.vue?vue&type=template&id=84b8c396&scoped=true&\");\n/* harmony import */ var _KnowledgeBaseMain_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./KnowledgeBaseMain.vue?vue&type=script&lang=js& */ \"./src/lib/knowledgeBase/KnowledgeBaseMain.vue?vue&type=script&lang=js&\");\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _KnowledgeBaseMain_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__) if([\"default\"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _KnowledgeBaseMain_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n/* harmony import */ var _KnowledgeBaseMain_vue_vue_type_style_index_0_id_84b8c396_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./KnowledgeBaseMain.vue?vue&type=style&index=0&id=84b8c396&scoped=true&lang=css& */ \"./src/lib/knowledgeBase/KnowledgeBaseMain.vue?vue&type=style&index=0&id=84b8c396&scoped=true&lang=css&\");\n/* harmony import */ var
|
|
15524
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _KnowledgeBaseMain_vue_vue_type_template_id_84b8c396_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./KnowledgeBaseMain.vue?vue&type=template&id=84b8c396&scoped=true& */ \"./src/lib/knowledgeBase/KnowledgeBaseMain.vue?vue&type=template&id=84b8c396&scoped=true&\");\n/* harmony import */ var _KnowledgeBaseMain_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./KnowledgeBaseMain.vue?vue&type=script&lang=js& */ \"./src/lib/knowledgeBase/KnowledgeBaseMain.vue?vue&type=script&lang=js&\");\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _KnowledgeBaseMain_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__) if([\"default\"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _KnowledgeBaseMain_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n/* harmony import */ var _KnowledgeBaseMain_vue_vue_type_style_index_0_id_84b8c396_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./KnowledgeBaseMain.vue?vue&type=style&index=0&id=84b8c396&scoped=true&lang=css& */ \"./src/lib/knowledgeBase/KnowledgeBaseMain.vue?vue&type=style&index=0&id=84b8c396&scoped=true&lang=css&\");\n/* harmony import */ var _KnowledgeBaseMain_vue_vue_type_style_index_1_lang_css___WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./KnowledgeBaseMain.vue?vue&type=style&index=1&lang=css& */ \"./src/lib/knowledgeBase/KnowledgeBaseMain.vue?vue&type=style&index=1&lang=css&\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(\n _KnowledgeBaseMain_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n _KnowledgeBaseMain_vue_vue_type_template_id_84b8c396_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n _KnowledgeBaseMain_vue_vue_type_template_id_84b8c396_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n false,\n null,\n \"84b8c396\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"src/lib/knowledgeBase/KnowledgeBaseMain.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/KnowledgeBaseMain.vue?");
|
|
15457
15525
|
|
|
15458
15526
|
/***/ }),
|
|
15459
15527
|
|
|
@@ -15481,6 +15549,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod
|
|
|
15481
15549
|
|
|
15482
15550
|
/***/ }),
|
|
15483
15551
|
|
|
15552
|
+
/***/ "./src/lib/knowledgeBase/KnowledgeBaseMain.vue?vue&type=style&index=1&lang=css&":
|
|
15553
|
+
/*!**************************************************************************************!*\
|
|
15554
|
+
!*** ./src/lib/knowledgeBase/KnowledgeBaseMain.vue?vue&type=style&index=1&lang=css& ***!
|
|
15555
|
+
\**************************************************************************************/
|
|
15556
|
+
/*! no static exports found */
|
|
15557
|
+
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
15558
|
+
|
|
15559
|
+
"use strict";
|
|
15560
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_KnowledgeBaseMain_vue_vue_type_style_index_1_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/vue-style-loader??ref--6-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src??ref--6-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib??vue-loader-options!./KnowledgeBaseMain.vue?vue&type=style&index=1&lang=css& */ \"./node_modules/vue-style-loader/index.js?!./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/lib/knowledgeBase/KnowledgeBaseMain.vue?vue&type=style&index=1&lang=css&\");\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_KnowledgeBaseMain_vue_vue_type_style_index_1_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_KnowledgeBaseMain_vue_vue_type_style_index_1_lang_css___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_KnowledgeBaseMain_vue_vue_type_style_index_1_lang_css___WEBPACK_IMPORTED_MODULE_0__) if([\"default\"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_KnowledgeBaseMain_vue_vue_type_style_index_1_lang_css___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/KnowledgeBaseMain.vue?");
|
|
15561
|
+
|
|
15562
|
+
/***/ }),
|
|
15563
|
+
|
|
15484
15564
|
/***/ "./src/lib/knowledgeBase/KnowledgeBaseMain.vue?vue&type=template&id=84b8c396&scoped=true&":
|
|
15485
15565
|
/*!************************************************************************************************!*\
|
|
15486
15566
|
!*** ./src/lib/knowledgeBase/KnowledgeBaseMain.vue?vue&type=template&id=84b8c396&scoped=true& ***!
|
|
@@ -15493,6 +15573,54 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod
|
|
|
15493
15573
|
|
|
15494
15574
|
/***/ }),
|
|
15495
15575
|
|
|
15576
|
+
/***/ "./src/lib/knowledgeBase/MobileDialog.vue":
|
|
15577
|
+
/*!************************************************!*\
|
|
15578
|
+
!*** ./src/lib/knowledgeBase/MobileDialog.vue ***!
|
|
15579
|
+
\************************************************/
|
|
15580
|
+
/*! no static exports found */
|
|
15581
|
+
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
15582
|
+
|
|
15583
|
+
"use strict";
|
|
15584
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _MobileDialog_vue_vue_type_template_id_e31817a6_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MobileDialog.vue?vue&type=template&id=e31817a6&scoped=true& */ \"./src/lib/knowledgeBase/MobileDialog.vue?vue&type=template&id=e31817a6&scoped=true&\");\n/* harmony import */ var _MobileDialog_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./MobileDialog.vue?vue&type=script&lang=js& */ \"./src/lib/knowledgeBase/MobileDialog.vue?vue&type=script&lang=js&\");\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _MobileDialog_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__) if([\"default\"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _MobileDialog_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n/* harmony import */ var _MobileDialog_vue_vue_type_style_index_0_id_e31817a6_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./MobileDialog.vue?vue&type=style&index=0&id=e31817a6&scoped=true&lang=css& */ \"./src/lib/knowledgeBase/MobileDialog.vue?vue&type=style&index=0&id=e31817a6&scoped=true&lang=css&\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(\n _MobileDialog_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n _MobileDialog_vue_vue_type_template_id_e31817a6_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n _MobileDialog_vue_vue_type_template_id_e31817a6_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n false,\n null,\n \"e31817a6\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"src/lib/knowledgeBase/MobileDialog.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/MobileDialog.vue?");
|
|
15585
|
+
|
|
15586
|
+
/***/ }),
|
|
15587
|
+
|
|
15588
|
+
/***/ "./src/lib/knowledgeBase/MobileDialog.vue?vue&type=script&lang=js&":
|
|
15589
|
+
/*!*************************************************************************!*\
|
|
15590
|
+
!*** ./src/lib/knowledgeBase/MobileDialog.vue?vue&type=script&lang=js& ***!
|
|
15591
|
+
\*************************************************************************/
|
|
15592
|
+
/*! no static exports found */
|
|
15593
|
+
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
15594
|
+
|
|
15595
|
+
"use strict";
|
|
15596
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_lib_index_js_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_MobileDialog_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/babel-loader/lib!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib??vue-loader-options!./MobileDialog.vue?vue&type=script&lang=js& */ \"./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/lib/knowledgeBase/MobileDialog.vue?vue&type=script&lang=js&\");\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_lib_index_js_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_MobileDialog_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_lib_index_js_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_MobileDialog_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_lib_index_js_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_MobileDialog_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__) if([\"default\"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_lib_index_js_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_MobileDialog_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_lib_index_js_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_MobileDialog_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0___default.a); \n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/MobileDialog.vue?");
|
|
15597
|
+
|
|
15598
|
+
/***/ }),
|
|
15599
|
+
|
|
15600
|
+
/***/ "./src/lib/knowledgeBase/MobileDialog.vue?vue&type=style&index=0&id=e31817a6&scoped=true&lang=css&":
|
|
15601
|
+
/*!*********************************************************************************************************!*\
|
|
15602
|
+
!*** ./src/lib/knowledgeBase/MobileDialog.vue?vue&type=style&index=0&id=e31817a6&scoped=true&lang=css& ***!
|
|
15603
|
+
\*********************************************************************************************************/
|
|
15604
|
+
/*! no static exports found */
|
|
15605
|
+
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
15606
|
+
|
|
15607
|
+
"use strict";
|
|
15608
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_MobileDialog_vue_vue_type_style_index_0_id_e31817a6_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/vue-style-loader??ref--6-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src??ref--6-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib??vue-loader-options!./MobileDialog.vue?vue&type=style&index=0&id=e31817a6&scoped=true&lang=css& */ \"./node_modules/vue-style-loader/index.js?!./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/lib/knowledgeBase/MobileDialog.vue?vue&type=style&index=0&id=e31817a6&scoped=true&lang=css&\");\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_MobileDialog_vue_vue_type_style_index_0_id_e31817a6_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_MobileDialog_vue_vue_type_style_index_0_id_e31817a6_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_MobileDialog_vue_vue_type_style_index_0_id_e31817a6_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__) if([\"default\"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_MobileDialog_vue_vue_type_style_index_0_id_e31817a6_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/MobileDialog.vue?");
|
|
15609
|
+
|
|
15610
|
+
/***/ }),
|
|
15611
|
+
|
|
15612
|
+
/***/ "./src/lib/knowledgeBase/MobileDialog.vue?vue&type=template&id=e31817a6&scoped=true&":
|
|
15613
|
+
/*!*******************************************************************************************!*\
|
|
15614
|
+
!*** ./src/lib/knowledgeBase/MobileDialog.vue?vue&type=template&id=e31817a6&scoped=true& ***!
|
|
15615
|
+
\*******************************************************************************************/
|
|
15616
|
+
/*! exports provided: render, staticRenderFns */
|
|
15617
|
+
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
15618
|
+
|
|
15619
|
+
"use strict";
|
|
15620
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_68609640_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_MobileDialog_vue_vue_type_template_id_e31817a6_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"68609640-vue-loader-template\"}!../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib??vue-loader-options!./MobileDialog.vue?vue&type=template&id=e31817a6&scoped=true& */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"68609640-vue-loader-template\\\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/lib/knowledgeBase/MobileDialog.vue?vue&type=template&id=e31817a6&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_68609640_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_MobileDialog_vue_vue_type_template_id_e31817a6_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_68609640_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_MobileDialog_vue_vue_type_template_id_e31817a6_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/MobileDialog.vue?");
|
|
15621
|
+
|
|
15622
|
+
/***/ }),
|
|
15623
|
+
|
|
15496
15624
|
/***/ "./src/lib/knowledgeBase/api/kbChat.js":
|
|
15497
15625
|
/*!*********************************************!*\
|
|
15498
15626
|
!*** ./src/lib/knowledgeBase/api/kbChat.js ***!
|
|
@@ -15517,6 +15645,18 @@ eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@b
|
|
|
15517
15645
|
|
|
15518
15646
|
/***/ }),
|
|
15519
15647
|
|
|
15648
|
+
/***/ "./src/lib/knowledgeBase/native.js":
|
|
15649
|
+
/*!*****************************************!*\
|
|
15650
|
+
!*** ./src/lib/knowledgeBase/native.js ***!
|
|
15651
|
+
\*****************************************/
|
|
15652
|
+
/*! no static exports found */
|
|
15653
|
+
/***/ (function(module, exports, __webpack_require__) {
|
|
15654
|
+
|
|
15655
|
+
"use strict";
|
|
15656
|
+
eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.installNativeFallbacks = installNativeFallbacks;\nexports.hasElementUI = hasElementUI;\nexports.flattenFolderTree = flattenFolderTree;\n\nvar _objectSpread2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/objectSpread2 */ \"./node_modules/@babel/runtime/helpers/objectSpread2.js\"));\n\n/**\n * 知识库 H5 原生兜底(无 Element UI 依赖)\n *\n * 背景:知识库模块在 PC 宿主(已全局注册 Element UI)中依赖 $message/$confirm/v-loading。\n * H5 宿主没有 Element UI,这些能力缺失会导致点击无响应。\n * 本文件仅在宿主未提供这些能力时,注入极简原生实现(DOM toast + 自绘确认框 + 轻量 loading 遮罩),\n * 不引入 element-ui 库;PC 宿主已有真实现,自动跳过。\n */\nvar FALLBACK_STYLE_ID = 'kb-native-fallback-style';\nvar FALLBACK_CSS = \"\\n.kb-native-toast{position:fixed;top:15%;left:50%;transform:translateX(-50%);z-index:99999;\\ndisplay:flex;align-items:center;gap:6px;max-width:76vw;padding:9px 16px;border-radius:6px;\\nbackground:#fff;box-shadow:0 4px 16px rgba(0,0,0,.14);font-size:14px;color:#303133;\\nword-break:break-all;animation:kbToastIn .2s ease;}\\n.kb-native-toast.is-success{color:#52c41a}.kb-native-toast.is-warning{color:#e6a23c}\\n.kb-native-toast.is-error{color:#f56c6c}.kb-native-toast.is-info{color:#303133}\\n@keyframes kbToastIn{from{opacity:0;transform:translate(-50%,-8px)}to{opacity:1;transform:translate(-50%,0)}}\\n.kb-native-loading-mask{position:absolute;top:0;right:0;bottom:0;left:0;z-index:10;display:flex;align-items:center;justify-content:center;\\nbackground:rgba(255,255,255,.75);border-radius:inherit;}\\n.kb-native-loading-spinner{width:26px;height:26px;border:3px solid #e5e7eb;border-top-color:#1677ff;\\nborder-radius:50%;animation:kbSpin .8s linear infinite;}\\n@keyframes kbSpin{to{transform:rotate(360deg)}}\\n/* \\u81EA\\u7ED8\\u786E\\u8BA4\\u6846\\uFF08\\u66FF\\u4EE3 window.confirm\\uFF0CH5 \\u65E0 Element UI \\u65F6\\u4F7F\\u7528\\uFF09 */\\n.kb-confirm-mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:99998;background:rgba(0,0,0,.45);\\ndisplay:flex;align-items:center;justify-content:center;animation:kbFadeIn .18s ease;}\\n.kb-confirm-box{width:82vw;max-width:320px;background:#fff;border-radius:12px;overflow:hidden;\\nbox-shadow:0 12px 32px rgba(0,0,0,.18);animation:kbPopIn .18s ease;}\\n.kb-confirm-title{padding:18px 20px 0;text-align:center;font-size:16px;font-weight:600;color:#303133;}\\n.kb-confirm-msg{padding:10px 20px 20px;text-align:center;font-size:14px;line-height:1.5;color:#606266;\\nword-break:break-all;max-height:50vh;overflow-y:auto;white-space:pre-wrap;}\\n.kb-confirm-btns{display:flex;border-top:1px solid #f0f2f5;}\\n.kb-confirm-btn{flex:1;height:44px;border:none;background:#fff;font-size:15px;color:#606266;cursor:pointer;}\\n.kb-confirm-btn:active{background:#f5f7fa;}\\n.kb-confirm-btn + .kb-confirm-btn{border-left:1px solid #f0f2f5;}\\n.kb-confirm-btn.primary{color:#1677ff;font-weight:600;}\\n.kb-confirm-btn.primary.is-danger{color:#f56c6c;}\\n@keyframes kbFadeIn{from{opacity:0}to{opacity:1}}\\n@keyframes kbPopIn{from{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}\\n\";\n\nfunction injectStyle() {\n if (typeof document === 'undefined' || document.getElementById(FALLBACK_STYLE_ID)) return;\n var tag = document.createElement('style');\n tag.id = FALLBACK_STYLE_ID;\n tag.textContent = FALLBACK_CSS;\n document.head.appendChild(tag);\n}\n\nfunction showToast(opts) {\n if (typeof document === 'undefined') return;\n injectStyle();\n var o = typeof opts === 'string' ? {\n message: opts\n } : opts || {};\n var el = document.createElement('div');\n el.className = \"kb-native-toast is-\".concat(o.type || 'info');\n el.textContent = o.message || '';\n document.body.appendChild(el);\n var duration = o.duration || 2200;\n setTimeout(function () {\n el.parentNode && el.parentNode.removeChild(el);\n }, duration);\n}\n\nfunction escapeHtml(s) {\n return String(s == null ? '' : s).replace(/[&<>\"']/g, function (c) {\n return {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[c];\n });\n}\n/**\n * 自绘确认框(不调起系统 window.confirm)\n * 返回 Promise:确定 resolve,取消 reject('cancel'),与 Element UI $confirm 用法一致\n */\n\n\nfunction showConfirm(opts) {\n if (typeof document === 'undefined') {\n return window.confirm(\"\".concat(opts.title || '提示', \"\\n\").concat(opts.message || '')) ? Promise.resolve() : Promise.reject(new Error('cancel'));\n }\n\n injectStyle();\n return new Promise(function (resolve, reject) {\n var mask = document.createElement('div');\n mask.className = 'kb-confirm-mask';\n var isDanger = opts.type === 'error';\n mask.innerHTML = \"\\n <div class=\\\"kb-confirm-box\\\">\\n <div class=\\\"kb-confirm-title\\\">\".concat(escapeHtml(opts.title || '提示'), \"</div>\\n <div class=\\\"kb-confirm-msg\\\">\").concat(escapeHtml(opts.message || ''), \"</div>\\n <div class=\\\"kb-confirm-btns\\\">\\n <button type=\\\"button\\\" class=\\\"kb-confirm-btn\\\">\").concat(escapeHtml(opts.cancelButtonText || '取消'), \"</button>\\n <button type=\\\"button\\\" class=\\\"kb-confirm-btn primary\").concat(isDanger ? ' is-danger' : '', \"\\\">\").concat(escapeHtml(opts.confirmButtonText || '确定'), \"</button>\\n </div>\\n </div>\");\n document.body.appendChild(mask);\n\n var done = function done(fn, arg) {\n return function () {\n mask.parentNode && mask.parentNode.removeChild(mask);\n fn(arg);\n };\n };\n\n var btns = mask.querySelectorAll('.kb-confirm-btn');\n btns[0].addEventListener('click', done(reject, new Error('cancel')));\n btns[1].addEventListener('click', done(resolve));\n });\n}\n/**\n * 给 Vue 原型/指令补齐知识库依赖的最小能力(已存在则不覆盖)\n */\n\n\nfunction installNativeFallbacks(Vue) {\n injectStyle();\n\n if (!Vue.prototype.$confirm) {\n Vue.prototype.$confirm = function kbNativeConfirm(message) {\n var title = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '提示';\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n return showConfirm((0, _objectSpread2.default)({\n title: title,\n message: message\n }, options || {}));\n };\n }\n\n if (!Vue.prototype.$message) {\n var message = function message(opts) {\n return showToast(opts);\n };\n\n ['success', 'warning', 'error', 'info'].forEach(function (type) {\n message[type] = function (opts) {\n return showToast(typeof opts === 'string' ? {\n message: opts,\n type: type\n } : (0, _objectSpread2.default)((0, _objectSpread2.default)({}, opts), {}, {\n type: type\n }));\n };\n });\n Vue.prototype.$message = message;\n }\n\n if (!Vue.directive('loading')) {\n var toggle = function toggle(el, on) {\n if (on && !el.__kbLoadingMask) {\n var mask = document.createElement('div');\n mask.className = 'kb-native-loading-mask';\n mask.innerHTML = '<div class=\"kb-native-loading-spinner\"></div>';\n var pos = (el.currentStyle || window.getComputedStyle && getComputedStyle(el) || {}).position;\n if (!pos || pos === 'static') el.style.position = 'relative';\n el.appendChild(mask);\n el.__kbLoadingMask = mask;\n } else if (!on && el.__kbLoadingMask) {\n el.__kbLoadingMask.parentNode && el.__kbLoadingMask.parentNode.removeChild(el.__kbLoadingMask);\n el.__kbLoadingMask = null;\n }\n };\n\n Vue.directive('loading', {\n bind: function bind(el, binding) {\n toggle(el, binding.value);\n },\n update: function update(el, binding) {\n toggle(el, binding.value);\n },\n unbind: function unbind(el) {\n toggle(el, false);\n }\n });\n }\n}\n/**\n * 判断宿主是否注册了 Element UI(检查全局/原型链上的 el-button 组件)\n *\n * 背景:平板横屏等宽屏场景若只按 innerWidth 判定移动端,会把无 Element UI 的 H5 宿主\n * 误判为 PC 模式,渲染出大量 el-* 未知元素导致页面不可用。\n * 因此无 Element UI 的宿主一律走自绘 UI 分支(isMobile=true),与宽度无关。\n *\n * @param {Object} vm 组件实例(this)或 Vue 构造器\n */\n\n\nfunction hasElementUI(vm) {\n try {\n var comps = vm && (vm.$options && vm.$options.components || vm.options && vm.options.components) || {};\n return !!(comps.elButton || comps.ElButton || comps['el-button']);\n } catch (e) {\n return false;\n }\n}\n/**\n * 展平文件夹树为 {node, depth} 数组(前序遍历,全部展开),供移动端下拉/列表选择\n */\n\n\nfunction flattenFolderTree(nodes) {\n var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var out = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n ;\n (nodes || []).forEach(function (n) {\n out.push({\n node: n,\n depth: depth\n });\n if (n.children && n.children.length) flattenFolderTree(n.children, depth + 1, out);\n });\n return out;\n}\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/knowledgeBase/native.js?");
|
|
15657
|
+
|
|
15658
|
+
/***/ }),
|
|
15659
|
+
|
|
15520
15660
|
/***/ "./src/lib/layout/main.js":
|
|
15521
15661
|
/*!********************************!*\
|
|
15522
15662
|
!*** ./src/lib/layout/main.js ***!
|