WXL
2 天以前 37d2ba3d2c1902202c8c7ee9485267b5a1945742
测试完成
已添加2个文件
已修改3个文件
500 ■■■■■ 文件已修改
package.json 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/styles/global.css 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/WangEditor/index.vue 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/knowledge/education/compilequer/index.vue 268 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/propaganda/index.vue 109 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json
@@ -41,6 +41,8 @@
    "@riophae/vue-treeselect": "0.4.0",
    "@vue/babel-plugin-jsx": "^1.1.5",
    "@vue/composition-api": "^1.0.0-rc.6",
    "@wangeditor/editor": "^5.1.23",
    "@wangeditor/editor-for-vue": "^1.0.2",
    "axios": "0.24.0",
    "clipboard": "2.0.8",
    "codemirror": "^5.65.13",
src/assets/styles/global.css
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
/* å®šä¹‰æ·¡è“è‰²ä¸»è‰²è°ƒ */
:root {
  --editor-primary-color: #007bff; /* ä¸»è‰²è°ƒ */
  --editor-background-color: #f8f9fa; /* èƒŒæ™¯é¢œè‰² */
  --editor-border-color: #dee2e6; /* è¾¹æ¡†é¢œè‰² */
  --editor-text-color: #343a40; /* æ–‡å­—颜色 */
}
/* è¦†ç›–编辑器的默认样式 */
.w-e-toolbar {
  background-color: var(--editor-background-color);
  border-bottom: 1px solid var(--editor-border-color);
  color: var(--editor-text-color);
}
.w-e-toolbar .w-e-menu {
  background-color: transparent;
  color: var(--editor-text-color);
}
.w-e-toolbar .w-e-menu:hover {
  background-color: var(--editor-primary-color);
  color: white;
}
.w-e-toolbar .w-e-menu.w-e-active {
  background-color: var(--editor-primary-color);
  color: white;
}
.w-e-toolbar .w-e-menu .w-e-icon {
  fill: var(--editor-text-color);
}
.w-e-toolbar .w-e-menu:hover .w-e-icon {
  fill: white;
}
.w-e-toolbar .w-e-menu.w-e-active .w-e-icon {
  fill: white;
}
.w-e-text-container {
  background-color: white;
  border: 1px solid var(--editor-border-color);
  color: var(--editor-text-color);
}
.w-e-text-container .w-e-text {
  color: var(--editor-text-color);
}
.w-e-text-container .w-e-text img {
  border: 1px solid var(--editor-border-color);
}
.w-e-text-container .w-e-text a {
  color: var(--editor-primary-color);
  text-decoration: underline;
}
.w-e-text-container .w-e-text a:hover {
  color: #0056b3;
}
src/components/WangEditor/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
<template>
  <div>
    <div ref="editor" style="text-align: left;"></div>
  </div>
</template>
<script>
import E from 'wangeditor';
export default {
  name: 'WangEditor',
  data() {
    return {
      editor: null, // WangEditor å®žä¾‹
    };
  },
  props: {
    content: {
      type: String,
      default: ''
    }
  },
  watch: {
    // å½“父组件传入的 content å˜åŒ–时,更新编辑器内容
    content(newContent) {
      if (this.editor && newContent !== this.editor.txt.html()) {
        this.editor.txt.html(newContent);
      }
    }
  },
  mounted() {
    // åˆå§‹åŒ– WangEditor
    this.editor = new E(this.$refs.editor);
    this.editor.config.onchange = () => {
      // ç¼–辑器内容变化时,触发 input äº‹ä»¶ä¼ é€’给父组件
      this.$emit('input', this.editor.txt.html());
    };
    // é…ç½®èœå•和其他设置
    this.editor.config.menus = [
      'head', 'bold', 'italic', 'underline', 'image', 'link', 'list', 'undo', 'redo'
    ];
    this.editor.config.zIndex = 1000;
    // åˆ›å»ºç¼–辑器
    this.editor.create();
    // è®¾ç½®åˆå§‹å†…容
    if (this.content) {
      this.editor.txt.html(this.content);
    }
  },
  beforeDestroy() {
    // é”€æ¯ç¼–辑器实例,释放资源
    if (this.editor) {
      this.editor.destroy();
    }
  }
};
</script>
src/views/knowledge/education/compilequer/index.vue
@@ -24,6 +24,7 @@
      <!-- åŸºæœ¬ä¿¡æ¯ -->
      <div v-if="Editprogress == 1">
        <div class="leftvlue-jbxx">基本信息</div>
        <el-divider></el-divider>
        <el-form
          :model="ruleForm"
          :rules="rules"
