From b7f7f38d7ead0939d82a8a0fb301b30b72398acc Mon Sep 17 00:00:00 2001
From: WXL <1785969728@qq.com>
Date: 星期四, 07 八月 2025 09:54:22 +0800
Subject: [PATCH] 测试完成

---
 src/views/knowledge/drug/index.vue    | 1072 +++++++++++++++++++++
 src/views/login.vue                   |    6 
 src/views/system/group/index.vue      | 1343 +++++++++++++++++++++++++++
 src/views/knowledge/article/index.vue |  486 +++++++++
 4 files changed, 2,893 insertions(+), 14 deletions(-)

diff --git a/src/views/knowledge/article/index.vue b/src/views/knowledge/article/index.vue
new file mode 100644
index 0000000..587ad77
--- /dev/null
+++ b/src/views/knowledge/article/index.vue
@@ -0,0 +1,486 @@
+<template>
+  <div class="ArticleManagement">
+    <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="68px">
+          <el-form-item label="鏂囩珷鏍囬" prop="title">
+            <el-input
+              v-model="queryParams.title"
+              placeholder="璇疯緭鍏ユ枃绔犳爣棰�"
+              clearable
+              style="width: 200px"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="鏂囩珷鍒嗙被" prop="category">
+            <el-select v-model="queryParams.category" placeholder="璇烽�夋嫨鍒嗙被" clearable style="width: 200px">
+              <el-option
+                v-for="item in categoryOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="鐘舵��" prop="status">
+            <el-select v-model="queryParams.status" placeholder="璇烽�夋嫨鐘舵��" clearable style="width: 200px">
+              <el-option
+                v-for="item in statusOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </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"
+            >鏂板</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="danger"
+              plain
+              icon="el-icon-delete"
+              size="medium"
+              :disabled="multiple"
+              @click="handleDelete"
+            >鍒犻櫎</el-button>
+          </el-col>
+        </el-row>
+
+        <el-table v-loading="loading" :data="filteredArticleList" @selection-change="handleSelectionChange">
+          <el-table-column type="selection" width="50" align="center" />
+          <el-table-column label="鏂囩珷ID" align="center" prop="id" width="80" />
+          <el-table-column label="鏂囩珷鏍囬" align="center" prop="title" :show-overflow-tooltip="true" />
+          <el-table-column label="鏂囩珷鍒嗙被" align="center" prop="category" width="120">
+            <template slot-scope="scope">
+              <dict-tag :options="categoryOptions" :value="scope.row.category"/>
+            </template>
+          </el-table-column>
+          <el-table-column label="灏侀潰鍥�" align="center" prop="coverImage" width="120">
+            <template slot-scope="scope">
+              <el-image
+                v-if="scope.row.coverImage"
+                style="width: 80px; height: 60px"
+                :src="scope.row.coverImage"
+                :preview-src-list="[scope.row.coverImage]"
+                fit="cover"
+              />
+              <span v-else>鏃犲皝闈�</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="浣滆��" align="center" prop="author" width="120" />
+          <el-table-column label="鍙戝竷鏃堕棿" align="center" prop="publishTime" width="160">
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.publishTime, '{y}-{m}-{d} {h}:{i}') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="闃呰閲�" align="center" prop="views" width="80" />
+          <el-table-column label="鐘舵��" align="center" prop="status" width="100">
+            <template slot-scope="scope">
+              <dict-tag :options="statusOptions" :value="scope.row.status"/>
+            </template>
+          </el-table-column>
+          <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width" width="180">
+            <template slot-scope="scope">
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+              >淇敼</el-button>
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+              >鍒犻櫎</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="open" width="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="鏂囩珷鏍囬" prop="title">
+              <el-input v-model="form.title" placeholder="璇疯緭鍏ユ枃绔犳爣棰�" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鏂囩珷鍒嗙被" prop="category">
+              <el-select v-model="form.category" placeholder="璇烽�夋嫨鍒嗙被">
+                <el-option
+                  v-for="item in categoryOptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鐘舵��" prop="status">
+              <el-radio-group v-model="form.status">
+                <el-radio
+                  v-for="dict in statusOptions"
+                  :key="dict.value"
+                  :label="dict.value"
+                >{{dict.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="灏侀潰鍥�">
+              <el-upload
+                class="avatar-uploader"
+                action="#"
+                :show-file-list="false"
+                :on-change="handleCoverChange"
+                :auto-upload="false">
+                <img v-if="form.coverImage" :src="form.coverImage" class="avatar">
+                <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+              </el-upload>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鏂囩珷鎽樿" prop="summary">
+              <el-input
+                type="textarea"
+                :rows="3"
+                v-model="form.summary"
+                placeholder="璇疯緭鍏ユ枃绔犳憳瑕�"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鏂囩珷鍐呭" prop="content">
+              <editor v-model="form.content" :min-height="300"/>
+            </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 { parseTime } from '@/utils/ruoyi'
+
+export default {
+  name: "ArticleManagement",
+  dicts: ['sys_normal_disable', 'sys_user_sex'],
+  data() {
+    return {
+      // 閬僵灞�
+      loading: false,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鏂囩珷琛ㄦ牸鏁版嵁
+      articleList: [
+        {
+          id: 1,
+          title: "濡備綍鎻愰珮鍓嶇寮�鍙戞晥鐜�",
+          category: "1",
+          coverImage: "https://pic.rmb.bdstatic.com/bjh/news/5e5f1b3e7b1a8a7f8a3d6a7d3a6a7d3a.jpeg",
+          author: "寮犱笁",
+          publishTime: "2023-05-10 09:30:00",
+          views: 1250,
+          status: "1",
+          summary: "鏈枃浠嬬粛浜嗗嚑绉嶆彁楂樺墠绔紑鍙戞晥鐜囩殑鏂规硶鍜屽伐鍏�",
+          content: "<p>鍓嶇寮�鍙戞晥鐜囩殑鎻愬崌瀵逛簬椤圭洰杩涘害鑷冲叧閲嶈...</p>"
+        },
+        {
+          id: 2,
+          title: "Vue3鏂扮壒鎬цВ鏋�",
+          category: "2",
+          coverImage: "https://pic.rmb.bdstatic.com/bjh/news/8e5f1b3e7b1a8a7f8a3d6a7d3a6a7d3a.jpeg",
+          author: "鏉庡洓",
+          publishTime: "2023-05-15 14:20:00",
+          views: 3200,
+          status: "1",
+          summary: "璇︾粏瑙f瀽Vue3鐨勬柊鐗规�у拰浣跨敤鍦烘櫙",
+          content: "<p>Vue3甯︽潵浜嗚澶氫护浜哄叴濂嬬殑鏂扮壒鎬�...</p>"
+        },
+        {
+          id: 3,
+          title: "Element UI浣跨敤鎶�宸�",
+          category: "3",
+          coverImage: "https://pic.rmb.bdstatic.com/bjh/news/9e5f1b3e7b1a8a7f8a3d6a7d3a6a7d3a.jpeg",
+          author: "鐜嬩簲",
+          publishTime: "2023-05-20 10:15:00",
+          views: 890,
+          status: "0",
+          summary: "鍒嗕韩涓�浜汦lement UI鐨勯珮绾т娇鐢ㄦ妧宸�",
+          content: "<p>Element UI浣滀负娴佽鐨刄I妗嗘灦锛屾湁璁稿瀹炵敤鎶�宸�...</p>"
+        },
+        {
+          id: 4,
+          title: "鍓嶇鎬ц兘浼樺寲鎸囧崡",
+          category: "1",
+          coverImage: "https://pic.rmb.bdstatic.com/bjh/news/7e5f1b3e7b1a8a7f8a3d6a7d3a6a7d3a.jpeg",
+          author: "璧靛叚",
+          publishTime: "2023-05-25 16:45:00",
+          views: 4500,
+          status: "1",
+          summary: "鍏ㄩ潰鐨勫墠绔�ц兘浼樺寲鏂规硶鍜屽疄璺�",
+          content: "<p>鎬ц兘浼樺寲鏄墠绔紑鍙戜腑姘告亽鐨勮瘽棰�...</p>"
+        },
+        {
+          id: 5,
+          title: "TypeScript鍏ラ棬鏁欑▼",
+          category: "2",
+          coverImage: "https://pic.rmb.bdstatic.com/bjh/news/6e5f1b3e7b1a8a7f8a3d6a7d3a6a7d3a.jpeg",
+          author: "閽变竷",
+          publishTime: "2023-06-01 11:10:00",
+          views: 2100,
+          status: "1",
+          summary: "浠庨浂寮�濮嬪涔燭ypeScript",
+          content: "<p>TypeScript浣滀负JavaScript鐨勮秴闆嗚秺鏉ヨ秺鍙楁杩�...</p>"
+        }
+      ],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        title: undefined,
+        category: undefined,
+        status: undefined
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        title: [
+          { required: true, message: "鏂囩珷鏍囬涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        category: [
+          { required: true, message: "鏂囩珷鍒嗙被涓嶈兘涓虹┖", trigger: "change" }
+        ],
+        status: [
+          { required: true, message: "鐘舵�佷笉鑳戒负绌�", trigger: "change" }
+        ],
+        summary: [
+          { required: true, message: "鏂囩珷鎽樿涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        content: [
+          { required: true, message: "鏂囩珷鍐呭涓嶈兘涓虹┖", trigger: "blur" }
+        ]
+      },
+      // 鏂囩珷鍒嗙被閫夐」
+      categoryOptions: [
+        { value: "1", label: "鎶�鏈枃绔�" },
+        { value: "2", label: "鏁欑▼鎸囧崡" },
+        { value: "3", label: "缁忛獙鍒嗕韩" },
+        { value: "4", label: "琛屼笟璧勮" }
+      ],
+      // 鐘舵�侀�夐」
+      statusOptions: [
+        { value: "0", label: "鑽夌" },
+        { value: "1", label: "宸插彂甯�" },
+        { value: "2", label: "宸蹭笅鏋�" }
+      ]
+    };
+  },
+  computed: {
+    filteredArticleList() {
+      let list = [...this.articleList];
+      if (this.queryParams.title) {
+        list = list.filter(item =>
+          item.title.includes(this.queryParams.title)
+        );
+      }
+      if (this.queryParams.category) {
+        list = list.filter(item =>
+          item.category === this.queryParams.category
+        );
+      }
+      if (this.queryParams.status) {
+        list = list.filter(item =>
+          item.status === this.queryParams.status
+        );
+      }
+      return list;
+    }
+  },
+  created() {
+    this.total = this.articleList.length;
+  },
+  methods: {
+    // 瑙f瀽鏃堕棿
+    parseTime,
+    /** 鏌ヨ鏂囩珷鍒楄〃 */
+    getList() {
+      this.loading = true;
+      setTimeout(() => {
+        this.loading = false;
+      }, 500);
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞鏂囩珷";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      const article = this.articleList.find(item => item.id === id);
+      this.form = Object.assign({}, article);
+      this.open = true;
+      this.title = "淇敼鏂囩珷";
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            // 妯℃嫙淇敼鏂囩珷
+            const index = this.articleList.findIndex(item => item.id === this.form.id);
+            if (index !== -1) {
+              this.articleList.splice(index, 1, this.form);
+            }
+            this.$modal.msgSuccess("淇敼鎴愬姛");
+          } else {
+            // 妯℃嫙鏂板鏂囩珷
+            this.form.id = Math.max(...this.articleList.map(item => item.id)) + 1;
+            this.form.publishTime = new Date().toLocaleString();
+            this.form.views = 0;
+            this.articleList.unshift(this.form);
+            this.total = this.articleList.length;
+            this.$modal.msgSuccess("鏂板鎴愬姛");
+          }
+          this.open = false;
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const articleIds = row.id || this.ids;
+      this.$modal.confirm('鏄惁纭鍒犻櫎鏂囩珷鏍囬涓�"' + row.title + '"鐨勬暟鎹」锛�').then(() => {
+        // 妯℃嫙鍒犻櫎鏂囩珷
+        this.articleList = this.articleList.filter(item => item.id !== articleIds);
+        this.total = this.articleList.length;
+        this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(() => {});
+    },
+    /** 鍙栨秷鎸夐挳 */
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 琛ㄥ崟閲嶇疆 */
+    reset() {
+      this.form = {
+        id: undefined,
+        title: undefined,
+        category: undefined,
+        coverImage: undefined,
+        author: "绠$悊鍛�",
+        publishTime: undefined,
+        views: 0,
+        status: "1",
+        summary: undefined,
+        content: undefined
+      };
+      this.resetForm("form");
+    },
+    // 灏侀潰鍥句笂浼犲鐞�
+    handleCoverChange(file) {
+      const reader = new FileReader();
+      reader.onload = (e) => {
+        this.form.coverImage = e.target.result;
+      };
+      reader.readAsDataURL(file.raw);
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.ArticleManagement {
+  padding: 20px;
+}
+
+.avatar-uploader ::v-deep .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+}
+
+.avatar-uploader ::v-deep .el-upload:hover {
+  border-color: #409EFF;
+}
+
+.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 178px;
+  height: 178px;
+  line-height: 178px;
+  text-align: center;
+}
+
+.avatar {
+  width: 178px;
+  height: 178px;
+  display: block;
+}
+</style>
diff --git a/src/views/knowledge/drug/index.vue b/src/views/knowledge/drug/index.vue
index aa54bde..5e45095 100644
--- a/src/views/knowledge/drug/index.vue
+++ b/src/views/knowledge/drug/index.vue
@@ -1,27 +1,1077 @@
 <template>
-  <div>
-鑽搧鐭ヨ瘑搴�
+  <div class="DrugKnowledgeManagement">
+    <!-- 宸︿晶鏍� -->
+    <div class="sidecolumn">
+      <div class="sidecolumn-top">
+        <div class="top-wj">鑽搧鍒嗙被</div>
+        <div class="top-tj" @click="dialogFormVisible = true">+娣诲姞</div>
+      </div>
+      <div class="center-ss">
+        <el-input
+          placeholder="璇疯緭鍏ュ唴瀹�"
+          v-model="sidecolumnval"
+          class="input-with-select"
+          size="medium">
+        </el-input>
+      </div>
+
+      <div class="head-container" style="margin-top: 20px">
+        <el-tree
+          :data="deptOptions"
+          :props="defaultProps"
+          :expand-on-click-node="false"
+          :filter-node-method="filterNode"
+          ref="tree"
+          node-key="id"
+          default-expand-all
+          highlight-current
+          @node-click="handleNodeClick">
+          <span class="custom-tree-node" slot-scope="{ node, data }">
+            <span>{{ node.label }}</span>
+            <span v-if="data.id > 0">
+              <el-button
+                type="text"
+                icon="el-icon-delete"
+                circle
+                size="mini"
+                @click="() => remove(node, data)">
+              </el-button>
+            </span>
+            <span v-if="data.id > 0">
+              <el-button
+                type="text"
+                circle
+                size="mini"
+                @click="() => altertag(node, data)">
+                <span class="button-textxg"><i class="el-icon-edit-outline"></i></span>
+              </el-button>
+            </span>
+          </span>
+        </el-tree>
+      </div>
+    </div>
+    <!-- 鍙充晶鏁版嵁 -->
+    <div class="leftvlue">
+      <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="drugName">
+                <el-input
+                  v-model="queryParams.drugName"
+                  placeholder="璇疯緭鍏�"
+                  clearable
+                  style="width: 200px"
+                  @keyup.enter.native="handleQuery"/>
+              </el-form-item>
+              <el-form-item label="鑽搧鍒嗙被" prop="categoryId">
+                <el-select v-model="queryParams.categoryId" placeholder="璇烽�夋嫨">
+                  <el-option
+                    v-for="item in drugCategories"
+                    :key="item.id"
+                    :label="item.categoryName"
+                    :value="item.id">
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="鑽搧绫诲瀷" prop="drugType">
+                <el-select v-model="queryParams.drugType" placeholder="璇烽�夋嫨">
+                  <el-option
+                    v-for="item in drugTypes"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value">
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="鏄惁澶勬柟鑽�" prop="isPrescription">
+                <el-select v-model="queryParams.isPrescription" placeholder="璇烽�夋嫨">
+                  <el-option
+                    v-for="item in prescriptionOptions"
+                    :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">鏂板</el-button>
+              </el-col>
+              <el-col :span="1.5">
+                <el-button
+                  type="danger"
+                  plain
+                  icon="el-icon-delete"
+                  size="medium"
+                  :disabled="multiple"
+                  @click="handleDelete">鍒犻櫎</el-button>
+              </el-col>
+            </el-row>
+
+            <el-table
+              v-loading="loading"
+              :data="filteredDrugList"
+              @selection-change="handleSelectionChange">
+              <el-table-column type="selection" width="50" align="center" />
+              <el-table-column
+                label="鑽搧鍚嶇О"
+                fixed
+                align="center"
+                key="drugName"
+                prop="drugName"
+                :show-overflow-tooltip="true">
+              </el-table-column>
+              <el-table-column
+                label="閫氱敤鍚�"
+                align="center"
+                key="genericName"
+                prop="genericName"
+                :show-overflow-tooltip="true"
+                width="200"/>
+              <el-table-column
+                label="鑽搧鍒嗙被"
+                align="center"
+                key="categoryName"
+                prop="categoryName"
+                :show-overflow-tooltip="true"/>
+              <el-table-column
+                label="鑽搧绫诲瀷"
+                align="center"
+                key="drugType"
+                prop="drugType">
+                <template slot-scope="scope">
+                  <dict-tag :options="drugTypes" :value="scope.row.drugType"/>
+                </template>
+              </el-table-column>
+              <el-table-column
+                label="鏄惁澶勬柟鑽�"
+                align="center"
+                key="isPrescription"
+                prop="isPrescription">
+                <template slot-scope="scope">
+                  <dict-tag :options="prescriptionOptions" :value="scope.row.isPrescription"/>
+                </template>
+              </el-table-column>
+              <el-table-column
+                label="瑙勬牸"
+                align="center"
+                key="specification"
+                prop="specification"
+                width="120"/>
+              <el-table-column
+                label="鍗曚綅"
+                align="center"
+                key="unit"
+                prop="unit"
+                width="80"/>
+              <el-table-column
+                label="鐢熶骇鍘傚"
+                align="center"
+                key="manufacturer"
+                prop="manufacturer"
+                width="150"/>
+              <el-table-column
+                label="鎵瑰噯鏂囧彿"
+                align="center"
+                key="approvalNumber"
+                prop="approvalNumber"
+                width="150"/>
+              <el-table-column
+                label="鎿嶄綔"
+                fixed="right"
+                align="center"
+                width="200"
+                class-name="small-padding fixed-width">
+                <template slot-scope="scope">
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="handleUpdate(scope.row)">
+                    <span class="button-textxg"><i class="el-icon-edit"></i>淇敼</span>
+                  </el-button>
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="handleDelete(scope.row)">
+                    <span class="button-textsc"><i class="el-icon-delete"></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="drugOpen"
+          :close-on-click-modal="false"
+          width="900px"
+          append-to-body>
+          <el-form
+            ref="drugForm"
+            :model="drugForm"
+            :rules="rules"
+            label-width="100px">
+            <div class="headline">
+              <div class="basics">鍩虹淇℃伅</div>
+            </div>
+            <el-divider></el-divider>
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="鑽搧鍚嶇О" prop="drugName">
+                  <el-input
+                    v-model="drugForm.drugName"
+                    placeholder="璇疯緭鍏ヨ嵂鍝佸悕绉�"
+                    maxlength="40"/>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="閫氱敤鍚�" prop="genericName">
+                  <el-input
+                    v-model="drugForm.genericName"
+                    placeholder="璇疯緭鍏ヨ嵂鍝侀�氱敤鍚�"
+                    maxlength="40"/>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="鑽搧鍒嗙被" prop="categoryId">
+                  <el-select
+                    style="width: 300px;"
+                    v-model="drugForm.categoryId"
+                    size="medium"
+                    filterable
+                    placeholder="璇烽�夋嫨鍒嗙被">
+                    <el-option-group
+                      v-for="group in deptOptions"
+                      :key="group.id"
+                      :label="group.categoryName">
+                      <el-option
+                        v-for="item in group.children"
+                        :key="item.id"
+                        :label="item.categoryName"
+                        :value="item.id">
+                      </el-option>
+                    </el-option-group>
+                  </el-select>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="鑽搧绫诲瀷" prop="drugType">
+                  <el-select v-model="drugForm.drugType" placeholder="璇烽�夋嫨鑽搧绫诲瀷">
+                    <el-option
+                      v-for="item in drugTypes"
+                      :key="item.value"
+                      :label="item.label"
+                      :value="item.value">
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="鏄惁澶勬柟鑽�" prop="isPrescription">
+                  <el-radio-group v-model="drugForm.isPrescription">
+                    <el-radio
+                      v-for="(item, index) in prescriptionOptions"
+                      :label="item.value">{{ item.label }}</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="鎵瑰噯鏂囧彿" prop="approvalNumber">
+                  <el-input
+                    v-model="drugForm.approvalNumber"
+                    placeholder="璇疯緭鍏ユ壒鍑嗘枃鍙�"
+                    maxlength="40"/>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="瑙勬牸" prop="specification">
+                  <el-input
+                    v-model="drugForm.specification"
+                    placeholder="璇疯緭鍏ヨ嵂鍝佽鏍�"
+                    maxlength="40"/>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="鍗曚綅" prop="unit">
+                  <el-select v-model="drugForm.unit" placeholder="璇烽�夋嫨鍗曚綅">
+                    <el-option
+                      v-for="item in unitOptions"
+                      :key="item.value"
+                      :label="item.label"
+                      :value="item.value">
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="鐢熶骇鍘傚" prop="manufacturer">
+                  <el-input
+                    v-model="drugForm.manufacturer"
+                    placeholder="璇疯緭鍏ョ敓浜у巶瀹�"
+                    maxlength="100"/>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="鏉″舰鐮�" prop="barcode">
+                  <el-input
+                    v-model="drugForm.barcode"
+                    placeholder="璇疯緭鍏ユ潯褰㈢爜"
+                    maxlength="40"/>
+                </el-form-item>
+              </el-col>
+            </el-row>
+
+            <div class="headline">
+              <div class="basics">鑽搧鎴愬垎</div>
+            </div>
+            <el-divider></el-divider>
+            <el-form-item prop="ingredients">
+              <el-input
+                type="textarea"
+                :rows="3"
+                placeholder="璇疯緭鍏ヨ嵂鍝佷富瑕佹垚鍒�"
+                v-model="drugForm.ingredients">
+              </el-input>
+            </el-form-item>
+
+            <div class="headline">
+              <div class="basics">鐢ㄦ硶鐢ㄩ噺</div>
+            </div>
+            <el-divider></el-divider>
+            <el-form-item prop="usageDosage">
+              <el-input
+                type="textarea"
+                :rows="3"
+                placeholder="璇疯緭鍏ョ敤娉曠敤閲忚鏄�"
+                v-model="drugForm.usageDosage">
+              </el-input>
+            </el-form-item>
+
+            <div class="headline">
+              <div class="basics">涓嶈壇鍙嶅簲</div>
+            </div>
+            <el-divider></el-divider>
+            <el-form-item prop="adverseReactions">
+              <el-input
+                type="textarea"
+                :rows="3"
+                placeholder="璇疯緭鍏ヤ笉鑹弽搴旇鏄�"
+                v-model="drugForm.adverseReactions">
+              </el-input>
+            </el-form-item>
+
+            <div class="headline">
+              <div class="basics">绂佸繉</div>
+            </div>
+            <el-divider></el-divider>
+            <el-form-item prop="contraindications">
+              <el-input
+                type="textarea"
+                :rows="3"
+                placeholder="璇疯緭鍏ョ蹇岃鏄�"
+                v-model="drugForm.contraindications">
+              </el-input>
+            </el-form-item>
+
+            <div class="headline">
+              <div class="basics">娉ㄦ剰浜嬮」</div>
+            </div>
+            <el-divider></el-divider>
+            <el-form-item prop="precautions">
+              <el-input
+                type="textarea"
+                :rows="3"
+                placeholder="璇疯緭鍏ユ敞鎰忎簨椤�"
+                v-model="drugForm.precautions">
+              </el-input>
+            </el-form-item>
+          </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="鏂板绫诲埆" width="30%" :visible.sync="dialogFormVisible">
+      <div style="text-align: center; margin-bottom: 20px">
+        <el-radio-group v-model="radio">
+          <el-radio-button label="涓诲垎绫�"></el-radio-button>
+          <el-radio-button label="瀛愬垎绫�"></el-radio-button>
+        </el-radio-group>
+      </div>
+      <el-divider></el-divider>
+
+      <el-form :model="classifyform">
+        <el-form-item label="璇烽�夋嫨鑽搧澶х被" v-if="radio == '瀛愬垎绫�'">
+          <el-select v-model="classifyform.pid" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in deptOptions"
+              :key="item.id"
+              :label="item.categoryName"
+              :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="璇疯緭鍏ョ被鍒悕绉�">
+          <el-input
+            v-model="classifyform.categoryName"
+            autocomplete="off"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="getDeptTree()">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitsidecolumn">纭� 瀹�</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
 export default {
-  data () {
+  name: "DrugKnowledge",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  data() {
     return {
-
+      // 閬僵灞�
+      loading: false,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      idds: "",
+      classifyform: {  // 娣诲姞杩欎釜瀵硅薄
+        id: undefined,
+        pid: undefined,
+        categoryName: undefined
+      },
+      amendtag: false, //鏄惁淇敼绫诲埆
+      dialogFormVisible: false, //淇敼娣诲姞绫诲埆寮规
+      deleteVisible: false, //鍒嗙被鍒犻櫎寮规
+      deletefenl: "楂樿鍘�", //鍒犻櫎椤�
+      radio: "涓诲垎绫�",
+      // 琛ㄦ牸鏁版嵁
+      drugList: [
+        {
+          id: 1,
+          drugName: "闃胯帿瑗挎灄鑳跺泭",
+          genericName: "闃胯帿瑗挎灄",
+          categoryId: 101,
+          categoryName: "鎶楃敓绱�",
+          drugType: "1",
+          isPrescription: "1",
+          specification: "0.25g脳24绮�",
+          unit: "鐩�",
+          manufacturer: "鍗庡寳鍒惰嵂",
+          approvalNumber: "鍥借嵂鍑嗗瓧H13024176",
+          barcode: "6923450601234",
+          ingredients: "闃胯帿瑗挎灄",
+          usageDosage: "鍙f湇銆傛垚浜轰竴娆�0.5g锛屾瘡6锝�8灏忔椂1娆★紝涓�鏃ュ墏閲忎笉瓒呰繃4g銆�",
+          adverseReactions: "1.鎭跺績銆佸憰鍚愩�佽吂娉诲強鍋囪啘鎬ц偁鐐庣瓑鑳冭偁閬撳弽搴斻��2.鐨柟銆佽嵂鐗╃儹鍜屽摦鍠樼瓑杩囨晱鍙嶅簲銆�",
+          contraindications: "闈掗湁绱犺繃鏁忓強闈掗湁绱犵毊鑲よ瘯楠岄槼鎬ф偅鑰呯鐢ㄣ��",
+          precautions: "1.闈掗湁绱犵被鍙f湇鑽墿鍋跺彲寮曡捣杩囨晱鎬т紤鍏嬶紝灏ゅ瑙佷簬鏈夐潚闇夌礌鎴栧ご瀛㈣弻绱犺繃鏁忓彶鐨勬偅鑰呫��2.浼犳煋鎬у崟鏍哥粏鑳炲澶氱棁鎮h�呭簲鐢ㄦ湰鍝佹槗鍙戠敓鐨柟锛屽簲閬垮厤浣跨敤銆�"
+        },
+        {
+          id: 2,
+          drugName: "鏉胯摑鏍归绮�",
+          genericName: "鏉胯摑鏍�",
+          categoryId: 302,
+          categoryName: "鐗囧墏",
+          drugType: "3",
+          isPrescription: "0",
+          specification: "10g脳20琚�",
+          unit: "鐩�",
+          manufacturer: "鐧戒簯灞卞埗鑽�",
+          approvalNumber: "鍥借嵂鍑嗗瓧Z44023445",
+          barcode: "6923450605678",
+          ingredients: "鏉胯摑鏍�",
+          usageDosage: "寮�姘村啿鏈嶃�備竴娆�5锝�10g锛屼竴鏃�3锝�4娆°��",
+          adverseReactions: "灏氫笉鏄庣‘銆�",
+          contraindications: "灏氫笉鏄庣‘銆�",
+          precautions: "1.蹇岀儫銆侀厭鍙婅緵杈c�佺敓鍐枫�佹补鑵婚鐗┿��2.涓嶅疁鍦ㄦ湇鑽湡闂村悓鏃舵湇鐢ㄦ粙琛ユ�т腑鑽��"
+        },
+        {
+          id: 3,
+          drugName: "澶嶆柟涓瑰弬鐗�",
+          genericName: "澶嶆柟涓瑰弬",
+          categoryId: 303,
+          categoryName: "鑳跺泭",
+          drugType: "3",
+          isPrescription: "0",
+          specification: "60鐗�",
+          unit: "鐡�",
+          manufacturer: "鍚屼粊鍫�",
+          approvalNumber: "鍥借嵂鍑嗗瓧Z11020672",
+          barcode: "6923450609012",
+          ingredients: "涓瑰弬銆佷笁涓冦�佸啺鐗�",
+          usageDosage: "鍙f湇銆備竴娆�3鐗囷紝涓�鏃�3娆°��",
+          adverseReactions: "灏氫笉鏄庣‘銆�",
+          contraindications: "瀛曞绂佺敤銆�",
+          precautions: "1.蹇岄鐢熷喎銆佽緵杈c�佹补鑵婚鐗┿��2.鏈嶈嵂鏈熼棿濡傛湁涓嶉�傦紝搴旂珛鍗冲仠鑽苟灏卞尰銆�"
+        },
+        {
+          id: 4,
+          drugName: "甯冩礇鑺紦閲婅兌鍥�",
+          genericName: "甯冩礇鑺�",
+          categoryId: 102,
+          categoryName: "瑙g儹闀囩棝鑽�",
+          drugType: "1",
+          isPrescription: "0",
+          specification: "0.3g脳20绮�",
+          unit: "鐩�",
+          manufacturer: "涓編鍙插厠",
+          approvalNumber: "鍥借嵂鍑嗗瓧H10900089",
+          barcode: "6923450612345",
+          ingredients: "甯冩礇鑺�",
+          usageDosage: "鍙f湇銆傛垚浜轰竴娆�1绮掞紝涓�鏃�2娆�(鏃╂櫄鍚勪竴娆�)銆�",
+          adverseReactions: "1.灏戞暟鐥呬汉鍙嚭鐜版伓蹇冦�佸憰鍚愩�佽儍鐑х伡鎰熸垨杞诲害娑堝寲涓嶈壇銆佽儍鑲犻亾婧冪枴鍙婂嚭琛�銆佽浆姘ㄩ叾鍗囬珮銆佸ご鐥涖�佸ご鏅曘�佽�抽福銆佽鍔涙ā绯娿�佺簿绁炵揣寮犮�佸棞鐫°�佷笅鑲㈡按鑲挎垨浣撻噸楠ゅ銆�",
+          contraindications: "1.瀵瑰叾浠栭潪鐢句綋鎶楃値鑽繃鏁忚�呯鐢ㄣ��2.瀛曞鍙婂摵涔虫湡濡囧コ绂佺敤銆�3.瀵归樋鍙稿尮鏋楄繃鏁忕殑鍝枠鎮h�呯鐢ㄣ��",
+          precautions: "1.鏈搧涓哄鐥囨不鐤楄嵂锛屼笉瀹滈暱鏈熸垨澶ч噺浣跨敤锛岀敤浜庢鐥涗笉寰楄秴杩�5澶╋紝鐢ㄤ簬瑙g儹涓嶅緱瓒呰繃3澶╋紝濡傜棁鐘朵笉缂撹В锛岃鍜ㄨ鍖诲笀鎴栬嵂甯堛��2.涓嶈兘鍚屾椂鏈嶇敤鍏朵粬鍚湁瑙g儹闀囩棝鑽殑鑽搧(濡傛煇浜涘鏂规姉鎰熷啋鑽�)銆�"
+        },
+        {
+          id: 5,
+          drugName: "鍏懗鍦伴粍涓�",
+          genericName: "鍏懗鍦伴粍",
+          categoryId: 201,
+          categoryName: "琛ョ泭鑽�",
+          drugType: "3",
+          isPrescription: "0",
+          specification: "200涓�",
+          unit: "鐡�",
+          manufacturer: "鍚屼粊鍫�",
+          approvalNumber: "鍥借嵂鍑嗗瓧Z11020061",
+          barcode: "6923450615678",
+          ingredients: "鐔熷湴榛勩�侀厭钀歌倝銆佺墶涓圭毊銆佸北鑽�佽尟鑻撱�佹辰娉�",
+          usageDosage: "鍙f湇銆備竴娆�8涓革紝涓�鏃�3娆°��",
+          adverseReactions: "灏氫笉鏄庣‘銆�",
+          contraindications: "灏氫笉鏄庣‘銆�",
+          precautions: "1.蹇岃緵杈i鐗┿��2.涓嶅疁鍦ㄦ湇鑽湡闂存湇鎰熷啋鑽��3.鏈嶈嵂鏈熼棿鍑虹幇椋熸涓嶆尟锛岃儍鑴樹笉閫傦紝澶т究绋�锛岃吂鐥涚瓑鐥囩姸鏃讹紝搴斿幓鍖婚櫌灏辫瘖銆�"
+        }
+      ],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      drugOpen: false,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 鑽搧鍒嗙被閫夐」
+      drugCategories: [
+        { id: 101, categoryName: "鎶楃敓绱�" },
+        { id: 102, categoryName: "瑙g儹闀囩棝鑽�" },
+        { id: 103, categoryName: "蹇冭绠¤嵂鐗�" },
+        { id: 201, categoryName: "琛ョ泭鑽�" },
+        { id: 202, categoryName: "娓呯儹鑽�" },
+        { id: 203, categoryName: "绁涙箍鑽�" },
+        { id: 301, categoryName: "涓稿墏" },
+        { id: 302, categoryName: "鐗囧墏" },
+        { id: 303, categoryName: "鑳跺泭" }
+      ],
+      // 娣诲姞銆佷慨鏀瑰弬鏁�
+      drugForm: {},
+      deptOptions: [
+        {
+          id: 1,
+          categoryName: "瑗胯嵂",
+          children: [
+            { id: 101, categoryName: "鎶楃敓绱�" },
+            { id: 102, categoryName: "瑙g儹闀囩棝鑽�" },
+            { id: 103, categoryName: "蹇冭绠¤嵂鐗�" }
+          ]
+        },
+        {
+          id: 2,
+          categoryName: "涓嵂",
+          children: [
+            { id: 201, categoryName: "琛ョ泭鑽�" },
+            { id: 202, categoryName: "娓呯儹鑽�" },
+            { id: 203, categoryName: "绁涙箍鑽�" }
+          ]
+        },
+        {
+          id: 3,
+          categoryName: "涓垚鑽�",
+          children: [
+            { id: 301, categoryName: "涓稿墏" },
+            { id: 302, categoryName: "鐗囧墏" },
+            { id: 303, categoryName: "鑳跺泭" }
+          ]
+        }
+      ],
+      defaultProps: {
+        children: "children",
+        label: "categoryName",
+      },
+      sidecolumnform: {}, //娣诲姞绫诲埆琛ㄥ崟
+      dialogFormVisible: false, //娣诲姞绫诲埆寮规
+      sidecolumnval: "", //绫诲埆鎼滅储
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        drugName: undefined,
+        categoryId: undefined,
+        drugType: undefined,
+        isPrescription: undefined
+      },
+      // 鑽搧绫诲瀷閫夐」
+      drugTypes: [
+        { value: "1", label: "瑗胯嵂" },
+        { value: "2", label: "涓嵂" },
+        { value: "3", label: "涓垚鑽�" },
+        { value: "4", label: "鐢熺墿鍒跺搧" },
+        { value: "5", label: "鍏朵粬" }
+      ],
+      // 鏄惁澶勬柟鑽�夐」
+      prescriptionOptions: [
+        { value: "1", label: "澶勬柟鑽�" },
+        { value: "0", label: "闈炲鏂硅嵂" }
+      ],
+      // 鍗曚綅閫夐」
+      unitOptions: [
+        { value: "鐩�", label: "鐩�" },
+        { value: "鐡�", label: "鐡�" },
+        { value: "鏀�", label: "鏀�" },
+        { value: "琚�", label: "琚�" },
+        { value: "鐗�", label: "鐗�" },
+        { value: "绮�", label: "绮�" },
+        { value: "g", label: "鍏�" },
+        { value: "ml", label: "姣崌" }
+      ],
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        drugName: [
+          { required: true, message: "鑽搧鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        genericName: [
+          { required: true, message: "閫氱敤鍚嶄笉鑳戒负绌�", trigger: "blur" }
+        ],
+        categoryId: [
+          { required: true, message: "鑽搧鍒嗙被涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        drugType: [
+          { required: true, message: "鑽搧绫诲瀷涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        isPrescription: [
+          { required: true, message: "鏄惁澶勬柟鑽笉鑳戒负绌�", trigger: "blur" }
+        ],
+        specification: [
+          { required: true, message: "瑙勬牸涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        unit: [
+          { required: true, message: "鍗曚綅涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        approvalNumber: [
+          { required: true, message: "鎵瑰噯鏂囧彿涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        manufacturer: [
+          { required: true, message: "鐢熶骇鍘傚涓嶈兘涓虹┖", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  computed: {
+    filteredDrugList() {
+      let list = [...this.drugList];
+      if (this.queryParams.drugName) {
+        list = list.filter(item =>
+          item.drugName.includes(this.queryParams.drugName)
+        );
+      }
+      if (this.queryParams.categoryId) {
+        list = list.filter(item =>
+          item.categoryId == this.queryParams.categoryId
+        );
+      }
+      if (this.queryParams.drugType) {
+        list = list.filter(item =>
+          item.drugType == this.queryParams.drugType
+        );
+      }
+      if (this.queryParams.isPrescription) {
+        list = list.filter(item =>
+          item.isPrescription == this.queryParams.isPrescription
+        );
+      }
+      return list;
     }
   },
-
-  created () {
-
+  watch: {
+    // 鏍规嵁鍚嶇О绛涢�夐儴闂ㄦ爲
+    sidecolumnval(val) {
+      this.$refs.tree.filter(val);
+    }
   },
-
+  created() {
+    // 鍒濆鍖栨暟鎹�
+    this.total = this.drugList.length;
+  },
   methods: {
+    /** 鏌ヨ鑽搧鍒楄〃 */
+    getList() {
+      this.loading = true;
+      setTimeout(() => {
+        this.loading = false;
+      }, 500);
+    },
+    /** 鏌ヨ鑽搧鍒嗙被鏍戠粨鏋� */
+    getDeptTree() {
+      this.dialogFormVisible = false;
+    },
+    // 绛涢�夎妭鐐�
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.categoryName.indexOf(value) !== -1;
+    },
+    // 娣诲姞绫诲埆鏍�
+    submitsidecolumn() {
+      if (this.classifyform.id) {
+        // 妯℃嫙淇敼鍒嗙被
+        const category = this.findCategory(this.classifyform.id);
+        if (category) {
+          category.categoryName = this.classifyform.categoryName;
+          if (this.classifyform.pid) {
+            category.pid = this.classifyform.pid;
+          }
+        }
+        this.$modal.msgSuccess("淇敼鎴愬姛");
+        this.classifyform = {};
+        this.dialogFormVisible = false;
+        return;
+      }
 
+      // 妯℃嫙鏂板鍒嗙被
+      const newCategory = {
+        id: Math.max(...this.deptOptions.flatMap(group =>
+          [group.id, ...(group.children || []).map(child => child.id)]
+        )) + 1,
+        categoryName: this.classifyform.categoryName,
+        pid: this.radio === "瀛愬垎绫�" ? this.classifyform.pid : null
+      };
+
+      if (this.radio === "瀛愬垎绫�") {
+        const parent = this.findCategory(this.classifyform.pid);
+        if (parent) {
+          if (!parent.children) parent.children = [];
+          parent.children.push(newCategory);
+        }
+      } else {
+        newCategory.children = [];
+        this.deptOptions.push(newCategory);
+      }
+
+      this.$modal.msgSuccess("鏂板鎴愬姛");
+      this.classifyform = {};
+      this.dialogFormVisible = false;
+    },
+
+    findCategory(id) {
+      for (const group of this.deptOptions) {
+        if (group.id === id) return group;
+        if (group.children) {
+          for (const child of group.children) {
+            if (child.id === id) return child;
+          }
+        }
+      }
+      return null;
+    },
+
+    remove(a, b) {
+      if (b.pid) {
+        this.$modal
+          .confirm('鏄惁纭鍒犻櫎鍒嗙被椤逛负"' + b.categoryName + '"鐨勬暟鎹」锛�')
+          .then(() => {
+            // 妯℃嫙鍒犻櫎瀛愬垎绫�
+            const parent = this.findCategory(b.pid);
+            if (parent && parent.children) {
+              parent.children = parent.children.filter(child => child.id !== b.id);
+            }
+            this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+          })
+          .catch(() => {});
+      } else {
+        this.$modal
+          .confirm(
+            '鏄惁纭鍒犻櫎涓�绾у垎绫�"' +
+              b.categoryName +
+              '"锛熷垹闄ゅ悗鍏朵笅鍒嗙被灏嗗綊绫烩�樻湭鍒嗙被鈥�'
+          )
+          .then(() => {
+            // 妯℃嫙鍒犻櫎涓诲垎绫�
+            this.deptOptions = this.deptOptions.filter(group => group.id !== b.id);
+            this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+          })
+          .catch(() => {});
+      }
+    },
+    altertag(a, b) {
+      this.dialogFormVisible = true;
+      if (!b.pid) {
+        this.radio = "涓诲垎绫�";
+      } else {
+        this.radio = "瀛愬垎绫�";
+      }
+      this.classifyform = JSON.parse(JSON.stringify(b));
+      this.dialogFormVisible = true;
+    },
+    handleNodeClick(data) {
+      this.queryParams.categoryId = data.id;
+    },
+
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.drugForm = {};
+      this.drugOpen = false;
+      this.reset();
+    },
+
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.drugForm = {
+        id: undefined,
+        drugName: undefined,
+        genericName: undefined,
+        categoryId: undefined,
+        drugType: undefined,
+        isPrescription: undefined,
+        specification: undefined,
+        unit: undefined,
+        manufacturer: undefined,
+        approvalNumber: undefined,
+        barcode: undefined,
+        ingredients: undefined,
+        usageDosage: undefined,
+        adverseReactions: undefined,
+        contraindications: undefined,
+        precautions: undefined
+      };
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        drugName: undefined,
+        categoryId: undefined,
+        drugType: undefined,
+        isPrescription: undefined
+      };
+      this.$refs.tree.setCurrentKey(null);
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.title = "鏂板鑽搧";
+      this.drugForm = {};
+      this.drugOpen = true;
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      this.title = "淇敼鑽搧淇℃伅";
+      this.drugForm = Object.assign({}, row);
+      this.drugOpen = true;
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function() {
+      this.$refs["drugForm"].validate(valid => {
+        if (valid) {
+          if (this.drugForm.id != undefined) {
+            // 妯℃嫙淇敼鑽搧
+            const index = this.drugList.findIndex(item => item.id === this.drugForm.id);
+            if (index !== -1) {
+              this.drugList.splice(index, 1, this.drugForm);
+            }
+            this.$modal.msgSuccess("淇敼鎴愬姛");
+          } else {
+            // 妯℃嫙鏂板鑽搧
+            this.drugForm.id = Math.max(...this.drugList.map(item => item.id)) + 1;
+            this.drugList.unshift(this.drugForm);
+            this.total = this.drugList.length;
+            this.$modal.msgSuccess("鏂板鎴愬姛");
+          }
+          this.drugOpen = false;
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const drugIds = row.id || this.ids;
+      this.$modal
+        .confirm('鏄惁纭鍒犻櫎鑽搧鍚嶇О涓�"' + row.drugName + '"鐨勬暟鎹」锛�')
+        .then(() => {
+          // 妯℃嫙鍒犻櫎鑽搧
+          this.drugList = this.drugList.filter(item => item.id !== drugIds);
+          this.total = this.drugList.length;
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    }
   }
-}
+};
 </script>
 
-<style lang='scss' scoped>
-
+<style lang="scss" scoped>
+.DrugKnowledgeManagement {
+  display: flex;
+}
+.sidecolumn {
+  width: 300px;
+  min-height: 100vh;
+  text-align: center;
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #fff;
+  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;
+  }
+}
+.headline {
+  display: flex;
+  justify-content: space-between;
+  font-size: 20px;
+  border-left: 4px solid #41a1be;
+  padding-left: 5px;
+  margin: 15px 0;
+}
+.leftvlue {
+  width: 80%;
+  margin-top: 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);
+}
+::v-deep .el-tree-node__content {
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-box-align: center;
+  -ms-flex-align: center;
+  align-items: center;
+  height: 46px;
+  font-size: 20px;
+  cursor: pointer;
+}
+::v-deep .el-tree {
+  position: relative;
+  cursor: default;
+  border-radius: 5px;
+  background: #eff8fe;
+  color: #606266;
+  border: 1px solid #bbe1fa;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+::v-deep
+  .el-tree--highlight-current
+  .el-tree-node.is-current
+  > .el-tree-node__content {
+  background-color: #7799fb;
+  color: #fff;
+}
+::v-deep .el-button--mini.is-circle {
+  padding: 7px;
+  margin: 0;
+  color: red;
+}
+.button-text {
+  color: rgb(70, 204, 238);
+}
+.button-textcs {
+  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/login.vue b/src/views/login.vue
index 0590ecb..ca16496 100644
--- a/src/views/login.vue
+++ b/src/views/login.vue
@@ -136,7 +136,7 @@
         smsCode: "",
         rememberMe: false,
         code: "",
-        orgid: "1",
+        orgid: "47255004333112711A1001",
       },
       options: [
         { value: "1", label: "鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�" },
@@ -296,7 +296,7 @@
 
           const loginData = {
             username: this.loginForm.username,
-            orgid: "1",
+            orgid: "47255004333112711A1001",
             loginType: this.loginMethod
           };
 
@@ -311,7 +311,7 @@
           this.$store
             .dispatch("Login", loginData)
             .then(() => {
-              this.$router.push({ path: this.redirect || "/" }).catch(() => {});
+              this.$router.push({ path: this.redirect || "/followvisit/discharge" }).catch(() => {});
             })
             .catch(() => {
               this.loading = false;
diff --git a/src/views/system/group/index.vue b/src/views/system/group/index.vue
new file mode 100644
index 0000000..af86dae
--- /dev/null
+++ b/src/views/system/group/index.vue
@@ -0,0 +1,1343 @@
+<template>
+  <div class="TeamManagement">
+    <!-- 鍥㈤槦绠$悊 -->
+    <el-tabs v-model="activeTab" type="card">
+      <el-tab-pane label="鍥㈤槦绠$悊" name="team">
+        <el-row :gutter="20">
+          <el-col :span="24" :xs="24">
+            <el-form :model="teamQueryParams" ref="teamQueryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+              <el-form-item label="鍥㈤槦鍚嶇О" prop="name">
+                <el-input
+                  v-model="teamQueryParams.name"
+                  placeholder="璇疯緭鍏ュ洟闃熷悕绉�"
+                  clearable
+                  style="width: 200px"
+                  @keyup.enter.native="handleTeamQuery"
+                />
+              </el-form-item>
+              <el-form-item label="鍥㈤槦鐘舵��" prop="status">
+                <el-select v-model="teamQueryParams.status" placeholder="璇烽�夋嫨鐘舵��" clearable style="width: 200px">
+                  <el-option
+                    v-for="item in teamStatusOptions"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  />
+                </el-select>
+              </el-form-item>
+              <el-form-item>
+                <el-button type="primary" icon="el-icon-search" size="medium" @click="handleTeamQuery">鎼滅储</el-button>
+                <el-button icon="el-icon-refresh" size="medium" @click="resetTeamQuery">閲嶇疆</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="handleTeamAdd"
+                >鏂板鍥㈤槦</el-button>
+              </el-col>
+            </el-row>
+
+            <el-table v-loading="teamLoading" :data="filteredTeamList" @selection-change="handleTeamSelectionChange">
+              <el-table-column type="selection" width="50" align="center" />
+              <el-table-column label="鍥㈤槦ID" align="center" prop="id" width="80" />
+              <el-table-column label="鍥㈤槦鍚嶇О" align="center" prop="name" :show-overflow-tooltip="true" />
+              <el-table-column label="鍥㈤槦缁勯暱" align="center" prop="leader" width="120" />
+              <el-table-column label="鍥㈤槦鎴愬憳" align="center" prop="memberCount" width="100">
+  <template slot-scope="scope">
+    <el-tag>{{ (scope.row.members || []).length }}浜�</el-tag>
+  </template>
+</el-table-column>
+              <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="160">
+                <template slot-scope="scope">
+                  <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="鍥㈤槦鐘舵��" align="center" prop="status" width="100">
+                <template slot-scope="scope">
+                  <dict-tag :options="teamStatusOptions" :value="scope.row.status"/>
+                </template>
+              </el-table-column>
+              <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width" width="180">
+                <template slot-scope="scope">
+                  <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-view"
+                    @click="handleTeamDetail(scope.row)"
+                  >璇︽儏</el-button>
+                  <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-edit"
+                    @click="handleTeamUpdate(scope.row)"
+                  >缂栬緫</el-button>
+                  <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-delete"
+                    @click="handleTeamDelete(scope.row)"
+                  >鍒犻櫎</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+
+            <pagination
+              v-show="teamTotal>0"
+              :total="teamTotal"
+              :page.sync="teamQueryParams.pageNum"
+              :limit.sync="teamQueryParams.pageSize"
+              @pagination="getTeamList"
+            />
+          </el-col>
+        </el-row>
+      </el-tab-pane>
+
+      <!-- 浜哄憳鍒嗙粍 -->
+      <el-tab-pane label="浜哄憳鍒嗙粍" name="member">
+        <el-row :gutter="20">
+          <el-col :span="24" :xs="24">
+            <el-form :model="memberQueryParams" ref="memberQueryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+              <el-form-item label="鎴愬憳濮撳悕" prop="name">
+                <el-input
+                  v-model="memberQueryParams.name"
+                  placeholder="璇疯緭鍏ユ垚鍛樺鍚�"
+                  clearable
+                  style="width: 200px"
+                  @keyup.enter.native="handleMemberQuery"
+                />
+              </el-form-item>
+              <el-form-item label="鎵�灞炲洟闃�" prop="teamId">
+                <el-select v-model="memberQueryParams.teamId" placeholder="璇烽�夋嫨鍥㈤槦" clearable style="width: 200px">
+                  <el-option
+                    v-for="item in teamList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                  />
+                </el-select>
+              </el-form-item>
+              <el-form-item label="鎴愬憳鐘舵��" prop="status">
+                <el-select v-model="memberQueryParams.status" placeholder="璇烽�夋嫨鐘舵��" clearable style="width: 200px">
+                  <el-option
+                    v-for="item in memberStatusOptions"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  />
+                </el-select>
+              </el-form-item>
+              <el-form-item>
+                <el-button type="primary" icon="el-icon-search" size="medium" @click="handleMemberQuery">鎼滅储</el-button>
+                <el-button icon="el-icon-refresh" size="medium" @click="resetMemberQuery">閲嶇疆</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="handleMemberAdd"
+                >鏂板鎴愬憳</el-button>
+              </el-col>
+              <el-col :span="1.5">
+                <el-button
+                  type="danger"
+                  plain
+                  icon="el-icon-delete"
+                  size="medium"
+                  :disabled="multiple"
+                  @click="handleMemberDelete"
+                >鍒犻櫎</el-button>
+              </el-col>
+            </el-row>
+
+            <el-table v-loading="memberLoading" :data="filteredMemberList" @selection-change="handleMemberSelectionChange">
+              <el-table-column type="selection" width="50" align="center" />
+              <el-table-column label="鎴愬憳ID" align="center" prop="id" width="80" />
+              <el-table-column label="鎴愬憳濮撳悕" align="center" prop="name" :show-overflow-tooltip="true" />
+              <el-table-column label="鎵�灞炲洟闃�" align="center" prop="teamName" width="150" />
+              <el-table-column label="鑱屼綅" align="center" prop="position" width="120" />
+              <el-table-column label="鑱旂郴鐢佃瘽" align="center" prop="phone" width="150" />
+              <el-table-column label="閭" align="center" prop="email" width="200" />
+              <el-table-column label="褰撳墠宸ュ崟" align="center" prop="currentWorkOrder" width="120">
+                <template slot-scope="scope">
+                  <el-tag :type="scope.row.currentWorkOrder ? '' : 'info'">
+                    {{ scope.row.currentWorkOrder || '绌洪棽' }}
+                  </el-tag>
+                </template>
+              </el-table-column>
+              <el-table-column label="鎴愬憳鐘舵��" align="center" prop="status" width="100">
+                <template slot-scope="scope">
+                  <dict-tag :options="memberStatusOptions" :value="scope.row.status"/>
+                </template>
+              </el-table-column>
+              <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width" width="180">
+                <template slot-scope="scope">
+                  <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-edit"
+                    @click="handleMemberUpdate(scope.row)"
+                  >缂栬緫</el-button>
+                  <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-delete"
+                    @click="handleMemberDelete(scope.row)"
+                  >鍒犻櫎</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+
+            <pagination
+              v-show="memberTotal>0"
+              :total="memberTotal"
+              :page.sync="memberQueryParams.pageNum"
+              :limit.sync="memberQueryParams.pageSize"
+              @pagination="getMemberList"
+            />
+          </el-col>
+        </el-row>
+      </el-tab-pane>
+
+      <!-- 宸ュ崟鎸囨淳 -->
+      <el-tab-pane label="宸ュ崟鎸囨淳" name="workOrder">
+        <el-row :gutter="20">
+          <el-col :span="24" :xs="24">
+            <el-form :model="workOrderQueryParams" ref="workOrderQueryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+              <el-form-item label="宸ュ崟缂栧彿" prop="id">
+                <el-input
+                  v-model="workOrderQueryParams.id"
+                  placeholder="璇疯緭鍏ュ伐鍗曠紪鍙�"
+                  clearable
+                  style="width: 200px"
+                  @keyup.enter.native="handleWorkOrderQuery"
+                />
+              </el-form-item>
+              <el-form-item label="宸ュ崟鐘舵��" prop="status">
+                <el-select v-model="workOrderQueryParams.status" placeholder="璇烽�夋嫨鐘舵��" clearable style="width: 200px">
+                  <el-option
+                    v-for="item in workOrderStatusOptions"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  />
+                </el-select>
+              </el-form-item>
+              <el-form-item label="澶勭悊浜�" prop="assignee">
+                <el-select v-model="workOrderQueryParams.assignee" placeholder="璇烽�夋嫨澶勭悊浜�" clearable style="width: 200px">
+                  <el-option
+                    v-for="item in memberList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                  />
+                </el-select>
+              </el-form-item>
+              <el-form-item>
+                <el-button type="primary" icon="el-icon-search" size="medium" @click="handleWorkOrderQuery">鎼滅储</el-button>
+                <el-button icon="el-icon-refresh" size="medium" @click="resetWorkOrderQuery">閲嶇疆</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="handleWorkOrderAdd"
+                >鏂板缓宸ュ崟</el-button>
+              </el-col>
+            </el-row>
+
+            <el-table v-loading="workOrderLoading" :data="filteredWorkOrderList" @selection-change="handleWorkOrderSelectionChange">
+              <el-table-column type="selection" width="50" align="center" />
+              <el-table-column label="宸ュ崟缂栧彿" align="center" prop="id" width="120" />
+              <el-table-column label="宸ュ崟鏍囬" align="center" prop="title" :show-overflow-tooltip="true" />
+              <el-table-column label="浼樺厛绾�" align="center" prop="priority" width="100">
+                <template slot-scope="scope">
+                  <el-tag :type="scope.row.priority === '1' ? 'danger' : scope.row.priority === '2' ? 'warning' : ''">
+                    {{ scope.row.priority === '1' ? '楂�' : scope.row.priority === '2' ? '涓�' : '浣�' }}
+                  </el-tag>
+                </template>
+              </el-table-column>
+              <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="160">
+                <template slot-scope="scope">
+                  <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="鎴鏃堕棿" align="center" prop="deadline" width="160">
+                <template slot-scope="scope">
+                  <span>{{ parseTime(scope.row.deadline, '{y}-{m}-{d}') }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="澶勭悊浜�" align="center" prop="assigneeName" width="120" />
+              <el-table-column label="宸ュ崟鐘舵��" align="center" prop="status" width="120">
+                <template slot-scope="scope">
+                  <dict-tag :options="workOrderStatusOptions" :value="scope.row.status"/>
+                </template>
+              </el-table-column>
+              <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width" width="180">
+                <template slot-scope="scope">
+                  <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-edit"
+                    @click="handleWorkOrderUpdate(scope.row)"
+                  >缂栬緫</el-button>
+                  <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-delete"
+                    @click="handleWorkOrderDelete(scope.row)"
+                  >鍒犻櫎</el-button>
+                  <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-s-promotion"
+                    @click="handleAssignWorkOrder(scope.row)"
+                    v-if="scope.row.status === '0'"
+                  >鎸囨淳</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+
+            <pagination
+              v-show="workOrderTotal>0"
+              :total="workOrderTotal"
+              :page.sync="workOrderQueryParams.pageNum"
+              :limit.sync="workOrderQueryParams.pageSize"
+              @pagination="getWorkOrderList"
+            />
+          </el-col>
+        </el-row>
+      </el-tab-pane>
+    </el-tabs>
+
+    <!-- 鍥㈤槦璇︽儏瀵硅瘽妗� -->
+    <el-dialog :title="teamDialogTitle" :visible.sync="teamDialogVisible" width="70%" append-to-body>
+      <el-descriptions :column="2" border>
+        <el-descriptions-item label="鍥㈤槦ID">{{ currentTeam.id }}</el-descriptions-item>
+        <el-descriptions-item label="鍥㈤槦鍚嶇О">{{ currentTeam.name }}</el-descriptions-item>
+        <el-descriptions-item label="鍥㈤槦缁勯暱">{{ currentTeam.leader }}</el-descriptions-item>
+<el-descriptions-item label="鍥㈤槦鎴愬憳">{{ (currentTeam.members || []).length }}浜�</el-descriptions-item>        <el-descriptions-item label="鍒涘缓鏃堕棿">{{ parseTime(currentTeam.createTime, '{y}-{m}-{d} {h}:{i}') }}</el-descriptions-item>
+        <el-descriptions-item label="鍥㈤槦鐘舵��">
+          <dict-tag :options="teamStatusOptions" :value="currentTeam.status"/>
+        </el-descriptions-item>
+        <el-descriptions-item label="鍥㈤槦鎻忚堪" :span="2">{{ currentTeam.description || '鏃�' }}</el-descriptions-item>
+      </el-descriptions>
+
+      <div class="team-members" style="margin-top: 20px;">
+        <div class="headline">
+          <div class="basics">鍥㈤槦鎴愬憳</div>
+        </div>
+        <el-divider></el-divider>
+        <el-table :data="currentTeam.members" border style="width: 100%">
+          <el-table-column prop="name" label="鎴愬憳濮撳悕" width="120" />
+          <el-table-column prop="position" label="鑱屼綅" width="120" />
+          <el-table-column prop="phone" label="鑱旂郴鐢佃瘽" width="150" />
+          <el-table-column prop="email" label="閭" width="200" />
+          <el-table-column prop="currentWorkOrder" label="褰撳墠宸ュ崟" width="150">
+            <template slot-scope="scope">
+              <el-tag :type="scope.row.currentWorkOrder ? '' : 'info'">
+                {{ scope.row.currentWorkOrder || '绌洪棽' }}
+              </el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column prop="status" label="鎴愬憳鐘舵��" width="100">
+            <template slot-scope="scope">
+              <dict-tag :options="memberStatusOptions" :value="scope.row.status"/>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+
+      <div class="team-work-orders" style="margin-top: 20px;">
+        <div class="headline">
+          <div class="basics">鍥㈤槦宸ュ崟</div>
+        </div>
+        <el-divider></el-divider>
+        <el-table :data="teamWorkOrders" border style="width: 100%">
+          <el-table-column prop="id" label="宸ュ崟缂栧彿" width="120" />
+          <el-table-column prop="title" label="宸ュ崟鏍囬" />
+          <el-table-column prop="priority" label="浼樺厛绾�" width="100">
+            <template slot-scope="scope">
+              <el-tag :type="scope.row.priority === '1' ? 'danger' : scope.row.priority === '2' ? 'warning' : ''">
+                {{ scope.row.priority === '1' ? '楂�' : scope.row.priority === '2' ? '涓�' : '浣�' }}
+              </el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column prop="assigneeName" label="澶勭悊浜�" width="120" />
+          <el-table-column prop="status" label="宸ュ崟鐘舵��" width="120">
+            <template slot-scope="scope">
+              <dict-tag :options="workOrderStatusOptions" :value="scope.row.status"/>
+            </template>
+          </el-table-column>
+          <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" width="160">
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="deadline" label="鎴鏃堕棿" width="160">
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.deadline, '{y}-{m}-{d}') }}</span>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="teamDialogVisible = false">鍏� 闂�</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 鏂板/缂栬緫鍥㈤槦瀵硅瘽妗� -->
+    <el-dialog :title="teamFormTitle" :visible.sync="teamFormVisible" width="50%" append-to-body>
+      <el-form ref="teamForm" :model="teamForm" :rules="teamRules" label-width="80px">
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="鍥㈤槦鍚嶇О" prop="name">
+              <el-input v-model="teamForm.name" placeholder="璇疯緭鍏ュ洟闃熷悕绉�" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍥㈤槦缁勯暱" prop="leader">
+              <el-select v-model="teamForm.leader" placeholder="璇烽�夋嫨鍥㈤槦缁勯暱">
+                <el-option
+                  v-for="item in memberList"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍥㈤槦鐘舵��" prop="status">
+              <el-radio-group v-model="teamForm.status">
+                <el-radio
+                  v-for="dict in teamStatusOptions"
+                  :key="dict.value"
+                  :label="dict.value"
+                >{{dict.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鍥㈤槦鎴愬憳" prop="members">
+              <el-transfer
+                v-model="teamForm.members"
+                :data="memberOptions"
+                :titles="['鍙�夋垚鍛�', '鍥㈤槦鎴愬憳']"
+                :props="{
+                  key: 'id',
+                  label: 'name'
+                }"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鍥㈤槦鎻忚堪" prop="description">
+              <el-input type="textarea" :rows="3" v-model="teamForm.description" placeholder="璇疯緭鍏ュ洟闃熸弿杩�" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitTeamForm">纭� 瀹�</el-button>
+        <el-button @click="cancelTeamForm">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 鏂板/缂栬緫鎴愬憳瀵硅瘽妗� -->
+    <el-dialog :title="memberFormTitle" :visible.sync="memberFormVisible" width="50%" append-to-body>
+      <el-form ref="memberForm" :model="memberForm" :rules="memberRules" label-width="80px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鎴愬憳濮撳悕" prop="name">
+              <el-input v-model="memberForm.name" placeholder="璇疯緭鍏ユ垚鍛樺鍚�" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎵�灞炲洟闃�" prop="teamId">
+              <el-select v-model="memberForm.teamId" placeholder="璇烽�夋嫨鎵�灞炲洟闃�">
+                <el-option
+                  v-for="item in teamList"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鑱屼綅" prop="position">
+              <el-input v-model="memberForm.position" placeholder="璇疯緭鍏ヨ亴浣�" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
+              <el-input v-model="memberForm.phone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="閭" prop="email">
+              <el-input v-model="memberForm.email" placeholder="璇疯緭鍏ラ偖绠�" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎴愬憳鐘舵��" prop="status">
+              <el-radio-group v-model="memberForm.status">
+                <el-radio
+                  v-for="dict in memberStatusOptions"
+                  :key="dict.value"
+                  :label="dict.value"
+                >{{dict.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitMemberForm">纭� 瀹�</el-button>
+        <el-button @click="cancelMemberForm">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 鏂板/缂栬緫宸ュ崟瀵硅瘽妗� -->
+    <el-dialog :title="workOrderFormTitle" :visible.sync="workOrderFormVisible" width="60%" append-to-body>
+      <el-form ref="workOrderForm" :model="workOrderForm" :rules="workOrderRules" label-width="80px">
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="宸ュ崟鏍囬" prop="title">
+              <el-input v-model="workOrderForm.title" placeholder="璇疯緭鍏ュ伐鍗曟爣棰�" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="浼樺厛绾�" prop="priority">
+              <el-select v-model="workOrderForm.priority" placeholder="璇烽�夋嫨浼樺厛绾�">
+                <el-option
+                  v-for="item in priorityOptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎴鏃堕棿" prop="deadline">
+              <el-date-picker
+                v-model="workOrderForm.deadline"
+                type="datetime"
+                placeholder="璇烽�夋嫨鎴鏃堕棿"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="宸ュ崟鍐呭" prop="content">
+              <el-input type="textarea" :rows="4" v-model="workOrderForm.content" placeholder="璇疯緭鍏ュ伐鍗曞唴瀹�" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="宸ュ崟鐘舵��" prop="status">
+              <el-radio-group v-model="workOrderForm.status">
+                <el-radio
+                  v-for="dict in workOrderStatusOptions"
+                  :key="dict.value"
+                  :label="dict.value"
+                >{{dict.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12" v-if="workOrderForm.status === '1'">
+            <el-form-item label="澶勭悊浜�" prop="assignee">
+              <el-select v-model="workOrderForm.assignee" placeholder="璇烽�夋嫨澶勭悊浜�">
+                <el-option
+                  v-for="item in memberList"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitWorkOrderForm">纭� 瀹�</el-button>
+        <el-button @click="cancelWorkOrderForm">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 鎸囨淳宸ュ崟瀵硅瘽妗� -->
+    <el-dialog title="鎸囨淳宸ュ崟" :visible.sync="assignDialogVisible" width="40%" append-to-body>
+      <el-form :model="assignForm" label-width="80px">
+        <el-form-item label="宸ュ崟鏍囬">
+          <el-input v-model="assignForm.title" disabled />
+        </el-form-item>
+        <el-form-item label="澶勭悊浜�" prop="assignee">
+          <el-select v-model="assignForm.assignee" placeholder="璇烽�夋嫨澶勭悊浜�" style="width: 100%">
+            <el-option
+              v-for="item in availableMembers"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="浼樺厛绾�" prop="priority">
+          <el-select v-model="assignForm.priority" placeholder="璇烽�夋嫨浼樺厛绾�" style="width: 100%">
+            <el-option
+              v-for="item in priorityOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鎴鏃堕棿" prop="deadline">
+          <el-date-picker
+            v-model="assignForm.deadline"
+            type="datetime"
+            placeholder="璇烽�夋嫨鎴鏃堕棿"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            style="width: 100%"
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitAssign">纭� 瀹�</el-button>
+        <el-button @click="assignDialogVisible = false">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { parseTime } from '@/utils/ruoyi'
+
+export default {
+  name: "TeamManagement",
+  dicts: ['sys_normal_disable', 'sys_user_sex'],
+  data() {
+    return {
+      // 褰撳墠婵�娲荤殑鏍囩椤�
+      activeTab: 'team',
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+
+      // 鍥㈤槦绠$悊鐩稿叧鏁版嵁
+      teamLoading: false,
+       multiple: false, // 杩欓噷娣诲姞
+      teamList: [
+        {
+          id: 1,
+          name: "鍓嶇寮�鍙戝洟闃�",
+          leader: "寮犱笁",
+          members: [
+            { id: 1, name: "寮犱笁", position: "鍓嶇缁勯暱", phone: "13800138001", email: "zhangsan@example.com", currentWorkOrder: "WO20230001", status: "1" },
+            { id: 2, name: "鏉庡洓", position: "楂樼骇鍓嶇", phone: "13800138002", email: "lisi@example.com", currentWorkOrder: "", status: "1" },
+            { id: 3, name: "鐜嬩簲", position: "鍓嶇寮�鍙�", phone: "13800138003", email: "wangwu@example.com", currentWorkOrder: "WO20230002", status: "1" }
+          ],
+          createTime: "2023-01-15 09:30:00",
+          status: "1",
+          description: "璐熻矗鍏徃鎵�鏈夊墠绔」鐩殑寮�鍙戝拰缁存姢"
+        },
+        {
+          id: 2,
+          name: "鍚庣寮�鍙戝洟闃�",
+          leader: "璧靛叚",
+          members: [
+            { id: 4, name: "璧靛叚", position: "鍚庣缁勯暱", phone: "13800138004", email: "zhaoliu@example.com", currentWorkOrder: "WO20230003", status: "1" },
+            { id: 5, name: "閽变竷", position: "楂樼骇鍚庣", phone: "13800138005", email: "qianqi@example.com", currentWorkOrder: "", status: "1" },
+            { id: 6, name: "瀛欏叓", position: "鍚庣寮�鍙�", phone: "13800138006", email: "sunba@example.com", currentWorkOrder: "", status: "1" }
+          ],
+          createTime: "2023-01-20 14:20:00",
+          status: "1",
+          description: "璐熻矗鍏徃鎵�鏈夊悗绔湇鍔$殑寮�鍙戝拰缁存姢"
+        },
+        {
+          id: 3,
+          name: "娴嬭瘯鍥㈤槦",
+          leader: "鍛ㄤ節",
+          members: [
+            { id: 7, name: "鍛ㄤ節", position: "娴嬭瘯缁忕悊", phone: "13800138007", email: "zhoujiu@example.com", currentWorkOrder: "WO20230004", status: "1" },
+            { id: 8, name: "鍚村崄", position: "娴嬭瘯宸ョ▼甯�", phone: "13800138008", email: "wushi@example.com", currentWorkOrder: "", status: "1" }
+          ],
+          createTime: "2023-02-10 10:15:00",
+          status: "1",
+          description: "璐熻矗鍏徃鎵�鏈夐」鐩殑娴嬭瘯宸ヤ綔"
+        }
+      ],
+      teamQueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: undefined,
+        status: undefined
+      },
+      teamTotal: 3,
+      teamStatusOptions: [
+        { value: "0", label: "绂佺敤" },
+        { value: "1", label: "鍚敤" }
+      ],
+      teamDialogVisible: false,
+      teamDialogTitle: "",
+      currentTeam: {
+      id: undefined,
+      name: undefined,
+      leader: undefined,
+      members: [],  // 纭繚鏈夐粯璁ょ┖鏁扮粍
+      createTime: undefined,
+      status: undefined,
+      description: undefined
+    },
+      teamFormVisible: false,
+      teamFormTitle: "",
+      teamForm: {
+        id: undefined,
+        name: undefined,
+        leader: undefined,
+        members: [],
+        status: "1",
+        description: undefined
+      },
+      teamRules: {
+        name: [
+          { required: true, message: "鍥㈤槦鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        leader: [
+          { required: true, message: "鍥㈤槦缁勯暱涓嶈兘涓虹┖", trigger: "change" }
+        ],
+        status: [
+          { required: true, message: "鍥㈤槦鐘舵�佷笉鑳戒负绌�", trigger: "change" }
+        ]
+      },
+
+      // 浜哄憳鍒嗙粍鐩稿叧鏁版嵁
+      memberLoading: false,
+      memberList: [
+        { id: 1, name: "寮犱笁", teamId: 1, teamName: "鍓嶇寮�鍙戝洟闃�", position: "鍓嶇缁勯暱", phone: "13800138001", email: "zhangsan@example.com", currentWorkOrder: "WO20230001", status: "1" },
+        { id: 2, name: "鏉庡洓", teamId: 1, teamName: "鍓嶇寮�鍙戝洟闃�", position: "楂樼骇鍓嶇", phone: "13800138002", email: "lisi@example.com", currentWorkOrder: "", status: "1" },
+        { id: 3, name: "鐜嬩簲", teamId: 1, teamName: "鍓嶇寮�鍙戝洟闃�", position: "鍓嶇寮�鍙�", phone: "13800138003", email: "wangwu@example.com", currentWorkOrder: "WO20230002", status: "1" },
+        { id: 4, name: "璧靛叚", teamId: 2, teamName: "鍚庣寮�鍙戝洟闃�", position: "鍚庣缁勯暱", phone: "13800138004", email: "zhaoliu@example.com", currentWorkOrder: "WO20230003", status: "1" },
+        { id: 5, name: "閽变竷", teamId: 2, teamName: "鍚庣寮�鍙戝洟闃�", position: "楂樼骇鍚庣", phone: "13800138005", email: "qianqi@example.com", currentWorkOrder: "", status: "1" },
+        { id: 6, name: "瀛欏叓", teamId: 2, teamName: "鍚庣寮�鍙戝洟闃�", position: "鍚庣寮�鍙�", phone: "13800138006", email: "sunba@example.com", currentWorkOrder: "", status: "1" },
+        { id: 7, name: "鍛ㄤ節", teamId: 3, teamName: "娴嬭瘯鍥㈤槦", position: "娴嬭瘯缁忕悊", phone: "13800138007", email: "zhoujiu@example.com", currentWorkOrder: "WO20230004", status: "1" },
+        { id: 8, name: "鍚村崄", teamId: 3, teamName: "娴嬭瘯鍥㈤槦", position: "娴嬭瘯宸ョ▼甯�", phone: "13800138008", email: "wushi@example.com", currentWorkOrder: "", status: "1" }
+      ],
+      memberQueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: undefined,
+        teamId: undefined,
+        status: undefined
+      },
+      memberTotal: 8,
+      memberStatusOptions: [
+        { value: "0", label: "绂佺敤" },
+        { value: "1", label: "鍚敤" }
+      ],
+      memberFormVisible: false,
+      memberFormTitle: "",
+      memberForm: {
+        id: undefined,
+        name: undefined,
+        teamId: undefined,
+        position: undefined,
+        phone: undefined,
+        email: undefined,
+        status: "1"
+      },
+      memberRules: {
+        name: [
+          { required: true, message: "鎴愬憳濮撳悕涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        teamId: [
+          { required: true, message: "鎵�灞炲洟闃熶笉鑳戒负绌�", trigger: "change" }
+        ],
+        position: [
+          { required: true, message: "鑱屼綅涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        phone: [
+          { required: true, message: "鑱旂郴鐢佃瘽涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        email: [
+          { required: true, message: "閭涓嶈兘涓虹┖", trigger: "blur" },
+          { type: 'email', message: '璇疯緭鍏ユ纭殑閭鍦板潃', trigger: ['blur', 'change'] }
+        ],
+        status: [
+          { required: true, message: "鎴愬憳鐘舵�佷笉鑳戒负绌�", trigger: "change" }
+        ]
+      },
+
+      // 宸ュ崟鎸囨淳鐩稿叧鏁版嵁
+      workOrderLoading: false,
+      workOrderList: [
+        { id: "WO20230001", title: "棣栭〉鏀圭増闇�姹傚紑鍙�", priority: "1", createTime: "2023-03-01 09:30:00", deadline: "2023-03-15 18:00:00", assignee: 1, assigneeName: "寮犱笁", status: "1", content: "瀹屾垚棣栭〉鏀圭増鐨勬墍鏈夊墠绔紑鍙戝伐浣�" },
+        { id: "WO20230002", title: "鐢ㄦ埛涓績鎺ュ彛寮�鍙�", priority: "2", createTime: "2023-03-05 14:20:00", deadline: "2023-03-20 18:00:00", assignee: 3, assigneeName: "鐜嬩簲", status: "1", content: "寮�鍙戠敤鎴蜂腑蹇冪浉鍏虫帴鍙�" },
+        { id: "WO20230003", title: "璁㈠崟绯荤粺鎬ц兘浼樺寲", priority: "1", createTime: "2023-03-10 10:15:00", deadline: "2023-03-25 18:00:00", assignee: 4, assigneeName: "璧靛叚", status: "1", content: "浼樺寲璁㈠崟绯荤粺鎬ц兘锛屾彁楂樺搷搴旈�熷害" },
+        { id: "WO20230004", title: "鏀粯鍔熻兘娴嬭瘯", priority: "3", createTime: "2023-03-15 16:45:00", deadline: "2023-03-30 18:00:00", assignee: 7, assigneeName: "鍛ㄤ節", status: "1", content: "瀹屾垚鏀粯鍔熻兘鐨勫叏闈㈡祴璇�" },
+        { id: "WO20230005", title: "鏁版嵁鎶ヨ〃寮�鍙�", priority: "2", createTime: "2023-03-20 11:10:00", deadline: "2023-04-05 18:00:00", assignee: undefined, assigneeName: undefined, status: "0", content: "寮�鍙戞暟鎹粺璁℃姤琛ㄥ姛鑳�" }
+      ],
+      workOrderQueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        id: undefined,
+        status: undefined,
+        assignee: undefined
+      },
+      workOrderTotal: 5,
+      workOrderStatusOptions: [
+        { value: "0", label: "寰呮寚娲�" },
+        { value: "1", label: "杩涜涓�" },
+        { value: "2", label: "宸插畬鎴�" },
+        { value: "3", label: "宸插彇娑�" }
+      ],
+      priorityOptions: [
+        { value: "1", label: "楂�" },
+        { value: "2", label: "涓�" },
+        { value: "3", label: "浣�" }
+      ],
+      workOrderFormVisible: false,
+      workOrderFormTitle: "",
+      workOrderForm: {
+        id: undefined,
+        title: undefined,
+        priority: "2",
+        createTime: undefined,
+        deadline: undefined,
+        assignee: undefined,
+        status: "0",
+        content: undefined
+      },
+      workOrderRules: {
+        title: [
+          { required: true, message: "宸ュ崟鏍囬涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        priority: [
+          { required: true, message: "浼樺厛绾т笉鑳戒负绌�", trigger: "change" }
+        ],
+        deadline: [
+          { required: true, message: "鎴鏃堕棿涓嶈兘涓虹┖", trigger: "change" }
+        ],
+        content: [
+          { required: true, message: "宸ュ崟鍐呭涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        status: [
+          { required: true, message: "宸ュ崟鐘舵�佷笉鑳戒负绌�", trigger: "change" }
+        ]
+      },
+
+      // 鎸囨淳宸ュ崟鐩稿叧鏁版嵁
+      assignDialogVisible: false,
+      assignForm: {
+        id: undefined,
+        title: undefined,
+        assignee: undefined,
+        priority: "2",
+        deadline: undefined
+      }
+    };
+  },
+  computed: {
+    // 鍥㈤槦鎴愬憳閫夐」锛堢敤浜庣┛姊锛�
+    memberOptions() {
+      return this.memberList.map(member => ({
+        key: member.id,
+        label: member.name,
+        disabled: member.status === "0"
+      }));
+    },
+    // 杩囨护鍚庣殑鍥㈤槦鍒楄〃
+    filteredTeamList() {
+      let list = [...this.teamList];
+      if (this.teamQueryParams.name) {
+        list = list.filter(item =>
+          item.name.includes(this.teamQueryParams.name)
+        );
+      }
+      if (this.teamQueryParams.status) {
+        list = list.filter(item =>
+          item.status === this.teamQueryParams.status
+        );
+      }
+      return list;
+    },
+    // 杩囨护鍚庣殑鎴愬憳鍒楄〃
+    filteredMemberList() {
+      let list = [...this.memberList];
+      if (this.memberQueryParams.name) {
+        list = list.filter(item =>
+          item.name.includes(this.memberQueryParams.name)
+        );
+      }
+      if (this.memberQueryParams.teamId) {
+        list = list.filter(item =>
+          item.teamId === this.memberQueryParams.teamId
+        );
+      }
+      if (this.memberQueryParams.status) {
+        list = list.filter(item =>
+          item.status === this.memberQueryParams.status
+        );
+      }
+      return list;
+    },
+    // 杩囨护鍚庣殑宸ュ崟鍒楄〃
+    filteredWorkOrderList() {
+      let list = [...this.workOrderList];
+      if (this.workOrderQueryParams.id) {
+        list = list.filter(item =>
+          item.id.includes(this.workOrderQueryParams.id)
+        );
+      }
+      if (this.workOrderQueryParams.status) {
+        list = list.filter(item =>
+          item.status === this.workOrderQueryParams.status
+        );
+      }
+      if (this.workOrderQueryParams.assignee) {
+        list = list.filter(item =>
+          item.assignee === this.workOrderQueryParams.assignee
+        );
+      }
+      return list;
+    },
+    // 鍥㈤槦宸ュ崟锛堢敤浜庡洟闃熻鎯咃級
+    teamWorkOrders() {
+      if (!this.currentTeam.id) return [];
+      const teamMemberIds = this.currentTeam.members.map(member => member.id);
+      return this.workOrderList.filter(order =>
+        teamMemberIds.includes(order.assignee)
+      );
+    },
+    // 鍙敤鎴愬憳锛堢敤浜庡伐鍗曟寚娲撅級
+    availableMembers() {
+      return this.memberList.filter(member =>
+        member.status === "1" && !member.currentWorkOrder
+      );
+    }
+  },
+  methods: {
+    // 瑙f瀽鏃堕棿
+    parseTime,
+    /** 鍥㈤槦绠$悊鐩稿叧鏂规硶 */
+    // 鏌ヨ鍥㈤槦鍒楄〃
+    getTeamList() {
+      this.teamLoading = true;
+      setTimeout(() => {
+        this.teamLoading = false;
+      }, 500);
+    },
+    // 鍥㈤槦鎼滅储
+    handleTeamQuery() {
+      this.teamQueryParams.pageNum = 1;
+    },
+    // 閲嶇疆鍥㈤槦鎼滅储
+    resetTeamQuery() {
+      this.resetForm("teamQueryForm");
+      this.handleTeamQuery();
+    },
+    // 鍥㈤槦澶氶��
+    handleTeamSelectionChange(selection) {
+      this.ids = selection.map(item => item.id);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    // 鏌ョ湅鍥㈤槦璇︽儏
+    handleTeamDetail(row) {
+      this.currentTeam = row;
+      this.teamDialogTitle = "鍥㈤槦璇︽儏 - " + row.name;
+      this.teamDialogVisible = true;
+    },
+    // 鏂板鍥㈤槦
+    handleTeamAdd() {
+      this.resetTeamForm();
+      this.teamFormTitle = "鏂板鍥㈤槦";
+      this.teamFormVisible = true;
+    },
+    // 淇敼鍥㈤槦
+    handleTeamUpdate(row) {
+      this.resetTeamForm();
+      const team = this.teamList.find(item => item.id === row.id);
+      this.teamForm = Object.assign({}, team);
+      this.teamForm.members = team.members.map(member => member.id);
+      this.teamFormTitle = "淇敼鍥㈤槦";
+      this.teamFormVisible = true;
+    },
+    // 鍒犻櫎鍥㈤槦
+    handleTeamDelete(row) {
+      const teamIds = row.id || this.ids;
+      this.$modal.confirm('鏄惁纭鍒犻櫎鍥㈤槦鍚嶇О涓�"' + row.name + '"鐨勬暟鎹」锛�').then(() => {
+        // 妯℃嫙鍒犻櫎鍥㈤槦
+        this.teamList = this.teamList.filter(item => item.id !== teamIds);
+        this.teamTotal = this.teamList.length;
+        this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(() => {});
+    },
+    // 鎻愪氦鍥㈤槦琛ㄥ崟
+    submitTeamForm() {
+      this.$refs["teamForm"].validate(valid => {
+        if (valid) {
+          if (this.teamForm.id != null) {
+            // 妯℃嫙淇敼鍥㈤槦
+            const index = this.teamList.findIndex(item => item.id === this.teamForm.id);
+            if (index !== -1) {
+              const leader = this.memberList.find(member => member.id === this.teamForm.leader);
+              const members = this.memberList.filter(member =>
+                this.teamForm.members.includes(member.id)
+              );
+
+              this.teamList.splice(index, 1, {
+                ...this.teamForm,
+                leader: leader ? leader.name : '',
+                members: members
+              });
+            }
+            this.$modal.msgSuccess("淇敼鎴愬姛");
+          } else {
+            // 妯℃嫙鏂板鍥㈤槦
+            const newId = Math.max(...this.teamList.map(item => item.id)) + 1;
+            const leader = this.memberList.find(member => member.id === this.teamForm.leader);
+            const members = this.memberList.filter(member =>
+              this.teamForm.members.includes(member.id)
+            );
+
+            this.teamList.unshift({
+              ...this.teamForm,
+              id: newId,
+              leader: leader ? leader.name : '',
+              members: members,
+              createTime: new Date().toLocaleString()
+            });
+            this.teamTotal = this.teamList.length;
+            this.$modal.msgSuccess("鏂板鎴愬姛");
+          }
+          this.teamFormVisible = false;
+        }
+      });
+    },
+    // 閲嶇疆鍥㈤槦琛ㄥ崟
+    resetTeamForm() {
+      this.teamForm = {
+        id: undefined,
+        name: undefined,
+        leader: undefined,
+        members: [],
+        status: "1",
+        description: undefined
+      };
+      this.resetForm("teamForm");
+    },
+    // 鍙栨秷鍥㈤槦琛ㄥ崟
+    cancelTeamForm() {
+      this.teamFormVisible = false;
+      this.resetTeamForm();
+    },
+
+    /** 浜哄憳鍒嗙粍鐩稿叧鏂规硶 */
+    // 鏌ヨ鎴愬憳鍒楄〃
+    getMemberList() {
+      this.memberLoading = true;
+      setTimeout(() => {
+        this.memberLoading = false;
+      }, 500);
+    },
+    // 鎴愬憳鎼滅储
+    handleMemberQuery() {
+      this.memberQueryParams.pageNum = 1;
+    },
+    // 閲嶇疆鎴愬憳鎼滅储
+    resetMemberQuery() {
+      this.resetForm("memberQueryForm");
+      this.handleMemberQuery();
+    },
+    // 鎴愬憳澶氶��
+    handleMemberSelectionChange(selection) {
+      this.ids = selection.map(item => item.id);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    // 鏂板鎴愬憳
+    handleMemberAdd() {
+      this.resetMemberForm();
+      this.memberFormTitle = "鏂板鎴愬憳";
+      this.memberFormVisible = true;
+    },
+    // 淇敼鎴愬憳
+    handleMemberUpdate(row) {
+      this.resetMemberForm();
+      const member = this.memberList.find(item => item.id === row.id);
+      this.memberForm = Object.assign({}, member);
+      this.memberFormTitle = "淇敼鎴愬憳";
+      this.memberFormVisible = true;
+    },
+    // 鍒犻櫎鎴愬憳
+    handleMemberDelete(row) {
+      const memberIds = row.id || this.ids;
+      this.$modal.confirm('鏄惁纭鍒犻櫎鎴愬憳濮撳悕涓�"' + row.name + '"鐨勬暟鎹」锛�').then(() => {
+        // 妯℃嫙鍒犻櫎鎴愬憳
+        this.memberList = this.memberList.filter(item => item.id !== memberIds);
+        this.memberTotal = this.memberList.length;
+        this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(() => {});
+    },
+    // 鎻愪氦鎴愬憳琛ㄥ崟
+    submitMemberForm() {
+      this.$refs["memberForm"].validate(valid => {
+        if (valid) {
+          if (this.memberForm.id != null) {
+            // 妯℃嫙淇敼鎴愬憳
+            const index = this.memberList.findIndex(item => item.id === this.memberForm.id);
+            if (index !== -1) {
+              const team = this.teamList.find(item => item.id === this.memberForm.teamId);
+              this.memberList.splice(index, 1, {
+                ...this.memberForm,
+                teamName: team ? team.name : ''
+              });
+            }
+            this.$modal.msgSuccess("淇敼鎴愬姛");
+          } else {
+            // 妯℃嫙鏂板鎴愬憳
+            const newId = Math.max(...this.memberList.map(item => item.id)) + 1;
+            const team = this.teamList.find(item => item.id === this.memberForm.teamId);
+            this.memberList.unshift({
+              ...this.memberForm,
+              id: newId,
+              teamName: team ? team.name : '',
+              currentWorkOrder: ''
+            });
+            this.memberTotal = this.memberList.length;
+            this.$modal.msgSuccess("鏂板鎴愬姛");
+          }
+          this.memberFormVisible = false;
+        }
+      });
+    },
+    // 閲嶇疆鎴愬憳琛ㄥ崟
+    resetMemberForm() {
+      this.memberForm = {
+        id: undefined,
+        name: undefined,
+        teamId: undefined,
+        position: undefined,
+        phone: undefined,
+        email: undefined,
+        status: "1"
+      };
+      this.resetForm("memberForm");
+    },
+    // 鍙栨秷鎴愬憳琛ㄥ崟
+    cancelMemberForm() {
+      this.memberFormVisible = false;
+      this.resetMemberForm();
+    },
+
+    /** 宸ュ崟鎸囨淳鐩稿叧鏂规硶 */
+    // 鏌ヨ宸ュ崟鍒楄〃
+    getWorkOrderList() {
+      this.workOrderLoading = true;
+      setTimeout(() => {
+        this.workOrderLoading = false;
+      }, 500);
+    },
+    // 宸ュ崟鎼滅储
+    handleWorkOrderQuery() {
+      this.workOrderQueryParams.pageNum = 1;
+    },
+    // 閲嶇疆宸ュ崟鎼滅储
+    resetWorkOrderQuery() {
+      this.resetForm("workOrderQueryForm");
+      this.handleWorkOrderQuery();
+    },
+    // 宸ュ崟澶氶��
+    handleWorkOrderSelectionChange(selection) {
+      this.ids = selection.map(item => item.id);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    // 鏂板宸ュ崟
+    handleWorkOrderAdd() {
+      this.resetWorkOrderForm();
+      this.workOrderFormTitle = "鏂板缓宸ュ崟";
+      this.workOrderFormVisible = true;
+    },
+    // 淇敼宸ュ崟
+    handleWorkOrderUpdate(row) {
+      this.resetWorkOrderForm();
+      const workOrder = this.workOrderList.find(item => item.id === row.id);
+      this.workOrderForm = Object.assign({}, workOrder);
+      this.workOrderFormTitle = "缂栬緫宸ュ崟";
+      this.workOrderFormVisible = true;
+    },
+    // 鍒犻櫎宸ュ崟
+    handleWorkOrderDelete(row) {
+      const workOrderIds = row.id || this.ids;
+      this.$modal.confirm('鏄惁纭鍒犻櫎宸ュ崟鏍囬涓�"' + row.title + '"鐨勬暟鎹」锛�').then(() => {
+        // 妯℃嫙鍒犻櫎宸ュ崟
+        this.workOrderList = this.workOrderList.filter(item => item.id !== workOrderIds);
+        this.workOrderTotal = this.workOrderList.length;
+        this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(() => {});
+    },
+    // 鎸囨淳宸ュ崟
+    handleAssignWorkOrder(row) {
+      this.assignForm = {
+        id: row.id,
+        title: row.title,
+        assignee: undefined,
+        priority: row.priority,
+        deadline: row.deadline
+      };
+      this.assignDialogVisible = true;
+    },
+    // 鎻愪氦宸ュ崟琛ㄥ崟
+    submitWorkOrderForm() {
+      this.$refs["workOrderForm"].validate(valid => {
+        if (valid) {
+          if (this.workOrderForm.id != null) {
+            // 妯℃嫙淇敼宸ュ崟
+            const index = this.workOrderList.findIndex(item => item.id === this.workOrderForm.id);
+            if (index !== -1) {
+              const assignee = this.memberList.find(member => member.id === this.workOrderForm.assignee);
+              this.workOrderList.splice(index, 1, {
+                ...this.workOrderForm,
+                assigneeName: assignee ? assignee.name : undefined
+              });
+            }
+            this.$modal.msgSuccess("淇敼鎴愬姛");
+          } else {
+            // 妯℃嫙鏂板宸ュ崟
+            const newId = "WO" + new Date().getFullYear() + (Math.floor(Math.random() * 90000) + 10000);
+            const assignee = this.memberList.find(member => member.id === this.workOrderForm.assignee);
+            this.workOrderList.unshift({
+              ...this.workOrderForm,
+              id: newId,
+              assigneeName: assignee ? assignee.name : undefined,
+              createTime: new Date().toLocaleString()
+            });
+            this.workOrderTotal = this.workOrderList.length;
+            this.$modal.msgSuccess("鏂板鎴愬姛");
+          }
+          this.workOrderFormVisible = false;
+        }
+      });
+    },
+    // 閲嶇疆宸ュ崟琛ㄥ崟
+    resetWorkOrderForm() {
+      this.workOrderForm = {
+        id: undefined,
+        title: undefined,
+        priority: "2",
+        createTime: undefined,
+        deadline: undefined,
+        assignee: undefined,
+        status: "0",
+        content: undefined
+      };
+      this.resetForm("workOrderForm");
+    },
+    // 鍙栨秷宸ュ崟琛ㄥ崟
+    cancelWorkOrderForm() {
+      this.workOrderFormVisible = false;
+      this.resetWorkOrderForm();
+    },
+    // 鎻愪氦鎸囨淳
+    submitAssign() {
+      if (!this.assignForm.assignee) {
+        this.$modal.msgError("璇烽�夋嫨澶勭悊浜�");
+        return;
+      }
+
+      // 妯℃嫙鎸囨淳宸ュ崟
+      const index = this.workOrderList.findIndex(item => item.id === this.assignForm.id);
+      if (index !== -1) {
+        const assignee = this.memberList.find(member => member.id === this.assignForm.assignee);
+        if (assignee) {
+          // 鏇存柊宸ュ崟鐘舵��
+          this.workOrderList.splice(index, 1, {
+            ...this.workOrderList[index],
+            assignee: this.assignForm.assignee,
+            assigneeName: assignee.name,
+            priority: this.assignForm.priority,
+            deadline: this.assignForm.deadline,
+            status: "1"
+          });
+
+          // 鏇存柊鎴愬憳褰撳墠宸ュ崟
+          const memberIndex = this.memberList.findIndex(member => member.id === this.assignForm.assignee);
+          if (memberIndex !== -1) {
+            this.memberList.splice(memberIndex, 1, {
+              ...this.memberList[memberIndex],
+              currentWorkOrder: this.assignForm.id
+            });
+          }
+
+          this.$modal.msgSuccess("鎸囨淳鎴愬姛");
+          this.assignDialogVisible = false;
+        }
+      }
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.TeamManagement {
+  padding: 20px;
+}
+
+.headline {
+  display: flex;
+  justify-content: space-between;
+  font-size: 20px;
+  border-left: 4px solid #41a1be;
+  padding-left: 5px;
+  margin: 15px 0;
+}
+
+.avatar-uploader ::v-deep .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+}
+
+.avatar-uploader ::v-deep .el-upload:hover {
+  border-color: #409EFF;
+}
+
+.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 178px;
+  height: 178px;
+  line-height: 178px;
+  text-align: center;
+}
+
+.avatar {
+  width: 178px;
+  height: 178px;
+  display: block;
+}
+
+.team-members, .team-work-orders {
+  margin-top: 20px;
+}
+</style>

--
Gitblit v1.9.3