فهرست منبع

添加导出并打包

yangg 10 ماه پیش
والد
کامیت
be0b91c2ec
31فایلهای تغییر یافته به همراه520 افزوده شده و 339 حذف شده
  1. 2 2
      .env.development
  2. 0 0
      dist/index.html
  3. 0 0
      dist/static/css/chunk-05cbf9fe.7131743c.css
  4. 0 0
      dist/static/css/chunk-4c810402.e30e9787.css
  5. 0 0
      dist/static/css/chunk-5045afd2.641e9b71.css
  6. 0 0
      dist/static/css/chunk-796d0180.7131743c.css
  7. 0 0
      dist/static/css/chunk-a29b7d62.904a5f71.css
  8. 0 0
      dist/static/js/app.720bd6c5.js
  9. 0 0
      dist/static/js/app.f19d8c4a.js
  10. 0 0
      dist/static/js/chunk-05cbf9fe.9ae4f646.js
  11. 0 0
      dist/static/js/chunk-4c810402.f6fecff9.js
  12. 0 0
      dist/static/js/chunk-4e6c21e3.2798f33b.js
  13. 0 0
      dist/static/js/chunk-5045afd2.b7291cbc.js
  14. 0 0
      dist/static/js/chunk-5a4698d3.d4d42d31.js
  15. 0 0
      dist/static/js/chunk-796d0180.c85828f3.js
  16. 0 0
      dist/static/js/chunk-7bfd84a5.044cc5df.js
  17. 0 0
      dist/static/js/chunk-8cfd37e8.499204f8.js
  18. 0 0
      dist/static/js/chunk-a29b7d62.591cf077.js
  19. 0 0
      dist/static/js/chunk-cb83c9ea.57e05959.js
  20. 3 3
      src/router/index.js
  21. 6 1
      src/store/modules/user.js
  22. 226 151
      src/views/dataCenter/category/components/dataList.vue
  23. 4 0
      src/views/dataCenter/components/dataList.vue
  24. 2 1
      src/views/document/com/components/Attribute/Directory/index.scss
  25. 5 6
      src/views/document/com/components/Attribute/Directory/index.vue
  26. 204 162
      src/views/document/com/components/TextView/index.vue
  27. 6 5
      src/views/document/com/view.vue
  28. 11 0
      src/views/document/components/dataSearch.vue
  29. 3 1
      src/views/document/create.scss
  30. 37 7
      src/views/document/create.vue
  31. 11 0
      src/views/document/temList/components/dataSearch.vue

+ 2 - 2
.env.development

@@ -2,5 +2,5 @@
 ENV = 'development'
 port = 8080
 # base api
-VUE_APP_BASE_API = 'http://192.168.1.178:8000'
-#127.0.0.1
+VUE_APP_BASE_API = 'http://120.46.190.49:8000'
+#192.168.1.178

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
dist/index.html


+ 0 - 0
dist/static/css/chunk-4e6c21e3.7131743c.css → dist/static/css/chunk-05cbf9fe.7131743c.css


+ 0 - 0
dist/static/css/chunk-8cfd37e8.e30e9787.css → dist/static/css/chunk-4c810402.e30e9787.css


+ 0 - 0
dist/static/css/chunk-7bfd84a5.641e9b71.css → dist/static/css/chunk-5045afd2.641e9b71.css


+ 0 - 0
dist/static/css/chunk-cb83c9ea.7131743c.css → dist/static/css/chunk-796d0180.7131743c.css


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
dist/static/css/chunk-a29b7d62.904a5f71.css


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
dist/static/js/app.720bd6c5.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
dist/static/js/app.f19d8c4a.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
dist/static/js/chunk-05cbf9fe.9ae4f646.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
dist/static/js/chunk-4c810402.f6fecff9.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
dist/static/js/chunk-4e6c21e3.2798f33b.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
dist/static/js/chunk-5045afd2.b7291cbc.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
dist/static/js/chunk-5a4698d3.d4d42d31.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
dist/static/js/chunk-796d0180.c85828f3.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
dist/static/js/chunk-7bfd84a5.044cc5df.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
dist/static/js/chunk-8cfd37e8.499204f8.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
dist/static/js/chunk-a29b7d62.591cf077.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
dist/static/js/chunk-cb83c9ea.57e05959.js


+ 3 - 3
src/router/index.js

@@ -231,13 +231,13 @@ export const asyncRoutes = [
         name: 'documentSearch',
         meta: { title: '文档管理',  noCache: true }
       },