@@ -258,6 +259,18 @@
          <el-col :span="4">
            <div class="leftvlue-jbxx">宣教内容</div>
          </el-col>
          <el-col :offset="16" :span="4">
            <el-upload
              class="upload-demo"
              :action="uploadImgUrlword"
              :on-success="uploadEditorSuccessword"
              :on-error="uploadEditorErrorword"
              :before-upload="beforeEditorUploadword"
              :headers="headers"
            >
              <el-button size="small" type="primary">word文件上传</el-button>
            </el-upload>
          </el-col>
        </el-row>
        <div>
@@ -268,7 +281,7 @@
            label-width="100px"
            class="demo-ruleForm"
          >
            <el-row :gutter="20">
            <!-- <el-row :gutter="20">
              <el-col :span="12">
                <el-form-item label="资料形式" prop="region">
                  <el-select
@@ -285,40 +298,14 @@
                  </el-select>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <div>
                  <el-button @click="laststep('ruleForm')">上一步</el-button>
                  <el-button
                    type="success"
                    @click="Departmenttreatment('ruleForm')"
                    >保存</el-button
                  >
                  <el-button
                    type="warning"
                    @click="Departmenttreatment('ruleForm')"
                    >另存新版本</el-button
                  >
                  <el-button type="info" @click="closeFm('ruleForm')"
                    >关闭</el-button
                  >
                </div>
              </el-col>
            </el-row>
              <el-col :span="12"> -->
            <!-- </el-col>
            </el-row> -->
          </el-form>
        </div>
        <div>
          <el-upload
            class="upload-demo"
            :action="uploadImgUrlword"
            :on-success="uploadEditorSuccessword"
            :on-error="uploadEditorErrorword"
            :before-upload="beforeEditorUploadword"
            :headers="headers"
          >
            <el-button size="small" type="primary">word文件上传</el-button>
          </el-upload>
        <!-- <div>
          <div id="quillEditorQiniu">
            <!-- åŸºäºŽelementUi的上传组件 el-upload begin-->
            <el-upload
              class="avatar-uploader"
              :action="uploadImgUrl"
@@ -330,7 +317,6 @@
              :headers="headers"
            >
            </el-upload>
            <!-- åŸºäºŽelementUi的上传组件 el-upload end-->
            <quill-editor
              class="editor"
              v-model="content"
@@ -342,6 +328,32 @@
            >
            </quill-editor>
          </div>
        </div> -->
        <!-- æ–°ç»„ä»¶ -->
        <div style="border: 1px solid #ccc; margin: 10px">
          <Toolbar
            style="border-bottom: 1px solid #ccc"
            :editor="editor"
            :defaultConfig="toolbarConfig"
            :mode="modes"
          />
          <Editor
            style="height: 500px; overflow-y: hidden"
            v-model="content"
            :defaultConfig="editorConfig"
            :mode="modes"
            @onCreated="onCreated"
          />
        </div>
        <div>
          <el-button @click="laststep('ruleForm')">上一步</el-button>
          <el-button type="success" @click="Departmenttreatment('ruleForm')"
            >保存</el-button
          >
          <el-button type="warning" @click="Departmenttreatment('ruleForm')"
            >另存新版本</el-button
          >
          <el-button type="info" @click="closeFm('ruleForm')">关闭</el-button>
        </div>
      </div>
    </div>
