From 958f682227fd2aae9efd5791c89fa3ef0f4cdc4c Mon Sep 17 00:00:00 2001
From: heimawl <1785969728@qq.com>
Date: 星期四, 29 六月 2023 18:38:53 +0800
Subject: [PATCH] 备注信息

---
 src/views/shortmessage/communication/index.vue               |  908 +++++++++++
 src/views/shortmessage/communication/lemon-message-voice.vue |   35 
 src/views/shortmessage/healthinformation/index.vue           |   17 
 src/views/shortmessage/taglibrary/index.vue                  |  711 +++++++++
 src/views/knowledge/questionbank/index.vue                   |    2 
 src/views/knowledge/education/index.vue                      |   10 
 src/views/shortmessage/communication/database/contacts.js    |  148 +
 src/views/shortmessage/communication/database/user.js        |    6 
 src/websocket/websocket.js                                   |  113 +
 src/main.js                                                  |  166 +-
 src/views/repositoryai/verbaltrick/particulars/index.vue     |    6 
 package.json                                                 |    9 
 src/views/knowledge/questionnaire/index.vue                  |    2 
 src/views/repositoryai/matching/myAudio.vue                  |  288 +++
 src/views/shortmessage/messagebank/index.vue                 |  932 ++++++++++++
 src/views/repositoryai/matching/index.vue                    |  752 +++++++++
 src/views/shortmessage/communication/database/emoji.js       |  293 +++
 src/views/shortmessage/communication/database/messages.js    |  154 ++
 18 files changed, 4,458 insertions(+), 94 deletions(-)

diff --git a/package.json b/package.json
index f14e1c0..89fe2f8 100644
--- a/package.json
+++ b/package.json
@@ -52,13 +52,17 @@
     "js-beautify": "1.13.0",
     "js-cookie": "3.0.1",
     "jsencrypt": "3.0.0-rc.1",
+    "lemon-imui": "^1.7.7",
     "nprogress": "0.2.0",
     "quill": "1.3.7",
     "quill-image-drop-module": "^1.0.3",
     "quill-image-resize": "^3.0.9",
     "quill-image-resize-module": "^3.0.0",
+    "sass": "^1.63.6",
     "screenfull": "5.0.2",
     "sortablejs": "1.10.2",
+    "style-loader": "^3.3.3",
+    "stylus-loader": "^7.1.3",
     "vue": "2.6.12",
     "vue-cli": "^2.9.6",
     "vue-codemirror": "^4.0.6",
@@ -83,11 +87,12 @@
     "eslint": "7.15.0",
     "eslint-plugin-vue": "7.2.0",
     "lint-staged": "10.5.3",
+    "node-sass": "^8.0.0",
     "runjs": "4.4.2",
-    "sass": "1.32.13",
-    "sass-loader": "10.1.1",
+    "sass-loader": "^10.4.1",
     "script-ext-html-webpack-plugin": "2.1.5",
     "script-loader": "^0.7.2",
+    "stylus": "^0.59.0",
     "svg-sprite-loader": "5.1.1",
     "vue-template-compiler": "2.6.12"
   },
diff --git a/src/main.js b/src/main.js
index 3ae7057..e21d599 100644
--- a/src/main.js
+++ b/src/main.js
@@ -1,27 +1,27 @@
-import Vue from 'vue'
+import Vue from "vue";
 
-import Cookies from 'js-cookie'
+import Cookies from "js-cookie";
 import * as echarts from "echarts";
 
-import Element from 'element-ui'
-import './assets/styles/element-variables.scss'
+import Element from "element-ui";
+import "./assets/styles/element-variables.scss";
 
-import '@/assets/styles/index.scss' // global css
-import '@/assets/styles/ruoyi.scss' // ruoyi css
-import App from './App'
-import store from './store'
-import router from './router'
-import directive from './directive' // directive
-import plugins from './plugins' // plugins
-import { download } from '@/utils/request'
- //寮曞叆quill-editor缂栬緫鍣�
- import VueQuillEditor from 'vue-quill-editor'
- // require styles 寮曞叆鏍峰紡
- import 'quill/dist/quill.core.css'
- import 'quill/dist/quill.snow.css'
- import 'quill/dist/quill.bubble.css'
- Vue.use(VueQuillEditor);
- // 寮曞叆
+import "@/assets/styles/index.scss"; // global css
+import "@/assets/styles/ruoyi.scss"; // ruoyi css
+import App from "./App";
+import store from "./store";
+import router from "./router";
+import directive from "./directive"; // directive
+import plugins from "./plugins"; // plugins
+import { download } from "@/utils/request";
+//寮曞叆quill-editor缂栬緫鍣�
+import VueQuillEditor from "vue-quill-editor";
+// require styles 寮曞叆鏍峰紡
+import "quill/dist/quill.core.css";
+import "quill/dist/quill.snow.css";
+import "quill/dist/quill.bubble.css";
+Vue.use(VueQuillEditor);
+// 寮曞叆
 import { codemirror } from "vue-codemirror";
 import "@/utils/cm-setting.js";
 Vue.component("codemirror", codemirror);
@@ -29,89 +29,97 @@
 //  import 'vue-codemirror/dist/codemirror.css'
 //  Vue.use(VueCodeMirror)
 
- //瀹炵幇quill-editor缂栬緫鍣ㄦ嫋鎷戒笂浼犲浘鐗�
+//瀹炵幇quill-editor缂栬緫鍣ㄦ嫋鎷戒笂浼犲浘鐗�
 //  import Quill from 'quill'
-import {Quill} from 'vue-quill-editor' 
- window.Quill = Quill;
- import imageResize from 'quill-image-resize'
-//  const scriptEl = document.createElement('script'); 
-// 	scriptEl.charset = 'utf-8' 
-// 	scriptEl.src =  './image-resize.min.js' 
-// 	const head = document.head || document.getElementsByTagName('head')[0]; 
+import { Quill } from "vue-quill-editor";
+window.Quill = Quill;
+import imageResize from "quill-image-resize";
+//  const scriptEl = document.createElement('script');
+// 	scriptEl.charset = 'utf-8'
+// 	scriptEl.src =  './image-resize.min.js'
+// 	const head = document.head || document.getElementsByTagName('head')[0];
 // 	head.appendChild(scriptEl);
 
- import { ImageDrop } from 'quill-image-drop-module'
+import { ImageDrop } from "quill-image-drop-module";
 //  import imageResize from 'quill-image-resize'
- Quill.register('modules/imageDrop', ImageDrop)
+Quill.register("modules/imageDrop", ImageDrop);
 //  import imageResize from 'quill-image-resize-module'
- Quill.register('modules/imageResize', imageResize)
- //瀹炵幇quill-editor缂栬緫鍣ㄨ皟鏁村浘鐗囧昂瀵�
+Quill.register("modules/imageResize", imageResize);
+//瀹炵幇quill-editor缂栬緫鍣ㄨ皟鏁村浘鐗囧昂瀵�
 //  Quill.register('modules/imageResize', ImageResize)
 
-import './assets/icons' // icon
-import './permission' // permission control
+import LemonIMUI from "lemon-imui";
+import "lemon-imui/dist/index.css";
+Vue.use(LemonIMUI);
+
+import "./assets/icons"; // icon
+import "./permission"; // permission control
 import { getDicts } from "@/api/system/dict/data";
 import { getConfigKey } from "@/api/system/config";
-import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree } from "@/utils/ruoyi";
+import {
+  parseTime,
+  resetForm,
+  addDateRange,
+  selectDictLabel,
+  selectDictLabels,
+  handleTree,
+} from "@/utils/ruoyi";
 // 鍒嗛〉缁勪欢
 import Pagination from "@/components/Pagination";
 // 鑷畾涔夎〃鏍煎伐鍏风粍浠�
-import RightToolbar from "@/components/RightToolbar"
+import RightToolbar from "@/components/RightToolbar";
 // 瀵屾枃鏈粍浠�
-import Editor from "@/components/Editor"
+import Editor from "@/components/Editor";
 // 鏂囦欢涓婁紶缁勪欢
-import FileUpload from "@/components/FileUpload"
+import FileUpload from "@/components/FileUpload";
 // 鍥剧墖涓婁紶缁勪欢
-import ImageUpload from "@/components/ImageUpload"
+import ImageUpload from "@/components/ImageUpload";
 // 鍥剧墖棰勮缁勪欢
-import ImagePreview from "@/components/ImagePreview"
+import ImagePreview from "@/components/ImagePreview";
 // 瀛楀吀鏍囩缁勪欢
-import DictTag from '@/components/DictTag'
+import DictTag from "@/components/DictTag";
 // 澶撮儴鏍囩缁勪欢
-import VueMeta from 'vue-meta'
+import VueMeta from "vue-meta";
 // 瀛楀吀鏁版嵁缁勪欢
-import DictData from '@/components/DictData'
+import DictData from "@/components/DictData";
 // 缁勪欢灏佽闆嗘垚
-import components from './components'
+import components from "./components";
 // 娉ㄥ唽杩囨护鍣�
 // 鑷畾涔夋寚浠�
-import * as directives from './directives'
-import * as filters from './filters'
-for(let key in filters){
-Vue.filter(key, filters[key])
+import * as directives from "./directives";
+import * as filters from "./filters";
+for (let key in filters) {
+  Vue.filter(key, filters[key]);
 }
 
 // 鍏ㄥ眬鏂规硶鎸傝浇
 
-Vue.prototype.getDicts = getDicts
-Vue.prototype.getConfigKey = getConfigKey
-Vue.prototype.parseTime = parseTime
-Vue.prototype.resetForm = resetForm
-Vue.prototype.addDateRange = addDateRange
-Vue.prototype.selectDictLabel = selectDictLabel
-Vue.prototype.selectDictLabels = selectDictLabels
-Vue.prototype.download = download
-Vue.prototype.handleTree = handleTree
+Vue.prototype.getDicts = getDicts;
+Vue.prototype.getConfigKey = getConfigKey;
+Vue.prototype.parseTime = parseTime;
+Vue.prototype.resetForm = resetForm;
+Vue.prototype.addDateRange = addDateRange;
+Vue.prototype.selectDictLabel = selectDictLabel;
+Vue.prototype.selectDictLabels = selectDictLabels;
+Vue.prototype.download = download;
+Vue.prototype.handleTree = handleTree;
 // 鍏ㄥ眬缁勪欢鎸傝浇
-Vue.component('DictTag', DictTag)
-Vue.component('Pagination', Pagination)
-Vue.component('RightToolbar', RightToolbar)
-Vue.component('Editor', Editor)
-Vue.component('FileUpload', FileUpload)
-Vue.component('ImageUpload', ImageUpload)
-Vue.component('ImagePreview', ImagePreview)
-
+Vue.component("DictTag", DictTag);
+Vue.component("Pagination", Pagination);
+Vue.component("RightToolbar", RightToolbar);
+Vue.component("Editor", Editor);
+Vue.component("FileUpload", FileUpload);
+Vue.component("ImageUpload", ImageUpload);
+Vue.component("ImagePreview", ImagePreview);
 
 // 灏佽鑷畾涔夋寚浠�
-for(let key in directives)
-Vue.directive(key, directives[key])
-Vue.use(directive)
-Vue.use(plugins)
-Vue.use(VueMeta)
-DictData.install()
-Vue.use(components)
+for (let key in directives) Vue.directive(key, directives[key]);
+Vue.use(directive);
+Vue.use(plugins);
+Vue.use(VueMeta);
+DictData.install();
+Vue.use(components);
 // Vue.use(VueQuillEditor)
-
 
 /**
  * If you don't want to use mock-server
@@ -123,14 +131,14 @@
  */
 
 Vue.use(Element, {
-  size: Cookies.get('size') || 'medium' // set element-ui default size
-})
+  size: Cookies.get("size") || "medium", // set element-ui default size
+});
 
-Vue.config.productionTip = false
+Vue.config.productionTip = false;
 
 new Vue({
-  el: '#app',
+  el: "#app",
   router,
   store,
-  render: h => h(App)
-})
+  render: (h) => h(App),
+});
diff --git a/src/views/knowledge/education/index.vue b/src/views/knowledge/education/index.vue
index c29eb8a..6623dde 100644
--- a/src/views/knowledge/education/index.vue
+++ b/src/views/knowledge/education/index.vue
@@ -137,7 +137,7 @@
                 >
               </el-form-item>
             </el-form>
-
+            <el-divider></el-divider>
             <el-row :gutter="10" class="mb8">
               <el-col :span="1.5">
                 <el-button
@@ -430,13 +430,7 @@
 </template>
 
 <script>
-import {
-  listUser,
-  getUser,
-  delUser,
-  addUser,
-  updateUser,
-} from "@/api/system/user";
+import { listUser, delUser, addUser, updateUser } from "@/api/system/user";
 import { getToken } from "@/utils/auth";
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
diff --git a/src/views/knowledge/questionbank/index.vue b/src/views/knowledge/questionbank/index.vue
index 51b92df..c80f732 100644
--- a/src/views/knowledge/questionbank/index.vue
+++ b/src/views/knowledge/questionbank/index.vue
@@ -53,7 +53,7 @@
             >
           </el-form-item>
         </el-form>
-
+        <el-divider></el-divider>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
             <el-button
diff --git a/src/views/knowledge/questionnaire/index.vue b/src/views/knowledge/questionnaire/index.vue
index 9290e98..6f34dca 100644
--- a/src/views/knowledge/questionnaire/index.vue
+++ b/src/views/knowledge/questionnaire/index.vue
@@ -109,7 +109,7 @@
                 >
               </el-form-item>
             </el-form>
-
+            <el-divider></el-divider>
             <el-row :gutter="10" class="mb8">
               <el-col :span="1.5">
                 <el-button