-      {
+     /*  {
         path: 'new',
         redirect: '/document/create',
         target:"_blank",
         name:"createNewDocument",
-        meta: { title: '创建文档',  noCache: true }
-      },
+        meta: { title: '创建文档',  noCache: true,hidden:true }
+      }, */
       {
         path: 'temList',
         component: () => import('@/views/document/temList/temList'),

+ 6 - 1
src/store/modules/user.js

@@ -11,6 +11,7 @@ const state = {
   roles: [],
   roleInfo:{},
   authList:[],
+  id:''
 }
 
 const mutations = {
@@ -37,6 +38,9 @@ const mutations = {
   },
   SET_AUTH_LIST:(state,authList)=>{
     state.authList=authList;
+  },
+  SET_ID:(state,id)=>{
+    state.id=id;
   }
 }
 
@@ -65,7 +69,7 @@ const actions = {
         if (!data) {
           reject('Verification failed, please Login again.')
         }
-        const { roles, username,email,realName,avatar, introduction,roleInfo,authList } = data
+        const { roles, username,email,realName,avatar, introduction,roleInfo,authList,id } = data
         if (!roles || roles.length <= 0) {
             reject('getInfo: roles must be a non-null array!')
         }
@@ -80,6 +84,7 @@ const actions = {
         commit('SET_AVATAR', avatar)
         commit('SET_AUTH_LIST', authList)
         commit('SET_INTRODUCTION', introduction)
+        commit('SET_ID', id)
 
         resolve(data)
       }).catch(error => {

+ 226 - 151
src/views/dataCenter/category/components/dataList.vue

@@ -1,170 +1,245 @@
 <template>
   <div class="data-list">
-
-
-      <el-table :data="dataList" style="width: 100%" header-row-class-name="headerBg" empty-text="没有分类信息">
-        <el-table-column prop="id" label="ID" align="center" width="80"/>
-        <el-table-column prop="name" label="分类名称" align="center" min-width="180"/>
-        <el-table-column prop="created_at" label="创建时间" align="center" min-width="180"/>
-        <el-table-column prop="status" label="分类状态" align="center" min-width="180">
-          <template #default="scope">
-              <div>
-                {{scope.row.status==5?"启用":""}}
-                {{scope.row.status==6?"停用":""}}
-              </div>
-          </template>
-        </el-table-column>
-        <el-table-column label="操作" fixed="right" align="center"  min-width="150">
-          <template #default="scope">
-            <div class="btns">
-              <el-button type="primary" size="small" @click="btnEdit(scope.row)"><svg-icon icon-class="edit"/>编辑</el-button>
-              <el-button type="danger" size="small" @click="onDelete(scope.row.id)"><svg-icon icon-class="delete"/>删除</el-button>
-            </div>
-          </template>
-        </el-table-column>
-      </el-table>
-
-
-
-      <div class="page-info">
-      	<el-pagination
-      	v-model:currentPage="queryForm.page"
-      	:page-size="queryForm.pageSize"
-      	:total="recordCount"
-      	:page-count="pageTotal"
-      	 background
-      	 layout="prev, pager, next"
-      	 @current-change="ChangePage"
-      	 >
-      	 </el-pagination>
-      </div>
-
-     <el-dialog  :visible.sync="dialogVisible" append-to-body v-el-drag-dialog  width="50%" custom-class="prod-verify" title="修改原始数据分类 ">
-          <dataInfo :id="currentDataId" @onClose="onClose"></dataInfo>
-      </el-dialog>
-
+    <el-table
+      :data="dataList"
+      style="width: 100%"
+      header-row-class-name="headerBg"
+      empty-text="没有分类信息"
+    >
+      <el-table-column prop="id" label="ID" align="center" width="80" />
+      <el-table-column
+        prop="name"
+        label="分类名称"
+        align="center"
+        min-width="180"
+      />
+      <el-table-column
+        prop="created_at"
+        label="创建时间"
+        align="center"
+        min-width="180"
+      />
+      <el-table-column
+        prop="status"
+        label="分类状态"
+        align="center"
+        min-width="180"
+      >
+        <template #default="scope">
+          <div>
+            {{ scope.row.status == 5 ? "启用" : "" }}
+            {{ scope.row.status == 6 ? "停用" : "" }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="操作"
+        fixed="right"
+        align="center"
+        min-width="150"
+      >
+        <template #default="scope">
+          <div class="btns">
+            <el-button
+              type="primary"
+              v-if="scope.row.edit"
+              size="small"
+              @click="btnEdit(scope.row)"
+              ><svg-icon icon-class="edit" />编辑</el-button
+            >
+            <el-button
+              type="danger"
+              size="small"
+              @click="onDelete(scope.row.id)"
+              v-if="scope.row.delete"
+              ><svg-icon icon-class="delete" />删除</el-button
+            >
+          </div>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <div class="page-info">
+      <el-pagination
+        v-model:currentPage="queryForm.page"
+        :page-size="queryForm.pageSize"
+        :total="recordCount"
+        :page-count="pageTotal"
+        background
+        layout="prev, pager, next"
+        @current-change="ChangePage"
+      >
+      </el-pagination>
+    </div>
+
+    <el-dialog
+      :visible.sync="dialogVisible"
+      append-to-body
+      v-el-drag-dialog
+      width="50%"
+      custom-class="prod-verify"
+      title="修改原始数据分类 "
+    >
+      <dataInfo :id="currentDataId" @onClose="onClose"></dataInfo>
+    </el-dialog>
   </div>
-
-
 </template>
 
 <script>
-  import{searchSourceDataCategory,deleteSourceDataCategory} from'@/api/sourceData';
-  import dataInfo from './dataInfo.vue';
-  import elDragDialog from '@/directive/el-drag-dialog'
-  export default{
-    components:{
-      dataInfo,
-    },
-    directives: { elDragDialog },
-    props:{
-      queryForm:{
-        type:Object,
-        default:()=>{
-          return {
-            page:1,
-            pageSize:10,
-            name:'',
-            status:'',
-          }
-        }
-      }
+import {
+  searchSourceDataCategory,
+  deleteSourceDataCategory,
+} from "@/api/sourceData";
+import {
+  createAdminRole,
+  updateAdminRole,
+  getAdminRoleInfo,
+} from "@/api/AdminRole";
+import dataInfo from "./dataInfo.vue";
+import elDragDialog from "@/directive/el-drag-dialog";
+export default {
+  components: {
+    dataInfo,
+  },
+  directives: { elDragDialog },
+  props: {
+    queryForm: {
+      type: Object,
+      default: () => {
+        return {
+          page: 1,
+          pageSize: 10,
+          name: "",
+          status: "",
+        };
+      },
     },
-    watch:{
-
-        'queryForm': {
-          handler: function(val) {
-            this.search();
-          },
-          immediate: true,//立即执行
-          deep: true
-
-        },
+  },
+  watch: {
+    queryForm: {
+      handler: function (val) {
+        this.search();
+      },
+      immediate: true, //立即执行
+      deep: true,
     },
-    data(){
-      return{
-        dialogVisible:false,//控制产品审核
-        currentDataId:0,
-        recordCount:0,
-        pageTotal:1,
-        dataList:[],
-        currentData:{},
-      }
+  },
+  data() {
+    return {
+      dialogVisible: false, //控制产品审核
+      currentDataId: 0,
+      recordCount: 0,
+      pageTotal: 1,
+      dataList: [],
+      currentData: {},
+      authorityList: [],
+    };
+  },
+  mounted() {
+    this.search();
+  },
+  methods: {
+    authority() {
+      getAdminRoleInfo({ id: this.$store.state.user.roleInfo.id }).then(
+        (res) => {
+          this.authorityList = res.data;
+        }
+      );
     },
-    mounted() {
-      this.search();
+    onFocusVal(e) {
+      let _this = this;
+      _this.currentDataId = e.target.dataset.id;
     },
-    methods:{
 
-      onFocusVal(e){
-        let _this=this;
-        _this.currentDataId=e.target.dataset.id;
-      },
-
-      onChangeVal(e){
-        let _this=this;
-        let par={
-          id:_this.currentDataId,
-          val:e,
-        };
-      },
-
-      onClose(){
-        let _this=this;
-        _this.dialogVisible=false;
-        _this.search();
-      },
+    onChangeVal(e) {
+      let _this = this;
+      let par = {
+        id: _this.currentDataId,
+        val: e,
+      };
+    },
 
+    onClose() {
+      let _this = this;
+      _this.dialogVisible = false;
+      _this.search();
+    },
 
-      onDelete(e){
-        let _this=this;
-        let par={
-          id:e,
-        }
-        // console.log("para",par);
-        _this.$confirm("您是否确认删除该记录?","提示",{
-          confirmButtonText: '确认',
-          cancelButtonText: '取消',
-          type: 'warning',
-        }).then((res)=>{
-          // console.log("AAA")
-             deleteSourceDataCategory(par).then(res=>{
-               _this.search();
-             })
-        }).catch(()=>{
+    onDelete(e) {
+      let _this = this;
+      let par = {
+        id: e,
+      };
+      // console.log("para",par);
+      _this
+        .$confirm("您是否确认删除该记录?", "提示", {
+          confirmButtonText: "确认",
+          cancelButtonText: "取消",
+          type: "warning",
         })
-      },
-      //编辑
-      btnEdit(e){
-        let _this=this;
-        _this.currentDataId=e.id;
-        _this.dialogVisible=true;
-      },
-      handleClose(){
-        let _this=this;
-        _this.currentData={};
-        _this.dialogVisible=false;
-      },
-      //搜索
-      search(){
-        let _this=this;
-        searchSourceDataCategory(_this.queryForm).then(res=>{
-          if(!res)return;
-          _this.dataList=res.data.sourcecategories;
-          _this.recordCount=res.data.total;
-          _this.pageTotal=res.data.totalPage;
+        .then((res) => {
+          // console.log("AAA")
+          deleteSourceDataCategory(par).then((res) => {
+            _this.search();
+          });
         })
-      },
-      //修改分页
-      ChangePage(e){
-      	let _this=this;
-      	_this.queryForm.page=e;
-      	_this.search();
-      },
-    }
-  }
+        .catch(() => {});
+    },
+    //编辑
+    btnEdit(e) {
+      let _this = this;
+      _this.currentDataId = e.id;
+      _this.dialogVisible = true;
+    },
+    handleClose() {
+      let _this = this;
+      _this.currentData = {};
+      _this.dialogVisible = false;
+    },
+    //搜索
+    search() {
+      let _this = this;
+      searchSourceDataCategory(_this.queryForm).then((res) => {
+        if (!res) return;
+        if (this.$store.state.user.name == "admin") {
+          res.data.sourcecategories.forEach((el) => {
+            _this.$set(el, "edit", true);
+            _this.$set(el, "delete", true);
+          });
+        } else {
+          getAdminRoleInfo({ id: this.$store.state.user.roleInfo.id }).then(
+            (responese) => {
+              if (!responese) return;
+              responese.data.source_cate_auth.forEach((item) => {
+                res.data.sourcecategories.forEach((el) => {
+                  if (item.id === el.id) {
+                    _this.$set(el, "edit", true);
+                    _this.$set(el, "delete", true);
+                  } else {
+                    _this.$set(el, "edit", false);
+                    _this.$set(el, "delete", false);
+                  }
+                });
+              });
+            }
+          );
+        }
+        _this.dataList = res.data.sourcecategories;
+        console.log(_this.dataList);
+        _this.recordCount = res.data.total;
+        _this.pageTotal = res.data.totalPage;
+      });
+    },
+    //修改分页
+    ChangePage(e) {
+      let _this = this;
+      _this.queryForm.page = e;
+      _this.search();
+    },
+  },
+};
 </script>
 
 <style lang="scss">
-@import './dataList.scss';
+@import "./dataList.scss";
 </style>

+ 4 - 0
src/views/dataCenter/components/dataList.vue

@@ -115,8 +115,12 @@
     },
     mounted() {
       this.search();
+      this.authority()
     },
     methods:{
+      authority(){
+        console.log(this.$store.state.user.roleInfo.id);
+      },
       editWidth(row){
         if(this.allowDelete && this.allowEdit){
           return 200;

+ 2 - 1
src/views/document/com/components/Attribute/Directory/index.scss

@@ -2,7 +2,8 @@
   display:flex;
   width:100%;
   flex-direction:column;
-  height:350px;
+  height:500px;
+  overflow: auto;
   justify-content: flex-start;
   align-items: flex-start;
   margin-top:50px;

+ 5 - 6
src/views/document/com/components/Attribute/Directory/index.vue

@@ -2,8 +2,8 @@
   <div class="com-directory" v-if="coms != null && coms.length > 0 && size > 0">
     <el-form class="dirceForm">
       <template v-for="(sub) in coms" >
-        <template v-for="(item) in sub.attrs">
-          <el-form-item v-if="item.type=='Directory'" :label="item.name + ' (引用名:[' + sub.id + '])'">
+        <template v-for="(item,index) in sub.attrs">
+          <el-form-item :key="index" v-if="item.type=='Directory'" :label="item.name + ' (引用名:[' + sub.id + '])'">
             <el-input type="textarea" v-model="item.content"></el-input>
           </el-form-item>
         </template>
@@ -12,12 +12,11 @@
     </el-form>
     <div class="com-title">目录信息</div>
     <div class="com-items">
-      <template v-for="(it, index) in coms">
+      <template v-for="(it) in coms">
         <template
-          v-for="(item, itemIndex) in it.attrs"
-          v-if="item.type == 'Directory'"
+          v-for="(item, itemIndex) in it.attrs"  
         >
-          <div class="com-item">
+          <div class="com-item" :key="itemIndex" v-if="item.type == 'Directory'">
             <div class="icon"><svg-icon icon-class="directory" /></div>
             <div class="name">
               {{ item.content != "" ? item.content : item.name }}

+ 204 - 162
src/views/document/com/components/TextView/index.vue

@@ -1,182 +1,224 @@
 <template>
-    <div class="template-textarea">
-        <div class="rich-editor" v-html="content"></div>
-    </div>
+  <div class="template-textarea">
+    <div class="rich-editor" v-html="replaceData(com.content)"></div>
+  </div>
 </template>
 
 <script>
-  // import CKEditor from "ckeditor4-vue";
-  import {findData} from "@/api/sourceData";
-  export  default {
-      name: 'app',
-      emits:['onUpdateData'],
-      compnents:{
-        		// ckeditor: CKEditor.component
+// import CKEditor from "ckeditor4-vue";
+import { findData } from "@/api/sourceData";
+export default {
+  name: "app",
+  emits: ["onUpdateData"],
+  compnents: {
+    // ckeditor: CKEditor.component
+  },
+  props: {
+    coms: {
+      type: Array,
+      default: () => {
+        return [];
       },
-      props:{
-
-        coms:{
-          type:Array,
-          default:()=>{
-            return [];
-          }
-        },
-        currentIndex:{
-          type:Number,
-          default:0,
-        },
-        com:{
-          type:Object,
-          default:null,
-        }
+    },
+    currentIndex: {
+      type: Number,
+      default: 0,
+    },
+    com: {
+      type: Object,
+      default: null,
+    },
+  },
+  watch: {
+    com: {
+      handler(val) {
+        console.log('val',val);
+       /*  let _this = this;
+        if (val == null) return;
+        if (val.content == undefined || val.content == null) return;
+        _this.replaceData(val.content).then((res) => {
+          _this.content = res;
+          _this.$emit("onUpdateData", this.currentIndex, res);
+        }); */
       },
-      watch:{
-        'com':{
-            handler(val){
-               let _this=this;
-                if(val==null)return;
-                if(val.content==undefined || val.content==null)return;
-                _this.replaceData(val.content).then(res=>{
-                  _this.content=res;
-                  _this.$emit('onUpdateData',this.currentIndex,res);
-                });
-           },
-           immediate:true,
-           deep:true,
-        },
-      },
-      data() {
-          return {
-              content:'',
-          };
-      },
-      methods:{
+      immediate: true,
+      deep: true,
+    },
+  },
+  data() {
+    return {
+      content: "",
+    };
+  },
+  methods: {
+    replaceData(data){
+          for(var i=0;i<this.com.attrs.length;i++){
+            if(this.com.attrs[i].type=='variable'){
+              //全局变量
+              data=data.replace("{{"+this.com.attrs[i].id+"}}",'<input type="text" class="text-input-box" value="'+this.com.attrs[i].content+'">');
 
-       async replaceData(data){
-          let _this=this;
-          for(var i=0;i<_this.com.attrs.length;i++){
-             let attrId=_this.com.attrs[i].id;
-              if(_this.com.attrs[i].type=='formula'){
-                let formula=await _this.analysisformula(_this.com.attrs[i]);
-                 formula=await _this.getRemote(formula);
-                data=data.replace("{{"+attrId+"}}",eval(formula));
-              }else if(_this.com.attrs[i].type=='sourceData'){
-                    let result=await _this.getRemote1(_this.com.attrs[i].formula);
-                    data=data.replace("{{"+attrId+"}}",result);
-              }else if(_this.com.attrs[i].type=="Directory"){
-                //处理目录
-                data=data.replace("<p>{{"+attrId+"}}</p>","<h1>"+_this.com.attrs[i].content+"</h1>");
-                data=data.replace("<div>{{"+attrId+"}}</div>","<h1>"+_this.com.attrs[i].content+"</h1>");
-                data=data.replace("<span>{{"+attrId+"}}</span>","<h1>"+_this.com.attrs[i].content+"</h1>");
-                // data=data.replace("{{"+attrId+"}}","<h1 style='font-size:18px;'>"+_this.com.attrs[i].content+"</h1>");
-              }else{
-                data=data.replace("{{"+attrId+"}}",_this.com.attrs[i].content);
-              }
+            }else{
+              data=data.replace("{{"+this.com.attrs[i].id+"}}",this.com.attrs[i].content);
+            }
           }
           return data;
+          
         },
-
-        //分析公式
-      async analysisformula(attrs){
-            let _this=this;
-            var pattern=/(\[.*?\]){3}/;
-            var formula=attrs.formula;
-            var reg = new RegExp(pattern);
-            while(true){
-                var items=formula.match(reg);
-                if(items==null)break;
-                let itemName=items[0];
-                let data=await _this.getformulaData(itemName);
-                data=await _this.getRemote(data);
-                formula=formula.replace(itemName,"("+parseFloat(data)+")");
-            }
-            return (formula);
-        },
-       async getformulaData(formulaItem){
-            let _this=this;
-            var pattern=/\[(.*?)\]\[(.*?)\]\[(.*?)\]/;
-            var reg = new RegExp(pattern);
-            let items=formulaItem.match(reg);
-            let calResult=0;
-            if(items[1]=='T'){
-              //表示本地模板数据
-              calResult=await _this.getModuleData(items[2],items[3]);
-            }
-            return calResult;
-        },
-        async getRemote(formula){
-          let _this=this;
-          var pattern=/\[(.*?)\]\[(.*?)\]\[(.*?)\]\[(.*?)\]/;
-          var reg = new RegExp(pattern);
-          while(true){
-            let items=formula.match(reg);
-            if(items==null)break;
-            if(items[1]=="R"){
-                //表示获取远程数据
-                var dataIndex=items[4];
-                dataIndex=items[4].split(",");
-                let calResult=await _this.getRemoteData(items[2],items[3],dataIndex[0],dataIndex[1]);
-                let itemName=items[0];
-                formula=formula.replace(itemName,"("+parseFloat(calResult)+")");
-            }
+    /* async replaceData(data) {
+      let _this = this;
+      for (var i = 0; i < _this.com.attrs.length; i++) {
+        let attrId = _this.com.attrs[i].id;
+        if (_this.com.attrs[i].type == "formula") {
+          let formula = await _this.analysisformula(_this.com.attrs[i]);
+          formula = await _this.getRemote(formula);
+          let evalResult = eval(formula);
+          if (!isNaN(evalResult)) {
+            data = data.replace("{{" + attrId + "}}", evalResult);
           }
-          return formula;
-        },
-        async getRemote1(formula){
-          let _this=this;
-          var pattern=/\[(.*?)\]\[(.*?)\]\[(.*?)\]\[(.*?)\]/;
-          var reg = new RegExp(pattern);
-          while(true){
-            let items=formula.match(reg);
-            if(items==null)break;
-            if(items[1]=="R"){
-                //表示获取远程数据
-                var dataIndex=items[4];
-                dataIndex=items[4].split(",");
-                let calResult=await _this.getRemoteData(items[2],items[3],dataIndex[0],dataIndex[1]);
-                let itemName=items[0];
-                formula=formula.replace(itemName,parseFloat(calResult));
-            }
+        } else if (_this.com.attrs[i].type == "sourceData") {
+          let result = await _this.getRemote1(_this.com.attrs[i].formula);
+          if (!isNaN(result)) {
+            data = data.replace("{{" + attrId + "}}", result);
           }
-          return formula;
-        },
+        } else if (_this.com.attrs[i].type == "Directory") {
+          //处理目录
+          data = data.replace(
+            "<p>{{" + attrId + "}}</p>",
+            "<h1>" + _this.com.attrs[i].content + "</h1>"
+          );
+          data = data.replace(
+            "<div>{{" + attrId + "}}</div>",
+            "<h1>" + _this.com.attrs[i].content + "</h1>"
+          );
+          data = data.replace(
+            "<span>{{" + attrId + "}}</span>",
+            "<h1>" + _this.com.attrs[i].content + "</h1>"
+          );
+        } else {
+          data = data.replace("{{" + attrId + "}}", _this.com.attrs[i].content);
+        }
+      }
+      return data;
+    }, */
 
-        //获取远程数据
-        async getRemoteData(code,sheet,row,col){
-            let _this=this;
-            let result=0;
-            let par={
-              code:code,
-              sheetName:sheet,
-              row:row,
-              col:col
-            }
-            let res=await findData(par);
-            if(res.status==200){
-              console.log('result:',res.data);
-              return res.data.result;
-            }
-            return 0;
-        },
+    //分析公式
+    async analysisformula(attrs) {
+      let _this = this;
+      var pattern = /(\[.*?\]){3}/;
+      var formula = attrs.formula;
+      var reg = new RegExp(pattern);
+      while (true) {
+        var items = formula.match(reg);
+        if (items == null) break;
+        let itemName = items[0];
+        let data = await _this.getformulaData(itemName);
+        data = await _this.getRemote(data);
+        formula = formula.replace(itemName, "(" + parseFloat(data) + ")");
+      }
+      return formula;
+    },
+    async getformulaData(formulaItem) {
+      let _this = this;
+      var pattern = /\[(.*?)\]\[(.*?)\]\[(.*?)\]/;
+      var reg = new RegExp(pattern);
+      let items = formulaItem.match(reg);
+      let calResult = 0;
+      if (items[1] == "T") {
+        //表示本地模板数据
+        calResult = await _this.getModuleData(items[2], items[3]);
+      }
+      return calResult;
+    },
+    async getRemote(formula) {
+      let _this = this;
+      var pattern = /\[(.*?)\]\[(.*?)\]\[(.*?)\]\[(.*?)\]/;
+      var reg = new RegExp(pattern);
+      while (true) {
+        let items = formula.match(reg);
+        if (items == null) break;
+        if (items[1] == "R") {
+          //表示获取远程数据
+          var dataIndex = items[4];
+          dataIndex = items[4].split(",");
+          let calResult = await _this.getRemoteData(
+            items[2],
+            items[3],
+            dataIndex[0],
+            dataIndex[1]
+          );
+          let itemName = items[0];
+          formula = formula.replace(
+            itemName,
+            "(" + parseFloat(calResult) + ")"
+          );
+        }
+      }
+      return formula;
+    },
+    async getRemote1(formula) {
+      let _this = this;
+      var pattern = /\[(.*?)\]\[(.*?)\]\[(.*?)\]\[(.*?)\]/;
+      var reg = new RegExp(pattern);
+      while (true) {
+        let items = formula.match(reg);
+        if (items == null) break;
+        if (items[1] == "R") {
+          //表示获取远程数据
+          var dataIndex = items[4];
+          dataIndex = items[4].split(",");
+          let calResult = await _this.getRemoteData(
+            items[2],
+            items[3],
+            dataIndex[0],
+            dataIndex[1]
+          );
+          let itemName = items[0];
+          formula = formula.replace(itemName, parseFloat(calResult));
+        }
+      }
+      return formula;
+    },
 
+    //获取远程数据
+    async getRemoteData(code, sheet, row, col) {
+      debugger
+      let _this = this;
+      let result = 0;
+      let par = {
+        code: code,
+        sheetName: sheet,
+        row: row,
+        col: col,
+      };
+      let res = await findData(par);
+      if (res.status == 200) {
+        console.log("result:", res.data);
+        let dataResult = parseFloat(res.data.result);
+        if (!isNaN(dataResult)) {
+          return dataResult;
+        }
+      }
+      return 0;
+    },
 
-        //获取本地文档模块数据
-       async getModuleData(code,attrName){
-          let _this=this;
-          let item=_this.coms.filter(o=>o.code==code);
-          if(item.length>0){
-            let attr=item[0].attrs.filter(o=>o.name==attrName);
-            if(attr.length>0){
-              return parseFloat(attr[0].content);
-            }
+    //获取本地文档模块数据
+    async getModuleData(code, attrName) {
+      let _this = this;
+      let item = _this.coms.filter((o) => o.code == code);
+      if (item.length > 0) {
+        let attr = item[0].attrs.filter((o) => o.name == attrName);
+        if (attr.length > 0) {
+          let content = parseFloat(attr[0].content);
+          if (!isNaN(content)) {
+            return content;
           }
-          return 0;
-        },
-
-
+        }
       }
-  }
+      return 0;
+    },
+  },
+};
 </script>
 <style lang="scss">
-@import './index.scss';
+@import "./index.scss";
 </style>

+ 6 - 5
src/views/document/com/view.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="com-viewer">
-    <div class="content">
+    <div class="content" ref="content">
       <template v-for="(item, index) in coms">
         <component
           :key="index"
@@ -53,7 +53,7 @@ export default {
       handler(val) {
         if (val == null) return;
         this.comList = JSON.parse(JSON.stringify(val));
-        console.log("comList",this.comList);
+        console.log("comList", this.comList);
       },
       immediate: true,
       deep: true,
@@ -68,14 +68,15 @@ export default {
   methods: {
     onUpdateData(index, data) {
       this.comList[index].content = data;
-      console.log("comList1",this.comList);
       this.rebuildContent();
     },
     rebuildContent() {
-     // this.content = this.comList.map((item) => item.content).join("");
+      this.content = this.comList.map((item) => item.content).join("");
+      console.log(this.content);
     },
+
     onExport() {
-      let contentData = `<!DOCTYPE html><html><head><meta charset="UTF-8"></head><body><p class="header1"></p> ${this.content} </body></html>`;
+      let contentData = `<!DOCTYPE html><html><head><meta charset="UTF-8"></head><body><p class="header1"></p> ${this.$refs.content.innerHTML} </body></html>`;
       contentData = contentData
         .replaceAll("<table ", `<table style="border-collapse: collapse;" `)
         .replaceAll("<td>", `<td style="border: 1px solid black;">`);

+ 11 - 0
src/views/document/components/dataSearch.vue

@@ -31,6 +31,9 @@
         <el-form-item>
           <el-button type="primary" @click="onSubmit">  <svg-icon icon-class="search"/> 搜索</el-button>
         </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="addDocument"  class="el-icon-circle-plus-outline">创建文档</el-button>
+        </el-form-item>
       </el-form>
 
 
@@ -93,6 +96,14 @@ export default{
     //搜索
     onSubmit(){
       this.$emit("bindSetQuery",this.$props.queryForm);
+    },
+    /* 创建文档 */
+    addDocument(){
+      let _this = this;
+      let a = document.createElement("a");
+      a.href = "#/document/create"; // 使用 hash
+      a.target = "_blank";
+      a.click();
     }
   }
 }

+ 3 - 1
src/views/document/create.scss

@@ -113,7 +113,7 @@
         top:60px;
         background:#FFF;
         z-index:999;
-        width:940px;
+        width: 1025px;
       }
 
       .editor-box{
@@ -153,6 +153,7 @@
             box-shadow: 0 2px 8px 0 rgba(0,0,0,.1);
             border-radius: 2px;
         /*     width: 94px; */
+        letter-spacing: 3px;
             height: 75px;
             display: inline-block;
             text-align: center;
@@ -199,6 +200,7 @@
   background-color: #fff;
   border: 1px solid #ddd;
   padding: 10px;
+  letter-spacing: 3px;
   margin-bottom: 10px;
   cursor: pointer;
   text-align: center;

+ 37 - 7
src/views/document/create.vue

@@ -18,7 +18,8 @@
           v-if="docAttr.id > 0"
           >另存为</el-button
         >
-        <el-button type="primary" size="mini" @click="onSave">保存</el-button>
+        <el-button type="primary" size="mini" @click="onSave">保存文档</el-button>
+        <el-button type="primary" size="mini" v-if="$store.state.user.name=='admin'">保存并更新模版</el-button>
         <el-button type="primary" size="mini" @click="onOpenView"
           >预览导出
         </el-button>
@@ -51,6 +52,18 @@
                   <div @click="onLoadArticle(it)">{{ it.title }}</div>
                 </div>
               </el-collapse-item>
+              <el-collapse-item title="模版列表" name="-2" v-if="showView == 0">
+                <div
+                  v-for="(it, index) in articleList"
+                  draggable
+                  :key="it.id"
+                  :data-index="index"
+                  data-type="article"
+                  class="sub-menus"
+                >
+                  <div @click="onLoadArticle(it)">{{ it.title }}</div>
+                </div>
+              </el-collapse-item>
 
               <!--     <template v-for="(item, itemIndex) in categoryList">
                 <div class="sub-title">{{ item.name }}</div>
@@ -191,8 +204,8 @@
           </div>
           <div
             class="item"
-            @click="onSetActiveIndex(9997)"
-            :class="comIndex == 9997 ? 'active-item' : ''"
+            @click="onCatalogIndex(9997)"
+            :class="catalogIndex == 9997 ? 'active-item' : ''"
           >
             <span class="name">目录信息</span>
           </div>
@@ -216,12 +229,12 @@
             @onRebuild="onRebuild"
           ></comList>
         </template>
-        <template v-if="comIndex == 9997">
+        <template v-if="catalogIndex == 9997">
           <Directory :coms="coms" />
         </template>
         <!-- comIndex != 9999 && comIndex != 9998 && comIndex != 9997 AttributeIndex==1-->
         <template
-          v-if="comIndex != 9999 && comIndex != 9998 && comIndex != 9997 &&AttributeIndex != 1"
+          v-if="comIndex != 9999 && comIndex != 9998 && catalogIndex != 9997 &&AttributeIndex != 1"
         >
           <Attribute
             :com="coms[comIndex]"
@@ -348,6 +361,7 @@ export default {
       childrenList: [],
       value: [],
       AttributeIndex: 0,
+      catalogIndex:0,//目录信息
     };
   },
   watch: {
@@ -559,14 +573,28 @@ export default {
     onRemove(index) {
       this.coms.splice(index, 1);
     },
+    /* 目录信息 */
+    onCatalogIndex(e){
+      this.catalogIndex=e
+      if (
+        this.comIndex == 9999 ||
+        this.comIndex == 9998 ||
+        this.AttributeIndex == 1
+      ) {
+        this.comIndex = 0;
+        this.AttributeIndex = 0;
+      }
+      
+    },
     //设置当前索引
     onSetActiveIndex(e) {
       this.comIndex = e;
       if (
         this.comIndex == 9999 ||
         this.comIndex == 9998 ||
-        this.comIndex == 9997
+        this.catalogIndex == 9997
       ) {
+        this.catalogIndex = 0;
         this.AttributeIndex = 0;
       }
     },
@@ -576,8 +604,9 @@ export default {
       if (
         this.comIndex == 9999 ||
         this.comIndex == 9998 ||
-        this.comIndex == 9997
+        this.catalogIndex == 9997
       ) {
+        this.catalogIndex = 0;
         this.comIndex = 0;
       }
     },
@@ -721,6 +750,7 @@ export default {
       }
       console.log(e);
       let com = _this.coms[_this.comIndex];
+      console.log("com:",com);
       let data = {
         type: "Directory",
         id: "Directory" + (com.attrs.length + 1),

+ 11 - 0
src/views/document/temList/components/dataSearch.vue

@@ -31,6 +31,9 @@
         <el-form-item>
           <el-button type="primary" @click="onSubmit">  <svg-icon icon-class="search"/> 搜索</el-button>
         </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="addDocument" class="el-icon-circle-plus-outline"> 创建模版</el-button>
+        </el-form-item>
       </el-form>
 
 
@@ -93,6 +96,14 @@ export default{
     //搜索
     onSubmit(){
       this.$emit("bindSetQuery",this.$props.queryForm);
+    },
+    /* 创建模版 */
+    addDocument(){
+      let _this = this;
+      let a = document.createElement("a");
+      a.href = "#/document/create"; // 使用 hash
+      a.target = "_blank";
+      a.click();
     }
   }
 }

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است