소스 검색

用户管理相关

wukai 2 년 전
부모
커밋
88df87d0b5
3개의 변경된 파일932개의 추가작업 그리고 593개의 파일을 삭제
  1. 44 0
      src/api/system/expand.js
  2. 248 0
      src/views/system/expand/index.vue
  3. 640 593
      src/views/system/user/index.vue

+ 44 - 0
src/api/system/expand.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询用户登录限制列表
+export function listExpand(query) {
+  return request({
+    url: '/system/expand/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询用户登录限制详细
+export function getExpand(userId) {
+  return request({
+    url: '/system/expand/' + userId,
+    method: 'get'
+  })
+}
+
+// 新增用户登录限制
+export function addExpand(data) {
+  return request({
+    url: '/system/expand',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改用户登录限制
+export function updateExpand(data) {
+  return request({
+    url: '/system/expand',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除用户登录限制
+export function delExpand(userId) {
+  return request({
+    url: '/system/expand/' + userId,
+    method: 'delete'
+  })
+}

+ 248 - 0
src/views/system/expand/index.vue

@@ -0,0 +1,248 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="上次修改密码时间" prop="lastUpdateTime">
+        <el-date-picker clearable
+          v-model="queryParams.lastUpdateTime"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择上次修改密码时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @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="Plus"
+          @click="handleAdd"
+          v-hasPermi="['system:expand:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="Edit"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['system:expand:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="Delete"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['system:expand:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="Download"
+          @click="handleExport"
+          v-hasPermi="['system:expand:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="expandList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="用户ID" align="center" prop="userId" />
+      <el-table-column label="上次修改密码时间" align="center" prop="lastUpdateTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.lastUpdateTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="登录IP限制" align="center" prop="loginIp" />
+      <el-table-column label="登录时间限制" align="center" prop="loginTime" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template #default="scope">
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:expand:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:expand:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      v-model:page="queryParams.pageNum"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改用户登录限制对话框 -->
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+      <el-form ref="expandRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="上次修改密码时间" prop="lastUpdateTime">
+          <el-date-picker clearable
+            v-model="form.lastUpdateTime"
+            type="date"
+            value-format="YYYY-MM-DD"
+            placeholder="请选择上次修改密码时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="登录IP限制" prop="loginIp">
+          <el-input v-model="form.loginIp" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="登录时间限制" prop="loginTime">
+          <el-input v-model="form.loginTime" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="Expand">
+    import {getExpand, listExpand} from "@/api/system/expand";
+
+    const { proxy } = getCurrentInstance();
+
+const expandList = ref([]);
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    lastUpdateTime: null,
+    loginIp: null,
+    loginTime: null
+  },
+  rules: {
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询用户登录限制列表 */
+function getList() {
+  loading.value = true;
+  listExpand(queryParams.value).then(response => {
+    expandList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    userId: null,
+    lastUpdateTime: null,
+    loginIp: null,
+    loginTime: null
+  };
+  proxy.resetForm("expandRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.userId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加用户登录限制";
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _userId = row.userId || ids.value
+  getExpand(_userId).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改用户登录限制";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["expandRef"].validate(valid => {
+    if (valid) {
+      if (form.value.userId != null) {
+        updateExpand(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addExpand(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _userIds = row.userId || ids.value;
+  proxy.$modal.confirm('是否确认删除用户登录限制编号为"' + _userIds + '"的数据项?').then(function() {
+    return delExpand(_userIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('system/expand/export', {
+    ...queryParams.value
+  }, `expand_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+</script>

+ 640 - 593
src/views/system/user/index.vue

@@ -1,607 +1,654 @@
 <template>
-   <div class="app-container">
-      <el-row :gutter="20">
-         <!--部门数据-->
-         <el-col :span="4" :xs="24">
-            <div class="head-container">
-               <el-input
-                  v-model="deptName"
-                  placeholder="请输入部门名称"
-                  clearable
-                  prefix-icon="Search"
-                  style="margin-bottom: 20px"
-               />
-            </div>
-            <div class="head-container">
-               <el-tree
-                  :data="deptOptions"
-                  :props="{ label: 'label', children: 'children' }"
-                  :expand-on-click-node="false"
-                  :filter-node-method="filterNode"
-                  ref="deptTreeRef"
-                  node-key="id"
-                  highlight-current
-                  default-expand-all
-                  @node-click="handleNodeClick"
-               />
-            </div>
-         </el-col>
-         <!--用户数据-->
-         <el-col :span="20" :xs="24">
-            <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
-               <el-form-item label="用户名称" prop="userName">
-                  <el-input
-                     v-model="queryParams.userName"
-                     placeholder="请输入用户名称"
-                     clearable
-                     style="width: 240px"
-                     @keyup.enter="handleQuery"
-                  />
-               </el-form-item>
-               <el-form-item label="手机号码" prop="phonenumber">
-                  <el-input
-                     v-model="queryParams.phonenumber"
-                     placeholder="请输入手机号码"
-                     clearable
-                     style="width: 240px"
-                     @keyup.enter="handleQuery"
-                  />
-               </el-form-item>
-               <el-form-item label="状态" prop="status">
-                  <el-select
-                     v-model="queryParams.status"
-                     placeholder="用户状态"
-                     clearable
-                     style="width: 240px"
-                  >
-                     <el-option
-                        v-for="dict in sys_normal_disable"
-                        :key="dict.value"
-                        :label="dict.label"
-                        :value="dict.value"
-                     />
-                  </el-select>
-               </el-form-item>
-               <el-form-item label="创建时间" style="width: 308px;">
-                  <el-date-picker
-                     v-model="dateRange"
-                     value-format="YYYY-MM-DD"
-                     type="daterange"
-                     range-separator="-"
-                     start-placeholder="开始日期"
-                     end-placeholder="结束日期"
-                  ></el-date-picker>
-               </el-form-item>
-               <el-form-item>
-                  <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
-                  <el-button icon="Refresh" @click="resetQuery">重置</el-button>
-               </el-form-item>
-            </el-form>
+	<div class="app-container">
+		<el-row :gutter="20">
+			<!--部门数据-->
+			<el-col :span="4" :xs="24">
+				<div class="head-container">
+					<el-input v-model="deptName" placeholder="请输入部门名称" clearable prefix-icon="Search"
+						style="margin-bottom: 20px" />
+				</div>
+				<div class="head-container">
+					<el-tree :data="deptOptions" :props="{ label: 'label', children: 'children' }"
+						:expand-on-click-node="false" :filter-node-method="filterNode" ref="deptTreeRef" node-key="id"
+						highlight-current default-expand-all @node-click="handleNodeClick" />
+				</div>
+			</el-col>
+			<!--用户数据-->
+			<el-col :span="20" :xs="24">
+				<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+					<el-form-item label="用户名称" prop="userName">
+						<el-input v-model="queryParams.userName" placeholder="请输入用户名称" clearable style="width: 240px"
+							@keyup.enter="handleQuery" />
+					</el-form-item>
+					<el-form-item label="手机号码" prop="phonenumber">
+						<el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable style="width: 240px"
+							@keyup.enter="handleQuery" />
+					</el-form-item>
+					<el-form-item label="状态" prop="status">
+						<el-select v-model="queryParams.status" placeholder="用户状态" clearable style="width: 240px">
+							<el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label"
+								:value="dict.value" />
+						</el-select>
+					</el-form-item>
+					<el-form-item label="创建时间" style="width: 308px;">
+						<el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange"
+							range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
+					</el-form-item>
+					<el-form-item>
+						<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+						<el-button icon="Refresh" @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="Plus"
-                     @click="handleAdd"
-                     v-hasPermi="['system:user:add']"
-                  >新增</el-button>
-               </el-col>
-               <el-col :span="1.5">
-                  <el-button
-                     type="success"
-                     plain
-                     icon="Edit"
-                     :disabled="single"
-                     @click="handleUpdate"
-                     v-hasPermi="['system:user:edit']"
-                  >修改</el-button>
-               </el-col>
-               <el-col :span="1.5">
-                  <el-button
-                     type="danger"
-                     plain
-                     icon="Delete"
-                     :disabled="multiple"
-                     @click="handleDelete"
-                     v-hasPermi="['system:user:remove']"
-                  >删除</el-button>
-               </el-col>
-               <el-col :span="1.5">
-                  <el-button
-                     type="info"
-                     plain
-                     icon="Upload"
-                     @click="handleImport"
-                     v-hasPermi="['system:user:import']"
-                  >导入</el-button>
-               </el-col>
-               <el-col :span="1.5">
-                  <el-button
-                     type="warning"
-                     plain
-                     icon="Download"
-                     @click="handleExport"
-                     v-hasPermi="['system:user:export']"
-                  >导出</el-button>
-               </el-col>
-               <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
-            </el-row>
+				<el-row :gutter="10" class="mb8">
+					<el-col :span="1.5">
+						<el-button type="primary" plain icon="Plus" @click="handleAdd"
+							v-hasPermi="['system:user:add']">新增</el-button>
+					</el-col>
+					<el-col :span="1.5">
+						<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
+							v-hasPermi="['system:user:edit']">修改</el-button>
+					</el-col>
+					<el-col :span="1.5">
+						<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
+							v-hasPermi="['system:user:remove']">删除</el-button>
+					</el-col>
+					<el-col :span="1.5">
+						<el-button type="info" plain icon="Upload" @click="handleImport"
+							v-hasPermi="['system:user:import']">导入</el-button>
+					</el-col>
+					<el-col :span="1.5">
+						<el-button type="warning" plain icon="Download" @click="handleExport"
+							v-hasPermi="['system:user:export']">导出</el-button>
+					</el-col>
+					<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"
+						:columns="columns"></right-toolbar>
+				</el-row>
 
-            <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
-               <el-table-column type="selection" width="50" align="center" />
-               <el-table-column label="用户编号" align="center" key="userId" prop="userId" v-if="columns[0].visible" />
-               <el-table-column label="用户名称" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" />
-               <el-table-column label="用户昵称" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" />
-               <el-table-column label="部门" align="center" key="deptName" prop="dept.deptName" v-if="columns[3].visible" :show-overflow-tooltip="true" />
-               <el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" v-if="columns[4].visible" width="120" />
-               <el-table-column label="状态" align="center" key="status" v-if="columns[5].visible">
-                  <template #default="scope">
-                     <el-switch
-                        v-model="scope.row.status"
-                        active-value="0"
-                        inactive-value="1"
-                        @change="handleStatusChange(scope.row)"
-                     ></el-switch>
-                  </template>
-               </el-table-column>
-               <el-table-column label="创建时间" align="center" prop="createTime" v-if="columns[6].visible" width="160">
-                  <template #default="scope">
-                     <span>{{ parseTime(scope.row.createTime) }}</span>
-                  </template>
-               </el-table-column>
-               <el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width">
-                  <template #default="scope">
-                     <el-tooltip content="修改" placement="top" v-if="scope.row.userId !== 1">
-                        <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:user:edit']"></el-button>
-                     </el-tooltip>
-                     <el-tooltip content="删除" placement="top" v-if="scope.row.userId !== 1">
-                        <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:user:remove']"></el-button>
-                     </el-tooltip>
-                     <el-tooltip content="重置密码" placement="top" v-if="scope.row.userId !== 1">
-                         <el-button link type="primary" icon="Key" @click="handleResetPwd(scope.row)" v-hasPermi="['system:user:resetPwd']"></el-button>
-                     </el-tooltip>
-                     <el-tooltip content="分配角色" placement="top" v-if="scope.row.userId !== 1">
-                        <el-button link type="primary" icon="CircleCheck" @click="handleAuthRole(scope.row)" v-hasPermi="['system:user:edit']"></el-button>
-                     </el-tooltip>
-                  </template>
-               </el-table-column>
-            </el-table>
-            <pagination
-               v-show="total > 0"
-               :total="total"
-               v-model:page="queryParams.pageNum"
-               v-model:limit="queryParams.pageSize"
-               @pagination="getList"
-            />
-         </el-col>
-      </el-row>
+				<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
+					<el-table-column type="selection" width="50" align="center" />
+					<el-table-column label="用户编号" align="center" key="userId" prop="userId" v-if="columns[0].visible" />
+					<el-table-column label="用户名称" align="center" key="userName" prop="userName"
+						v-if="columns[1].visible" :show-overflow-tooltip="true" />
+					<el-table-column label="用户昵称" align="center" key="nickName" prop="nickName"
+						v-if="columns[2].visible" :show-overflow-tooltip="true" />
+					<el-table-column label="部门" align="center" key="deptName" prop="dept.deptName"
+						v-if="columns[3].visible" :show-overflow-tooltip="true" />
+					<el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber"
+						v-if="columns[4].visible" width="120" />
+					<el-table-column label="状态" align="center" key="status" v-if="columns[5].visible">
+						<template #default="scope">
+							<el-switch v-model="scope.row.status" active-value="0" inactive-value="1"
+								@change="handleStatusChange(scope.row)"></el-switch>
+						</template>
+					</el-table-column>
+					<el-table-column label="创建时间" align="center" prop="createTime" v-if="columns[6].visible"
+						width="160">
+						<template #default="scope">
+							<span>{{ parseTime(scope.row.createTime) }}</span>
+						</template>
+					</el-table-column>
+					<el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width">
+						<template #default="scope">
+							<el-tooltip content="修改" placement="top" v-if="scope.row.userId !== 1">
+								<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
+									v-hasPermi="['system:user:edit']"></el-button>
+							</el-tooltip>
+							<el-tooltip content="删除" placement="top" v-if="scope.row.userId !== 1">
+								<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
+									v-hasPermi="['system:user:remove']"></el-button>
+							</el-tooltip>
+							<el-tooltip content="重置密码" placement="top" v-if="scope.row.userId !== 1">
+								<el-button link type="primary" icon="Key" @click="handleResetPwd(scope.row)"
+									v-hasPermi="['system:user:resetPwd']"></el-button>
+							</el-tooltip>
+							<el-tooltip content="登录限制" placement="top" v-if="scope.row.userId !== 1">
+								<!-- <i class="el-icon-info"></i> -->
+								<el-button link type="primary" icon="InfoFilled" @click="handleLoginLimit(scope.row)"
+									v-hasPermi="['system:user:resetPwd']"></el-button>
+							</el-tooltip>
+							<el-tooltip content="分配角色" placement="top" v-if="scope.row.userId !== 1">
+								<el-button link type="primary" icon="CircleCheck" @click="handleAuthRole(scope.row)"
+									v-hasPermi="['system:user:edit']"></el-button>
+							</el-tooltip>
+						</template>
+					</el-table-column>
+				</el-table>
+				<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
+					v-model:limit="queryParams.pageSize" @pagination="getList" />
+			</el-col>
+		</el-row>
 
-      <!-- 添加或修改用户配置对话框 -->
-      <el-dialog :title="title" v-model="open" width="600px" append-to-body>
-         <el-form :model="form" :rules="rules" ref="userRef" label-width="80px">
-            <el-row>
-               <el-col :span="12">
-                  <el-form-item label="用户昵称" prop="nickName">
-                     <el-input v-model="form.nickName" placeholder="请输入用户昵称" maxlength="30" />
-                  </el-form-item>
-               </el-col>
-               <el-col :span="12">
-                  <el-form-item label="归属部门" prop="deptId">
-                     <el-tree-select
-                        v-model="form.deptId"
-                        :data="deptOptions"
-                        :props="{ value: 'id', label: 'label', children: 'children' }"
-                        value-key="id"
-                        placeholder="请选择归属部门"
-                        check-strictly
-                     />
-                  </el-form-item>
-               </el-col>
-            </el-row>
-            <el-row>
-               <el-col :span="12">
-                  <el-form-item label="手机号码" prop="phonenumber">
-                     <el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" />
-                  </el-form-item>
-               </el-col>
-               <el-col :span="12">
-                  <el-form-item label="邮箱" prop="email">
-                     <el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" />
-                  </el-form-item>
-               </el-col>
-            </el-row>
-            <el-row>
-               <el-col :span="12">
-                  <el-form-item v-if="form.userId == undefined" label="用户名称" prop="userName">
-                     <el-input v-model="form.userName" placeholder="请输入用户名称" maxlength="30" />
-                  </el-form-item>
-               </el-col>
-               <el-col :span="12">
-                  <el-form-item v-if="form.userId == undefined" label="用户密码" prop="password">
-                     <el-input v-model="form.password" placeholder="请输入用户密码" type="password" maxlength="20" show-password />
-                  </el-form-item>
-               </el-col>
-            </el-row>
-            <el-row>
-               <el-col :span="12">
-                  <el-form-item label="用户性别">
-                     <el-select v-model="form.sex" placeholder="请选择">
-                        <el-option
-                           v-for="dict in sys_user_sex"
-                           :key="dict.value"
-                           :label="dict.label"
-                           :value="dict.value"
-                        ></el-option>
-                     </el-select>
-                  </el-form-item>
-               </el-col>
-               <el-col :span="12">
-                  <el-form-item label="状态">
-                     <el-radio-group v-model="form.status">
-                        <el-radio
-                           v-for="dict in sys_normal_disable"
-                           :key="dict.value"
-                           :label="dict.value"
-                        >{{ dict.label }}</el-radio>
-                     </el-radio-group>
-                  </el-form-item>
-               </el-col>
-            </el-row>
-            <el-row>
-               <el-col :span="12">
-                  <el-form-item label="岗位">
-                     <el-select v-model="form.postIds" multiple placeholder="请选择">
-                        <el-option
-                           v-for="item in postOptions"
-                           :key="item.postId"
-                           :label="item.postName"
-                           :value="item.postId"
-                           :disabled="item.status == 1"
-                        ></el-option>
-                     </el-select>
-                  </el-form-item>
-               </el-col>
-               <el-col :span="12">
-                  <el-form-item label="角色">
-                     <el-select v-model="form.roleIds" multiple placeholder="请选择">
-                        <el-option
-                           v-for="item in roleOptions"
-                           :key="item.roleId"
-                           :label="item.roleName"
-                           :value="item.roleId"
-                           :disabled="item.status == 1"
-                        ></el-option>
-                     </el-select>
-                  </el-form-item>
-               </el-col>
-            </el-row>
-            <el-row>
-               <el-col :span="24">
-                  <el-form-item label="备注">
-                     <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
-                  </el-form-item>
-               </el-col>
-            </el-row>
-         </el-form>
-         <template #footer>
-            <div class="dialog-footer">
-               <el-button type="primary" @click="submitForm">确 定</el-button>
-               <el-button @click="cancel">取 消</el-button>
-            </div>
-         </template>
-      </el-dialog>
+		<!-- 添加或修改用户配置对话框 -->
+		<el-dialog :title="title" v-model="open" width="600px" append-to-body>
+			<el-form :model="form" :rules="rules" ref="userRef" label-width="80px">
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="用户昵称" prop="nickName">
+							<el-input v-model="form.nickName" placeholder="请输入用户昵称" maxlength="30" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="归属部门" prop="deptId">
+							<el-tree-select v-model="form.deptId" :data="deptOptions"
+								:props="{ value: 'id', label: 'label', children: 'children' }" value-key="id"
+								placeholder="请选择归属部门" check-strictly />
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="手机号码" prop="phonenumber">
+							<el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="邮箱" prop="email">
+							<el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" />
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="12">
+						<el-form-item v-if="form.userId == undefined" label="用户名称" prop="userName">
+							<el-input v-model="form.userName" placeholder="请输入用户名称" maxlength="30" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item v-if="form.userId == undefined" label="用户密码" prop="password">
+							<el-input v-model="form.password" placeholder="请输入用户密码" type="password" maxlength="20"
+								show-password />
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="用户性别">
+							<el-select v-model="form.sex" placeholder="请选择">
+								<el-option v-for="dict in sys_user_sex" :key="dict.value" :label="dict.label"
+									:value="dict.value"></el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="状态">
+							<el-radio-group v-model="form.status">
+								<el-radio v-for="dict in sys_normal_disable" :key="dict.value"
+									:label="dict.value">{{ dict.label }}</el-radio>
+							</el-radio-group>
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="岗位">
+							<el-select v-model="form.postIds" multiple placeholder="请选择">
+								<el-option v-for="item in postOptions" :key="item.postId" :label="item.postName"
+									:value="item.postId" :disabled="item.status == 1"></el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="角色">
+							<el-select v-model="form.roleIds" multiple placeholder="请选择">
+								<el-option v-for="item in roleOptions" :key="item.roleId" :label="item.roleName"
+									:value="item.roleId" :disabled="item.status == 1"></el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="24">
+						<el-form-item label="备注">
+							<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<div class="dialog-footer">
+					<el-button type="primary" @click="submitForm">确 定</el-button>
+					<el-button @click="cancel">取 消</el-button>
+				</div>
+			</template>
+		</el-dialog>
 
-      <!-- 用户导入对话框 -->
-      <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
-         <el-upload
-            ref="uploadRef"
-            :limit="1"
-            accept=".xlsx, .xls"
-            :headers="upload.headers"
-            :action="upload.url + '?updateSupport=' + upload.updateSupport"
-            :disabled="upload.isUploading"
-            :on-progress="handleFileUploadProgress"
-            :on-success="handleFileSuccess"
-            :auto-upload="false"
-            drag
-         >
-            <el-icon class="el-icon--upload"><upload-filled /></el-icon>
-            <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
-            <template #tip>
-               <div class="el-upload__tip text-center">
-                  <div class="el-upload__tip">
-                     <el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据
-                  </div>
-                  <span>仅允许导入xls、xlsx格式文件。</span>
-                  <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
-               </div>
-            </template>
-         </el-upload>
-         <template #footer>
-            <div class="dialog-footer">
-               <el-button type="primary" @click="submitFileForm">确 定</el-button>
-               <el-button @click="upload.open = false">取 消</el-button>
-            </div>
-         </template>
-      </el-dialog>
-   </div>
+		<!-- 用户导入对话框 -->
+		<el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
+			<el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
+				:action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
+				:on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
+				<el-icon class="el-icon--upload"><upload-filled /></el-icon>
+				<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+				<template #tip>
+					<div class="el-upload__tip text-center">
+						<div class="el-upload__tip">
+							<el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据
+						</div>
+						<span>仅允许导入xls、xlsx格式文件。</span>
+						<el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"
+							@click="importTemplate">下载模板</el-link>
+					</div>
+				</template>
+			</el-upload>
+			<template #footer>
+				<div class="dialog-footer">
+					<el-button type="primary" @click="submitFileForm">确 定</el-button>
+					<el-button @click="upload.open = false">取 消</el-button>
+				</div>
+			</template>
+		</el-dialog>
+
+		<!-- 修改用户登录限制对话框 -->
+		<el-dialog :title="login.title" v-model="login.open" width="500px" append-to-body>
+			<el-form ref="expandRef" :model="form" :rules="rules" label-width="80px">
+				<el-form-item label="上次修改密码时间" prop="lastUpdateTime">
+					<el-date-picker clearable v-model="form.lastUpdateTime" type="date" value-format="YYYY-MM-DD"
+						placeholder="请选择上次修改密码时间">
+					</el-date-picker>
+				</el-form-item>
+				<el-form-item label="登录IP限制" prop="loginIp">
+					<el-input v-model="form.loginIp" type="textarea" placeholder="请输入内容" />
+				</el-form-item>
+				<el-form-item label="登录时间限制" prop="loginTime">
+					<el-input v-model="form.loginTime" type="textarea" placeholder="请输入内容" />
+				</el-form-item>
+			</el-form>
+			<template #footer>
+				<div class="dialog-footer">
+					<el-button type="primary" @click="submitForm">确 定</el-button>
+					<el-button @click="cancel">取 消</el-button>
+				</div>
+			</template>
+		</el-dialog>
+	</div>
 </template>
 
 <script setup name="User">
-import { getToken } from "@/utils/auth";
-import { changeUserStatus, listUser, resetUserPwd, delUser, getUser, updateUser, addUser, deptTreeSelect } from "@/api/system/user";
+	import {
+		getToken
+	} from "@/utils/auth";
+	import {
+		changeUserStatus,
+		listUser,
+		resetUserPwd,
+		delUser,
+		getUser,
+		updateUser,
+		addUser,
+		deptTreeSelect
+	} from "@/api/system/user";
 
-const router = useRouter();
-const { proxy } = getCurrentInstance();
-const { sys_normal_disable, sys_user_sex } = proxy.useDict("sys_normal_disable", "sys_user_sex");
+	const router = useRouter();
+	const {
+		proxy
+	} = getCurrentInstance();
+	const {
+		sys_normal_disable,
+		sys_user_sex
+	} = proxy.useDict("sys_normal_disable", "sys_user_sex");
 
-const userList = ref([]);
-const open = ref(false);
-const loading = ref(true);
-const showSearch = ref(true);
-const ids = ref([]);
-const single = ref(true);
-const multiple = ref(true);
-const total = ref(0);
-const title = ref("");
-const dateRange = ref([]);
-const deptName = ref("");
-const deptOptions = ref(undefined);
-const initPassword = ref(undefined);
-const postOptions = ref([]);
-const roleOptions = ref([]);
-/*** 用户导入参数 */
-const upload = reactive({
-  // 是否显示弹出层(用户导入)
-  open: false,
-  // 弹出层标题(用户导入)
-  title: "",
-  // 是否禁用上传
-  isUploading: false,
-  // 是否更新已经存在的用户数据
-  updateSupport: 0,
-  // 设置上传的请求头部
-  headers: { Authorization: "Bearer " + getToken() },
-  // 上传的地址
-  url: import.meta.env.VITE_APP_BASE_API + "/system/user/importData"
-});
-// 列显隐信息
-const columns = ref([
-  { key: 0, label: `用户编号`, visible: true },
-  { key: 1, label: `用户名称`, visible: true },
-  { key: 2, label: `用户昵称`, visible: true },
-  { key: 3, label: `部门`, visible: true },
-  { key: 4, label: `手机号码`, visible: true },
-  { key: 5, label: `状态`, visible: true },
-  { key: 6, label: `创建时间`, visible: true }
-]);
+	const userList = ref([]);
+	const open = ref(false);
+	const loading = ref(true);
+	const showSearch = ref(true);
+	const ids = ref([]);
+	const single = ref(true);
+	const multiple = ref(true);
+	const total = ref(0);
+	const title = ref("");
+	const dateRange = ref([]);
+	const deptName = ref("");
+	const deptOptions = ref(undefined);
+	const initPassword = ref(undefined);
+	const postOptions = ref([]);
+	const roleOptions = ref([]);
+	/*** 用户导入参数 */
+	const upload = reactive({
+		// 是否显示弹出层(用户导入)
+		open: false,
+		// 弹出层标题(用户导入)
+		title: "",
+		// 是否禁用上传
+		isUploading: false,
+		// 是否更新已经存在的用户数据
+		updateSupport: 0,
+		// 设置上传的请求头部
+		headers: {
+			Authorization: "Bearer " + getToken()
+		},
+		// 上传的地址
+		url: import.meta.env.VITE_APP_BASE_API + "/system/user/importData"
+	});
+	/*** 用户导入参数 */
+	const login = reactive({
+		// 是否显示弹出层(用户导入)
+		open: false,
+		// 弹出层标题(用户导入)
+		title: "",
+		// 是否禁用上传
+		isUploading: false,
+		// 是否更新已经存在的用户数据
+		updateSupport: 0,
+		// 设置上传的请求头部
+		headers: {
+			Authorization: "Bearer " + getToken()
+		},
+		// 上传的地址
+		url: import.meta.env.VITE_APP_BASE_API + "/system/user/importData"
+	});
+	// 列显隐信息
+	const columns = ref([{
+			key: 0,
+			label: `用户编号`,
+			visible: true
+		},
+		{
+			key: 1,
+			label: `用户名称`,
+			visible: true
+		},
+		{
+			key: 2,
+			label: `用户昵称`,
+			visible: true
+		},
+		{
+			key: 3,
+			label: `部门`,
+			visible: true
+		},
+		{
+			key: 4,
+			label: `手机号码`,
+			visible: true
+		},
+		{
+			key: 5,
+			label: `状态`,
+			visible: true
+		},
+		{
+			key: 6,
+			label: `创建时间`,
+			visible: true
+		}
+	]);
 
-const data = reactive({
-  form: {},
-  queryParams: {
-    pageNum: 1,
-    pageSize: 10,
-    userName: undefined,
-    phonenumber: undefined,
-    status: undefined,
-    deptId: undefined
-  },
-  rules: {
-    userName: [{ required: true, message: "用户名称不能为空", trigger: "blur" }, { min: 2, max: 20, message: "用户名称长度必须介于 2 和 20 之间", trigger: "blur" }],
-    nickName: [{ required: true, message: "用户昵称不能为空", trigger: "blur" }],
-    password: [{ required: true, message: "用户密码不能为空", trigger: "blur" }, { min: 5, max: 20, message: "用户密码长度必须介于 5 和 20 之间", trigger: "blur" }],
-    email: [{ type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }],
-    phonenumber: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur" }]
-  }
-});
+	const data = reactive({
+		form: {},
+		queryParams: {
+			pageNum: 1,
+			pageSize: 10,
+			userName: undefined,
+			phonenumber: undefined,
+			status: undefined,
+			deptId: undefined
+		},
+		rules: {
+			userName: [{
+				required: true,
+				message: "用户名称不能为空",
+				trigger: "blur"
+			}, {
+				min: 2,
+				max: 20,
+				message: "用户名称长度必须介于 2 和 20 之间",
+				trigger: "blur"
+			}],
+			nickName: [{
+				required: true,
+				message: "用户昵称不能为空",
+				trigger: "blur"
+			}],
+			password: [{
+				required: true,
+				message: "用户密码不能为空",
+				trigger: "blur"
+			}, {
+				min: 5,
+				max: 20,
+				message: "用户密码长度必须介于 5 和 20 之间",
+				trigger: "blur"
+			}],
+			email: [{
+				type: "email",
+				message: "请输入正确的邮箱地址",
+				trigger: ["blur", "change"]
+			}],
+			phonenumber: [{
+				pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+				message: "请输入正确的手机号码",
+				trigger: "blur"
+			}]
+		}
+	});
 
-const { queryParams, form, rules } = toRefs(data);
+	const {
+		queryParams,
+		form,
+		rules
+	} = toRefs(data);
 
-/** 通过条件过滤节点  */
-const filterNode = (value, data) => {
-  if (!value) return true;
-  return data.label.indexOf(value) !== -1;
-};
-/** 根据名称筛选部门树 */
-watch(deptName, val => {
-  proxy.$refs["deptTreeRef"].filter(val);
-});
-/** 查询部门下拉树结构 */
-function getDeptTree() {
-  deptTreeSelect().then(response => {
-    deptOptions.value = response.data;
-  });
-};
-/** 查询用户列表 */
-function getList() {
-  loading.value = true;
-  listUser(proxy.addDateRange(queryParams.value, dateRange.value)).then(res => {
-    loading.value = false;
-    userList.value = res.rows;
-    total.value = res.total;
-  });
-};
-/** 节点单击事件 */
-function handleNodeClick(data) {
-  queryParams.value.deptId = data.id;
-  handleQuery();
-};
-/** 搜索按钮操作 */
-function handleQuery() {
-  queryParams.value.pageNum = 1;
-  getList();
-};
-/** 重置按钮操作 */
-function resetQuery() {
-  dateRange.value = [];
-  proxy.resetForm("queryRef");
-  queryParams.value.deptId = undefined;
-  proxy.$refs.deptTreeRef.setCurrentKey(null);
-  handleQuery();
-};
-/** 删除按钮操作 */
-function handleDelete(row) {
-  const userIds = row.userId || ids.value;
-  proxy.$modal.confirm('是否确认删除用户编号为"' + userIds + '"的数据项?').then(function () {
-    return delUser(userIds);
-  }).then(() => {
-    getList();
-    proxy.$modal.msgSuccess("删除成功");
-  }).catch(() => {});
-};
-/** 导出按钮操作 */
-function handleExport() {
-  proxy.download("system/user/export", {
-    ...queryParams.value,
-  },`user_${new Date().getTime()}.xlsx`);
-};
-/** 用户状态修改  */
-function handleStatusChange(row) {
-  let text = row.status === "0" ? "启用" : "停用";
-  proxy.$modal.confirm('确认要"' + text + '""' + row.userName + '"用户吗?').then(function () {
-    return changeUserStatus(row.userId, row.status);
-  }).then(() => {
-    proxy.$modal.msgSuccess(text + "成功");
-  }).catch(function () {
-    row.status = row.status === "0" ? "1" : "0";
-  });
-};
-/** 更多操作 */
-function handleCommand(command, row) {
-  switch (command) {
-    case "handleResetPwd":
-      handleResetPwd(row);
-      break;
-    case "handleAuthRole":
-      handleAuthRole(row);
-      break;
-    default:
-      break;
-  }
-};
-/** 跳转角色分配 */
-function handleAuthRole(row) {
-  const userId = row.userId;
-  router.push("/system/user-auth/role/" + userId);
-};
-/** 重置密码按钮操作 */
-function handleResetPwd(row) {
-  proxy.$prompt('请输入"' + row.userName + '"的新密码', "提示", {
-    confirmButtonText: "确定",
-    cancelButtonText: "取消",
-    closeOnClickModal: false,
-    inputPattern: /^.{5,20}$/,
-    inputErrorMessage: "用户密码长度必须介于 5 和 20 之间",
-  }).then(({ value }) => {
-    resetUserPwd(row.userId, value).then(response => {
-      proxy.$modal.msgSuccess("修改成功,新密码是:" + value);
-    });
-  }).catch(() => {});
-};
-/** 选择条数  */
-function handleSelectionChange(selection) {
-  ids.value = selection.map(item => item.userId);
-  single.value = selection.length != 1;
-  multiple.value = !selection.length;
-};
-/** 导入按钮操作 */
-function handleImport() {
-  upload.title = "用户导入";
-  upload.open = true;
-};
-/** 下载模板操作 */
-function importTemplate() {
-  proxy.download("system/user/importTemplate", {
-  }, `user_template_${new Date().getTime()}.xlsx`);
-};
-/**文件上传中处理 */
-const handleFileUploadProgress = (event, file, fileList) => {
-  upload.isUploading = true;
-};
-/** 文件上传成功处理 */
-const handleFileSuccess = (response, file, fileList) => {
-  upload.open = false;
-  upload.isUploading = false;
-  proxy.$refs["uploadRef"].handleRemove(file);
-  proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
-  getList();
-};
-/** 提交上传文件 */
-function submitFileForm() {
-  proxy.$refs["uploadRef"].submit();
-};
-/** 重置操作表单 */
-function reset() {
-  form.value = {
-    userId: undefined,
-    deptId: undefined,
-    userName: undefined,
-    nickName: undefined,
-    password: undefined,
-    phonenumber: undefined,
-    email: undefined,
-    sex: undefined,
-    status: "0",
-    remark: undefined,
-    postIds: [],
-    roleIds: []
-  };
-  proxy.resetForm("userRef");
-};
-/** 取消按钮 */
-function cancel() {
-  open.value = false;
-  reset();
-};
-/** 新增按钮操作 */
-function handleAdd() {
-  reset();
-  getUser().then(response => {
-    postOptions.value = response.posts;
-    roleOptions.value = response.roles;
-    open.value = true;
-    title.value = "添加用户";
-    form.value.password = initPassword.value;
-  });
-};
-/** 修改按钮操作 */
-function handleUpdate(row) {
-  reset();
-  const userId = row.userId || ids.value;
-  getUser(userId).then(response => {
-    form.value = response.data;
-    postOptions.value = response.posts;
-    roleOptions.value = response.roles;
-    form.value.postIds = response.postIds;
-    form.value.roleIds = response.roleIds;
-    open.value = true;
-    title.value = "修改用户";
-    form.password = "";
-  });
-};
-/** 提交按钮 */
-function submitForm() {
-  proxy.$refs["userRef"].validate(valid => {
-    if (valid) {
-      if (form.value.userId != undefined) {
-        updateUser(form.value).then(response => {
-          proxy.$modal.msgSuccess("修改成功");
-          open.value = false;
-          getList();
-        });
-      } else {
-        addUser(form.value).then(response => {
-          proxy.$modal.msgSuccess("新增成功");
-          open.value = false;
-          getList();
-        });
-      }
-    }
-  });
-};
+	/** 通过条件过滤节点  */
+	const filterNode = (value, data) => {
+		if (!value) return true;
+		return data.label.indexOf(value) !== -1;
+	};
+	/** 根据名称筛选部门树 */
+	watch(deptName, val => {
+		proxy.$refs["deptTreeRef"].filter(val);
+	});
+	/** 查询部门下拉树结构 */
+	function getDeptTree() {
+		deptTreeSelect().then(response => {
+			deptOptions.value = response.data;
+		});
+	};
+	/** 查询用户列表 */
+	function getList() {
+		loading.value = true;
+		listUser(proxy.addDateRange(queryParams.value, dateRange.value)).then(res => {
+			loading.value = false;
+			userList.value = res.rows;
+			total.value = res.total;
+		});
+	};
+	/** 节点单击事件 */
+	function handleNodeClick(data) {
+		queryParams.value.deptId = data.id;
+		handleQuery();
+	};
+	/** 搜索按钮操作 */
+	function handleQuery() {
+		queryParams.value.pageNum = 1;
+		getList();
+	};
+	/** 重置按钮操作 */
+	function resetQuery() {
+		dateRange.value = [];
+		proxy.resetForm("queryRef");
+		queryParams.value.deptId = undefined;
+		proxy.$refs.deptTreeRef.setCurrentKey(null);
+		handleQuery();
+	};
+	/** 删除按钮操作 */
+	function handleDelete(row) {
+		const userIds = row.userId || ids.value;
+		proxy.$modal.confirm('是否确认删除用户编号为"' + userIds + '"的数据项?').then(function() {
+			return delUser(userIds);
+		}).then(() => {
+			getList();
+			proxy.$modal.msgSuccess("删除成功");
+		}).catch(() => {});
+	};
+	/** 导出按钮操作 */
+	function handleExport() {
+		proxy.download("system/user/export", {
+			...queryParams.value,
+		}, `user_${new Date().getTime()}.xlsx`);
+	};
+	/** 用户状态修改  */
+	function handleStatusChange(row) {
+		let text = row.status === "0" ? "启用" : "停用";
+		proxy.$modal.confirm('确认要"' + text + '""' + row.userName + '"用户吗?').then(function() {
+			return changeUserStatus(row.userId, row.status);
+		}).then(() => {
+			proxy.$modal.msgSuccess(text + "成功");
+		}).catch(function() {
+			row.status = row.status === "0" ? "1" : "0";
+		});
+	};
+	/** 更多操作 */
+	function handleCommand(command, row) {
+		switch (command) {
+			case "handleResetPwd":
+				handleResetPwd(row);
+				break;
+			case "handleAuthRole":
+				handleAuthRole(row);
+				break;
+			default:
+				break;
+		}
+	};
+	/** 跳转角色分配 */
+	function handleAuthRole(row) {
+		const userId = row.userId;
+		router.push("/system/user-auth/role/" + userId);
+	};
+	/** 重置密码按钮操作 */
+	function handleResetPwd(row) {
+		proxy.$prompt('请输入"' + row.userName + '"的新密码', "提示", {
+			confirmButtonText: "确定",
+			cancelButtonText: "取消",
+			closeOnClickModal: false,
+			inputPattern: /^.{5,20}$/,
+			inputErrorMessage: "用户密码长度必须介于 5 和 20 之间",
+		}).then(({
+			value
+		}) => {
+			resetUserPwd(row.userId, value).then(response => {
+				proxy.$modal.msgSuccess("修改成功,新密码是:" + value);
+			});
+		}).catch(() => {});
+	};
+	/** 选择条数  */
+	function handleSelectionChange(selection) {
+		ids.value = selection.map(item => item.userId);
+		single.value = selection.length != 1;
+		multiple.value = !selection.length;
+	};
+	/** 导入按钮操作 */
+	function handleImport() {
+		upload.title = "用户导入";
+		upload.open = true;
+	};
+	/** 下载模板操作 */
+	function importTemplate() {
+		proxy.download("system/user/importTemplate", {}, `user_template_${new Date().getTime()}.xlsx`);
+	};
+	/**文件上传中处理 */
+	const handleFileUploadProgress = (event, file, fileList) => {
+		upload.isUploading = true;
+	};
+	/** 文件上传成功处理 */
+	const handleFileSuccess = (response, file, fileList) => {
+		upload.open = false;
+		upload.isUploading = false;
+		proxy.$refs["uploadRef"].handleRemove(file);
+		proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
+			response.msg + "</div>", "导入结果", {
+				dangerouslyUseHTMLString: true
+			});
+		getList();
+	};
+	/** 提交上传文件 */
+	function submitFileForm() {
+		proxy.$refs["uploadRef"].submit();
+	};
+	/** 重置操作表单 */
+	function reset() {
+		form.value = {
+			userId: undefined,
+			deptId: undefined,
+			userName: undefined,
+			nickName: undefined,
+			password: undefined,
+			phonenumber: undefined,
+			email: undefined,
+			sex: undefined,
+			status: "0",
+			remark: undefined,
+			postIds: [],
+			roleIds: []
+		};
+		proxy.resetForm("userRef");
+	};
+	/** 取消按钮 */
+	function cancel() {
+		open.value = false;
+		reset();
+	};
+	/** 新增按钮操作 */
+	function handleAdd() {
+		reset();
+		getUser().then(response => {
+			postOptions.value = response.posts;
+			roleOptions.value = response.roles;
+			open.value = true;
+			title.value = "添加用户";
+			form.value.password = initPassword.value;
+		});
+	};
+	/** 修改按钮操作 */
+	function handleUpdate(row) {
+		reset();
+		const userId = row.userId || ids.value;
+		getUser(userId).then(response => {
+			form.value = response.data;
+			postOptions.value = response.posts;
+			roleOptions.value = response.roles;
+			form.value.postIds = response.postIds;
+			form.value.roleIds = response.roleIds;
+			open.value = true;
+			title.value = "修改用户";
+			form.password = "";
+		});
+	};
+	
+	/** 限制登录操作 */
+	function handleLoginLimit(row) {
+		reset();
+		const userId = row.userId || ids.value;
+		getUser(userId).then(response => {
+			form.value = response.data.expand;
+			login.open = true;
+			login.title = "登录限制";
+			form.password = "";
+		});
+	};
+	/** 提交按钮 */
+	function submitForm() {
+		proxy.$refs["userRef"].validate(valid => {
+			if (valid) {
+				if (form.value.userId != undefined) {
+					updateUser(form.value).then(response => {
+						proxy.$modal.msgSuccess("修改成功");
+						open.value = false;
+						getList();
+					});
+				} else {
+					addUser(form.value).then(response => {
+						proxy.$modal.msgSuccess("新增成功");
+						open.value = false;
+						getList();
+					});
+				}
+			}
+		});
+	};
 
-getDeptTree();
-getList();
-</script>
+	getDeptTree();
+	getList();
+</script>