@@ -358,6 +370,7 @@
<script>
import { quillEditor } from "vue-quill-editor";
import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
import axios from "axios";
import {
@@ -411,9 +424,80 @@
export default {
  name: "aEducationinfo",
  components: { OptionalForm },
  components: { OptionalForm, Editor, Toolbar },
  data() {
    return {
      editor: null,
      content: "<p>hello</p>",
      toolbarConfig: {},
      editorConfig: {
        placeholder: "请输入内容...",
        menus: [
          "head",
          "bold",
          "italic",
          "underline",
          "image",
          "link",
          "list",
          "undo",
          "redo",
          "file", // æ·»åŠ è‡ªå®šä¹‰æ–‡ä»¶ä¸Šä¼ èœå•
        ],
        uploadImgServer: process.env.VUE_APP_BASE_API + "/common/uploadSort", // å›¾ç‰‡ä¸Šä¼ æŽ¥å£
        uploadImgHeaders: {
          Authorization: "Bearer " + getToken(),
        }, // è‡ªå®šä¹‰ä¸Šä¼ çš„ headers
        uploadImgParams: { key: "value" }, // è‡ªå®šä¹‰ä¸Šä¼ çš„参数
        uploadImgMaxSize: 2 * 1024 * 1024, // å›¾ç‰‡æœ€å¤§å¤§å°ï¼Œå•位 Byte
        uploadImgMaxLength: 1, // ä¸€æ¬¡æœ€å¤šä¸Šä¼ å›¾ç‰‡æ•°é‡
        uploadImgTimeout: 3 * 60 * 1000, // è¶…时时间,单位 ms
        uploadImgHooks: {
          customInsert: (insertImgFn, result) => {
            const url = result.url; // èŽ·å–å›¾ç‰‡åœ°å€
            insertImgFn(url); // æ’入图片
          },
        },
        customMenus: {
          file: {
            tip: "上传文件",
            click: (editor) => {
              const input = document.createElement("input");
              input.type = "file";
              input.accept =
                "application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document"; // æ”¯æŒçš„æ–‡ä»¶ç±»åž‹
              input.onchange = (e) => {
                const file = e.target.files[0];
                if (!file) return;
                const formData = new FormData();
                formData.append("file", file);
                // ç¡®ä¿ process.env.VUE_APP_BASE_API æ˜¯æ­£ç¡®çš„
                const uploadUrl =
                  process.env.VUE_APP_BASE_API + "/common/uploadSort";
                axios
                  .post(uploadUrl, formData, {
                    headers: {
                      Authorization: "Bearer " + getToken(),
                    },
                  })
                  .then((res) => {
                    const url = res.data.url; // èŽ·å–æ–‡ä»¶åœ°å€
                    // æ’入文件链接作为普通文本
                    editor.txt.append(url + " ");
                    // æˆ–者插入文件链接作为超链接
                    // editor.cmd.do('insertLink', { name: '文件链接', url: url });
                  })
                  .catch((err) => {
                    console.error("文件上传失败", err);
                  });
              };
              input.click();
            },
          },
        },
      },
      modes: "default", // or 'simple'
      headers: {
        Authorization: "Bearer " + getToken(),
      },
@@ -577,8 +661,17 @@
      console.log(oldVal, "B");
    },
  },
  beforeDestroy() {
    const editor = this.editor;
    if (editor == null) return;
    editor.destroy(); // ç»„件销毁时,及时销毁编辑器
  },
  methods: {
    onCreated(editor) {
      this.editor = Object.seal(editor); // ä¸€å®šè¦ç”¨ Object.seal(),否则会报错
    },
    // ---------------------------------
    processElement(element) {
      return { ...element, isoperation: null };
    },
@@ -943,7 +1036,7 @@
      // èŽ·å–å…‰æ ‡æ‰€åœ¨ä½ç½®
      let length = quill.getSelection().index;
      // æ’入图片||视频  res.info为服务器返回的图片地址
      if (type == "mp4" || type == "MP4"|| type == "avi"|| type == "AVI") {
      if (type == "mp4" || type == "MP4" || type == "avi" || type == "AVI") {
        window.jsValue = imgUrl;
        quill.insertEmbed(length, "video", imgUrl);
      } else {
@@ -1034,12 +1127,9 @@
  },
};
</script>
<style src="@wangeditor/editor/dist/css/style.css"></style>
<style src="@/assets/styles/global.css"></style>
<style lang="scss" scoped>
.Questionnairemanagement {
  // display: flex;
}
.sidecolumn {
  // width: 300px;
  // min-height: 100vh;
@@ -1070,8 +1160,10 @@
  }
  .leftvlue-jbxx {
    margin-bottom: 50px;
    font-size: 20px;
    font-size: 24px;
    height: 30px;
    border-left: 3px solid #41a1be;
    padding-left: 3px;
    span {
      position: absolute;
@@ -1225,95 +1317,5 @@
  span {
    font-size: 24px;
  }
}
.editor {
  line-height: normal !important;
  height: 600px;
  margin-bottom: 80px;
}
.ql-snow .ql-tooltip[data-mode="link"]::before {
  content: "请输入链接地址:";
}
.ql-snow .ql-tooltip.ql-editing a.ql-action::after {
  border-right: 0px;
  content: "保存";
  padding-right: 0px;
}
.ql-snow .ql-tooltip[data-mode="video"]::before {
  content: "请输入视频地址:";
}
.ql-snow .ql-picker.ql-size .ql-picker-label::before,
.ql-snow .ql-picker.ql-size .ql-picker-item::before {
  content: "14px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="small"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="small"]::before {
  content: "10px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="large"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="large"]::before {
  content: "18px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="huge"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="huge"]::before {
  content: "32px";
}
.ql-snow .ql-picker.ql-header .ql-picker-label::before,
.ql-snow .ql-picker.ql-header .ql-picker-item::before {
  content: "文本";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
  content: "标题1";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
  content: "标题2";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
  content: "标题3";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
  content: "标题4";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
  content: "标题5";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
  content: "标题6";
}
.ql-snow .ql-picker.ql-font .ql-picker-label::before,
.ql-snow .ql-picker.ql-font .ql-picker-item::before {
  content: "标准字体";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="serif"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="serif"]::before {
  content: "衬线字体";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="monospace"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]::before {
  content: "等宽字体";
}
</style>
src/views/patient/propaganda/index.vue
@@ -51,6 +51,15 @@
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="患者范围" prop="status">
          <el-cascader
            v-model="topqueryParams.scopetype"
            placeholder="默认全部"
            :options="sourcetype"
            :props="{ expandTrigger: 'hover' }"
            @change="handleChange"
          ></el-cascader>
        </el-form-item>
        <el-form-item label="宣教状态" prop="status">
          <el-select v-model="topqueryParams.sendstate" placeholder="请选择">
@@ -266,9 +275,7 @@
          prop="endDay"
        >
          <template slot-scope="scope">
            <span>{{
              scope.row.endDay ? scope.row.endDay + "天" : ""
            }}</span>
            <span>{{ scope.row.endDay ? scope.row.endDay + "天" : "" }}</span>
          </template>
        </el-table-column>
        <el-table-column
@@ -292,7 +299,6 @@
          key="drname"
          prop="drname"
        />
        <!-- <el-table-column
          label="病历号"
@@ -366,20 +372,28 @@
          </template>
        </el-table-column> -->
        <el-table-column
        fixed="right"
          fixed="right"
          label="任务结果记录"
          width="120"
          align="center"
          key="remark"
          prop="remark"
        >
        <template slot-scope="scope" v-if="scope.row.remark">
          <el-tag type="success" v-if="scope.row.sendstate!=5&&scope.row.sendstate!=4&&scope.row.remark">{{ scope.row.remark }}</el-tag>
          <el-tag type="warning" v-else>{{ scope.row.remark }}</el-tag>
        </template>
      </el-table-column>
          <template slot-scope="scope" v-if="scope.row.remark">
            <el-tag
              type="success"
              v-if="
                scope.row.sendstate != 5 &&
                scope.row.sendstate != 4 &&
                scope.row.remark
              "
              >{{ scope.row.remark }}</el-tag
            >
            <el-tag type="warning" v-else>{{ scope.row.remark }}</el-tag>
          </template>
        </el-table-column>
        <el-table-column
        fixed="right"
          fixed="right"
          label="宣教时间"
          sortable
          align="center"
@@ -597,6 +611,22 @@
      ruleForm: {
        type: [],
      },
      sourcetype: [
        {
          value: 1,
          label: "科室",
          children: [],
        },
        {
          value: 2,
          label: "病区",
          children: [],
        },
        {
          value: 3,
          label: "全部",
        },
      ],
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      inputValue: "",
@@ -723,7 +753,7 @@
        pageSize: 10,
        serviceType: 4,
        searchscope: 2,
        sendstate:2,
        sendstate: 2,
      },
      propss: { multiple: true },
      options: [],
@@ -772,7 +802,18 @@
  watch: {},
  created() {
    this.serviceState = store.getters.serviceState;
    console.log(this.serviceState,'this.serviceState');
    this.sourcetype[0].children = store.getters.belongDepts.map((dept) => {
      return {
        label: dept.deptName,
        value: dept.deptCode,
      };
    });
    this.sourcetype[1].children = store.getters.belongWards.map((dept) => {
      return {
        label: dept.districtName,
        value: dept.districtCode,
      };
    });
    this.getList();
    this.getConfigKey("sys.user.initPassword").then((response) => {
@@ -791,16 +832,7 @@
  methods: {
    /** æŸ¥è¯¢é—¨è¯Šå®£æ•™æœåŠ¡åˆ—è¡¨ */
    getList() {
      if (this.topqueryParams.searchscope == 1) {
        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
          (obj) => obj.deptCode
        );
        this.topqueryParams.leavehospitaldistrictcodes = [];
      } else if (this.topqueryParams.searchscope == 2) {
        this.topqueryParams.leavehospitaldistrictcodes =
          store.getters.belongWards.map((obj) => obj.districtCode);
        this.topqueryParams.leaveldeptcodes = [];
      } else {
       if (this.topqueryParams.searchscope == 3) {
        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
          (obj) => obj.deptCode
        );
@@ -809,10 +841,13 @@
      }
      this.loading = true;
      if (this.topqueryParams.leavehospitaldistrictcodes[0]&&this.topqueryParams.leaveldeptcodes[0]) {
        this.topqueryParams.deptOrDistrict=2;
      }else{
        this.topqueryParams.deptOrDistrict=1;
      if (
        this.topqueryParams.leavehospitaldistrictcodes[0] &&
        this.topqueryParams.leaveldeptcodes[0]
      ) {
        this.topqueryParams.deptOrDistrict = 2;
      } else {
        this.topqueryParams.deptOrDistrict = 1;
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
@@ -841,6 +876,24 @@
        }, 200);
      } else {
        this.options = [];
      }
    },
    // æ‚£è€…范围处理
    handleChange(value) {
      let type = value[0];
      let code = value.slice(-1)[0];
      this.topqueryParams.leavehospitaldistrictcodes = [];
      this.topqueryParams.leaveldeptcodes = [];
      if (type == 1) {
        this.topqueryParams.leaveldeptcodes.push(code);
        this.topqueryParams.leavehospitaldistrictcodes = [];
        this.topqueryParams.searchscope = 1;
      } else if (type == 2) {
        this.topqueryParams.leavehospitaldistrictcodes.push(code);
        this.topqueryParams.leaveldeptcodes = [];
        this.topqueryParams.searchscope = 2;
      } else {
        this.topqueryParams.searchscope = 3;
      }
    },
    // é—¨è¯Šå®£æ•™çŠ¶æ€ä¿®æ”¹
@@ -912,7 +965,7 @@
        pageNum: 1,
        pageSize: 10,
        serviceType: 4,
        sendstate:2,
        sendstate: 2,
      };
      this.handleQuery();
    },