diff --git a/src/views/repositoryai/matching/index.vue b/src/views/repositoryai/matching/index.vue
new file mode 100644
index 0000000..bd334f3
--- /dev/null
+++ b/src/views/repositoryai/matching/index.vue
@@ -0,0 +1,752 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <!--鐢ㄦ埛鏁版嵁-->
+      <el-col :span="24" :xs="24">
+        <el-form
+          :model="topqueryParams"
+          ref="queryForm"
+          size="small"
+          :inline="true"
+          v-show="showSearch"
+          label-width="98px"
+        >
+          <el-form-item label="棰樼洰鏂囨湰" prop="text">
+            <el-input
+              v-model="topqueryParams.text"
+              placeholder="璇疯緭鍏�"
+              clearable
+              style="width: 200px"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="鍏宠仈鎸囨爣" prop="relevance">
+            <el-input
+              v-model="topqueryParams.relevance"
+              placeholder="璇疯緭鍏�"
+              clearable
+              style="width: 200px"
+              @keyup.enter.native="handleQuery"
+            /> </el-form-item
+          ><el-form-item label="鎵嬫満鍙�" prop="phonenumber">
+            <el-input
+              v-model="topqueryParams.phonenumber"
+              placeholder="璇疯緭鍏ユ墜鏈哄彿"
+              clearable
+              style="width: 200px"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <br />
+          <el-form-item label="鍒涘缓鏃堕棿">
+            <el-date-picker
+              v-model="dateRange"
+              style="width: 240px"
+              value-format="yyyy-MM-dd"
+              type="daterange"
+              range-separator="-"
+              start-placeholder="寮�濮嬫棩鏈�"
+              end-placeholder="缁撴潫鏃ユ湡"
+            ></el-date-picker>
+          </el-form-item>
+
+          <el-form-item>
+            <el-button
+              type="primary"
+              icon="el-icon-search"
+              size="medium"
+              @click="handleQuery"
+              >鎼滅储</el-button
+            >
+            <el-button icon="el-icon-refresh" size="medium" @click="resetQuery"
+              >閲嶇疆</el-button
+            >
+          </el-form-item>
+        </el-form>
+        <el-divider></el-divider>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              plain
+              icon="el-icon-plus"
+              size="medium"
+              @click="handleAdd"
+              v-hasPermi="['system:user:add']"
+              >鏂板</el-button
+            >
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="success"
+              plain
+              icon="el-icon-edit"
+              size="medium"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['system:user:edit']"
+              >淇敼</el-button
+            >
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="danger"
+              plain
+              icon="el-icon-delete"
+              size="medium"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['system:user:remove']"
+              >鍒犻櫎</el-button
+            >
+          </el-col>
+          <el-col :span="19">
+            <div class="documentf">
+              <div class="document">
+                <el-button
+                  type="warning"
+                  plain
+                  icon="el-icon-download"
+                  size="medium"
+                  @click="handleExport"
+                  v-hasPermi="['system:user:export']"
+                  >瀵煎嚭</el-button
+                >
+              </div>
+            </div>
+          </el-col>
+          <!-- <el-col :span="1.5"> </el-col> -->
+        </el-row>
+        <!-- <right-toolbar
+            :showSearch.sync="showSearch"
+            @queryTable="getList"
+            :columns="columns"
+          ></right-toolbar> -->
+        <el-table
+          v-loading="loading"
+          :data="userList"
+          @selection-change="handleSelectionChange"
+        >
+          <el-table-column type="selection" width="50" align="center" />
+          <el-table-column
+            label="搴忓彿"
+            align="center"
+            key="userId"
+            prop="userId"
+          />
+
+          <el-table-column
+            label="濮撳悕"
+            align="center"
+            key="userName"
+            prop="userName"
+            :show-overflow-tooltip="true"
+          />
+          <el-table-column
+            label="鎵嬫満鍙�"
+            align="center"
+            key="phonenumber"
+            prop="phonenumber"
+          />
+          <el-table-column
+            label="妯$増鍚嶇О"
+            align="center"
+            key="templateName"
+            prop="templateName"
+          />
+          <el-table-column
+            label="闂鏂囨湰"
+            align="center"
+            key="problem"
+            prop="problem"
+            width="180"
+          />
+          <el-table-column
+            label="闂鍥炲"
+            align="center"
+            key="replyz"
+            prop="replyz"
+          />
+
+          <el-table-column
+            label="鎾斁璇煶"
+            align="center"
+            key="topicnumber"
+            prop="topicnumber"
+            width="350"
+          >
+            <template slot-scope="scope">
+              <my-audio
+                :theUrl="scope.row.url"
+                :theControlList="scope.row.controlList"
+              ></my-audio>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="鍖归厤鎴愬姛璇彞"
+            align="center"
+            key="replya"
+            prop="replya"
+          />
+          <el-table-column
+            label="鍏宠仈鎸囨爣"
+            align="center"
+            key="replys"
+            prop="replys"
+          />
+          <el-table-column
+            label="鎸囨爣鍊�"
+            align="center"
+            key="replyc"
+            prop="replyc"
+          />
+          <el-table-column
+            label="鍥炲鏃堕棿"
+            align="center"
+            prop="createTime"
+            width="160"
+          >
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="鎿嶄綔"
+            align="center"
+            width="180"
+            class-name="small-padding fixed-width"
+          >
+            <template slot-scope="scope">
+              <el-button
+                size="medium"
+                type="text"
+                icon="el-icon-edit"
+                class="icon-edit"
+                @click="Referencequestion(scope.row)"
+                v-hasPermi="['system:user:edit']"
+                >缂栬緫璇濇湳</el-button
+              >
+              <el-button
+                size="medium"
+                type="text"
+                icon="el-icon-s-claim"
+                class="icon-s-claim"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['system:user:edit']"
+                >娴嬭瘯鍖归厤</el-button
+              >
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <pagination
+          v-show="total > 0"
+          :total="total"
+          :page.sync="topqueryParams.pageNum"
+          :limit.sync="topqueryParams.pageSize"
+          @pagination="getList"
+        />
+      </el-col>
+    </el-row>
+
+    <!-- 娣诲姞鎴栦慨鏀归鐩厤缃璇濇 -->
+    <!-- 鎸囨爣缂栬緫 -->
+    <el-dialog :visible.sync="indicatorVisible" width="700px">
+      <div class="headline">
+        <div class="basics">闂閰嶇疆</div>
+        <div class="headbottom">
+          <el-button
+            type="primary"
+            icon="el-icon-circle-plus-outline"
+            @click="addzbiao"
+            >娣诲姞鎸囨爣</el-button
+          >
+          <el-button type="primary" icon="el-icon-s-claim">淇濆瓨</el-button>
+          <el-button type="primary" icon="el-icon-document"
+            >鏇存柊鎸囨爣瑙勫垯鑷虫ā鐗�</el-button
+          >
+        </div>
+      </div>
+      <div class="valuetop" v-for="(item, index) in deployList" :key="item.id">
+        <div class="val-text">
+          <div>
+            鏈夋棤澶嶆煡 <span>{{ item.name }}</span>
+          </div>
+          <div class="text-icon" @click="deletei(index)">
+            <i class="el-icon-delete" />
+          </div>
+        </div>
+        <div class="val-bon">
+          <el-form ref="form" :model="form" label-width="80px">
+            <el-form-item label="鎸囨爣绫诲瀷">
+              <el-radio-group v-model="form.resource">
+                <el-radio label="閫夐」"></el-radio>
+                <el-radio label="鏂囨湰"></el-radio>
+                <el-radio label="鏁扮粍"></el-radio>
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item label="鎸囨爣鍚嶇О">
+              <el-input v-model="form.name"></el-input>
+            </el-form-item>
+            <el-form-item label="鎸囨爣鍊�">
+              <el-input v-model="item.name"></el-input>
+            </el-form-item>
+            <el-form-item label="鐗规畩璧勬簮">
+              <el-radio-group v-model="form.resource">
+                <el-radio label="鍩虹"></el-radio>
+                <el-radio label="鑷畾涔�"></el-radio>
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item label="鍩虹瑙勫垯">
+              <el-input type="textarea" v-model="item.valuetop"></el-input>
+            </el-form-item>
+          </el-form>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="indicatorVisible = false">鍏抽棴</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listUser,
+  delUser,
+  addUser,
+  updateUser,
+  changeUserStatus,
+} from "@/api/system/user";
+
+import myAudio from "./myAudio.vue";
+export default {
+  name: "User",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { myAudio },
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鐢ㄦ埛琛ㄦ牸鏁版嵁
+      userList: [
+        {
+          userId: 1,
+          userName: "鐜嬩簲",
+          phonenumber: "13802963330",
+          templateName: "涔屾媺",
+          problem: "鏈�杩戞�庝箞鏍�",
+          reply: "sas",
+          url: "",
+          controlList: "onlyOnePlaying",
+        },
+        {
+          userId: 1,
+          userName: "寮犱簲",
+          phonenumber: "13802963330",
+          templateName: "涔屾媺",
+          problem: "鏈�杩戞�庝箞鏍�",
+          reply: "sas",
+          url: "",
+          controlList: "onlyOnePlaying",
+        },
+      ],
+      deployList: [
+        {
+          id: 1,
+          name: "鏈�",
+          valuetop:
+            "(?!.*蹇榺.*涓峾.*娌�)^.*(鏄瘄鏈墊瀵箌鍋殀浣渱妫�|鏌澶嶈瘖|濂絴鍙傚姞|澶嶈瘖|鍘�(杩噟濂絴浜唡瀹寍鍖婚櫌)|鏉�(杩噟浜唡鍖婚櫌))|娌¢敊|瀵瑰憖|鍙兘|(宸茬粡|鏃�)鍘讳簡|寮�浜嗚嵂|鑵板甫|鍚婂甫|瑕佺殑|(?<!娌�)鏈夌殑|琛ㄥ甫,10;瑕�,5",
+        },
+        {
+          id: 2,
+          name: "涓嶇煡閬�",
+          valuetop:
+            "(涓峾娌璋亅楝紎鎬庝箞).*(鐥厊鍙兘|鐭ラ亾|浜嗚В|娓呮|鎳倈鏄庣櫧|纭|纭畾|鏅撳緱|鐭ユ檽|璁ゅ緱|璇嗗緱|鍗拌薄|鐔熸倝|璁皘浼殀鍏冲績|鍏虫敞|娉ㄦ剰|鍛婅瘔|閫氱煡|鍚�)",
+        },
+      ],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+
+      inputValue: "",
+      indicatorVisible: false, //鎸囨爣缂栬緫寮规
+      radio: "",
+      radios: [],
+      previewtype: 2, //棰勮棰樼洰绫诲瀷
+      total: 0, // 鎬绘潯鏁�
+      ImportQuantity: 999, //瀵奸鐩暟閲�
+      //棰勮棰樼洰淇℃伅
+      previewvalue: {
+        username: "杩欎釜鍖荤敓瀵逛綘鎬庝箞鏍�",
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {
+        phonenumber: "",
+        totagid: "",
+        types: "",
+        nickName: "",
+        qystatus: "",
+        btstatus: "",
+      },
+      //瀵煎叆杩涘害
+      dractive: 1,
+      // 瀵煎叆灞曠ず琛ㄥ崟
+      uploadingData: {},
+      // 鏌ヨ鍙傛暟
+      topqueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userName: undefined,
+        tagid: undefined,
+        topic: undefined,
+      },
+      propss: { multiple: true },
+
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        userName: [
+          { required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 2,
+            max: 20,
+            message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        nickName: [
+          { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        password: [
+          { required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 5,
+            max: 20,
+            message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        email: [
+          {
+            type: "email",
+            message: "璇疯緭鍏ユ纭殑閭鍦板潃",
+            trigger: ["blur", "change"],
+          },
+        ],
+        phonenumber: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+            trigger: "blur",
+          },
+        ],
+        IDnumber: [
+          {
+            pattern:
+              /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/,
+            message: "璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�",
+            trigger: "blur",
+          },
+        ],
+      },
+    };
+  },
+  watch: {},
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 鏌ヨ棰樼洰鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listUser(this.addDateRange(this.topqueryParams, this.dateRange)).then(
+        (response) => {
+          // this.userList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      );
+    },
+    // 缂栬緫璇濇湳鎸囨爣
+    Referencequestion(row) {
+      this.indicatorVisible = true;
+    },
+    // 鏂板鎸囨爣
+    addzbiao() {
+      const ids = this.deployList.length + 1;
+      console.log(ids);
+      this.deployList.push({
+        id: ids,
+        name: "",
+        valuetop: "",
+      });
+    },
+    // 鍒犻櫎鎸囨爣
+    deletei(index) {
+      console.log(index);
+      this.deployList.splice(index, 1);
+    },
+
+    // 棰樼洰鐘舵�佷慨鏀�
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "鍚敤" : "鍋滅敤";
+      this.$modal
+        .confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚楋紵')
+        .then(function () {
+          return changeUserStatus(row.userId, row.status);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "鎴愬姛");
+        })
+        .catch(function () {
+          row.status = row.status === "0" ? "1" : "0";
+        });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.topqueryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.topqueryParams.deptId = undefined;
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    //鍒犻櫎閫夐」
+    handleClose(tag) {
+      this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
+    },
+
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+    },
+
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            updateUser(this.form).then((response) => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUser(this.form).then((response) => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal
+        .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
+        .then(function () {
+          return delUser(userIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download(
+        "system/user/export",
+        {
+          ...this.topqueryParams,
+        },
+        `user_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.el-button--primary.is-plain {
+  color: #ffffff;
+  background: #409eff;
+  border-color: #4fabe9;
+}
+.document {
+  width: 100px;
+  height: 50px;
+}
+.documentf {
+  display: flex;
+  justify-content: flex-end;
+}
+.download {
+  text-align: center;
+  .el-upload__tip {
+    font-size: 23px;
+  }
+  .el-upload__text {
+    font-size: 23px;
+  }
+}
+.uploading {
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #ffffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+.el-tag + .el-tag {
+  margin-left: 10px;
+}
+.button-new-tag {
+  margin-left: 10px;
+  height: 32px;
+  line-height: 30px;
+  padding-top: 0;
+  padding-bottom: 0;
+}
+.input-new-tag {
+  width: 90px;
+  margin-left: 10px;
+  vertical-align: bottom;
+}
+.drexamine {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 30px;
+  background: #daeaf5;
+  img {
+    width: 100px;
+    height: 100px;
+  }
+}
+.qrcode-dialo {
+  // text-align: center;
+  //   display: flex;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .topic-dev {
+    margin-bottom: 25px;
+    font-size: 20px !important;
+    .dev-text {
+      margin-bottom: 10px;
+    }
+  }
+}
+.headline {
+  display: flex;
+  height: 50px;
+  margin: 15px;
+  margin-bottom: 0;
+  padding: 0 20px 20px 20px;
+  line-height: 50px;
+  background: #92c5f0;
+  justify-content: space-between;
+}
+.valuetop {
+  .val-text {
+    display: flex;
+    height: 50px;
+    margin: 15px;
+    margin-bottom: 0;
+    // padding: 0 20px 20px 20px;
+    padding: 0 20px;
+    align-items: center;
+    background: #92c5f0;
+    justify-content: space-between;
+    .text-icon {
+      width: 35px;
+      height: 35px;
+      line-height: 35px;
+      text-align: center;
+      background: #fafafa;
+      cursor: pointer;
+      border-radius: 5px;
+    }
+  }
+  .val-bon {
+    margin: 15px;
+    margin-top: 0;
+    padding: 30px;
+    background: #f2f5fc;
+    border: 1px solid #dcdfe6;
+    -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+      0 0 6px 0 rgba(0, 0, 0, 0.04);
+  }
+}
+.icon-s-claim {
+  color: #409eff;
+}
+.icon-edit {
+  color: rgb(5, 212, 212);
+}
+::v-deep.el-radio-group {
+  span {
+    font-size: 24px;
+  }
+}
+::v-deep.el-checkbox-group {
+  span {
+    font-size: 24px;
+  }
+}
+</style>
diff --git a/src/views/repositoryai/matching/myAudio.vue b/src/views/repositoryai/matching/myAudio.vue
new file mode 100644
index 0000000..ec471d9
--- /dev/null
+++ b/src/views/repositoryai/matching/myAudio.vue
@@ -0,0 +1,288 @@
+<template>
+  <div
+    class="di main-wrap"
+    v-loading="audio.waiting"
+    element-loading-text="闊宠棰戝姞杞戒腑"
+    element-loading-spinner="el-icon-loading"
+  >
+    <!-- 杩欓噷璁剧疆浜唕ef灞炴�у悗锛屽湪vue缁勪欢涓紝灏卞彲浠ョ敤this.$refs.audio鏉ヨ闂dom鍏冪礌 -->
+    <audio
+      ref="audio"
+      class="dn"
+      :src="url"
+      :preload="audio.preload"
+      @play="onPlay"
+      @error="onError"
+      @waiting="onWaiting"
+      @pause="onPause"
+      @timeupdate="onTimeupdate"
+      @loadedmetadata="onLoadedmetadata"
+    ></audio>
+    <div>
+      <!-- 鎾斁 -->
+      <i
+        class="el-icon-microphone"
+        v-if="audio.playing == true"
+        style="color: rgb(10 243 61); font-size: 18px"
+      ></i>
+      <i class="el-icon-microphone" v-else style="font-size: 18px"></i>
+      <el-button style="margin: 0 10px" type="text" @click="startPlayOrPause">{{
+        audio.playing | transPlayPause
+      }}</el-button>
+
+      <!-- 鎾斁鏈�澶ф椂闂� -->
+      <span type="info">{{ audio.maxTime | formatSecond }}</span>
+
+      <!-- 蹇繘鎸夐挳 -->
+      <el-button
+        v-show="!controlList.noSpeed"
+        type="text"
+        @click="changeSpeed"
+        >{{ audio.speed | transSpeed }}</el-button
+      >
+      <a
+        :href="url"
+        v-show="!controlList.noDownload"
+        target="_blank"
+        class="download"
+        download
+        >涓嬭浇</a
+      >
+      <br />
+
+      <!-- 鎾斁鏃堕棿 -->
+      <!-- <el-tag type="info">{{ audio.currentTime | formatSecond }}</el-tag> -->
+
+      <!-- 鎾斁杩涘害鏉� -->
+      <el-slider
+        v-show="!controlList.noProcess"
+        v-model="sliderTime"
+        :format-tooltip="formatProcessToolTip"
+        @change="changeCurrentTime"
+        class="slider"
+      ></el-slider>
+
+      <!-- 闈欓煶鎸夐挳 -->
+      <!-- <el-button
+        v-show="!controlList.noMuted"
+        type="text"
+        @click="startMutedOrNot"
+        >{{ audio.muted | transMutedOrNot }}</el-button
+      > -->
+
+      <!-- 闊抽噺澶у皬 -->
+      <el-slider
+        v-show="!controlList.noVolume"
+        v-model="volume"
+        :format-tooltip="formatVolumeToolTip"
+        @change="changeVolume"
+        class="slider"
+      ></el-slider>
+    </div>
+  </div>
+</template>
+
+<script>
+function realFormatSecond(second) {
+  var secondType = typeof second;
+  if (secondType === "number" || secondType === "string") {
+    second = parseInt(second);
+    var hours = Math.floor(second / 3600);
+    second = second - hours * 3600;
+    var mimute = Math.floor(second / 60);
+    second = second - mimute * 60;
+    return (
+      hours + ":" + ("0" + mimute).slice(-2) + ":" + ("0" + second).slice(-2)
+    );
+  } else {
+    return "0:00:00";
+  }
+}
+export default {
+  // 鐖朵紶瀛�
+  props: {
+    theUrl: {
+      type: String,
+      required: true,
+    },
+    theSpeeds: {
+      type: Array,
+      default() {
+        return [1, 1.5, 2];
+      },
+    },
+    theControlList: {
+      type: String,
+      default: "",
+    },
+  },
+  data() {
+    return {
+      url: this.theUrl,
+      audio: {
+        currentTime: 0,
+        maxTime: 0, // 闊抽鏃堕暱
+        playing: false, // 鏄惁鍦ㄦ挱鏀�
+        muted: false,
+        speed: 1,
+        waiting: false,
+        preload: "auto",
+      },
+      sliderTime: 0,
+      volume: 100,
+      speeds: this.theSpeeds,
+      controlList: {
+        // 涓嶆樉绀轰笅杞�
+        noDownload: false,
+        // 涓嶆樉绀洪潤闊�
+        noMuted: false,
+        // 涓嶆樉绀洪煶閲忔潯
+        noVolume: false,
+        // 涓嶆樉绀鸿繘搴︽潯
+        noProcess: false,
+        // 鍙兘鎾斁涓�涓�
+        onlyOnePlaying: false,
+        // 涓嶈蹇繘鎸夐挳
+        noSpeed: false,
+      },
+    };
+  },
+  methods: {
+    changeSpeed() {
+      let index = this.speeds.indexOf(this.audio.speed) + 1;
+      this.audio.speed = this.speeds[index % this.speeds.length];
+      this.$refs.audio.playbackRate = this.audio.speed;
+    },
+    startMutedOrNot() {
+      this.$refs.audio.muted = !this.$refs.audio.muted;
+      this.audio.muted = this.$refs.audio.muted;
+    },
+    // 闊抽噺鏉oolTip
+    formatVolumeToolTip(index) {
+      return "闊抽噺鏉�: " + index;
+    },
+    // 杩涘害鏉oolTip
+    formatProcessToolTip(index = 0) {
+      index = parseInt((this.audio.maxTime / 100) * index);
+      return "杩涘害鏉�: " + realFormatSecond(index);
+    },
+    // 闊抽噺鏀瑰彉
+    changeVolume(index = 0) {
+      this.$refs.audio.volume = index / 100;
+      this.volume = index;
+    },
+    // 鎾斁璺宠浆
+    changeCurrentTime(index) {
+      this.$refs.audio.currentTime = parseInt(
+        (index / 100) * this.audio.maxTime
+      );
+    },
+    //鏄剧ず鎾斁鎴栬�呮殏鍋�
+    startPlayOrPause() {
+      return this.audio.playing ? this.pausePlay() : this.startPlay();
+    },
+    // 寮�濮嬫挱鏀�
+    startPlay() {
+      // console.log("鎾斁");
+      this.$refs.audio.play();
+    },
+    // 鏆傚仠鎾斁
+    pausePlay() {
+      // console.log("鏆傚仠");
+      this.$refs.audio.pause();
+    },
+
+    // 闊抽鏆傚仠鏃惰Е鍙�
+    onPause() {
+      this.audio.playing = false;
+    },
+    // 闊抽閿欒鏃惰Е鍙�
+    onError() {
+      //   this.audio.waiting = true;
+    },
+    // 闊抽鍑嗗鏃惰Е鍙�
+    onWaiting(res) {
+      console.log("绛夊緟", res);
+    },
+    // 闊抽鎾斁鏃惰Е鍙�
+    onPlay(res) {
+      // console.log("鎾斁", res);
+      this.audio.playing = true;
+      this.audio.loading = false;
+      if (!this.controlList.onlyOnePlaying) {
+        return;
+      }
+      let target = res.target;
+      let audios = document.getElementsByTagName("audio"); //鑾峰彇鎵�鏈夎棰戞爣绛�
+      [...audios].forEach((item) => {
+        if (item !== target) {
+          item.pause();
+        }
+      });
+    },
+    // 鎾斁鏁伴噺闄愬埗锛堝悓鏃跺彧鑳芥挱鏀句竴涓級
+    setControlList() {
+      // 娉ㄦ剰鐖剁粍浠朵紶鐨勫�兼槸鍚︽弧瓒宠姹�
+      let controlList = this.theControlList.split(" ");
+      controlList.forEach((item) => {
+        if (this.controlList[item] !== undefined) {
+          this.controlList[item] = true;
+        }
+      });
+    },
+
+    // 褰搕imeupdate浜嬩欢澶ф姣忕涓�娆★紝鐢ㄦ潵鏇存柊闊抽娴佺殑褰撳墠鎾斁鏃堕棿
+    onTimeupdate(res) {
+      this.audio.currentTime = res.target.currentTime;
+      this.sliderTime = parseInt(
+        (this.audio.currentTime / this.audio.maxTime) * 100
+      );
+    },
+
+    // 褰撳姞杞借闊虫祦鍏冩暟鎹畬鎴愬悗锛屼細瑙﹀彂璇ヤ簨浠剁殑鍥炶皟鍑芥暟
+    onLoadedmetadata(res) {
+      // console.log("鍔犺浇", res);
+      this.audio.waiting = false; // 鍙栨秷绛夊緟鐘舵��
+      this.audio.maxTime = parseInt(res.target.duration);
+    },
+  },
+  // 杩囨护灞炴��
+  filters: {
+    formatSecond(second = 0) {
+      return realFormatSecond(second);
+    },
+    transPlayPause(value) {
+      return value ? "鏆傚仠" : "鎾斁";
+    },
+    transMutedOrNot(value) {
+      return value ? "鏀鹃煶" : "闈欓煶";
+    },
+    transSpeed(value) {
+      return "蹇繘: x" + value;
+    },
+  },
+  created() {
+    this.setControlList();
+  },
+};
+</script>
+
+<style scoped>
+.slider {
+  display: inline-block;
+  width: 100px;
+  position: relative;
+  top: 14px;
+  margin-left: 15px;
+}
+.di {
+  display: inline-block;
+}
+.download {
+  color: #409eff;
+  margin-left: 15px;
+}
+.dn {
+  display: none;
+}
+</style>
diff --git a/src/views/repositoryai/verbaltrick/particulars/index.vue b/src/views/repositoryai/verbaltrick/particulars/index.vue
index f072168..a05e672 100644
--- a/src/views/repositoryai/verbaltrick/particulars/index.vue
+++ b/src/views/repositoryai/verbaltrick/particulars/index.vue
@@ -136,7 +136,7 @@
   margin-bottom: 0;
   padding: 0 20px 20px 20px;
   line-height: 50px;
-  background: #cdcdce;
+  background: #92c5f0;
 }
 .headline {
   display: flex;
@@ -145,7 +145,7 @@
   margin-bottom: 0;
   padding: 0 20px 20px 20px;
   line-height: 50px;
-  background: #cdcdce;
+  background: #92c5f0;
   justify-content: space-between;
 }
 .valuetop {
@@ -157,7 +157,7 @@
     // padding: 0 20px 20px 20px;
     padding: 0 20px;
     align-items: center;
-    background: #cdcdce;
+    background: #92c5f0;
     justify-content: space-between;
     .text-icon {
       width: 35px;
diff --git a/src/views/shortmessage/communication/database/contacts.js b/src/views/shortmessage/communication/database/contacts.js
new file mode 100644
index 0000000..6a4db60
--- /dev/null
+++ b/src/views/shortmessage/communication/database/contacts.js
@@ -0,0 +1,148 @@
+export default [
+    {
+      id: 1,
+      displayName: "鍍忔ⅵ涓�鏍疯嚜鐢�",
+      avatar: "https://p.qqan.com/up/2020-2/2020022821001845128.jpg",
+      index: "X",
+      unread: 0,
+      lastSendTime: 1566047865417,
+      lastContent: "浣犲紑蹇冨悧"
+    },
+    {
+      id: 2,
+      displayName: "姊﹂啋鏃跺垎銆�",
+      avatar: "https://p.qqan.com/up/2021-1/20211301122243621.jpg",
+      index: "M",
+      unread: 0,
+      lastSendTime: 1566047865417,
+      lastContent: ""
+    },
+    {
+      id: 3,
+      displayName: "鍑屼簯",
+      avatar: "https://p.qqan.com/up/2021-1/2021129102387841.jpg",
+      index: "L",
+      unread: 0,
+      lastSendTime: 1566047865417,
+      lastContent: ""
+    },
+    {
+      id: 4,
+      displayName: "灏忛儹",
+      avatar: "https://p.qqan.com/up/2021-1/2021122135507881.jpg",
+      index: "X",
+      unread: 0,
+      lastSendTime: 1566047865417,
+      lastContent: ""
+    },
+    {
+      id: 5,
+      displayName: "鏉ㄧ帀娉�",
+      avatar: "https://p.qqan.com/up/2021-1/20211211131598147.jpg",
+      index: "Y",
+      unread: 0,
+      lastSendTime: 1566047865417,
+      lastContent: ""
+    },
+    {
+      id: 6,
+      displayName: "妫郴Style",
+      avatar: "https://p.qqan.com/up/2021-1/2021113104111220.jpg",
+      index: "S",
+      unread: 0,
+      lastSendTime: 1566047865417,
+      lastContent: ""
+    },
+    {
+      id: 7,
+      displayName: "闇哥帇鑺�",
+      avatar: "https://p.qqan.com/up/2021-1/20211411391666.jpg",
+      index: "B",
+      unread: 0,
+      lastSendTime: 1566047865417,
+      lastContent: "浣犳�庝箞杩樹笉鐫″憖锛�"
+    },
+    {
+      id: 8,
+      displayName: "鏇惧钩",
+      avatar: "https://p.qqan.com/up/2020-12/202012291044425822.jpg",
+      index: "Z",
+      unread: 0,
+      lastSendTime: 1566047865417,
+      lastContent: ""
+    },
+    {
+      id: 9,
+      displayName: "娣$劧",
+      avatar: "https://p.qqan.com/up/2020-12/202012141813343503.jpg",
+      index: "D",
+      unread: 0,
+      lastSendTime: 1566047865417,
+      lastContent: ""
+    },
+    {
+      id: 10,
+      displayName: "鍙跺瓙銆�",
+      avatar: "https://p.qqan.com/up/2021-1/20211301122243621.jpg",
+      index: "Y",
+      unread: 0,
+      lastSendTime: 1566047865417,
+      lastContent: ""
+    },
+    {
+      id: 11,
+      displayName: "鍦熻眴",
+      avatar: "https://p.qqan.com/up/2020-12/202012111157268739.jpg",
+      index: "T",
+      unread: 0,
+      lastSendTime: 1566047865417,
+      lastContent: ""
+    },
+    {
+      id: 12,
+      displayName: "娓呮搏",
+      avatar: "https://p.qqan.com/up/2020-12/202012415467996.jpg",
+      index: "Q",
+      unread: 0,
+      lastSendTime: 1566047865417,
+      lastContent: ""
+    },
+    {
+      id: 13,
+      displayName: "Lemon-imui浜ゆ祦缇�",
+      avatar: "https://p.qqan.com/up/2020-11/20201127157109035.jpg",
+      index: "L",
+      isGroup: true,
+      unread: 0,
+      lastSendTime: 1566047865417,
+      lastContent: "杩欎釜鍜嬪鐞嗗晩锛�"
+    },
+    {
+      id: 14,
+      displayName: "绯荤粺閫氱煡",
+      avatar: "https://p.qqan.com/up/2020-6/2020061117234279854.jpg",
+      index: "[1]绯荤当閫氱煡",
+      unread: 0,
+      lastSendTime: 1566047865417,
+      lastContent: "瀹侀潤鑷磋繙閫氳繃浜嗕綘鐨勫ソ鍙嬭姹�",
+      renderContainer() {
+        return (
+          <div style="padding:15px;">
+            <div>瀹侀潤鑷磋繙閫氳繃浜嗕綘鐨勫ソ鍙嬭姹�</div>
+            <div>瀹侀潤鑷磋繙閫氳繃浜嗕綘鐨勫ソ鍙嬭姹�</div>
+            <div>瀹侀潤鑷磋繙閫氳繃浜嗕綘鐨勫ソ鍙嬭姹�</div>
+          </div>
+        );
+      }
+    },
+    {
+      id: 15,
+      displayName: "瀹侀潤鑷磋繙銆�",
+      avatar: "https://p.qqan.com/up/2020-6/2020060308522797777.jpg",
+      index: "N",
+      unread: 0,
+      lastSendTime: 1566047865417,
+      lastContent: ""
+    }
+  ];
+  
\ No newline at end of file
diff --git a/src/views/shortmessage/communication/database/emoji.js b/src/views/shortmessage/communication/database/emoji.js
new file mode 100644
index 0000000..5872aac
--- /dev/null
+++ b/src/views/shortmessage/communication/database/emoji.js
@@ -0,0 +1,293 @@
+export default [
+    {
+      label: "琛ㄦ儏",
+      children: [
+        {
+          name: "1f600",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f600.png"
+        },
+        {
+          name: "1f62c",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f62c.png"
+        },
+        {
+          name: "1f601",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f601.png"
+        },
+        {
+          name: "1f602",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f602.png"
+        },
+        {
+          name: "1f923",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f923.png"
+        },
+        {
+          name: "1f973",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f973.png"
+        },
+        {
+          name: "1f603",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f603.png"
+        },
+        {
+          name: "1f604",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f604.png"
+        },
+        {
+          name: "1f605",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f605.png"
+        },
+        {
+          name: "1f606",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f606.png"
+        },
+        {
+          name: "1f607",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f607.png"
+        },
+        {
+          name: "1f609",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f609.png"
+        },
+        {
+          name: "1f60a",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f60a.png"
+        },
+        {
+          name: "1f642",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f642.png"
+        },
+        {
+          name: "1f643",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f643.png"
+        },
+        {
+          name: "1263a",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/263a.png"
+        },
+        {
+          name: "1f60b",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f60b.png"
+        },
+        {
+          name: "1f60c",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f60c.png"
+        },
+        {
+          name: "1f60d",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f60d.png"
+        },
+        {
+          name: "1f970",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f970.png"
+        },
+        {
+          name: "1f618",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f618.png"
+        },
+        {
+          name: "1f617",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f617.png"
+        },
+        {
+          name: "1f619",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f619.png"
+        },
+        {
+          name: "1f61a",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f61a.png"
+        },
+        {
+          name: "1f61c",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f61c.png"
+        },
+        {
+          name: "1f92a",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f92a.png"
+        },
+        {
+          name: "1f928",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f928.png"
+        },
+        {
+          name: "1f9d0",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f9d0.png"
+        },
+        {
+          name: "1f61d",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f61d.png"
+        },
+        {
+          name: "1f61b",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f61b.png"
+        },
+        {
+          name: "1f911",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f911.png"
+        },
+        {
+          name: "1f913",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f913.png"
+        },
+        {
+          name: "1f60e",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f60e.png"
+        },
+        {
+          name: "1f929",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f929.png"
+        },
+        {
+          name: "1f921",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f921.png"
+        },
+        {
+          name: "1f920",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f920.png"
+        },
+        {
+          name: "1f917",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f917.png"
+        },
+        {
+          name: "1f60f",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f60f.png"
+        },
+        {
+          name: "1f636",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f636.png"
+        },
+        {
+          name: "1f610",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f610.png"
+        },
+        {
+          name: "1f611",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f611.png"
+        },
+        {
+          name: "1f612",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f612.png"
+        },
+        {
+          name: "1f644",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f644.png"
+        },
+        {
+          name: "1f914",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f914.png"
+        },
+        {
+          name: "1f925",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f925.png"
+        },
+        {
+          name: "1f92d",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f92d.png"
+        },
+        {
+          name: "1f92b",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f92b.png"
+        },
+        {
+          name: "1f92c",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f92c.png"
+        },
+        {
+          name: "1f92f",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f92f.png"
+        },
+        {
+          name: "1f633",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f633.png"
+        },
+        {
+          name: "1f61e",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f61e.png"
+        },
+        {
+          name: "1f61f",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f61f.png"
+        },
+        {
+          name: "1f620",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f620.png"
+        },
+        {
+          name: "1f621",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f621.png"
+        }
+      ]
+    },
+    {
+      label: "鏀惰棌",
+      children: [
+        {
+          name: "1f62c",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f62c.png"
+        },
+        {
+          name: "1f621",
+          title: "寰瑧",
+          src: "https://twemoji.maxcdn.com/2/72x72/1f621.png"
+        }
+      ]
+    }
+  ];
+  
\ No newline at end of file
diff --git a/src/views/shortmessage/communication/database/messages.js b/src/views/shortmessage/communication/database/messages.js
new file mode 100644
index 0000000..e83f1e9
--- /dev/null
+++ b/src/views/shortmessage/communication/database/messages.js
@@ -0,0 +1,154 @@
+import ContactsData from "./contacts";
+import UserData from "./user";
+const generateRandId = () => {
+  return Math.random().toString(36).substr(-8);
+};
+const getContact = (id) => {
+  const data = ContactsData.find((contact) => contact.id == id);
+  return { id: data.id, avatar: data.avatar, displayName: data.displayName };
+};
+export default {
+  1: [
+    {
+      id: generateRandId(),
+      status: "succeed",
+      type: "text",
+      sendTime: 1566047865417,
+      content: "闂綘浠朵簨",
+      toContactId: 1,
+      fromUser: UserData
+    },
+    {
+      id: generateRandId(),
+      status: "succeed",
+      type: "text",
+      sendTime: 1566047865417,
+      content: "鍟ュ瓙銆�",
+      toContactId: 1,
+      fromUser: getContact(1)
+    },
+    {
+      id: generateRandId(),
+      status: "succeed",
+      type: "text",
+      sendTime: 1566047865417,
+      content: "涓轰粈涔�",
+      toContactId: 1,
+      fromUser: UserData
+    },
+    {
+      id: generateRandId(),
+      status: "succeed",
+      type: "text",
+      sendTime: 1566047865417,
+      content: "浣犵┛浜嗛珮璺熼瀷杩樿繖涔堢煯",
+      toContactId: 1,
+      fromUser: UserData
+    },
+    {
+      id: generateRandId(),
+      status: "succeed",
+      type: "text",
+      sendTime: 1566047865417,
+      content: "鍥犱负鎴戠煯鍟娿�俒!1f600][!1f600][!1f600]",
+      toContactId: 1,
+      fromUser: getContact(1)
+    },
+    {
+      id: generateRandId(),
+      status: "succeed",
+      type: "text",
+      sendTime: 1566047865417,
+      content: "浣犲紑蹇冨悧",
+      toContactId: 1,
+      fromUser: getContact(1)
+    }
+  ],
+  2: [],
+  3: [],
+  4: [],
+  5: [],
+  6: [],
+  7: [],
+  8: [],
+  9: [],
+  10: [],
+  11: [],
+  12: [],
+  13: [
+    {
+      id: generateRandId(),
+      status: "succeed",
+      type: "text",
+      sendTime: 1566047865417,
+      content: "鎴戞槸娴嬭瘯鏃跺�欑湅鍒扮殑",
+      toContactId: 1,
+      fromUser: getContact(4)
+    },
+    {
+      id: generateRandId(),
+      status: "succeed",
+      type: "text",
+      sendTime: 1566047865417,
+      content: "涓婃柊鐗堟湰浜嗭紝鐜╃帺",
+      toContactId: 1,
+      fromUser: getContact(4)
+    },
+    {
+      id: generateRandId(),
+      status: "succeed",
+      type: "text",
+      sendTime: 1566047865417,
+      content: "椤圭洰鍐呮病鏈夋悶杩欎釜",
+      toContactId: 1,
+      fromUser: getContact(4)
+    },
+    {
+      id: generateRandId(),
+      status: "succeed",
+      type: "text",
+      sendTime: 1566047865417,
+      content: "@awesome 鏈�鏂扮殑锛屼笉鐒跺摢鏈夎繖鍔熻兘",
+      toContactId: 1,
+      fromUser: getContact(5)
+    },
+    {
+      id: generateRandId(),
+      status: "succeed",
+      type: "text",
+      sendTime: 1566047865417,
+      content: "鍏跺疄鏄窡浣犵殑閬僵灞傛湁鍐茬獊",
+      toContactId: 1,
+      fromUser: getContact(4)
+    },
+    {
+      id: generateRandId(),
+      status: "succeed",
+      type: "text",
+      sendTime: 1566047865417,
+      content: "鑷繁淇敼index鍝�",
+      toContactId: 1,
+      fromUser: UserData
+    },
+    {
+      id: generateRandId(),
+      status: "succeed",
+      type: "text",
+      sendTime: 1566047865417,
+      content: "浣犱滑鍗囩骇鍒版渶杩戠増浜嗗悧锛�",
+      toContactId: 1,
+      fromUser: getContact(6)
+    },
+    {
+      id: generateRandId(),
+      status: "succeed",
+      type: "text",
+      sendTime: 1566047865417,
+      content: "wo 鐜板湪鐢ㄧ殑142",
+      toContactId: 1,
+      fromUser: getContact(7)
+    }
+  ],
+  14: [],
+  15: []
+};
diff --git a/src/views/shortmessage/communication/database/user.js b/src/views/shortmessage/communication/database/user.js
new file mode 100644
index 0000000..8870541
--- /dev/null
+++ b/src/views/shortmessage/communication/database/user.js
@@ -0,0 +1,6 @@
+export default {
+    id: 1000,
+    avatar: "https://p.qqan.com/up/2018-4/15244505348390471.jpg",
+    displayName: "閲庣伀銆�"
+  };
+  
\ No newline at end of file
diff --git a/src/views/shortmessage/communication/index.vue b/src/views/shortmessage/communication/index.vue
new file mode 100644
index 0000000..34e458f
--- /dev/null
+++ b/src/views/shortmessage/communication/index.vue
@@ -0,0 +1,908 @@
+<template>
+  <div id="app">
+    <div class="scroll-top" @click="scrollToTop">馃殌</div>
+
+    <div class="imui-center">
+      <lemon-imui
+        :user="user"
+        ref="IMUI"
+        :contextmenu="contextmenu"
+        :contact-contextmenu="contactContextmenu"
+        :theme="theme"
+        :hide-menu="hideMenu"
+        :hide-menu-avatar="hideMenuAvatar"
+        :hide-message-name="hideMessageName"
+        :hide-message-time="hideMessageTime"
+        @change-menu="handleChangeMenu"
+        @change-contact="handleChangeContact"
+        @pull-messages="handlePullMessages"
+        @message-click="handleMessageClick"
+        @menu-avatar-click="handleMenuAvatarClick"
+        @send="handleSend"
+      >
+        <template #cover>
+          <div class="cover">
+            <i class="lemon-icon-message"></i>
+            <p><b>鑷畾涔夊皝闈� Lemon</b> IMUI</p>
+          </div>
+        </template>
+        <template #message-title="contact">
+          <span>{{ contact.displayName }}</span>
+          <small class="more" @click="changeDrawer(contact, $refs.IMUI)"
+            >{{
+              ($refs.IMUI ? $refs.IMUI.drawerVisible : false) ? "鍏抽棴" : "鎵撳紑"
+            }}鎶藉眽</small
+          >
+          <br />
+        </template>
+      </lemon-imui>
+      <div class="action">
+        <lemon-button @click="appendMessage">鍙戦�佹秷鎭�</lemon-button>
+        <lemon-button @click="appendEventMessage">鍙戦�� event 娑堟伅</lemon-button>
+        <lemon-button @click="removeMessage">鍒犻櫎鏈�杩戜竴鏉℃秷鎭�</lemon-button>
+        <lemon-button @click="updateMessage">淇敼娑堟伅</lemon-button>
+        <lemon-button @click="appendCustomMessage">鍙戦�佹秷鎭�</lemon-button>
+        <br />
+        <lemon-button @click="updateContact">淇敼鑱旂郴浜轰俊鎭�</lemon-button>
+        <lemon-button @click="changeMenuVisible">鍒囨崲瀵艰埅鏄剧ず</lemon-button>
+        <lemon-button @click="changeMenuAvatarVisible"
+          >鍒囨崲澶村儚鏄剧ず</lemon-button
+        >
+        <lemon-button @click="changeMessageNameVisible"
+          >鍒囨崲鑱婂ぉ绐楀彛鍐呭悕瀛楁樉绀�</lemon-button
+        >
+        <lemon-button @click="changeMessageTimeVisible"
+          >鍒囨崲鑱婂ぉ绐楀彛鍐呮椂闂存樉绀�</lemon-button
+        >
+        <lemon-button @click="changeTheme"
+          >鍒囨崲涓婚锛屽綋鍓嶄富棰橈細{{ this.theme }}</lemon-button
+        >
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import LemonMessageVoice from "./lemon-message-voice";
+import EmojiData from "./database/emoji";
+import { sendWebsocket, closeWebsocket } from "@/websocket/websocket.js";
+// Vue.component(LemonMessageVoice.name, LemonMessageVoice);
+// 鑾峰彇鏃堕棿
+const getTime = () => {
+  return new Date().getTime();
+};
+// 闅忔満id
+const generateRandId = () => {
+  return Math.random().toString(36).substr(-8);
+};
+// 闅忔満瀛楃
+const generateRandWord = () => {
+  return Math.random().toString(36).substr(2);
+};
+// 鑾峰彇娑堟伅
+const generateMessage = (toContactId = "", fromUser) => {
+  if (!fromUser) {
+    fromUser = {
+      id: "system",
+      displayName: "绯荤粺娴嬭瘯",
+      avatar: "http://upload.qqbodys.com/allimg/1710/1035512943-0.jpg",
+    };
+  }
+  return {
+    id: generateRandId(),
+    status: "succeed",
+    type: "text",
+    sendTime: getTime(),
+    content: generateRandWord(),
+    //fileSize: 1231,
+    //fileName: "asdasd.doc",
+    toContactId,
+    fromUser,
+  };
+};
+export default {
+  name: "communication",
+  data() {
+    return {
+      theme: "blue",
+      // 鑱旂郴浜哄彸閿搷浣�
+      contactContextmenu: [
+        {
+          text: "鍒犻櫎璇ヨ亰澶�",
+          click: (e, instance, hide) => {
+            const { IMUI, contact } = instance;
+            IMUI.updateContact({
+              id: contact.id,
+              lastContent: null,
+            });
+            if (IMUI.currentContactId == contact.id) IMUI.changeContact(null);
+            hide();
+          },
+        },
+        {
+          text: "璁剧疆澶囨敞鍜屾爣绛�",
+        },
+        {
+          text: "鎶曡瘔",
+        },
+        {
+          icon: "lemon-icon-message",
+          render: (h, instance, hide) => {
+            return (
+              <div style="display:flex;justify-content:space-between;align-items:center;width:130px">
+                <span>鍔犲叆榛戝悕鍗�</span>
+                <span>
+                  <input type="checkbox" id="switch" />
+                  <label id="switch-label" for="switch">
+                    Toggle
+                  </label>
+                </span>
+              </div>
+            );
+          },
+        },
+        {
+          click(e, instance, hide) {
+            const { IMUI, contact } = instance;
+            IMUI.removeContact(contact.id);
+            if (IMUI.currentContactId == contact.id) IMUI.changeContact(null);
+            hide();
+          },
+          color: "red",
+          text: "鍒犻櫎濂藉弸",
+        },
+      ],
+      // 娑堟伅鍙抽敭鎿嶄綔
+      contextmenu: [
+        {
+          click: (e, instance, hide) => {
+            const { IMUI, message } = instance;
+            const data = {
+              id: generateRandId(),
+              type: "event",
+              //浣跨敤 jsx 鏃� click蹇呴』浣跨敤绠ご鍑芥暟锛堜娇涓婁笅鏂囧仠鐣欏湪vue鍐咃級
+              content: (
+                <div>
+                  <span>
+                    浣犳挙鍥炰簡涓�鏉℃秷鎭瘂" "}
+                    <span
+                      v-show={message.type == "text"}
+                      style="color:#333;cursor:pointer"
+                      content={message.content}
+                      on-click={(e) => {
+                        IMUI.setEditorValue(e.target.getAttribute("content"));
+                      }}
+                    >
+                      閲嶆柊缂栬緫
+                    </span>
+                  </span>
+                </div>
+              ),
+
+              toContactId: message.toContactId,
+              sendTime: getTime(),
+            };
+            IMUI.removeMessage(message.id);
+            IMUI.appendMessage(data, true);
+            hide();
+          },
+          visible: (instance) => {
+            return instance.message.fromUser.id == this.user.id;
+          },
+          text: "鎾ゅ洖娑堟伅",
+        },
+        {
+          visible: (instance) => {
+            return instance.message.fromUser.id != this.user.id;
+          },
+          text: "涓炬姤",
+        },
+        {
+          text: "杞彂",
+        },
+        {
+          visible: (instance) => {
+            return instance.message.type == "text";
+          },
+          text: "澶嶅埗鏂囧瓧",
+        },
+        {
+          visible: (instance) => {
+            return instance.message.type == "image";
+          },
+          text: "涓嬭浇鍥剧墖",
+        },
+        {
+          visible: (instance) => {
+            return instance.message.type == "file";
+          },
+          text: "涓嬭浇鏂囦欢",
+        },
+        {
+          click: (e, instance, hide) => {
+            const { IMUI, message } = instance;
+            IMUI.removeMessage(message.id);
+            hide();
+          },
+          icon: "lemon-icon-folder",
+          color: "red",
+          text: "鍒犻櫎",
+        },
+      ],
+      packageData: "",
+      hideMenuAvatar: false,
+      hideMenu: false,
+      hideMessageName: false,
+      hideMessageTime: true,
+      user: {
+        id: "1",
+        displayName: "June",
+        avatar: "",
+      },
+    };
+  },
+
+  created() {},
+  mounted() {
+    const contactData1 = {
+      id: "contact-1",
+      displayName: "宸ヤ綔鍗忎綔缇�",
+      avatar: "http://upload.qqbodys.com/img/weixin/20170804/ji5qxg1am5ztm.jpg",
+      index: "[1]缇ょ粍",
+      unread: 0,
+      lastSendTime: 1566047865417,
+      lastContent: "2",
+    };
+    const contactData2 = {
+      id: "contact-2",
+      displayName: "鑷畾涔夊唴瀹�",
+      avatar: "http://upload.qqbodys.com/img/weixin/20170807/jibfvfd00npin.jpg",
+      //index: "Z",
+      click(next) {
+        next();
+      },
+      renderContainer: () => {
+        return <h1 style="text-indent:20px">鑷畾涔夐〉闈�</h1>;
+      },
+      lastSendTime: 1345209465000,
+      lastContent: "12312",
+      unread: 2,
+    };
+    const contactData3 = {
+      id: "contact-3",
+      displayName: "閾佺墰",
+      avatar: "http://upload.qqbodys.com/img/weixin/20170803/jiq4nzrkrnd0e.jpg",
+      index: "T",
+      unread: 32,
+      lastSendTime: 3,
+      lastContent: "浣犲ソ123",
+    };
+    const contactData4 = {
+      id: "contact-4",
+      displayName: "濡傝姳",
+      avatar:
+        "https://dss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=4275424924,2201401076&fm=111&gp=0.jpg",
+      index: "",
+      unread: 1,
+      lastSendTime: 3,
+      lastContent: "鍚冮キ浜嗗槢",
+    };
+
+    const { IMUI } = this.$refs;
+    setTimeout(() => {
+      IMUI.changeContact("contact-1");
+    }, 500);
+
+    IMUI.setLastContentRender("event", (message) => {
+      return `[鑷畾涔夐�氱煡鍐呭]`;
+    });
+
+    let contactList = [
+      { ...contactData1 },
+      { ...contactData2 },
+      { ...contactData3 },
+      //...Array(100).fill(contactData1)
+    ];
+
+    IMUI.initContacts(contactList);
+    IMUI.initMenus([
+      {
+        name: "messages",
+      },
+      {
+        name: "contacts",
+      },
+      {
+        name: "custom1",
+        title: "鑷畾涔夋寜閽�1",
+        unread: 0,
+        render: (menu) => {
+          return <i class="lemon-icon-attah" />;
+        },
+        renderContainer: () => {
+          return (
+            <div class="article">
+              <ul>
+                <li class="article-item">
+                  <h2>浜烘皯鏃ユ姤璋堢綉绾㈠甫璐э細浜у搧鐪熺殑鍊煎緱涔板悧锛�</h2>
+                </li>
+                <li class="article-item">
+                  鐢樿們澶忔渤鍘垮彂鐢�5.7绾у湴闇� 鏆傛湭鎺ュ埌浜哄憳浼や骸鎶ュ憡
+                </li>
+                <li class="article-item">
+                  鍖楁柟澶氬湴椋庡姏浠嶅己娌欏皹鐩镐即,涓滃寳鍐呰挋鍙ょ瓑鍦拌繋闆ㄩ洩
+                </li>
+                <li class="article-item">
+                  鑻辫揣杞︽锛氳秺鍗楄鏂归噰闆嗙枒姝昏�呭灞濪NA浣滄瘮瀵�
+                </li>
+                <li class="article-item">
+                  鐭ュ悕杩為攣鍜栧暋搴楃殑铔嬬硶鍚冨嚭娲昏櫕 鏇濆厜鍐呭箷澶渿鎯�
+                </li>
+              </ul>
+              <lemon-contact
+                props={{ contact: contactData1 }}
+                style="margin:20px"
+              />
+              <lemon-contact
+                props={{ contact: contactData3 }}
+                style="margin:20px"
+              />
+            </div>
+          );
+        },
+        isBottom: true,
+      },
+      {
+        name: "custom2",
+        title: "鑷畾涔夋寜閽�2",
+        unread: 0,
+        click: () => {
+          alert("鎷︽埅瀵艰埅鐐瑰嚮浜嬩欢");
+        },
+        render: (menu) => {
+          return <i class="lemon-icon-group" />;
+        },
+        isBottom: true,
+      },
+    ]);
+
+    IMUI.initEditorTools([
+      {
+        name: "emoji",
+      },
+      {
+        name: "uploadFile",
+      },
+      {
+        name: "uploadImage",
+      },
+      {
+        name: "test1",
+        click: () => {
+          IMUI.$refs.editor.selectFile("application/vnd.ms-excel");
+        },
+        render: () => {
+          return <span>Excel</span>;
+        },
+      },
+      {
+        name: "test1",
+        click: () => {
+          IMUI.initEditorTools([{ name: "uploadFile" }, { name: "emoji" }]);
+        },
+        render: () => {
+          return <span>閲嶅埗宸ュ叿鏍�</span>;
+        },
+      },
+      {
+        name: "test2",
+        isRight: true,
+        title: "涓婁紶 Excel",
+        click: () => {
+          alert("鐐瑰嚮浜� 路路路 ");
+        },
+        render: () => {
+          return <b>路路路</b>;
+        },
+      },
+    ]);
+    IMUI.initEmoji(EmojiData);
+
+    IMUI.setLastContentRender("voice", (message) => {
+      return <span>[璇煶]</span>;
+    });
+
+    const { SimpleIMUI } = this.$refs;
+    contactData1.id = "11";
+    SimpleIMUI.initContacts([contactData1]);
+    SimpleIMUI.initEmoji(EmojiData);
+    SimpleIMUI.changeContact(contactData1.id);
+  },
+  methods: {
+    changeTheme() {
+      this.theme = this.theme == "default" ? "blue" : "default";
+    },
+    scrollToTop() {
+      document.body.scrollIntoView();
+    },
+    // 鐐瑰嚮宸︿晶瀵艰埅澶村儚瑙﹀彂
+    handleMenuAvatarClick() {
+      console.log("Event:menu-avatar-click");
+    },
+    // 鐐瑰嚮娑堟伅瑙﹀彂
+    handleMessageClick(e, key, message, instance) {
+      console.log("鐐瑰嚮浜嗘秷鎭�", e, key, message);
+
+      if (key == "status") {
+        instance.updateMessage({
+          id: message.id,
+          status: "going",
+          content: "姝e湪閲嶆柊鍙戦�佹秷鎭�...",
+        });
+        setTimeout(() => {
+          instance.updateMessage({
+            id: message.id,
+            status: "succeed",
+            content: "鍙戦�佹垚鍔�",
+          });
+        }, 2000);
+      }
+    },
+    // 闅愯棌瀵艰埅澶村儚
+    changeMenuAvatarVisible() {
+      this.hideMenuAvatar = !this.hideMenuAvatar;
+    },
+    // 闅愯棌宸︿晶瀵艰埅
+    changeMenuVisible() {
+      this.hideMenu = !this.hideMenu;
+    },
+    // 鏄惁闅愯棌鑱婂ぉ绐楀彛鑱旂郴浜哄悕瀛�
+    changeMessageNameVisible() {
+      this.hideMessageName = !this.hideMessageName;
+    },
+    // 鏄惁闅愯棌鑱婂ぉ绐楀彛娑堟伅鏃堕棿
+    changeMessageTimeVisible() {
+      this.hideMessageTime = !this.hideMessageTime;
+    },
+    removeMessage() {
+      const { IMUI } = this.$refs;
+      const messages = IMUI.getCurrentMessages();
+      const id = messages[messages.length - 1].id;
+      if (messages.length > 0) {
+        IMUI.removeMessage(id);
+      }
+    },
+    updateMessage() {
+      const { IMUI } = this.$refs;
+      const messages = IMUI.getCurrentMessages();
+      const message = messages[messages.length - 1];
+      if (messages.length > 0) {
+        const update = {
+          id: message.id,
+          status: "succeed",
+          type: "file",
+          fileName: "琚慨鏀规垚鏂囦欢浜�.txt",
+          fileSize: "4200000",
+        };
+        if (message.type == "event") {
+          update.fromUser = this.user;
+        }
+        IMUI.updateMessage(update);
+        IMUI.messageViewToBottom();
+      }
+    },
+    appendCustomMessage() {
+      const { IMUI } = this.$refs;
+      const message = {
+        id: generateRandId(),
+        status: "succeed",
+        type: "voice",
+        sendTime: getTime(),
+        content: "璇煶娑堟伅",
+        params1: "1",
+        params2: "2",
+        toContactId: "contact-1",
+        fromUser: this.user,
+      };
+      IMUI.appendMessage(message, true);
+    },
+    appendMessage() {
+      const { IMUI } = this.$refs;
+      const contact = IMUI.currentContact;
+      const message = generateMessage("contact-3");
+      message.fromUser = {
+        ...message.fromUser,
+        ...this.user,
+      };
+      IMUI.appendMessage(message, true);
+    },
+    appendEventMessage() {
+      const { IMUI } = this.$refs;
+      const message = {
+        id: generateRandId(),
+        type: "event",
+        content: (
+          <span>
+            閭�璇蜂綘鍔犲叆缇よ亰{" "}
+            <span
+              style="color:#333;cursor:pointer"
+              on-click={() => alert("OK")}
+            >
+              鎺ュ彈
+            </span>
+          </span>
+        ),
+        toContactId: "contact-3",
+        sendTime: getTime(),
+      };
+      IMUI.appendMessage(message, true);
+    },
+    updateContact() {
+      this.$refs.IMUI.updateContact({
+        id: "contact-3",
+        unread: 10,
+        displayName: generateRandWord(),
+        lastSendTime: getTime(),
+        lastContent: "淇敼鏄电О涓洪殢鏈哄瓧姣�",
+      });
+    },
+    changeDrawer(contact, instance) {
+      instance.changeDrawer({
+        //width: 240,
+        //height: "90%",
+        //offsetX:0 ,
+        //offsetY: ,
+        //position: "center",
+        // inside: true,
+        // offsetX: -280,
+        // offsetY: -100,
+        render: () => {
+          return (
+            <div class="drawer-content">
+              <p>
+                <b>鑷畾涔夋娊灞�</b>
+              </p>
+              <p>{contact.displayName}</p>
+            </div>
+          );
+        },
+      });
+    },
+    // 宸︿晶鑱旂郴浜虹偣鍑昏Е鍙�
+    handleChangeContact(contact, instance) {
+      // 鍒囨崲鏃跺叧闂瓀s銆傚洜涓烘湁鍙兘ws杩炴帴鎺ユ敹鏁版嵁灏氭湭瀹屾垚锛岀敤鎴峰氨璺宠浆浜嗛〉闈�
+      this.requstWs();
+      console.log("Event:change-contact");
+      console.log(contact, instance);
+      instance.updateContact({
+        id: contact.id,
+        unread: 0,
+      });
+      instance.closeDrawer();
+    },
+    // 寤虹珛杩炴帴
+    requstWs() {
+      console.log("杩炴帴");
+      // 闃叉鐢ㄦ埛澶氭杩炵画鐐瑰嚮鍙戣捣璇锋眰锛屾墍浠ヨ鍏堝叧闂笂娆$殑ws璇锋眰銆�
+      closeWebsocket();
+      // 璺熷悗绔崗鍟嗭紝闇�瑕佷粈涔堝弬鏁版暟鎹粰鍚庡彴
+      const obj = {
+        type: "text",
+        content: "甯濆緱鍦g浉鐩告洶搴�",
+        userId: "1", //鎺ユ敹鏁版嵁鏂�
+      };
+      // 鍙戣捣ws璇锋眰
+      sendWebsocket(
+        "ws://192.168.1.4:8080/chat?userId=2",
+        obj,
+        this.wsMessage,
+        this.wsError
+      );
+    },
+    // 鎺ユ敹ws杩斿洖鐨勬暟鎹�
+    wsMessage(data) {
+      const dataJson = data;
+      console.log(dataJson);
+      const datas = {
+        id: "鍞竴娑堟伅ID",
+        status: "succeed",
+        type: "text",
+        sendTime: 1566047865417,
+        content: "椹笂灏卞鎺ュ畬浜嗭紒",
+        toContactId: 2,
+        fromUser: {
+          //濡傛灉 id == this.user.id娑堟伅浼氭樉绀哄湪鍙充晶锛屽惁鍒欏湪宸︿晶
+          id: 2,
+          displayName: "涓藉畨濞�",
+          avatar: "",
+        },
+      };
+      // IMUI.appendMessage(data);
+    },
+    //ws閿欒鍥炶皟
+    wsError(data) {
+      console.log(data);
+    },
+    // 鍙戦�佹柊娑堟伅瑙﹀彂
+    handleSend(message, next, file) {
+      console.log(message, file);
+      console.log(next);
+      this.requstWs();
+      setTimeout(() => {
+        next();
+      }, 1000);
+    },
+    // 鑾峰彇鑱旂郴浜轰俊鎭垨婊氬姩鍒伴《閮ㄨЕ鍙�
+    handlePullMessages(contact, next, instance) {
+      console.log(contact, "鑾峰彇鑱旂郴浜轰俊鎭疉");
+      console.log(instance, "鑾峰彇鑱旂郴浜轰俊鎭疊");
+      console.log(next, "鑾峰彇鑱旂郴浜轰俊鎭疌");
+      const otheruser = {
+        id: contact.id,
+        displayName: contact.displayName,
+        avatar: contact.avatar,
+      };
+      setTimeout(() => {
+        const messages = [
+          generateMessage(instance.currentContactId, this.user),
+          generateMessage(instance.currentContactId, otheruser),
+          generateMessage(instance.currentContactId, this.user),
+          generateMessage(instance.currentContactId, otheruser),
+          generateMessage(instance.currentContactId, this.user),
+          generateMessage(instance.currentContactId, this.user),
+          generateMessage(instance.currentContactId, otheruser),
+          {
+            ...generateMessage(instance.currentContactId, this.user),
+            ...{ status: "failed" },
+          },
+        ];
+        let isEnd = false;
+        if (
+          instance.getMessages(instance.currentContactId).length +
+            messages.length >
+          11
+        )
+          isEnd = true;
+        next(messages, isEnd);
+      }, 500);
+    },
+    // 宸︿晶瀵艰埅鍗″垏鎹㈡椂闂�
+    handleChangeMenu() {
+      console.log("Event:change-menu");
+    },
+    openCustomContainer() {},
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+scss ::selection {
+  background: #000;
+  color: #fff;
+}
+body {
+  font-family: "Microsoft YaHei";
+  background: #f6f6f6 !important;
+}
+#app {
+  width: 90%;
+  margin: 0 auto;
+  padding-bottom: 100px;
+  .scroll-top {
+    cursor: pointer;
+    position: fixed;
+    bottom: 40px;
+    left: 50%;
+    border-radius: 50%;
+    background: #fff;
+    font-size: 18px;
+    overflow: hidden;
+    width: 40px;
+    height: 40px;
+    line-height: 40px;
+    user-select: none;
+    text-align: center;
+    transform: rotate(-45deg) translateX(-50%);
+    box-shadow: 0 0 30px rgba(0, 0, 0, 0.1);
+    &:hover {
+      font-size: 22px;
+    }
+  }
+  a {
+    color: #0c5ed9;
+    text-decoration: none;
+    font-size: 12px;
+  }
+  .action {
+    margin-top: 20px;
+    .lemon-button {
+      margin-right: 10px;
+      margin-bottom: 10px;
+    }
+  }
+  .link {
+    font-size: 14px;
+    margin-top: 15px;
+    a {
+      display: inline-block;
+      margin: 0 5px;
+      text-decoration: none;
+      background: #ffba00;
+      border-radius: 4px;
+      padding: 5px 10px;
+      color: rgba(0, 0, 0, 0.8);
+    }
+  }
+  .logo {
+    position: relative;
+    display: inline-block;
+    margin: 60px auto;
+    user-select: none;
+    .logo-text {
+      font-size: 38px;
+    }
+    .logo-sub {
+      font-size: 18px;
+      color: #999;
+      font-weight: 300;
+    }
+    .logo-badge {
+      position: absolute;
+      top: -10px;
+      left: 230px;
+      background: #000;
+      border-radius: 16px;
+      color: #f9f9f9;
+      font-size: 12px;
+      padding: 4px 8px;
+    }
+  }
+  .title {
+    font-size: 24px;
+    line-height: 26px;
+    border-left: 1px solid #ffba00;
+    padding-left: 15px;
+    margin-bottom: 15px;
+    margin-top: 30px;
+    user-select: none;
+  }
+  .table {
+    width: 100%;
+    border-radius: 10px;
+    background: #fff;
+    border-collapse: collapse;
+    tr {
+      cursor: pointer;
+    }
+    tr:not(.table-head):hover {
+      background: #ffba00 !important;
+    }
+    tr:nth-of-type(even) {
+      background: #f9f9f9;
+    }
+    th {
+      user-select: none;
+      color: #999;
+    }
+    td,
+    th {
+      text-align: left;
+      padding: 10px 15px;
+      font-size: 14px;
+      font-weight: normal;
+    }
+  }
+  .imui-center {
+    margin-bottom: 60px;
+    .lemon-wrapper {
+      border: 1px solid #ddd;
+    }
+    .lemon-drawer {
+      border: 1px solid #ddd;
+      border-left: 0;
+    }
+  }
+  .drawer-content {
+    padding: 15px;
+  }
+  .more {
+    font-size: 12px;
+    line-height: 24px;
+    height: 24px;
+    position: absolute;
+    top: 14px;
+    right: 14px;
+    cursor: pointer;
+    user-select: none;
+    color: #f1f1f1;
+    display: inline-block;
+    border-radius: 4px;
+    background: #111;
+    padding: 0 8px;
+    &:active {
+      background: #999;
+    }
+  }
+  .bar {
+    text-align: center;
+    line-height: 30px;
+    background: #fff;
+    margin: 15px;
+    color: #666;
+    user-select: none;
+    font-size: 12px;
+  }
+  .cover {
+    text-align: center;
+    user-select: none;
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    i {
+      font-size: 84px;
+      color: #e6e6e6;
+    }
+    p {
+      font-size: 18px;
+      color: #ddd;
+      line-height: 50px;
+    }
+  }
+  .article-item {
+    line-height: 34px;
+    cursor: pointer;
+    &:hover {
+      text-decoration: underline;
+      color: #318efd;
+    }
+  }
+  pre {
+    background: #fff;
+    border-radius: 8px;
+    padding: 15px;
+  }
+}
+.lemon-simple .lemon-container {
+  z-index: 5;
+}
+.lemon-simple .lemon-drawer {
+  z-index: 4;
+}
+input#switch[type="checkbox"] {
+  height: 0;
+  width: 0;
+  display: none;
+}
+label#switch-label {
+  cursor: pointer;
+  text-indent: -9999px;
+  width: 34px;
+  height: 20px;
+  background: #aaa;
+  display: block;
+  border-radius: 100px;
+  position: relative;
+}
+label#switch-label:after {
+  content: "";
+  position: absolute;
+  top: 2px;
+  left: 2px;
+  width: 16px;
+  height: 16px;
+  background: #fff;
+  border-radius: 20px;
+  transition: 0.3s;
+}
+input#switch:checked + label {
+  background: #0fd547;
+}
+input#switch:checked + label:after {
+  left: calc(100% - 2px);
+  transform: translateX(-100%);
+}
+label#switch-label:active:after {
+  width: 20px;
+}
+</style>
diff --git a/src/views/shortmessage/communication/lemon-message-voice.vue b/src/views/shortmessage/communication/lemon-message-voice.vue
new file mode 100644
index 0000000..1f91e54
--- /dev/null
+++ b/src/views/shortmessage/communication/lemon-message-voice.vue
@@ -0,0 +1,35 @@
+<script>
+export default {
+  name: "lemonMessageVoice",
+  inheritAttrs: false,
+  inject: ["IMUI"],
+  render() {
+    return (
+      <lemon-message-basic
+        class="lemon-message-voice"
+        props={{ ...this.$attrs }}
+        scopedSlots={{
+          content: (props) => {
+            return <span>{props.content}&nbsp;馃攬</span>;
+          },
+        }}
+      />
+    );
+  },
+};
+</script>
+<style lang="scss" scoped>
+.lemon-message.lemon-message-voice {
+  user-select: none;
+
+  .lemon-message__content {
+    border: 2px solid #000;
+    font-size: 12px;
+    cursor: pointer;
+
+    &::before {
+      display: none;
+    }
+  }
+}
+</style>
diff --git a/src/views/shortmessage/healthinformation/index.vue b/src/views/shortmessage/healthinformation/index.vue
new file mode 100644
index 0000000..65f835a
--- /dev/null
+++ b/src/views/shortmessage/healthinformation/index.vue
@@ -0,0 +1,17 @@
+<template>
+  <div></div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {};
+  },
+
+  created() {},
+
+  methods: {},
+};
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/src/views/shortmessage/messagebank/index.vue b/src/views/shortmessage/messagebank/index.vue
new file mode 100644
index 0000000..98fc3b7
--- /dev/null
+++ b/src/views/shortmessage/messagebank/index.vue
@@ -0,0 +1,932 @@
+<template>
+  <div class="Questionnairemanagement">
+    <!-- 宸︿晶鏍� -->
+    <div class="sidecolumn">
+      <div class="notebuttom"><i class="el-icon-chat-dot-square" />鍙戠煭淇�</div>
+      <div class="notestate">
+        <div class="state-text">鐭俊鐘舵��</div>
+        <div class="state-line">
+          <div class="value-left">
+            <i class="el-icon-chat-dot-square" />鍏ㄩ儴
+          </div>
+          <div class="quantityq">22</div>
+        </div>
+        <div class="state-line">
+          <div class="value-left">
+            <i class="el-icon-chat-dot-square" />鍙戦�佹垚鍔�
+          </div>
+          <div class="quantitycg">22</div>
+        </div>
+        <div class="state-line">
+          <div class="value-left">
+            <i class="el-icon-chat-dot-square" />鍙戦�佸け璐�
+          </div>
+          <div class="quantitysb">22</div>
+        </div>
+        <div class="state-line">
+          <div class="value-left">
+            <i class="el-icon-chat-dot-square" />寰呭彂閫�
+          </div>
+          <div class="quantityd">22</div>
+        </div>
+      </div>
+    </div>
+    <!-- 鍙充晶鏁版嵁 -->
+    <div class="leftvlue">
+      <div class="leftvlue-top">鐭俊璇︽儏</div>
+      <div class="leftvlue-bg">
+        <el-row :gutter="20">
+          <!--鐢ㄦ埛鏁版嵁-->
+          <el-col :span="24" :xs="24">
+            <el-form
+              :model="queryParams"
+              ref="queryForm"
+              size="small"
+              :inline="true"
+              v-show="showSearch"
+              label-width="98px"
+            >
+              <el-form-item label="鎵嬫満鍙�" prop="userName">
+                <el-input
+                  v-model="queryParams.userName"
+                  placeholder="璇疯緭鍏�"
+                  clearable
+                  style="width: 200px"
+                  @keyup.enter.native="handleQuery"
+                />
+              </el-form-item>
+              <el-form-item label="鍒涘缓鏃堕棿">
+                <el-date-picker
+                  v-model="dateRange"
+                  style="width: 240px"
+                  value-format="yyyy-MM-dd"
+                  type="daterange"
+                  range-separator="-"
+                  start-placeholder="寮�濮嬫棩鏈�"
+                  end-placeholder="缁撴潫鏃ユ湡"
+                ></el-date-picker>
+              </el-form-item>
+              <el-form-item label="鐭俊绫诲瀷" prop="status">
+                <el-select v-model="queryParams.status" placeholder="璇烽�夋嫨">
+                  <el-option
+                    v-for="item in languagelist"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="鎿嶄綔鐢ㄦ埛" prop="status">
+                <el-select v-model="queryParams.statusa" placeholder="璇烽�夋嫨">
+                  <el-option
+                    v-for="item in qyoptions"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+
+              <el-form-item>
+                <el-button
+                  type="primary"
+                  icon="el-icon-search"
+                  size="medium"
+                  @click="handleQuery"
+                  >鎼滅储</el-button
+                >
+                <el-button
+                  icon="el-icon-refresh"
+                  size="medium"
+                  @click="resetQuery"
+                  >閲嶇疆</el-button
+                >
+              </el-form-item>
+            </el-form>
+
+            <el-row :gutter="10" class="mb8">
+              <el-col :span="1.5">
+                <el-button
+                  type="primary"
+                  plain
+                  icon="el-icon-plus"
+                  size="medium"
+                  @click="handleAdd"
+                  v-hasPermi="['system:user:add']"
+                  >鏂板</el-button
+                >
+              </el-col>
+
+              <el-col :span="1.5">
+                <el-button
+                  type="danger"
+                  plain
+                  icon="el-icon-delete"
+                  size="medium"
+                  :disabled="multiple"
+                  @click="handleDelete"
+                  v-hasPermi="['system:user:remove']"
+                  >鍒犻櫎</el-button
+                >
+              </el-col>
+
+              <!-- <el-col :span="1.5"> </el-col> -->
+            </el-row>
+            <el-table
+              v-loading="loading"
+              :data="userList"
+              :border="true"
+              @selection-change="handleSelectionChange"
+            >
+              <el-table-column type="selection" width="50" align="center" />
+              <el-table-column
+                label="搴忓彿"
+                align="center"
+                key="userId"
+                prop="userId"
+              />
+              <el-table-column
+                label="涓绘棬"
+                align="center"
+                key="userName"
+                prop="userName"
+                :show-overflow-tooltip="true"
+              />
+              <el-table-column
+                label="闂鏂囨湰"
+                align="center"
+                key="nickName"
+                prop="nickName"
+                width="400"
+                :show-overflow-tooltip="true"
+              />
+
+              <el-table-column
+                label="闂璇煶"
+                align="center"
+                key="aphonenumber"
+                prop="aphonenumber"
+                width="400"
+              /><el-table-column
+                label="鍏宠仈鎸囨爣"
+                align="center"
+                key="bphonenumber"
+                prop="bphonenumber"
+                width="120"
+              />
+              <el-table-column
+                label="鎸囨爣閫夐」"
+                align="center"
+                key="bphonenumber"
+                prop="bphonenumber"
+                width="120"
+              />
+              <el-table-column
+                label="璇█"
+                align="center"
+                key="indicator"
+                prop="indicator"
+                width="120"
+              />
+              <el-table-column label="鏄惁鍚敤" align="center" key="status">
+                <template slot-scope="scope">
+                  <el-switch
+                    v-model="scope.row.status"
+                    active-value="0"
+                    inactive-value="1"
+                    @change="handleStatusChange(scope.row)"
+                  ></el-switch>
+                </template>
+              </el-table-column>
+
+              <el-table-column
+                label="鎿嶄綔"
+                align="center"
+                width="200"
+                class-name="small-padding fixed-width"
+              >
+                <template slot-scope="scope">
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="handleUpdate(scope.row)"
+                    v-hasPermi="['system:user:edit']"
+                    ><span class="button-textxg"
+                      ><i class="el-icon-edit-outline"></i>淇敼</span
+                    ></el-button
+                  >
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="compileUpdate(scope.row)"
+                    v-hasPermi="['system:user:edit']"
+                    ><span class="button-bji"
+                      ><i class="el-icon-edit"></i>缂栬緫鐭俊</span
+                    ></el-button
+                  >
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="handleDelete(scope.row)"
+                    v-hasPermi="['system:user:remove']"
+                    ><span class="button-textsc"
+                      ><i class="el-icon-delete-solid"></i>鍒犻櫎</span
+                    ></el-button
+                  >
+                </template>
+              </el-table-column>
+            </el-table>
+
+            <pagination
+              v-show="total > 0"
+              :total="total"
+              :page.sync="queryParams.pageNum"
+              :limit.sync="queryParams.pageSize"
+              @pagination="getList"
+            />
+          </el-col>
+        </el-row>
+
+        <!-- 娣诲姞鎴栦慨鏀圭煭淇¢厤缃璇濇 -->
+        <el-dialog
+          :title="title"
+          :visible.sync="indexopen"
+          width="900px"
+          append-to-body
+        >
+          <el-form
+            ref="form"
+            :model="indexform"
+            :rules="rules"
+            label-width="100px"
+          >
+            <el-row>
+              <el-col :span="24">
+                <el-form-item label="璇█" prop="deptId">
+                  <el-select
+                    v-model="indexform.language"
+                    placeholder="璇烽�夋嫨璇█"
+                  >
+                    <el-option
+                      v-for="index in languagelist"
+                      :key="index.value"
+                      :label="index.label"
+                      :value="index.value"
+                    ></el-option>
+                  </el-select>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="24">
+                <el-form-item label="鐭俊涓绘棬" prop="nickName">
+                  <el-input
+                    v-model="indexform.nickName"
+                    placeholder="璇疯緭鍏ョ煭淇′富鏃�"
+                    maxlength="80"
+                  />
+                </el-form-item> </el-col
+            ></el-row>
+            <el-row>
+              <el-col :span="24">
+                <div
+                  style="display: flex; margin-left: 100px; margin-bottom: 10px"
+                >
+                  <div class="tsgname" @click="tsgnameto()">鍖婚櫌鍚嶇О</div>
+                  <div class="tsgname" @click="tsgnameto()">鍖婚櫌鐢佃瘽</div>
+                  <div class="tsgname" @click="tsgnameto()">鍖婚櫌濮撳悕</div>
+                  <div class="tsgname" @click="tsgnameto()">闅忚濮撳悕</div>
+                  <div class="tsgname" @click="tsgnameto()">闅忚鐢佃瘽</div>
+                  <div class="tsgname" @click="tsgnameto()">鎬у埆</div>
+                  <div class="tsgname" @click="tsgnameto()">骞撮緞</div>
+                  <div class="tsgname" @click="tsgnameto()">鍦板潃</div>
+                </div>
+              </el-col></el-row
+            >
+            <el-row>
+              <el-col :span="24">
+                <el-form-item label="鐭俊鏂囨湰" prop="verbaltricktext">
+                  <el-input v-model="indexform.userName" maxlength="30" />
+                </el-form-item> </el-col
+            ></el-row>
+            <el-row>
+              <el-col :span="24">
+                <el-form-item label="鐭俊璇煶" prop="verbaltrickyy">
+                  <el-input v-model="indexform.userName" maxlength="30" />
+                </el-form-item> </el-col
+            ></el-row>
+            <el-row>
+              <el-col :span="24">
+                <el-form-item label="鏃犲尮閰嶆枃鏈�" prop="matchtext">
+                  <el-input v-model="indexform.userName" maxlength="30" />
+                </el-form-item> </el-col
+            ></el-row>
+            <el-row>
+              <el-col :span="24">
+                <el-form-item label="鏃犲尮閰嶈闊�" prop="matchyy">
+                  <el-input v-model="indexform.userName" maxlength="30" />
+                </el-form-item> </el-col
+            ></el-row>
+            <el-row>
+              <el-col :span="24">
+                <el-form-item label="鏃犲0鏂囨湰" prop="silenttext">
+                  <el-input v-model="indexform.userName" maxlength="30" />
+                </el-form-item> </el-col
+            ></el-row>
+            <el-row>
+              <el-col :span="24">
+                <el-form-item label="鏃犲0璇煶" prop="silentyy">
+                  <el-input v-model="indexform.userName" maxlength="30" />
+                </el-form-item> </el-col
+            ></el-row>
+            <el-row>
+              <el-col :span="24">
+                <el-form-item label="閫氱敤搴撴枃鏈�" prop="librarytext">
+                  <el-input v-model="indexform.userName" maxlength="30" />
+                </el-form-item> </el-col
+            ></el-row>
+            <el-row>
+              <el-col :span="24">
+                <el-form-item label="閫氱敤搴撹闊�" prop="libraryy">
+                  <el-input v-model="indexform.userName" maxlength="30" />
+                </el-form-item> </el-col
+            ></el-row>
+            <el-row>
+              <el-col :span="24">
+                <el-form-item label="鍚笉娓呮枃鏈�" prop="vaguetext">
+                  <el-input v-model="indexform.userName" maxlength="30" />
+                </el-form-item> </el-col
+            ></el-row>
+            <el-row>
+              <el-col :span="24">
+                <el-form-item label="鍚笉娓呰闊�" prop="vagueyy">
+                  <el-input v-model="indexform.userName" maxlength="30" />
+                </el-form-item> </el-col
+            ></el-row>
+
+            <el-row>
+              <el-col :span="24">
+                <el-form-item label="鐭俊瑙勫垯" prop="email">
+                  <el-input
+                    v-model="indexform.remark"
+                    type="textarea"
+                    placeholder="璇疯緭鍏ュ唴瀹�"
+                  ></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="24">
+                <el-form-item label="鏄惁鍚敤">
+                  <el-radio-group v-model="indexform.qystatus">
+                    <el-radio
+                      v-for="item in qyoptions"
+                      :key="item.value"
+                      :label="item.value"
+                      >{{ item.label }}</el-radio
+                    >
+                  </el-radio-group>
+                </el-form-item>
+              </el-col>
+            </el-row>
+
+            <el-row>
+              <el-col :span="24">
+                <el-form-item label="澶囨敞">
+                  <el-input
+                    v-model="indexform.remark"
+                    type="textarea"
+                    placeholder="璇疯緭鍏ュ唴瀹�"
+                  ></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </el-form>
+          <div slot="footer" class="dialog-footer">
+            <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+          </div>
+        </el-dialog>
+      </div>
+    </div>
+    <!-- 娣诲姞绫诲埆寮规 -->
+    <el-dialog
+      :title="amendtag ? '淇敼绫诲埆' : '鏂板绫诲埆'"
+      width="30%"
+      :visible.sync="dialogFormVisible"
+    >
+      <el-form :model="classifyform">
+        <el-form-item
+          :label="amendtag ? '璇疯緭鍏ユ柊鐨勭被鍒悕绉�' : '璇疯緭鍏ョ被鍒悕绉�'"
+        >
+          <el-input
+            v-model="classifyform.categoryname"
+            autocomplete="off"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogFormVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitsidecolumn">纭� 瀹�</el-button>
+      </div>
+    </el-dialog>
+    <!-- 鍒犻櫎绫诲埆纭妗� -->
+    <el-dialog title="璀﹀憡" :visible.sync="deleteVisible" width="40%">
+      <div style="font-size: 20px; color: rgb(247, 76, 76)">
+        鏄惁纭鍒犻櫎鍒嗙被锛歔<span>{{ deletefenl }}</span
+        >]?
+      </div>
+      <div style="font-size: 20px">
+        姝ゆ搷浣滀細灏嗚绫诲埆涓嬫墍鏈夋ā鍧楄浆绉昏嚦[鏈垎绫籡锛屾槸鍚︾户缁垹闄ゆ鍒嗙被锛�
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="deleteVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="deletefenlei">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listUser,
+  getUser,
+  delUser,
+  addUser,
+  updateUser,
+} from "@/api/system/user";
+import { getToken } from "@/utils/auth";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+export default {
+  name: "questionnaire",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      topactiveName: "Local", //椤堕儴閫夋嫨
+      // 閬僵灞�
+      loading: false,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      namequestionnaire: "",
+      haoquestionnaire: "",
+      idds: "",
+      amendtag: false, //鏄惁淇敼绫诲埆
+      dialogFormVisible: false, //淇敼娣诲姞绫诲埆寮规
+      deleteVisible: false, //鍒嗙被鍒犻櫎寮规
+      deletefenl: "楂樿鍘�", //鍒犻櫎椤�
+      classifyform: {
+        categoryname: "",
+      }, //绫诲埆琛ㄥ崟
+      // 琛ㄦ牸鏁版嵁
+      userList: [
+        {
+          userid: 1,
+          userName: "琛�甯歌銆佸翱甯歌",
+          nickName: "璐",
+          aphonenumber: "(?!涓�.*|娌�.*|鏈�.*)^.*([璐钩鍑]|璐|璇勫|璇勫),10",
+          bphonenumber: "閫夋嫨",
+          cphonenumber: "鏅�氳瘽",
+          status: "0",
+        },
+      ],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      // 瑙掕壊閫夐」
+      roleOptions: [],
+      // 娣诲姞銆佷慨鏀瑰弬鏁�
+      indexform: {},
+      numberlb: 22,
+      numberlbs: 2,
+      sidecolumnform: {}, //娣诲姞绫诲埆琛ㄥ崟
+      dialogFormVisible: false, //娣诲姞绫诲埆寮规
+      sidecolumnval: "", //绫诲埆鎼滅储
+      indexopen: false, //寮规灞曠ず鍚�
+      propss: { multiple: true },
+      languagelist: [
+        {
+          value: 1,
+          label: "鍏ㄩ儴",
+        },
+        {
+          value: 2,
+          label: "鍑洪櫌鐥呮儏闅忚",
+        },
+        {
+          value: 3,
+          label: "璇煶闅忚鍚庣煭淇�",
+        },
+        {
+          value: 4,
+          label: "鍖荤敓闅忚鍚庣煭淇�",
+        },
+      ], //璇█鍒楄〃
+      qyoptions: [
+        {
+          value: 1,
+          label: "鍚敤",
+        },
+        {
+          value: 2,
+          label: "鍏抽棴",
+        },
+      ],
+      //绫诲埆鍒楄〃
+      editableTabs: [
+        {
+          title: "鐭俊鍒嗙被涓�",
+          number: "1",
+        },
+        {
+          title: "鐭俊鍒嗙被浜�",
+          number: "2",
+        },
+        {
+          title: "鐭俊鍒嗙被涓�",
+          number: "2",
+        },
+        {
+          title: "鐭俊鍒嗙被鍥�",
+          number: "2",
+        },
+        {
+          title: "鐭俊鍒嗙被浜�",
+          number: "2",
+        },
+      ],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userName: undefined,
+        phonenumber: undefined,
+        status: undefined,
+        deptId: undefined,
+        IDnumber: undefined,
+      },
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        userName: [
+          { required: true, message: "涓绘棬涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 2,
+            max: 20,
+            message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        nickName: [
+          { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        password: [
+          { required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 5,
+            max: 20,
+            message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        email: [
+          {
+            type: "email",
+            message: "璇疯緭鍏ユ纭殑閭鍦板潃",
+            trigger: ["blur", "change"],
+          },
+        ],
+        phonenumber: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+            trigger: "blur",
+          },
+        ],
+        IDnumber: [
+          {
+            pattern:
+              /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/,
+            message: "璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�",
+            trigger: "blur",
+          },
+        ],
+      },
+    };
+  },
+  watch: {},
+  created() {
+    this.getList();
+  },
+
+  methods: {
+    /** 鏌ヨ鐢ㄦ埛鍒楄〃 */
+    getList() {
+      //   this.loading = true;
+      listUser().then((response) => {
+        console.log(response);
+        console.log(this.userList);
+      });
+    },
+    // 娣诲姞銆佷慨鏀圭被鍒�
+    submitsidecolumn() {
+      if (this.amendtag) {
+        this.classifyform.tagcategoryid = this.idds;
+        // toamendtagcategory(this.addDateRange(this.classifyform)).then(
+        //   (response) => {
+        //     console.log(response);
+        //     this.gitclasify();
+        //   }
+        // );
+      } else {
+        // addtagcategory(this.addDateRange(this.classifyform)).then(
+        //   (response) => {
+        //     console.log(response);
+        //     this.gitclasify();
+        //   }
+        // );
+      }
+      this.classifyform = {
+        categoryname: "",
+      };
+      this.idds = "";
+      this.dialogFormVisible = false;
+    },
+    //鍒犻櫎鍒嗙被
+    deletefenlei(row) {
+      if (this.deleteVisible) {
+        // deletetagcategory(this.idds).then((response) => {
+        //   console.log(response);
+        //   this.gitclasify();
+        // });
+        this.deleteVisible = false;
+        this.idds = "";
+      } else {
+        this.deleteVisible = true;
+        this.idds = row.tagcategoryid;
+        this.deletefenl = row.title;
+      }
+    },
+    compileUpdate(row) {
+      this.$router.push({
+        path: "/repositoryai/verbaltrick/particulars/",
+        query: { id: "1" },
+      });
+    },
+    // 棰樼洰鐘舵�佷慨鏀�
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "鍚敤" : "鍋滅敤";
+      this.$modal
+        .confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚楋紵')
+        .then(function () {
+          return changeUserStatus(row.userId, row.status);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "鎴愬姛");
+        })
+        .catch(function () {
+          row.status = row.status === "0" ? "1" : "0";
+        });
+    },
+    //鎼滅储绫诲埆
+    sidecolumnss() {},
+    // 渚挎嵎鏍囩
+    tsgnameto() {},
+    // 鍒囨崲鍏变韩/鏈湴
+    tophandleClick() {},
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.indexopen = false;
+      this.reset();
+    },
+
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams.deptId = undefined;
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.title = "鏂板鐭俊";
+      this.indexopen = true;
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      this.title = "淇敼鐭俊";
+      this.indexopen = true;
+    },
+    // 淇敼鍒嗙被寮规
+    popoveramend(tagcategoryid) {
+      this.idds = tagcategoryid;
+      this.amendtag = true;
+      this.dialogFormVisible = true;
+    },
+
+    /** 鏇存柊/淇敼鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            updateUser(this.form).then((response) => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.indexopen = false;
+              this.getList();
+            });
+          } else {
+            addUser(this.form).then((response) => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.indexopen = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal
+        .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
+        .then(function () {
+          return delUser(userIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.Questionnairemanagement {
+  display: flex;
+}
+.sidecolumn {
+  width: 300px;
+  min-height: 100vh;
+  text-align: center;
+  //   display: flex;
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .sidecolumn-top {
+    display: flex;
+    justify-content: space-between;
+    .top-wj {
+      font-size: 20px;
+    }
+    .top-tj {
+      font-size: 18px;
+
+      color: rgb(0, 89, 255);
+      cursor: pointer;
+    }
+  }
+  .center-ss {
+    margin-top: 30px;
+    .input-with-select {
+      height: 40px !important;
+    }
+  }
+  .bottom-fl {
+    margin-top: 30px;
+    display: center !important;
+  }
+}
+.qrcode-dialo {
+  text-align: center;
+  //   display: flex;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .qrcode-text {
+    font-size: 20px;
+    span {
+      margin-left: 20px;
+    }
+  }
+  .qrcode-img {
+    width: 300px;
+    height: 400px;
+  }
+}
+.tsgname {
+  width: 90px;
+  margin-right: 10px;
+  text-align: center;
+  cursor: pointer;
+  height: 40px;
+  line-height: 40px;
+  background: #7799fa;
+  color: #ffff;
+  font-size: 18px;
+  border-radius: 5px;
+}
+.tsgname:hover {
+  background: #3366f5;
+}
+::v-deep.el-tabs--left,
+.el-tabs--right {
+  overflow: hidden;
+  align-items: center;
+  display: flex;
+}
+::v-deep.el-input--medium .el-input__inner {
+  height: 40px !important;
+}
+::v-deep.el-tabs--right .el-tabs__active-bar.is-right {
+  height: 40px;
+  width: 5px;
+  left: 0;
+}
+::v-deep.el-tabs--right .el-tabs__item.is-right {
+  display: block;
+  font-size: 20px;
+}
+.leftvlue {
+  //   display: flex;
+  //   flex: 1;
+  width: 80%;
+  margin-top: 20px;
+  //   margin: 20px;
+  padding: 30px;
+  background: #ffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .mulsz {
+    font-size: 20px;
+  }
+}
+.button-text {
+  color: rgb(70, 204, 238);
+}
+.button-bji {
+  color: rgb(39, 167, 67);
+}
+.button-textxg {
+  color: rgb(35, 81, 233);
+}
+.button-textsc {
+  color: rgb(235, 23, 23);
+}
+</style>
diff --git a/src/views/shortmessage/taglibrary/index.vue b/src/views/shortmessage/taglibrary/index.vue
new file mode 100644
index 0000000..77e57b6
--- /dev/null
+++ b/src/views/shortmessage/taglibrary/index.vue
@@ -0,0 +1,711 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <!--鐢ㄦ埛鏁版嵁-->
+      <el-col :span="24" :xs="24">
+        <el-form
+          :model="topqueryParams"
+          ref="queryForm"
+          size="small"
+          :inline="true"
+          v-show="showSearch"
+          label-width="98px"
+        >
+          <el-form-item label="鏍囩鍚嶇О" prop="userName">
+            <el-input
+              v-model="topqueryParams.userName"
+              placeholder="璇疯緭鍏�"
+              clearable
+              style="width: 200px"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+
+          <el-form-item>
+            <el-button
+              type="primary"
+              icon="el-icon-search"
+              size="medium"
+              @click="handleQuery"
+              >鎼滅储</el-button
+            >
+            <el-button icon="el-icon-refresh" size="medium" @click="resetQuery"
+              >閲嶇疆</el-button
+            >
+          </el-form-item>
+        </el-form>
+        <el-divider></el-divider>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              plain
+              icon="el-icon-plus"
+              size="medium"
+              @click="handleAdd"
+              v-hasPermi="['system:user:add']"
+              >鏂板</el-button
+            >
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="success"
+              plain
+              icon="el-icon-edit"
+              size="medium"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['system:user:edit']"
+              >淇敼</el-button
+            >
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="danger"
+              plain
+              icon="el-icon-delete"
+              size="medium"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['system:user:remove']"
+              >鍒犻櫎</el-button
+            >
+          </el-col>
+          <el-col :span="19">
+            <div class="documentf">
+              <div class="document">
+                <el-button
+                  type="warning"
+                  plain
+                  icon="el-icon-download"
+                  size="medium"
+                  @click="handleExport"
+                  v-hasPermi="['system:user:export']"
+                  >瀵煎嚭</el-button
+                >
+              </div>
+            </div>
+          </el-col>
+          <!-- <el-col :span="1.5"> </el-col> -->
+        </el-row>
+        <!-- <right-toolbar
+              :showSearch.sync="showSearch"
+              @queryTable="getList"
+              :columns="columns"
+            ></right-toolbar> -->
+        <el-table
+          v-loading="loading"
+          :data="userList"
+          @selection-change="handleSelectionChange"
+        >
+          <el-table-column type="selection" width="50" align="center" />
+          <el-table-column
+            label="搴忓彿"
+            align="center"
+            key="userId"
+            prop="userId"
+          />
+
+          <el-table-column
+            label="鏍囩鍚嶇О"
+            align="center"
+            key="userName"
+            prop="userName"
+            :show-overflow-tooltip="true"
+          />
+          <el-table-column
+            label="璐﹀彿"
+            align="center"
+            key="types"
+            prop="types"
+          />
+          <el-table-column
+            label="瀵嗙爜"
+            align="center"
+            key="nickName"
+            prop="nickName"
+          />
+          <el-table-column
+            label="澶囨敞"
+            align="center"
+            key="phonenumber"
+            prop="phonenumber"
+            width="120"
+          />
+          <el-table-column label="鏄惁鍚敤" align="center" key="status">
+            <template slot-scope="scope">
+              <el-switch
+                v-model="scope.row.status"
+                active-value="0"
+                inactive-value="1"
+                @change="handleStatusChange(scope.row)"
+              ></el-switch>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="鏈�杩戞洿鏂版棩鏈�"
+            align="center"
+            prop="createTime"
+            width="160"
+          >
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="鎿嶄綔"
+            align="center"
+            width="160"
+            class-name="small-padding fixed-width"
+          >
+            <template slot-scope="scope">
+              <el-button
+                size="medium"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['system:user:edit']"
+                >缂栬緫</el-button
+              >
+              <el-button
+                size="medium"
+                type="text"
+                @click="handleDelete(scope.row)"
+                ><span style="color: rgb(236, 55, 55)"
+                  ><i class="el-icon-delete-solid"></i>鍒犻櫎</span
+                ></el-button
+              >
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <pagination
+          v-show="total > 0"
+          :total="total"
+          :page.sync="topqueryParams.pageNum"
+          :limit.sync="topqueryParams.pageSize"
+          @pagination="getList"
+        />
+      </el-col>
+    </el-row>
+
+    <!-- 娣诲姞鎴栦慨鏀规爣绛鹃厤缃璇濇 -->
+    <el-dialog
+      :title="title"
+      :visible.sync="addalteropen"
+      width="900px"
+      append-to-body
+    >
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鏍囩鍚嶇О" prop="nickName">
+              <el-input
+                v-model="form.nickName"
+                placeholder="璇疯緭鍏�"
+                maxlength="30"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鐭俊骞冲彴璐﹀彿" prop="email">
+              <el-input
+                v-model="form.nickName"
+                placeholder="璇疯緭鍏�"
+                maxlength="30"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鐭俊骞冲彴瀵嗙爜" prop="email">
+              <el-input
+                v-model="form.nickName"
+                placeholder="璇疯緭鍏�"
+                maxlength="30"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鏄惁鍚敤">
+              <el-radio-group v-model="form.qystatus">
+                <el-radio
+                  v-for="item in qyoptions"
+                  :key="item.value"
+                  :label="item.value"
+                  >{{ item.label }}</el-radio
+                >
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="澶囨敞">
+              <el-input
+                v-model="form.remark"
+                type="textarea"
+                placeholder="璇疯緭鍏ュ唴瀹�"
+              ></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listUser,
+  getUser,
+  delUser,
+  addUser,
+  updateUser,
+  resetUserPwd,
+  changeUserStatus,
+} from "@/api/system/user";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "User",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鐢ㄦ埛琛ㄦ牸鏁版嵁
+      userList: null,
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず淇敼銆佹坊鍔犲脊鍑哄眰
+      addalteropen: false,
+      // 閮ㄩ棬鍚嶇О
+      deptName: undefined,
+      // 榛樿瀵嗙爜
+      initPassword: undefined,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      // 瑙掕壊閫夐」
+      roleOptions: [],
+      dynamicTags: ["閫夐」涓�", "閫夐」浜�", "閫夐」涓�"], //閫夐」
+      inputVisible: false,
+      inputValue: "",
+      previewVisible: false, //鏍囩棰勮寮规
+      radio: "",
+      radios: [],
+      previewtype: 2, //棰勮鏍囩绫诲瀷
+      total: 0, // 鎬绘潯鏁�
+      ImportQuantity: 999, //瀵兼爣绛炬暟閲�
+      //棰勮鏍囩淇℃伅
+      previewvalue: {
+        username: "杩欎釜鍖荤敓瀵逛綘鎬庝箞鏍�",
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {
+        phonenumber: "",
+        totagid: "",
+        types: "",
+        nickName: "",
+        qystatus: "",
+        btstatus: "",
+      },
+
+      // 鏌ヨ鍙傛暟
+      topqueryParams: {
+        pageNum: 1,
+      },
+      propss: { multiple: true },
+      optionss: [
+        {
+          value: 1,
+          label: "涓滃崡",
+        },
+        {
+          value: 2,
+          label: "瑗垮寳",
+        },
+        {
+          value: 3,
+          label: "浠ㄤ花浠�",
+        },
+        {
+          value: 4,
+          label: "鍏椋掗",
+        },
+      ],
+      qyoptions: [
+        {
+          value: 1,
+          label: "鍚敤",
+        },
+        {
+          value: 2,
+          label: "鍏抽棴",
+        },
+      ],
+      btoptions: [
+        {
+          value: 1,
+          label: "蹇呭~",
+        },
+        {
+          value: 2,
+          label: "闈炲繀濉�",
+        },
+      ],
+      topicoptions: [
+        {
+          value: 1,
+          label: "鍗曢��",
+        },
+        {
+          value: 2,
+          label: "澶氶��",
+        },
+        {
+          value: 3,
+          label: "濉┖",
+        },
+      ],
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        userName: [
+          { required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 2,
+            max: 20,
+            message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        nickName: [
+          { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        password: [
+          { required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 5,
+            max: 20,
+            message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        email: [
+          {
+            type: "email",
+            message: "璇疯緭鍏ユ纭殑閭鍦板潃",
+            trigger: ["blur", "change"],
+          },
+        ],
+        phonenumber: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+            trigger: "blur",
+          },
+        ],
+        IDnumber: [
+          {
+            pattern:
+              /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/,
+            message: "璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�",
+            trigger: "blur",
+          },
+        ],
+      },
+    };
+  },
+  watch: {},
+  created() {
+    this.getList();
+    this.getConfigKey("sys.user.initPassword").then((response) => {
+      this.initPassword = response.msg;
+    });
+  },
+  methods: {
+    /** 鏌ヨ鏍囩鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listUser(this.addDateRange(this.topqueryParams, this.dateRange)).then(
+        (response) => {
+          this.userList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      );
+    },
+
+    // 鏍囩鐘舵�佷慨鏀�
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "鍚敤" : "鍋滅敤";
+      this.$modal
+        .confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚楋紵')
+        .then(function () {
+          return changeUserStatus(row.userId, row.status);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "鎴愬姛");
+        })
+        .catch(function () {
+          row.status = row.status === "0" ? "1" : "0";
+        });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.addalteropen = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.topqueryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.topqueryParams.deptId = undefined;
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    //鍒犻櫎閫夐」
+    handleClose(tag) {
+      this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
+    },
+    //瑙﹀彂鏂板杈撳叆
+    showInput() {
+      this.inputVisible = true;
+      this.$nextTick((_) => {
+        this.$refs.saveTagInput.$refs.input.focus();
+      });
+    },
+    //鑾峰彇澶卞幓鐒︾偣瑙﹀彂
+    handleInputConfirm() {
+      let inputValue = this.inputValue;
+      if (inputValue) {
+        this.dynamicTags.push(inputValue);
+      }
+      this.inputVisible = false;
+      this.inputValue = "";
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.title = "鏂板鏍囩";
+      this.addalteropen = true;
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      this.title = "淇敼鏍囩";
+      this.addalteropen = true;
+      //   const userId = row.userId || this.ids;
+      //   getUser(userId).then((response) => {
+      //     this.form = response.data;
+      //     this.postOptions = response.posts;
+      //     this.roleOptions = response.roles;
+      //     this.$set(this.form, "postIds", response.postIds);
+      //     this.$set(this.form, "roleIds", response.roleIds);
+      //     this.addalteropen = true;
+      //     this.form.password = "";
+      //   });
+    },
+    /** 閲嶇疆瀵嗙爜鎸夐挳鎿嶄綔 */
+    handleResetPwd(row) {
+      this.$prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        closeOnClickModal: false,
+        inputPattern: /^.{5,20}$/,
+        inputErrorMessage: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+      })
+        .then(({ value }) => {
+          resetUserPwd(row.userId, value).then((response) => {
+            this.$modal.msgSuccess("淇敼鎴愬姛锛屾柊瀵嗙爜鏄細" + value);
+          });
+        })
+        .catch(() => {});
+    },
+
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            updateUser(this.form).then((response) => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUser(this.form).then((response) => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal
+        .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
+        .then(function () {
+          return delUser(userIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download(
+        "system/user/export",
+        {
+          ...this.topqueryParams,
+        },
+        `user_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.el-button--primary.is-plain {
+  color: #ffffff;
+  background: #409eff;
+  border-color: #4fabe9;
+}
+.document {
+  width: 100px;
+  height: 50px;
+}
+.documentf {
+  display: flex;
+  justify-content: flex-end;
+}
+.download {
+  text-align: center;
+  .el-upload__tip {
+    font-size: 23px;
+  }
+  .el-upload__text {
+    font-size: 23px;
+  }
+}
+.uploading {
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #ffffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+.el-tag + .el-tag {
+  margin-left: 10px;
+}
+.button-new-tag {
+  margin-left: 10px;
+  height: 32px;
+  line-height: 30px;
+  padding-top: 0;
+  padding-bottom: 0;
+}
+.input-new-tag {
+  width: 90px;
+  margin-left: 10px;
+  vertical-align: bottom;
+}
+.drexamine {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 30px;
+  background: #daeaf5;
+  img {
+    width: 100px;
+    height: 100px;
+  }
+}
+.qrcode-dialo {
+  // text-align: center;
+  //   display: flex;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .topic-dev {
+    margin-bottom: 25px;
+    font-size: 20px !important;
+    .dev-text {
+      margin-bottom: 10px;
+    }
+  }
+}
+::v-deep.el-radio-group {
+  span {
+    font-size: 24px;
+  }
+}
+::v-deep.el-checkbox-group {
+  span {
+    font-size: 24px;
+  }
+}
+</style>
diff --git a/src/websocket/websocket.js b/src/websocket/websocket.js
new file mode 100644
index 0000000..d7090e8
--- /dev/null
+++ b/src/websocket/websocket.js
@@ -0,0 +1,113 @@
+import { Message } from 'element-ui'
+// import { getToken } from '@/utils/authToken' // 涓庡悗绔殑鍗忓晢锛寃ebsocket璇锋眰闇�瑕佸甫涓妕oken鍙傛暟
+let websock = null
+let messageCallback = null
+let errorCallback = null
+let wsUrl = ''
+let tryTime = 0
+ 
+// 鎺ユ敹ws鍚庣杩斿洖鐨勬暟鎹�
+function websocketonmessage (e) { 
+    console.log(e);
+  messageCallback(JSON.stringify(e.data))
+}
+ 
+/**
+ * 鍙戣捣websocket杩炴帴
+ * @param {Object} agentData 闇�瑕佸悜鍚庡彴浼犻�掔殑鍙傛暟鏁版嵁
+ */
+function websocketSend (agentData) {
+  // 鍔犲欢杩熸槸涓轰簡灏介噺璁﹚s杩炴帴鐘舵�佸彉涓篛PEN   
+  setTimeout(() => { 
+    // 娣诲姞鐘舵�佸垽鏂紝褰撲负OPEN鏃讹紝鍙戦�佹秷鎭�
+    if (websock.readyState === websock.OPEN) { // websock.OPEN = 1 
+      // 鍙戠粰鍚庣鐨勬暟鎹渶瑕佸瓧绗︿覆鍖�
+      websock.send(JSON.stringify(agentData))
+      console.log('杩炴帴鎴愬姛');
+    }
+    if (websock.readyState === websock.CLOSED) { // websock.CLOSED = 3 
+      console.log('websock.readyState=3')
+      Message.error('ws杩炴帴寮傚父锛岃绋嶅�欓噸璇昪')
+      errorCallback()
+    }
+  }, 500)
+}
+
+// 鍏抽棴ws杩炴帴
+function websocketclose (e) {  
+  // e.code === 1000  琛ㄧず姝e父鍏抽棴銆� 鏃犺涓轰綍鐩殑鑰屽垱寤�, 璇ラ摼鎺ラ兘宸叉垚鍔熷畬鎴愪换鍔°��
+  // e.code !== 1000  琛ㄧず闈炴甯稿叧闂��
+  if (e && e.code !== 1000) {
+    Message.error('ws杩炴帴寮傚父锛岃绋嶅�欓噸璇昩')
+    errorCallback()
+    // // 濡傛灉闇�瑕佽缃紓甯搁噸杩炲垯鍙浛鎹负涓嬮潰鐨勪唬鐮侊紝鑷杩涜娴嬭瘯
+    // if (tryTime < 10) {
+    //   setTimeout(function() {
+    //    websock = null
+    //    tryTime++
+    //    initWebSocket()
+    //    console.log(`绗�${tryTime}娆¢噸杩瀈)
+    //  }, 3 * 1000)
+    //} else {
+    //  Message.error('閲嶈繛澶辫触锛佽绋嶅悗閲嶈瘯')
+    //}
+  }
+}
+// 寤虹珛ws杩炴帴
+function websocketOpen (e) {
+  // console.log('ws杩炴帴鎴愬姛')
+}
+ 
+// 鍒濆鍖杦eosocket
+function initWebSocket () { 
+  if (typeof (WebSocket) === 'undefined') {
+    Message.error('鎮ㄧ殑娴忚鍣ㄤ笉鏀寔WebSocket锛屾棤娉曡幏鍙栨暟鎹�')
+    return false
+  }
+  
+//   const token = 'JWT=' + getToken()
+  // ws璇锋眰瀹屾暣鍦板潃
+//   const requstWsUrl = wsUrl + '?' + token
+  const requstWsUrl = wsUrl
+  websock = new WebSocket(requstWsUrl)
+
+  websock.onmessage = function (e) {
+    websocketonmessage(e)
+  } 
+  websock.onopen = function () {
+    websocketOpen()
+  }
+  websock.onerror = function () {
+    Message.error('ws杩炴帴寮傚父锛岃绋嶅�欓噸璇昦')
+    errorCallback()
+  }
+  websock.onclose = function (e) {
+    // websocketclose(e)
+  } 
+}
+ 
+/**
+ * 鍙戣捣websocket璇锋眰鍑芥暟
+ * @param {string} url ws杩炴帴鍦板潃
+ * @param {Object} agentData 浼犵粰鍚庡彴鐨勫弬鏁�
+ * @param {function} successCallback 鎺ユ敹鍒皐s鏁版嵁锛屽鏁版嵁杩涜澶勭悊鐨勫洖璋冨嚱鏁�
+ * @param {function} errCallback ws杩炴帴閿欒鐨勫洖璋冨嚱鏁�
+ */
+export function sendWebsocket (url, agentData, successCallback, errCallback) { 
+  wsUrl = url
+  initWebSocket()
+  messageCallback = successCallback
+  errorCallback = errCallback
+  websocketSend(agentData)
+}
+
+/**
+ * 鍏抽棴websocket鍑芥暟
+ */
+export function closeWebsocket () {
+  if (websock) {
+    websock.close() // 鍏抽棴websocket
+    websock.onclose() // 鍏抽棴websocket
+  }
+}
+

--
Gitblit v1.9.3