浏览代码

Merge branch 'master' of http://git.ius.plus/denny.zhao/VinnoManagementSystem

fly 2 年之前
父节点
当前提交
1cdfda1a39

+ 57 - 0
VinnoManagementSystem/src/api/wing/user.js

@@ -0,0 +1,57 @@
+import http from "@/utils/request"
+import common from "@/utils/common"
+
+export default {
+    fetchUserList: {
+		method: 'GetUserPagesAsync',
+		name: "用户列表",
+		post: async function (params) {            
+            var queryType = params.queryType == null ? '' : params.queryType
+            var queryState = params.queryState == null ? '' : params.queryState
+            var data = {
+                'PageIndex': params.page,
+                'PageSize': params.pageSize,
+                'QueryType': queryType,
+                'Keyword': params.keyword,
+                'QueryState': queryState
+            }
+            return await http.post({
+                "jsonrpc": "2.0",
+                "id": common.guid(),
+                "method": this.method,
+                "params": [data]
+            });
+        }
+	},
+    modifyUserPassword: {
+		method: 'ResetUserPassword',
+		name: "重置用户密码",
+		post: async function (req) {            
+            var data = {
+                'UserCode': req.code, 
+                'PassWord': req.password
+            }
+            return await http.post({
+                "jsonrpc": "2.0",
+                "id": common.guid(),
+                "method": this.method,
+                "params": [data]
+            });
+        }
+	},
+    userDetailInfo: {
+		method: 'FindUserByCode',
+		name: "用户详情",
+		post: async function (code) {            
+            var data = {
+                'UserCode': code, 
+            }
+            return await http.post({
+                "jsonrpc": "2.0",
+                "id": common.guid(),
+                "method": this.method,
+                "params": [data]
+            });
+        }
+	},
+}

+ 5 - 5
VinnoManagementSystem/src/components/admin/selectAdmin.vue

@@ -1,6 +1,6 @@
 <template>
   <el-dialog
-    :title="$t('admin.AssignAdmin')"
+    :title="$t('admin.assignAdmin')"
     v-model="visible"
     :width="800"
     destroy-on-close
@@ -13,7 +13,7 @@
             <el-input
               v-model="search.KeyWord"
               clearable
-              :placeholder="$t('admin.PleaseInputAdminName')"
+              :placeholder="$t('admin.pleaseInputAdminName')"
             >
             </el-input>
             <el-button type="primary" icon="el-icon-search" @click="upsearch">{{
@@ -41,15 +41,15 @@
             </template>
           </el-table-column>
           <el-table-column
-            :label="$t('admin.AccountName')"
+            :label="$t('admin.accountName')"
             prop="AdminName"
           ></el-table-column>
           <el-table-column
-            :label="$t('admin.FullName')"
+            :label="$t('admin.fullName')"
             prop="FullName"
           ></el-table-column>
           <el-table-column
-            :label="$t('admin.RoleName')"
+            :label="$t('admin.roleName')"
             prop="DefaultRoleName"
           ></el-table-column>
         </scTable>

+ 58 - 35
VinnoManagementSystem/src/locales/lang/en.js

@@ -12,6 +12,8 @@ export default {
 	rejected: "Rejected",
 	version: "Version",
 	more: "More",
+	yes: "Yes",
+	no: "No",
 	login: {
 		slogan: 'High performance / delicate / grace',
 		describe: 'Vue3 + element plus based front-end solutions in the background.',
@@ -64,8 +66,29 @@ export default {
 		authorityName: "Authority Name",
 		uniqueCode: "Unique Code",
 		uniqueCodeTip: "The system is unique and cannot be repeated, otherwise the permission will be invalid.",
+		userStatus: "User Status",
+		authenticationState: "Authentication State",
+		userStatusPlaceholder: "Please Choose User Status",		
+		nonactivated: "Nonactivated",
 		authorityNameRequire: "Please input authority name",
 		uniqueCodeRequire: "Please input unique code",
+		frontAuthority: "Front Authority",
+		selectItem: "Please select the menu on the left to operate",
+		activated: "Activated",
+		uncertified: "Uncertified",
+		waitcertified: "Wait Certified",
+		rejected: "Rejected",
+		certified: "Certified",
+		registerTime: "Register Time",
+		certificationAudit: "Certification audit",
+		rejectReason: "Reject Reason",
+		inputRejectReason: "Input RejectReason",
+		rejectReasonRequired: "RejectReason Required",
+		auditText: "Approved or not",
+		doctorLicense: "Doctor's license",
+		cardFront: "Card Front",
+		cardreverse: "Card Reverse",
+		applyRoleName: "Apply Role",
 	},
 	dialogBox: {
 		confirmWarningText:"Confirm whether to ",
@@ -95,11 +118,11 @@ export default {
 		description: "Description"
 	},
 	admin: {
-		AssignAdmin: "Assign Admin",
-		PleaseInputAdminName: "Please input name",
-		AccountName: "Account Name",
-		FullName: "User Name",
-		RoleName: "Role Name",
+		assignAdmin: "Assign Admin",
+		pleaseInputAdminName: "Please input name",
+		accountName: "Account Name",
+		fullName: "User Name",
+		roleName: "Role Name",
 		adminQueryTypeOption0: "Account Name",
 		adminQueryTypeOption1: "User Name",
 		adminRoleQuery: "Admin Role",
@@ -111,36 +134,36 @@ export default {
 		assignRole: "assign Role"
 	},
 	organization: {
-		OrganizationName: "Organization Name",
-		OrganizationLogo: "Organization Logo",
-		OrganizationState: "Audit State",
-		OrganizationState0: "WaitAudit",
-		OrganizationState1: "Audited",
-		OrganizationState2: "Rejected",
-		WaitAudit: "WaitAudit",
-		Audited: "Audited",
-		Rejected: "Rejected",
-		CountryName: "Country",
-		ProvinceName: "Province",
-		CityName: "City",
-		PatientType: "Patient Type",
-		PatientType0: "Person",
-		PatientType1: "Animal",
-		AdminFullName: "Admin Name",
-		DirectorName: "Organization Director",
-		QueryType0: "Organization Name",
-		QueryType1: "Admin Name",
-		AssignAdmin: "Assign Admin",
-		ConfirmDelete: "Are You Sure To Del This Organization ?",
-		ConfirmDelete2: "There has users or devices in the current organization. Are you sure to delete this Organization",
-		FrontOrganization: "Front Organization",
-		ApproveOrgMsg: "Are You Sure To Approve This Organization?",
-		OrgNameRequire: "Please input Organization Name",
-		PatientTypeRequire: "Please choose patient type",
-		UploadLogo: "Upload Logo",
-		SetDirector: "Set Director",
-		Setting0: "Patient Setting",
-		Setting1: "Exam Setting",
+		organizationName: "Organization Name",
+		organizationLogo: "Organization Logo",
+		organizationState: "Audit State",
+		organizationState0: "WaitAudit",
+		organizationState1: "Audited",
+		organizationState2: "Rejected",
+		waitAudit: "WaitAudit",
+		audited: "Audited",
+		rejected: "Rejected",
+		countryName: "Country",
+		provinceName: "Province",
+		cityName: "City",
+		patientType: "Patient Type",
+		patientType0: "Person",
+		patientType1: "Animal",
+		adminFullName: "Admin Name",
+		directorName: "Organization Director",
+		queryType0: "Organization Name",
+		queryType1: "Admin Name",
+		assignAdmin: "Assign Admin",
+		confirmDelete: "Are You Sure To Del This Organization ?",
+		confirmDelete2: "There has users or devices in the current organization. Are you sure to delete this Organization?",
+		frontOrganization: "Front Organization",
+		approveOrgMsg: "Are You Sure To Approve This Organization?",
+		orgNameRequire: "Please input Organization Name",
+		patientTypeRequire: "Please choose patient type",
+		uploadLogo: "Upload Logo",
+		setDirector: "Set Director",
+		setting0: "Patient Setting",
+		setting1: "Exam Setting",
 	},
 	menu: {		
 		home: "Home Page",

+ 77 - 54
VinnoManagementSystem/src/locales/lang/zh-cn.js

@@ -12,18 +12,20 @@ export default {
 	rejected: "审核不通过",
 	version: "版本",
 	more: "更多",
+	yes: "是",
+	no: "否",
 	login: {
 		slogan: '高性能 / 精致 / 优雅',
-		describe: '基于Vue3 + Element-Plus 的中后台前端解决方案',
+		describe: '基于Vue3 + Element-Plus 的中后台前端解决方案',
 		signInTitle: '杏聆荟管理后台',
-		rememberMe: '记住',
+		rememberMe: '记住密码',
 		forgetPassword: '忘记密码',
 		signIn: '登录',
 		signInOther: '其他登录方式',
 		userPlaceholder: '用户名 / 手机 / 邮箱',
 		userError: '请输入用户名',
 		PWPlaceholder: '请输入密码',
-		PWError: '请输入密码',
+		PWError: '请输入密码',
 		admin: '管理员',
 		copyright: "©2019-2022 Vinno Corporation. All rights reserved.",
 		loginError: '登录失败',
@@ -33,13 +35,13 @@ export default {
 		loginResult: "登录成功",
 		addPassword: "新增密码",
 		editPassword: "修改密码",
-		inputAdminCode: "请输入用户编码",
+		inputAdminCode: '请输入用户编码',
 		inputAdminOldPwd: "请输入旧密码",
-		inputAdminPwd: "请输入登录密码",
-		inputPwdValidate: "密码必须是由4-20位字母+数字组合",
-		againInputPwd: "请再次输入密码",
-		pwdDiff: "两次输入密码不一致",
-		adminOldPwd: "旧密码",
+		inputAdminPwd: '请输入登录密码',
+		inputPwdValidate: "密码必须是由4-20位字数字组合",
+		againInputPwd: '请再次输入密码',
+		pwdDiff: '两次输入密码不一致',
+		adminOldPwd: '旧密码',
 		newAdminPwd: "登录密码",
 		confirmAdminPwd: "确认密码",
 		loginOutConfirmTitle: "退出当前用户?"
@@ -47,11 +49,11 @@ export default {
 	dialogBox: {
 		confirmWarningText: "确认是否",
 		confirmWarningTitle: "提示",
-		confirmWarningButtonText: "退 出",
-		cancelButtonText: "取 消",
-		confirmButtonText: "确 认",
-		saveButtonText: "保 存",
-		clearButtonText: "清 空",
+		confirmWarningButtonText: '退 出',
+		cancelButtonText: '取 消',
+		confirmButtonText: '确 认',
+		saveButtonText: '保 存',
+		clearButtonText: '清 除',
 		confirm: "确定",
 		addTitle: "新增",
 		shareTitle: "分配",
@@ -59,7 +61,7 @@ export default {
 		removeTitle: "移除",
 		detailTitle: "查看详情",
 		confirmDeleteText: "确定删除吗?",
-		searchButtonText: "搜 索"
+		searchButtonText: '搜索'
 	},
 	response: {
 		operateSuccess: "操作成功",
@@ -68,11 +70,11 @@ export default {
 		operateEditButton: "编辑",
 		operateDeleteButton: "删除",
 		deleteSuccess: "删除成功",
-		keywordLabel: "关键字",
+		keywordLabel: '关键字',
 		description: "描述"
 	},
 	user: {
-		dynamic: '近期动',
+		dynamic: '近期动',
 		info: '个人信息',
 		settings: '设置',
 		nightmode: "黑夜模式",
@@ -81,25 +83,46 @@ export default {
 		language_msg: '翻译进行中,暂翻译了本视图的文本',
 		personSetting: '个人设置',
 		modifyPwd: '修改密码',
-		loginOut: '退出登',
-		userName: "用户名",
+		loginOut: '退出登',
+		userName: '用户名',
 		fullName: "用户姓名",
 		phone: "手机号",
 		email: "邮箱",
 		hospitalName: "所在医院",
+		userStatus: "用户状态",
+		authenticationState: "认证状",
+		userStatusPlaceholder: "请选择用户状",
+		nonactivated: "未激",
+		activated: "已激",
+		uncertified: "未认",
+		waitcertified: "待审",
+		rejected: "已拒",
+		certified: "已认",
+		registerTime: "注册时间",
+		certificationAudit: "认证审核",
+		rejectReason: "拒绝原因",
+		inputRejectReason: "请输入拒绝原因",
+		rejectReasonRequired: "拒绝原因必填",
+		auditText: "是否审核通过",
+		doctorLicense: "医师执照",
+		cardFront: "身份证正面",
+		cardreverse: "身份证反面",
+		applyRoleName: "申请角色",
 		assignUser: "分配负责人",
 		authorityName: "权限名称",
 		uniqueCode: "权限唯一码",
 		uniqueCodeTip: "系统唯一不可重复,否则将导致权限失效。",
 		authorityNameRequire: "请输入权限名称",
 		uniqueCodeRequire: "请输入权限唯一码",
+		frontAuthority: "上级权限",
+		selectItem: "请选择左侧菜单后操作",
 	},
 	admin: {
-		AssignAdmin: "分配管理员",
-		PleaseInputAdminName: "请输入管理员姓名",
-		AccountName: "用户名",
-		FullName: "用户姓名",
-		RoleName: "角色名称",
+		assignAdmin: "分配管理员",
+		pleaseInputAdminName: "请输入管理员姓名",
+		accountName: "用户名",
+		fullName: "用户姓名",
+		roleName: "角色名称",
 		adminQueryTypeOption0: "用户名",
 		adminQueryTypeOption1: "姓名",
 		adminRoleQuery: "管理员角色",
@@ -111,36 +134,36 @@ export default {
 		assignRole: "分配角色"
 	},
 	organization: {
-		OrganizationName: "机构名称",
-		OrganizationLogo: "机构Logo",
-		OrganizationState: "审核状态",
-		OrganizationState0: "待审核",
-		OrganizationState1: "已审核",
-		OrganizationState2: "已驳回",
-		WaitAudit: "待审核",
-		Audited: "已审核",
-		Rejected: "已驳回",
-		CountryName: "国家地区",
-		ProvinceName: "省份",
-		CityName: "城市",
-		PatientType: "服务对象",
-		PatientType0: "人用",
-		PatientType1: "兽用",
-		AdminFullName: "所属管理员",
-		DirectorName: "机构负责人",
-		QueryType0: "机构名称",
-		QueryType1: "所属管理员",
-		AssignAdmin: "分配管理员",
-		ConfirmDelete: "确定删除该组织吗?",
-		ConfirmDelete2: "当前机构存在绑定用户或设备,确定删除吗?",
-		FrontOrganization: "上级机构",
-		ApproveOrgMsg: "该机构是否审核通过?",
-		OrgNameRequire: "请输入机构名称",
-		PatientTypeRequire: "请选择服务对象",
-		UploadLogo: "上传Logo",
-		SetDirector: "编辑负责人",
-		Setting0: "病人配置",
-		Setting1: "检查配置",
+		organizationName: "机构名称",
+		organizationLogo: "机构Logo",
+		organizationState: "审核状态",
+		organizationState0: "待审核",
+		organizationState1: "已审核",
+		organizationState2: "已驳回",
+		waitAudit: "待审核",
+		audited: "已审核",
+		rejected: "已驳回",
+		countryName: "国家地区",
+		provinceName: "省份",
+		cityName: "城市",
+		patientType: "服务对象",
+		patientType0: "人用",
+		patientType1: "兽用",
+		adminFullName: "所属管理员",
+		directorName: "机构负责人",
+		queryType0: "机构名称",
+		queryType1: "所属管理员",
+		assignAdmin: "分配管理员",
+		confirmDelete: "确定删除该组织吗?",
+		confirmDelete2: "当前机构存在绑定用户或设备,确定删除吗?",
+		frontOrganization: "上级机构",
+		approveOrgMsg: "该机构是否审核通过?",
+		orgNameRequire: "请输入机构名称",
+		patientTypeRequire: "请选择服务对象",
+		uploadLogo: "上传Logo",
+		setDirector: "编辑负责人",
+		setting0: "病人配置",
+		setting1: "检查配置",
 	},
 	menu: {
 		home: "首页",

+ 171 - 0
VinnoManagementSystem/src/views/adminManage/adminAuthority.vue

@@ -0,0 +1,171 @@
+<template>
+  <el-container>
+    <el-aside width="300px" v-loading="menuloading">
+      <el-container>
+        <el-header>
+          <el-input
+            :placeholder="$t('pleaseInput')"
+            v-model="menuFilterText"
+            clearable
+          ></el-input>
+        </el-header>
+        <el-main class="nopadding">
+          <el-tree
+            ref="menu"
+            class="menu"
+            node-key="MenuId"
+            :data="menuList"
+            :props="menuProps"
+            highlight-current
+            default-expand-all
+            :expand-on-click-node="false"
+            check-strictly
+            :draggable="false"
+            :filter-node-method="menuFilterNode"
+            @node-click="menuClick"
+            @node-drop="nodeDrop"
+          >
+            <template #default="{ node }">
+              <span class="custom-tree-node el-tree-node__label">
+                <span class="label">
+                  {{ node.label }}
+                </span>
+                <span class="do">
+                  <el-icon @click.stop="add(node, true)"
+                    ><el-icon-plus
+                  /></el-icon>
+                </span>
+              </span>
+            </template>
+          </el-tree>
+        </el-main>
+        <el-footer style="height: 51px">
+          <el-button
+            type="primary"
+            size="small"
+            icon="el-icon-plus"
+            @click="add()"
+          ></el-button>
+        </el-footer>
+      </el-container>
+    </el-aside>
+    <el-container>
+      <el-main class="nopadding" style="padding: 20px" ref="main">
+        <save ref="save" :menu="menuList" @success="getMenu"></save>
+      </el-main>
+    </el-container>
+  </el-container>
+</template>
+
+<script>
+let newMenuIndex = 1;
+import save from "./saveAuthority";
+import common from "@/utils/common";
+
+export default {
+  name: "settingMenu",
+  components: {
+    save,
+  },
+  data() {
+    return {
+      menuloading: false,
+      menuList: [],
+      menuProps: {
+        label: function (a) {
+          return `${a.Label}${a.UniqueCode ? `(${a.UniqueCode})` : ""}`;
+        },
+        id: "Id",
+        children: "Children",
+      },
+      menuFilterText: "",
+      authorityList: [],
+    };
+  },
+  watch: {
+    menuFilterText(val) {
+      this.$refs.menu.filter(val);
+    },
+  },
+  mounted() {
+    this.getMenu();
+  },
+  methods: {
+    //加载树数据
+    async getMenu() {
+      this.menuloading = true;
+      var menuList = await this.$API.wing.post("GetAdminFeatureList");
+      this.menuList = menuList;
+      this.authorityList = await this.$API.wing.post(
+        "GetAdminFeatureSelectList"
+      );
+      this.menuloading = false;
+    },
+    //树点击
+    menuClick(data) {
+      if (!data.MenuId) {
+        data.MenuId = data.Id;
+      }
+      this.$refs.save.setData(data, this.authorityList);
+      this.$refs.main.$el.scrollTop = 0;
+    },
+    //树过滤
+    menuFilterNode(value, data) {
+      if (!value) return true;
+      var targetText = `${data.Label}${
+        data.UniqueCode ? `(${data.UniqueCode})` : ""
+      }`;
+      return targetText.indexOf(value) !== -1;
+    },
+    //增加
+    async add(node, checkFather) {
+      var featherCode = node?.data?.Id;
+      if (checkFather && !featherCode) {
+        return;
+      }
+      var newMenuData = {
+        MenuId: common.guid(),
+        Label: `未命名${newMenuIndex++}`,
+        FatherCode: featherCode,
+      };
+      this.$refs.menu.append(newMenuData, node);
+      this.$refs.menu.setCurrentKey(newMenuData.MenuId);
+      this.$refs.save.setData(newMenuData, this.authorityList);
+    },
+  },
+};
+</script>
+
+<style scoped>
+.custom-tree-node {
+  display: flex;
+  flex: 1;
+  align-items: center;
+  justify-content: space-between;
+  font-size: 14px;
+  padding-right: 24px;
+  height: 100%;
+}
+.custom-tree-node .label {
+  display: flex;
+  align-items: center;
+  height: 100%;
+}
+.custom-tree-node .label .el-tag {
+  margin-left: 5px;
+}
+.custom-tree-node .do {
+  display: none;
+}
+.custom-tree-node .do i {
+  margin-left: 5px;
+  color: #999;
+}
+.custom-tree-node .do i:hover {
+  color: #333;
+}
+
+.custom-tree-node:hover .do {
+  display: inline-block;
+}
+</style>

+ 2 - 2
VinnoManagementSystem/src/views/adminManage/adminList.vue

@@ -67,11 +67,11 @@
       >
         <el-table-column type="selection" width="50"></el-table-column>
         <el-table-column
-          :label="$t('admin.AccountName')"
+          :label="$t('admin.accountName')"
           prop="AdminName"
         ></el-table-column>
         <el-table-column
-          :label="$t('admin.FullName')"
+          :label="$t('admin.fullName')"
           prop="FullName"
         ></el-table-column>
         <el-table-column

+ 5 - 5
VinnoManagementSystem/src/views/adminManage/saveAdmin.vue

@@ -13,11 +13,11 @@
       label-width="150px"
       label-position="left"
     >
-      <el-form-item :label="$t('admin.AccountName')" prop="AdminName">
+      <el-form-item :label="$t('admin.accountName')" prop="AdminName">
         <el-input
           v-model="form.AdminName"
           clearable
-          :placeholder="$t('admin.AccountName')"
+          :placeholder="$t('admin.accountName')"
           style="width: 60%"
         ></el-input>
       </el-form-item>
@@ -39,11 +39,11 @@
           type="password" show-password
         ></el-input>
       </el-form-item>
-      <el-form-item :label="$t('admin.FullName')">
+      <el-form-item :label="$t('admin.fullName')">
         <el-input
           v-model="form.AdminFullName"
           clearable
-          :placeholder="$t('admin.FullName')"
+          :placeholder="$t('admin.fullName')"
           style="width: 60%"
         ></el-input>
       </el-form-item>
@@ -100,7 +100,7 @@ export default {
         AdminName: [
           {
             required: true,
-            message: this.$t("admin.AccountName"),
+            message: this.$t("admin.accountName"),
             trigger: "blur",
           },
         ],

+ 139 - 0
VinnoManagementSystem/src/views/adminManage/saveAuthority.vue

@@ -0,0 +1,139 @@
+<template>
+  <el-empty
+    :description="$t('user.selectItem')"
+    :image-size="100"
+    v-if="!form.MenuId"
+  ></el-empty>
+  <template v-else>
+    <h2>{{ $t(isEdit ? "edit" : "create") }}</h2>
+    <el-form
+      :model="form"
+      :rules="rules"
+      ref="dialogForm"
+      label-width="150px"
+      label-position="right"
+    >
+      <el-form-item :label="$t('user.authorityName')" prop="FeatureName">
+        <el-input
+          v-model="form.FeatureName"
+          clearable
+          :placeholder="$t('user.authorityNameRequire')"
+        ></el-input>
+      </el-form-item>
+      <el-form-item :label="$t('user.uniqueCode')" prop="UniqueCode">
+        <el-input
+          v-model="form.UniqueCode"
+          :placeholder="$t('user.uniqueCodeRequire')"
+          :disabled="form.OldUniqueCode !== ''"
+        ></el-input>
+        <div class="el-form-item-msg">
+          {{ $t("user.uniqueCodeTip") }}
+        </div>
+      </el-form-item>
+      <el-form-item :label="$t('user.frontAuthority')" prop="FatherCode">
+        <el-select
+          v-model="form.FatherCode"
+          clearable
+          filterable
+          style="width: 100%"
+        >
+          <el-option
+            v-for="item in authorityList"
+            :key="item.Key"
+            :label="item.Value"
+            :value="item.Key"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="save" :loading="loading"
+          >保 存</el-button
+        >
+      </el-form-item>
+    </el-form>
+  </template>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      isEdit: false,
+      form: {
+        Id: "",
+        OldUniqueCode: "",
+      },
+      loading: false,
+      rules: {
+        FeatureName: [
+          {
+            required: true,
+            message: this.$t("user.authorityNameRequire"),
+            trigger: "blur",
+          },
+        ],
+        UniqueCode: [
+          {
+            required: true,
+            message: this.$t("user.uniqueCodeRequire"),
+            trigger: "blur",
+          },
+        ],
+      },
+      authorityList: [],
+    };
+  },
+  mounted() {},
+  methods: {
+    //保存
+    async save() {
+      this.$refs.dialogForm.validate(async (valid) => {
+        if (valid) {
+          this.loading = true;
+          var method = this.isEdit ? "ModifyAdminFeature" : "CreateAdminFeature";
+          await this.$API.wing.post(method, this.form, () => {
+            this.form.MenuId = "";
+            this.$message.success(this.$t("response.operateSuccess"));
+            this.$emit("success");
+            this.loading = false;
+          });
+        } else {
+          return false;
+        }
+      });
+    },
+    //表单注入数据
+    setData(data, authorityList) {
+      this.isEdit = false;
+      if (data.Id) {
+        this.isEdit = true;
+        authorityList = authorityList.filter((x) => x.Key != data.Id);
+      }
+      var form = JSON.parse(JSON.stringify(data));
+      form.FeatureCode = form.Id;
+      form.FeatureName = form.Label;
+      form.OldUniqueCode = form.UniqueCode || "";
+      this.form = form;
+      this.authorityList = authorityList;
+    },
+  },
+};
+</script>
+
+<style scoped>
+h2 {
+  font-size: 17px;
+  color: #3c4a54;
+  padding: 0 0 30px 0;
+}
+.apilist {
+  border-left: 1px solid #eee;
+}
+
+[data-theme="dark"] h2 {
+  color: #fff;
+}
+[data-theme="dark"] .apilist {
+  border-color: #434343;
+}
+</style>

+ 12 - 12
VinnoManagementSystem/src/views/deviceManage/deviceList.vue

@@ -14,18 +14,18 @@
 		<el-main class="nopadding">
 			<scTable ref="table" :apiObj="apiObj" @selection-change="selectionChange" stripe border>
                 <el-table-column type="selection" width="50"></el-table-column>
-				<el-table-column label="#" type="index" width="40"></el-table-column>
-				<el-table-column :label="$t('device.deviceID')" prop="DeviceCode" width="150"></el-table-column>
-				<el-table-column :label="$t('device.deviceName')" prop="Name" width="120"></el-table-column>
-				<el-table-column :label="$t('device.deviceTypeName')" prop="DeviceTypeName" width="100"></el-table-column>
-                <el-table-column :label="$t('device.deviceModelName')" prop="DeviceModelName" width="120"></el-table-column>
-                <el-table-column :label="$t('response.description')" prop="Description" width="150"></el-table-column>
-                <el-table-column :label="$t('device.deviceCode')" prop="ShortCode" width="120"></el-table-column>
-                <el-table-column :label="$t('device.searchHosptial')" prop="HospitalName" width="150"></el-table-column>
-                <el-table-column :label="$t('device.departmentColumnTitle')" prop="DepartmentName" width="150"></el-table-column>
-                <el-table-column :label="$t('device.deviceBelongUser')" prop="DirectorName" width="130"></el-table-column>
-                <el-table-column :label="$t('device.searchAdmin')" prop="AdminName" width="130"></el-table-column>
-                <el-table-column :label="$t('device.shareUserCount')" prop="ShareUserNum" width="110"></el-table-column>
+				<el-table-column label="#" type="index" width="40" align="center" ></el-table-column>
+				<el-table-column :label="$t('device.deviceID')" prop="DeviceCode" width="150" align="center" ></el-table-column>
+				<el-table-column :label="$t('device.deviceName')" prop="Name" width="120" align="center" ></el-table-column>
+				<el-table-column :label="$t('device.deviceTypeName')" prop="DeviceTypeName" width="100" align="center" ></el-table-column>
+                <el-table-column :label="$t('device.deviceModelName')" prop="DeviceModelName" width="120" align="center" ></el-table-column>
+                <el-table-column :label="$t('response.description')" prop="Description" width="150" align="center" ></el-table-column>
+                <el-table-column :label="$t('device.deviceCode')" prop="ShortCode" width="120" align="center" ></el-table-column>
+                <el-table-column :label="$t('device.searchHosptial')" prop="HospitalName" width="150" align="center" ></el-table-column>
+                <el-table-column :label="$t('device.departmentColumnTitle')" prop="DepartmentName" width="150" align="center" ></el-table-column>
+                <el-table-column :label="$t('device.deviceBelongUser')" prop="DirectorName" width="130" align="center" ></el-table-column>
+                <el-table-column :label="$t('device.searchAdmin')" prop="AdminName" width="130" align="center" ></el-table-column>
+                <el-table-column :label="$t('device.shareUserCount')" prop="ShareUserNum" width="110" align="center" ></el-table-column>
 				<el-table-column :label="$t('response.operateColumnTitle')" fixed="right" align="center" width="150">
 					<template #default="scope">
 						<el-icon :size="30" :title="$t('edit')" color="#409EFC" class="tableOperateIcon" @click="table_edit(scope.row, scope.$index)"><sc-icon-operate-edit /></el-icon>

+ 3 - 3
VinnoManagementSystem/src/views/deviceManage/deviceTypeList.vue

@@ -20,9 +20,9 @@
 		</el-header>
 		<el-main class="nopadding">
 			<scTable ref="table" :apiObj="apiObj" stripe>
-				<el-table-column label="#" type="index" width="50"></el-table-column>
-				<el-table-column :label="$t('device.deviceTypeCode')" prop="DictionaryCode" width="250"></el-table-column>
-				<el-table-column :label="$t('device.deviceTypeName')" prop="Value" width="250"></el-table-column>
+				<el-table-column label="#" type="index" width="50" align="center" ></el-table-column>
+				<el-table-column :label="$t('device.deviceTypeCode')" prop="DictionaryCode" width="250" align="center" ></el-table-column>
+				<el-table-column :label="$t('device.deviceTypeName')" prop="Value" width="250" align="center" ></el-table-column>
 				<el-table-column :label="$t('device.deviceModel')" align="center">
 					<template #default="scope">
 					<span>{{ dictionaryList_string(scope.row.DictionaryList) }}</span>

+ 21 - 21
VinnoManagementSystem/src/views/organizationManage/organizationList.vue

@@ -17,7 +17,7 @@
           icon="el-icon-share"
           :disabled="selection.length == 0"
           @click="table_saveAdmin"
-          >{{ $t("organization.AssignAdmin") }}</el-button
+          >{{ $t("organization.assignAdmin") }}</el-button
         >
       </div>
       <div class="right-panel">
@@ -38,7 +38,7 @@
                 <el-option
                   v-for="item in queryTypes"
                   :key="item"
-                  :label="$t('organization.QueryType' + item)"
+                  :label="$t('organization.queryType' + item)"
                   :value="item"
                 />
               </el-select>
@@ -49,7 +49,7 @@
             v-model="search.State"
             clearable
             style="width: 200px"
-            :placeholder="$t('organization.OrganizationState')"
+            :placeholder="$t('organization.organizationState')"
             class="filter-item"
           >
             <el-option
@@ -77,11 +77,11 @@
       >
         <el-table-column type="selection" width="50"></el-table-column>
         <el-table-column
-          :label="$t('organization.OrganizationName')"
+          :label="$t('organization.organizationName')"
           prop="OrganizationName"
         ></el-table-column>
         <el-table-column
-          :label="$t('organization.OrganizationLogo')"
+          :label="$t('organization.organizationLogo')"
           prop="LogoUrl"
         >
           <template #default="scope">
@@ -93,43 +93,43 @@
           </template>
         </el-table-column>
         <el-table-column
-          :label="$t('organization.OrganizationState')"
+          :label="$t('organization.organizationState')"
           prop="State"
         >
           <template #default="scope">
             <span>{{
-              $t("organization.OrganizationState" + scope.row.State)
+              $t("organization.organizationState" + scope.row.State)
             }}</span>
           </template>
         </el-table-column>
         <el-table-column
-          :label="$t('organization.CountryName')"
+          :label="$t('organization.countryName')"
           prop="CountryName"
         ></el-table-column>
         <el-table-column
-          :label="$t('organization.ProvinceName')"
+          :label="$t('organization.provinceName')"
           prop="ProvinceName"
         ></el-table-column>
         <el-table-column
-          :label="$t('organization.CityName')"
+          :label="$t('organization.cityName')"
           prop="CityName"
         ></el-table-column>
         <el-table-column
-          :label="$t('organization.PatientType')"
+          :label="$t('organization.patientType')"
           prop="PatientType"
         >
           <template #default="scope">
             <span>{{
-              $t("organization.PatientType" + scope.row.PatientType)
+              $t("organization.patientType" + scope.row.PatientType)
             }}</span>
           </template>
         </el-table-column>
         <el-table-column
-          :label="$t('organization.AdminFullName')"
+          :label="$t('organization.adminFullName')"
           prop="AdminFullName"
         ></el-table-column>
         <el-table-column
-          :label="$t('organization.DirectorName')"
+          :label="$t('organization.directorName')"
           prop="DirectorName"
         ></el-table-column>
         <el-table-column :label="$t('createTime')" prop="CreateTime">
@@ -183,13 +183,13 @@
               <template #dropdown>
                 <el-dropdown-menu>
                   <el-dropdown-item @click="table_saveUser(scope.row)">{{
-                    $t("organization.SetDirector")
+                    $t("organization.setDirector")
                   }}</el-dropdown-item>
                   <el-dropdown-item @click="table_Setting(scope.row, 0)">{{
-                    $t("organization.Setting0")
+                    $t("organization.setting0")
                   }}</el-dropdown-item>
                   <el-dropdown-item @click="table_Setting(scope.row, 1)">{{
-                    $t("organization.Setting1")
+                    $t("organization.setting1")
                   }}</el-dropdown-item>
                 </el-dropdown-menu>
               </template>
@@ -254,7 +254,7 @@ export default {
       queryTypes: ["0", "1"],
       stateTypes: ["WaitAudit", "Audited", "Rejected"],
       selection: [],
-      confirmDel: this.$t("organization.ConfirmDelete"),
+      confirmDel: this.$t("organization.confirmDelete"),
       organizationCode: "",
     };
   },
@@ -345,7 +345,7 @@ export default {
     },
     //审核
     table_audit(row) {
-      this.$confirm(this.$t("organization.ApproveOrgMsg"), this.$t("audit"), {
+      this.$confirm(this.$t("organization.approveOrgMsg"), this.$t("audit"), {
         distinguishCancelAndClose: true,
         confirmButtonText: this.$t("audited"),
         cancelButtonText: this.$t("rejected"),
@@ -387,12 +387,12 @@ export default {
     },
     //删除前验证
     async changeTitle(row) {
-      this.confirmDel = this.$t("organization.ConfirmDelete");
+      this.confirmDel = this.$t("organization.confirmDelete");
       var res = await this.$API.wing.post("OrganizationBindQueryResult", {
         OrganizationCode: row.OrganizationCode,
       });
       if (res.BindDeviceNum > 0 || res.BindUserNum > 0) {
-        this.confirmDel = this.$t("organization.ConfirmDelete2");
+        this.confirmDel = this.$t("organization.confirmDelete2");
       }
     },
     //表格选择后回调事件

+ 13 - 13
VinnoManagementSystem/src/views/organizationManage/saveOrganization.vue

@@ -13,38 +13,38 @@
       label-width="100px"
       label-position="right"
     >
-      <el-form-item :label="$t('organization.OrganizationLogo')" prop="LogoUrl">
+      <el-form-item :label="$t('organization.organizationLogo')" prop="LogoUrl">
         <sc-upload
           v-model="form.LogoUrl"
-          :title="$t('organization.UploadLogo')"
+          :title="$t('organization.uploadLogo')"
           :width="90"
           :height="90"
         ></sc-upload>
       </el-form-item>
       <el-form-item
-        :label="$t('organization.OrganizationName')"
+        :label="$t('organization.organizationName')"
         prop="OrganizationName"
       >
         <el-input
           v-model="form.OrganizationName"
           clearable
-          :placeholder="$t('organization.OrgNameRequire')"
+          :placeholder="$t('organization.orgNameRequire')"
         ></el-input>
       </el-form-item>
-      <el-form-item :label="$t('organization.PatientType')" prop="PatientType">
+      <el-form-item :label="$t('organization.patientType')" prop="PatientType">
         <el-select v-model="form.PatientType" style="width: 100%">
           <el-option
-            :label="$t('organization.PatientType0')"
+            :label="$t('organization.patientType0')"
             :value="0"
           ></el-option>
           <el-option
-            :label="$t('organization.PatientType1')"
+            :label="$t('organization.patientType1')"
             :value="1"
           ></el-option>
         </el-select>
       </el-form-item>
 
-      <el-form-item :label="$t('organization.CountryName')" prop="CountryCode">
+      <el-form-item :label="$t('organization.countryName')" prop="CountryCode">
         <el-select
           v-model="form.CountryCode"
           @change="changeCountry"
@@ -60,7 +60,7 @@
       </el-form-item>
 
       <el-form-item
-        :label="$t('organization.ProvinceName')"
+        :label="$t('organization.provinceName')"
         prop="ProvinceCode"
       >
         <el-select
@@ -78,7 +78,7 @@
         </el-select>
       </el-form-item>
 
-      <el-form-item :label="$t('organization.CityName')" prop="CityCode">
+      <el-form-item :label="$t('organization.cityName')" prop="CityCode">
         <el-select
           v-model="form.CityCode"
           @change="changeCity"
@@ -95,7 +95,7 @@
       </el-form-item>
 
       <el-form-item
-        :label="$t('organization.FrontOrganization')"
+        :label="$t('organization.frontOrganization')"
         prop="ParentCode"
       >
         <el-select v-model="form.ParentCode" clearable style="width: 100%">
@@ -129,14 +129,14 @@ export default {
         OrganizationName: [
           {
             required: true,
-            message: this.$t("organization.OrgNameRequire"),
+            message: this.$t("organization.orgNameRequire"),
             trigger: "blur",
           },
         ],
         PatientType: [
           {
             required: true,
-            message: this.$t("organization.PatientTypeRequire"),
+            message: this.$t("organization.patientTypeRequire"),
             trigger: "blur",
           },
         ],

+ 2 - 2
VinnoManagementSystem/src/views/organizationManage/saveSetting.vue

@@ -1,6 +1,6 @@
 <template>
   <el-dialog
-    :title="$t('organization.Setting' + settingType)"
+    :title="$t('organization.setting' + settingType)"
     v-model="visible"
     :width="800"
     destroy-on-close
@@ -17,7 +17,7 @@
         <el-input v-model="form.SettingVersion" disabled></el-input>
       </el-form-item>
       <el-form-item
-        :label="$t('organization.Setting' + settingType)"
+        :label="$t('organization.setting' + settingType)"
         prop="SettingJson"
       >
         <el-input

+ 15 - 50
VinnoManagementSystem/src/views/userManage/authority.vue

@@ -20,17 +20,18 @@
             default-expand-all
             :expand-on-click-node="false"
             check-strictly
+            :draggable="false"
             :filter-node-method="menuFilterNode"
             @node-click="menuClick"
             @node-drop="nodeDrop"
           >
-            <template #default="{ node, data }">
+            <template #default="{ node }">
               <span class="custom-tree-node el-tree-node__label">
                 <span class="label">
                   {{ node.label }}
                 </span>
                 <span class="do">
-                  <el-icon @click.stop="add(node, data)"
+                  <el-icon @click.stop="add(node, true)"
                     ><el-icon-plus
                   /></el-icon>
                 </span>
@@ -78,6 +79,7 @@ export default {
         children: "Children",
       },
       menuFilterText: "",
+      authorityList: [],
     };
   },
   watch: {
@@ -94,6 +96,9 @@ export default {
       this.menuloading = true;
       var menuList = await this.$API.wing.post("GetUserFeatureList");
       this.menuList = menuList;
+      this.authorityList = await this.$API.wing.post(
+        "GetUserFeatureSelectList"
+      );
       this.menuloading = false;
     },
     //树点击
@@ -101,7 +106,7 @@ export default {
       if (!data.MenuId) {
         data.MenuId = data.Id;
       }
-      this.$refs.save.setData(data, true);
+      this.$refs.save.setData(data, this.authorityList);
       this.$refs.main.$el.scrollTop = 0;
     },
     //树过滤
@@ -112,60 +117,20 @@ export default {
       }`;
       return targetText.indexOf(value) !== -1;
     },
-    //树拖拽
-    nodeDrop(draggingNode, dropNode, dropType) {
-      this.$refs.save.setData({});
-      this.$message(
-        `拖拽对象:${draggingNode.data.meta.title}, 释放对象:${dropNode.data.meta.title}, 释放对象的位置:${dropType}`
-      );
-    },
     //增加
-    async add(node) {
+    async add(node, checkFather) {
+      var featherCode = node?.data?.Id;
+      if (checkFather && !featherCode) {
+        return;
+      }
       var newMenuData = {
         MenuId: common.guid(),
         Label: `未命名${newMenuIndex++}`,
-        FatherCode: node?.data?.Id,
+        FatherCode: featherCode,
       };
-
       this.$refs.menu.append(newMenuData, node);
       this.$refs.menu.setCurrentKey(newMenuData.MenuId);
-      this.$refs.save.setData(newMenuData);
-    },
-    //删除菜单
-    async delMenu() {
-      var CheckedNodes = this.$refs.menu.getCheckedNodes();
-      if (CheckedNodes.length == 0) {
-        this.$message.warning("请选择需要删除的项");
-        return false;
-      }
-
-      var confirm = await this.$confirm("确认删除已选择的菜单吗?", "提示", {
-        type: "warning",
-        confirmButtonText: "删除",
-        confirmButtonClass: "el-button--danger",
-      }).catch(() => {});
-      if (confirm != "confirm") {
-        return false;
-      }
-
-      this.menuloading = true;
-      var reqData = {
-        ids: CheckedNodes.map((item) => item.id),
-      };
-      var res = await this.$API.demo.post.post(reqData);
-      this.menuloading = false;
-
-      if (res.code == 200) {
-        CheckedNodes.forEach((item) => {
-          var node = this.$refs.menu.getNode(item);
-          if (node.isCurrent) {
-            this.$refs.save.setData({});
-          }
-          this.$refs.menu.remove(item);
-        });
-      } else {
-        this.$message.warning(res.message);
-      }
+      this.$refs.save.setData(newMenuData, this.authorityList);
     },
   },
 };

+ 99 - 0
VinnoManagementSystem/src/views/userManage/modifyUserPwd.vue

@@ -0,0 +1,99 @@
+<template>
+	<el-dialog :title="titleMap" v-model="visible" :width="500" destroy-on-close @closed="$emit('closed')">
+		<el-form :model="form" :rules="rules" :disabled="mode=='show'" ref="dialogForm" label-width="100px" label-position="left">
+			<el-input type="hidden" v-model="form.code"></el-input>
+            <el-form-item :label="$t('login.adminOldPwd')" prop="oldPassword">
+                <el-input type="password" v-model="form.oldPassword" clearable show-password></el-input>
+            </el-form-item>
+			<el-form-item :label="$t('login.newAdminPwd')" prop="password">
+                <el-input type="password" v-model="form.password" clearable show-password></el-input>
+            </el-form-item>
+            <el-form-item :label="$t('login.confirmAdminPwd')" prop="password2">
+                <el-input type="password" v-model="form.password2" clearable show-password></el-input>
+            </el-form-item>
+		</el-form>
+		<template #footer>
+			<el-button @click="visible=false" >{{$t('dialogBox.cancelButtonText')}}</el-button>
+			<el-button type="primary" :loading="isSaveing" @click="submit()">{{$t('dialogBox.saveButtonText')}}</el-button>
+		</template>
+	</el-dialog>
+</template>
+
+<script>
+	export default {
+		emits: ['success', 'closed'],
+		data() {
+			return {
+				titleMap: this.$t('login.editPassword'),
+				visible: false,
+				isSaveing: false,
+				//表单数据
+				form: {
+					code:"",
+					oldPassword: "",
+					password: "",
+				},
+				//验证规则
+				rules: {
+					code: [
+						{required: true, message: this.$t('login.inputAdminCode')}
+					],
+                    oldPassword: [
+						{required: true, message: this.$t('login.inputAdminOldPwd')},
+					],
+					password: [
+						{required: true, message: this.$t('login.inputAdminPwd')},
+						{validator: (rule, value, callback) => {
+                            let reg= /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{4,20}$/
+                            if(!reg.test(value)){
+								callback(new Error(this.$t('login.inputPwdValidate')))
+                            }
+							else{
+                                callback()
+                            }
+						}, trigger: 'blur'}
+					],
+					password2: [
+						{required: true, message: this.$t('login.againInputPwd')},
+						{validator: (rule, value, callback) => {
+							if (value !== this.form.password) {
+								callback(new Error(this.$t('login.pwdDiff')));
+							}else{
+								callback();
+							}
+						}}
+					]
+				}
+			}
+		},
+		methods: {
+			//显示
+			open(userCode = ''){
+				this.form.code = userCode;
+				this.visible = true;
+				return this
+			},
+			//表单提交方法
+			submit(){
+				this.$refs.dialogForm.validate(async (valid) => {
+					if (valid) {
+						this.isSaveing = true;
+                        var res = await this.$API.user.modifyUserPassword.post(this.form);
+						this.isSaveing = false;
+						if(res){
+							this.visible = false;
+							this.$message.success(this.$t('response.operateSuccess'))
+						}else{
+							this.$alert(res.message, this.$t('dialogBox.confirmWarningTitle'), {type: 'error'})
+						}
+					}else{
+						return false;
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+</style>

+ 28 - 15
VinnoManagementSystem/src/views/userManage/saveAuthority.vue

@@ -1,6 +1,6 @@
 <template>
   <el-empty
-    description="请选择左侧菜单后操作"
+    :description="$t('user.selectItem')"
     :image-size="100"
     v-if="!form.MenuId"
   ></el-empty>
@@ -10,7 +10,7 @@
       :model="form"
       :rules="rules"
       ref="dialogForm"
-      label-width="100px"
+      label-width="150px"
       label-position="right"
     >
       <el-form-item :label="$t('user.authorityName')" prop="FeatureName">
@@ -20,26 +20,31 @@
           :placeholder="$t('user.authorityNameRequire')"
         ></el-input>
       </el-form-item>
-      <!-- <el-form-item label="上级菜单" prop="parentId">
-      <el-cascader
-        v-model="form.parentId"
-        :options="menuOptions"
-        :props="menuProps"
-        :show-all-levels="false"
-        placeholder="顶级菜单"
-        clearable
-        disabled
-      ></el-cascader>
-    </el-form-item> -->
       <el-form-item :label="$t('user.uniqueCode')" prop="UniqueCode">
         <el-input
           v-model="form.UniqueCode"
           :placeholder="$t('user.uniqueCodeRequire')"
+          :disabled="form.OldUniqueCode !== ''"
         ></el-input>
         <div class="el-form-item-msg">
           {{ $t("user.uniqueCodeTip") }}
         </div>
       </el-form-item>
+      <el-form-item :label="$t('user.frontAuthority')" prop="FatherCode">
+        <el-select
+          v-model="form.FatherCode"
+          clearable
+          filterable
+          style="width: 100%"
+        >
+          <el-option
+            v-for="item in authorityList"
+            :key="item.Key"
+            :label="item.Value"
+            :value="item.Key"
+          ></el-option>
+        </el-select>
+      </el-form-item>
       <el-form-item>
         <el-button type="primary" @click="save" :loading="loading"
           >保 存</el-button
@@ -56,6 +61,7 @@ export default {
       isEdit: false,
       form: {
         Id: "",
+        OldUniqueCode: "",
       },
       loading: false,
       rules: {
@@ -74,6 +80,7 @@ export default {
           },
         ],
       },
+      authorityList: [],
     };
   },
   mounted() {},
@@ -96,12 +103,18 @@ export default {
       });
     },
     //表单注入数据
-    setData(data) {
-      this.isEdit = !!data.Id;
+    setData(data, authorityList) {
+      this.isEdit = false;
+      if (data.Id) {
+        this.isEdit = true;
+        authorityList = authorityList.filter((x) => x.Key != data.Id);
+      }
       var form = JSON.parse(JSON.stringify(data));
       form.FeatureCode = form.Id;
       form.FeatureName = form.Label;
+      form.OldUniqueCode = form.UniqueCode || "";
       this.form = form;
+      this.authorityList = authorityList;
     },
   },
 };

+ 0 - 0
VinnoManagementSystem/src/views/userManage/saveUser.vue


+ 223 - 0
VinnoManagementSystem/src/views/userManage/userAudit.vue

@@ -0,0 +1,223 @@
+<template>
+	<el-dialog :title="titleMap" v-model="visible" :width="700" destroy-on-close @closed="$emit('closed')">
+		<el-form :model="form" :rules="rules" :disabled="mode=='show'"  ref="dialogForm" label-width="100px" label-position="left">
+			<el-row :gutter="15">
+				<el-col :span="12">
+					<el-form-item :label="$t('user.fullName')" prop="fullName">
+						<el-input v-model="form.fullName" disabled clearable></el-input>
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item :label="$t('user.phone')" prop="phone">
+						<el-input v-model="form.phone" disabled clearable></el-input>
+					</el-form-item>
+				</el-col>
+			</el-row>
+			<el-row :gutter="15">
+				<el-col :span="12">
+					<el-form-item :label="$t('user.email')" prop="email">
+						<el-input v-model="form.email" disabled clearable></el-input>
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item :label="$t('device.searchHosptial')" prop="hospital">
+						<el-input v-model="form.hospital" disabled clearable></el-input>
+					</el-form-item>
+				</el-col>
+			</el-row>
+			<el-row :gutter="15">
+				<el-col :span="12">
+					<el-form-item :label="$t('device.departmentColumnTitle')" prop="department">
+						<el-input v-model="form.department" disabled clearable></el-input>
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item :label="$t('user.applyRoleName')" prop="applyRoleName">
+						<el-input v-model="form.applyRoleName" disabled clearable></el-input>
+					</el-form-item>
+				</el-col>
+			</el-row>
+			<el-row :gutter="15">
+				<el-col :span="12">
+					<el-form-item :label="$t('user.cardFront')">
+						<el-image v-show="true" :src="imgurl" style="width:100%;height:135px"></el-image>
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item :label="$t('user.cardreverse')">
+						<el-image v-show="true" :src="imgurl" style="width:100%;height:135px"></el-image>
+					</el-form-item>
+				</el-col>
+			</el-row>
+			<el-row :gutter="15">
+				<el-col :span="24">
+					<el-form-item :label="$t('user.doctorLicense')">
+						<el-image v-show="true" :src="imgurl" style="width:40%;height:135px"></el-image>
+					</el-form-item>
+				</el-col>
+			</el-row>
+			<el-row :gutter="15">
+				<el-col :span="24">
+					<el-form-item :label="$t('user.auditText')">
+						<el-radio-group v-model="form.applyRoleName">
+							<el-radio v-for="_item in radioList" :key="_item.value" :label="_item.value">{{_item.label}}</el-radio>
+						</el-radio-group>
+					</el-form-item>
+				</el-col>
+			</el-row>
+			<el-row :gutter="15">
+				<el-col :span="24">
+					<el-form-item :label="$t('user.rejectReason')">
+						<el-input type="textarea" v-model="form.rejectReason" :laceholder="$t('user.inputRejectReason')" clearable></el-input>
+					</el-form-item>
+				</el-col>
+			</el-row>
+		</el-form>
+		<template #footer>
+			<el-button @click="visible=false" >{{$t('dialogBox.cancelButtonText')}}</el-button>
+			<el-button type="primary" :loading="isSaveing" @click="submit()">{{$t('dialogBox.saveButtonText')}}</el-button>
+		</template>
+	</el-dialog>
+</template>
+
+<script>
+	export default {
+		emits: ['success', 'closed'],
+		data() {
+			return {
+				titleMap: this.$t('user.certificationAudit'),
+				visible: false,
+				isSaveing: false,
+				imgurl:"http://192.168.6.80:2800/img/avatar.jpg",
+				//表单数据
+				form: {
+					fullName: '',
+					phone: '',
+					email: '',
+					hospital: '',
+					department: '',
+					applyRoleName: '',
+					radio: '',
+					rejectReason: '',
+					identityApplyCode: ''
+				},
+				//审核列表
+				radioList:[
+					{ label: this.$t('yes'), value: 1 },
+					{ label: this.$t('no'), value: 2 }
+				],
+				//验证规则
+				rules: {
+					code: [
+						{required: true, message: this.$t('login.inputAdminCode')}
+					],
+                    oldPassword: [
+						{required: true, message: this.$t('login.inputAdminOldPwd')},
+					],
+					password: [
+						{required: true, message: this.$t('login.inputAdminPwd')},
+						{validator: (rule, value, callback) => {
+                            let reg= /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{4,20}$/
+                            if(!reg.test(value)){
+								callback(new Error(this.$t('login.inputPwdValidate')))
+                            }
+							else{
+                                callback()
+                            }
+						}, trigger: 'blur'}
+					],
+					password2: [
+						{required: true, message: this.$t('login.againInputPwd')},
+						{validator: (rule, value, callback) => {
+							if (value !== this.form.password) {
+								callback(new Error(this.$t('login.pwdDiff')));
+							}else{
+								callback();
+							}
+						}}
+					]
+				}
+			}
+		},
+		methods: {
+			//显示
+			open(userCode = ''){
+				this.queryUserInfo(userCode);
+				this.visible = true;
+				return this
+			},
+			//用户详情信息
+			async queryUserInfo(code){
+				this.isSaveing = true;
+				var res = await this.$API.user.userDetailInfo.post(code);
+				this.isSaveing = false;
+				if (res){
+					this.form.fullName = res.FullName;
+					this.form.phone = res.Phone
+					this.form.email = res.Email
+					this.form.hospital = res.HospitalName
+					this.form.department = res.DepartmentName
+					this.form.applyRoleName = res.IdentityApplyRoleName
+					this.form.identityApplyCode = res.IdentityApplyCode
+					if (res.IdentityCard != null && res.IdentityCard.length > 0) {
+						this.idUrl1 = res.IdentityCard[0]
+						this.idUrl1List.push(res.IdentityCard[0])
+						if (res.IdentityCard.length > 1) {
+						this.idUrl2 = res.IdentityCard[1]
+						this.idUrl2List.push(res.IdentityCard[1])
+						}
+					}
+					if (res.LicenseCard != null && res.LicenseCard.length > 0) {
+						this.licenseUrl = res.LicenseCard[0]
+						this.licenseUrlList.push(res.LicenseCard[0])
+					}
+				}
+			},
+			//表单提交方法
+			submit(){
+				this.$refs.dialogForm.validate(async (valid) => {
+					if (valid) {
+						this.isSaveing = true;
+                        var res = await this.$API.user.modifyUserPassword.post(this.form);
+						this.isSaveing = false;
+						if(res){
+							this.visible = false;
+							this.$message.success(this.$t('response.operateSuccess'))
+						}else{
+							this.$alert(res.message, this.$t('dialogBox.confirmWarningTitle'), {type: 'error'})
+						}
+					}else{
+						return false;
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+.el-dialog__header {
+    padding: var(--el-dialog-padding-primary);
+    padding-bottom: 10px;
+	border-bottom: 2px solid rgba(0,0,0,.06);
+ }
+.el-dialog__body {
+    padding: calc(var(--el-dialog-padding-primary) + 10px) var(--el-dialog-padding-primary);
+    color: var(--el-text-color-regular);
+    font-size: var(--el-dialog-content-font-size);
+    word-break: break-all;
+    padding-top: 10px;
+    padding-bottom: 10px;
+}
+.el-dialog__footer {
+    padding: var(--el-dialog-padding-primary);
+    padding-top: 10px;
+    text-align: right;
+    box-sizing: border-box;
+    border-top: 2px solid rgba(0,0,0,.06);
+}
+.el-form-item__label {
+    font-weight: bold;
+    line-height: 32px;
+}
+</style>

+ 174 - 0
VinnoManagementSystem/src/views/userManage/userList.vue

@@ -0,0 +1,174 @@
+<template>
+	<el-container>
+		<el-header>
+			<div class="left-panel">
+				<!-- <el-button type="primary" icon="el-icon-plus" @click="add"></el-button> -->
+			</div>
+			<div class="right-panel">
+				<div class="right-panel-search">
+                    <el-input v-model="search.keyword" clearable :placeholder="$t('response.searchPlaceholder')">
+                        <template #prepend>
+                            <el-select v-model="search.queryType" style="width: 100px;">
+                                <el-option :label="$t('user.userName')" value="0"></el-option>
+                                <el-option :label="$t('user.phone')" value="3"></el-option>
+                                <el-option :label="$t('user.email')" value="4"></el-option>
+                                <el-option :label="$t('user.fullName')" value="5"></el-option>
+                            </el-select>
+                        </template>
+                    </el-input>
+                    <el-select v-model="search.queryState" :placeholder="$t('user.userStatusPlaceholder')" clearable style="width:250px;">
+                        <el-option :label="$t('user.nonactivated')" value="Nonactivated"></el-option>
+                        <el-option :label="$t('user.activated')" value="Activated"></el-option>
+                    </el-select>
+					<el-button type="primary" icon="el-icon-search" @click="getList "></el-button>
+				</div>
+			</div>
+		</el-header>
+		<el-main class="nopadding">
+			<scTable ref="table" :apiObj="apiObj" stripe border>
+				<el-table-column label="#" type="index" width="50" align="center"></el-table-column>
+				<el-table-column :label="$t('user.userName')" prop="UserName" width="250" align="center" ></el-table-column>
+				<el-table-column :label="$t('user.fullName')" prop="FullName" width="180" align="center" ></el-table-column>
+				<el-table-column :label="$t('user.phone')" prop="Phone" width="150" align="center" ></el-table-column>
+                <el-table-column :label="$t('user.email')" prop="Email" width="220" align="center" ></el-table-column>
+                <el-table-column :label="$t('user.userStatus')" align="center" width="120" >
+					<template #default="scope">
+					    <span>{{ scope.row.UserState === 0 ? $t('user.nonactivated') : $t('user.activated') }}</span>
+					</template>
+				</el-table-column>
+                <el-table-column :label="$t('user.authenticationState')" align="center" width="120">
+					<template #default="scope">
+					    <span>{{ applyState_string(scope.row.ApplyState) }}</span>
+					</template>
+				</el-table-column>
+                <el-table-column :label="$t('menu.roleList')" prop="RoleName" width="120" align="center" ></el-table-column>
+                <el-table-column :label="$t('user.registerTime')" align="center">
+					<template #default="scope">
+					    <span>{{ this.$TOOL.dateFormat(new Date(scope.row.CreateTime), 'yyyy-MM-dd hh:mm:ss') }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column :label="$t('response.operateColumnTitle')" fixed="right" align="center" width="140">
+					<template #default="scope">
+                        <el-icon :size="30" :title="$t('edit')" color="#409EFC" class="tableOperateIcon" @click="table_edit(scope.row, scope.$index)"><sc-icon-operate-edit /></el-icon>
+                        <el-icon :size="30" :style="visableTransfer(1, scope.row)" :title="$t('audit')" color="#409EFC" class="tableOperateIcon" @click="table_audit(scope.row, scope.$index)"><sc-icon-audit /></el-icon>
+                        <el-icon :size="30" :style="visableTransfer(0, scope.row)" :title="$t('user.modifyPwd')" color="#409EFC" class="tableOperateIcon" @click="modifyPwd(scope.row, scope.$index)"><sc-icon-password /></el-icon>
+						<!-- <el-button type="text" size="small" @click="table_edit(scope.row, scope.$index)">{{$t('response.operateEditButton')}}</el-button> -->
+					</template>
+				</el-table-column>
+
+			</scTable>
+		</el-main>
+	</el-container>
+
+	<save-dialog v-if="dialog.save" ref="saveDialog" @success="handleSaveSuccess" @closed="dialog.save=false"></save-dialog>
+    <modifyPwd-dialog v-if="dialog.modifyPwd" ref="modifyPwdDialog" @success="handleModifyPwdSuccess" @closed="dialog.modifyPwd=false"></modifyPwd-dialog>
+	<audit-dialog v-if="dialog.audit" ref="auditDialog" @success="handleSaveSuccess" @closed="dialog.audit=false"></audit-dialog>
+</template>
+
+<script>
+	import saveDialog from './saveUser'
+    import modifyPwdDialog from './modifyUserPwd'
+    import auditDialog from './userAudit'
+
+	export default {
+		name: 'userList',
+		components: {
+			saveDialog,
+            modifyPwdDialog,
+			auditDialog
+		},
+		data() {
+			return {
+				dialog: {
+					save: false,
+                    modifyPwd: false,
+					audit: false,
+				},
+                listLoading: true,
+				apiObj: this.$API.user.fetchUserList,
+				search: {
+                    queryType: '',
+                    keyword: '',
+                    queryState: '',
+				},
+			}
+		},
+		methods: {
+			//修改密码
+			modifyPwd(row){
+				this.dialog.modifyPwd = true
+				this.$nextTick(() => {
+					this.$refs.modifyPwdDialog.open(row.UserCode);
+				})
+			},
+			//编辑
+			table_edit(row){
+				this.dialog.save = true
+				this.$nextTick(() => {
+					this.$refs.saveDialog.open('edit').setData(row)
+				})
+			},
+			//审核页面
+			table_audit(row){
+				this.dialog.audit = true
+				this.$nextTick(() => {
+					this.$refs.auditDialog.open(row.UserCode)
+				})
+			},
+			//搜索
+			async getList(){
+                this.$refs.table.upData(this.search)
+			},
+			dictionaryList_string(dictionaryList) {
+				var dictionaryStr = ''
+				for (var i = 0; i < dictionaryList.length; i++) {
+					dictionaryStr += dictionaryList[i].Value + '/'
+				}
+				dictionaryStr = dictionaryStr.substring(0, dictionaryStr.length - 1)
+				return dictionaryStr
+			},
+			//本地更新数据
+			handleSaveSuccess(){
+                this.$refs.table.refresh()
+			},
+            //修改密码
+            handleModifyPwdSuccess(){
+                //this.$refs.table.refresh()
+			},
+            //用户认证状态转换
+            applyState_string(str) {
+                if (str === 0) return this.$t('user.uncertified')
+                if (str === 1) return this.$t('user.waitcertified')
+                if (str === 2) return this.$t('user.rejected')
+                if (str === 3) return this.$t('user.certified')
+            },
+            //根据类型控制按钮显示隐藏
+            visableTransfer(type, row)
+            {
+                //类型0为密码
+                if (type === 0)
+                {
+                    if (row.Phone !='' || row.Email !='')
+                    {
+                        return "display: none !important;"
+                    }
+                }
+                else if (type === 1)
+                {
+                    if (row.ApplyState != 1)
+                    {
+                        return "display: none !important;"
+                    }
+                }
+                return ""
+            }
+		}
+	}
+</script>
+
+<style>
+.tableOperateIcon{
+	cursor:pointer;
+	margin-left:5px;
+}
+</style>