Jelajahi Sumber

井筒-领域检索

xiaoqiao 11 bulan lalu
induk
melakukan
d610f9b724

+ 57 - 2
src/main/java/com/bowintek/practice/controller/UserController.java

@@ -1,9 +1,11 @@
 package com.bowintek.practice.controller;
 
+import com.bowintek.practice.filter.exception.BaseErrorEnum;
 import com.bowintek.practice.filter.exception.BaseException;
 import com.bowintek.practice.filter.exception.BaseResponse;
 import com.bowintek.practice.filter.exception.RespGenerstor;
 import com.bowintek.practice.model.SysMenu;
+import com.bowintek.practice.model.SysUser;
 import com.bowintek.practice.services.service.AccountService;
 import com.bowintek.practice.services.service.UserService;
 import com.bowintek.practice.util.DateUtils;
@@ -15,8 +17,7 @@ import lombok.Data;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 @RestController
 @RequestMapping(value = "/api/user")
@@ -77,4 +78,58 @@ public class UserController {
     public BaseResponse<SysMenu> getUserShortcutMenuList(){
         return RespGenerstor.success(userService.getUserShortcutMenuList(accountService.getLoginUserID()));
     }
+    @ResponseBody
+    @PostMapping("/deleteSysUser")
+    public BaseResponse<Map<String, Object>> deleteSysUser(@RequestBody List<String> userIds) {
+
+        Integer result = userService.deleteUsers(userIds);
+        if (result <= 0)
+            throw new BaseException(BaseErrorEnum.DELETE_NOT_DATA_ERROR);
+        return RespGenerstor.success(1);
+    }
+    @PostMapping("saveUserInfo")
+    public BaseResponse addUserInfo(@RequestBody ReqUpdateUserInfoVo data) {
+
+        String desDefault = desUtils.decoder(data.pwd_default.getToken(), dateUtils.DateToDateTime(dateUtils.StrToDate(data.pwd_default.getTm(), "yyyy/MM/dd HH:mm:ss")));
+        String loginUserID=accountService.getLoginUserID();
+        SysUser sysUser=new SysUser();
+        String desConfirm = desUtils.decoder(data.pwd_confirm.getToken(), dateUtils.DateToDateTime(dateUtils.StrToDate(data.pwd_confirm.getTm(), "yyyy/MM/dd HH:mm:ss")));
+
+        if (!desDefault.equals(desConfirm))
+            throw new BaseException("","两次输入的密码不一致!");
+
+        sysUser.setUserID(UUID.randomUUID().toString());
+        sysUser.setLoginID(data.getLoginID());
+        sysUser.setName(data.getUserName());
+        sysUser.setUserTypeID(data.getUserTypeID());
+        sysUser.setRecordStatus(data.getRecordStatus().intValue());
+        sysUser.setCreateTime(new Date());
+        sysUser.setCreateBy(loginUserID) ;
+        sysUser.setPassword(desConfirm);
+
+        sysUser.setUpdateBy(loginUserID);
+        sysUser.setUpdateTime(new Date());
+
+        int ret=userService.saveUserInfo(sysUser);
+        if(ret==-1){
+            return RespGenerstor.fail("-1","账号已被占用!请用其他的账号。");
+        }else if(ret==1) {
+
+            return RespGenerstor.success("新增用户成功!");
+        }else{
+            return RespGenerstor.fail(ret+"","新增用户失败。");
+        }
+    }
+    @Data
+    public static class ReqUpdateUserInfoVo {
+        public String userID;
+        public String loginID;
+        public String userName;
+        public String jobNumber;
+        public Integer userTypeID;
+        public String departmentName;
+        public Integer recordStatus;
+        public DesModel pwd_default;
+        public DesModel pwd_confirm;
+    }
 }

+ 1 - 1
src/main/java/com/bowintek/practice/mapper/SysUserCQuery.java

@@ -33,7 +33,7 @@ public interface SysUserCQuery {
     Integer insertUserRole(@Param("dataList") List<SysUserSysRoleKey> dataList);
     List<SysMenu> selectUserShortcutMenuList(@Param("userID") String userID);
 
-
+    Integer deleteUserRoleByUserId(@Param("userIDList") List<String> userIDList);
     List<String> selectUserPerms(@Param("userID") String userID);
 
 }

+ 30 - 0
src/main/java/com/bowintek/practice/services/impl/UserServiceImpl.java

@@ -11,6 +11,8 @@ import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 import java.util.stream.Collectors;
@@ -31,6 +33,9 @@ public class UserServiceImpl implements UserService {
     SysUserCfMajorClassMapper sysUserCfMajorClassMapper;
     @Autowired
     private DateUtils dateUtils;
+    @Autowired
+    private SysLogMapper sysLogMapper;
+
     private String defaultPassword = "02C84926724BAC57A43249F0B49471D0";//zyy@1234
 
     private String studentRoleID = "8e814c6d-b40b-11ed-be3c-7085c2a9999e";//普通学生
@@ -238,4 +243,29 @@ public class UserServiceImpl implements UserService {
         return sysUserMapper.selectByExample(exp).stream().findFirst().orElse(null);
     }
 
+    @Override
+    public int saveUserInfo(SysUser sysUser) {
+        SysUser sysUserExist = getUserByLoginID(sysUser.getLoginID());
+        if (sysUserExist != null) {
+            return -1;
+        }
+        return sysUserMapper.insertSelective(sysUser);
+    }
+    @Override
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    public Integer deleteUsers(List<String> userIds) {
+        //关联中间表数据删除
+        sysUserCQuery.deleteUserRoleByUserId(userIds);
+        //关联表数据删除 sys_log
+        SysLogExample logExp=new SysLogExample();
+        SysLogExample.Criteria expCri = logExp.or();
+        expCri.andUserIDIn(userIds);
+        sysLogMapper.deleteByExample(logExp);
+        //删除sys_user表数据
+        SysUserExample exp = new SysUserExample();
+        SysUserExample.Criteria cri = exp.or();
+        cri.andUserIDIn(userIds);
+        sysUserMapper.deleteByExample(exp);
+        return 1;
+    }
 }

+ 2 - 1
src/main/java/com/bowintek/practice/services/service/UserService.java

@@ -31,5 +31,6 @@ public interface UserService {
 
     List<SysMenu> getUserShortcutMenuList(String userID);
     SysUser getUserByLoginID(String loginID);
-
+    int saveUserInfo(SysUser sysUser);;
+    Integer deleteUsers(List<String> userIds);
 }

+ 2 - 2
src/main/resources/application.yml

@@ -12,7 +12,7 @@ spring:
     type: com.alibaba.druid.pool.DruidDataSource
     driver-class-name: com.mysql.cj.jdbc.Driver
     #基本属性
-    url: jdbc:mysql://office.bowintek.com:3306/smartSearchDB?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
+    url: jdbc:mysql://office.bowintek.com:3306/smartSearchDB?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
     #url: jdbc:mysql://office.bowintek.com:3306/practicedb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
     username: root
     password: bowin123
@@ -20,7 +20,7 @@ spring:
       # 数据源基本配置
       username: root
       password: bowin123
-      url: jdbc:mysql://office.bowintek.com:3306/smartSearchDB?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
+      url: jdbc:mysql://office.bowintek.com:3306/smartSearchDB?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
       driver-class-name: com.mysql.jdbc.Driver
     postgre:
       # 数据源基本配置

+ 7 - 1
src/main/resources/mapping/SysUserCQuery.xml

@@ -201,5 +201,11 @@
          inner join sys_user_sys_role ur on rfc.RoleID = ur.RoleID
         where 1=1 and ur.userID=#{userID}
     </select>
-
+    <delete id="deleteUserRoleByUserId">
+        delete from sys_user_sys_role where 1=1
+        and userID in
+        <foreach collection="userIDList" item="userID" index="index" open="(" close=")" separator=",">
+            #{userID}
+        </foreach>
+    </delete>
 </mapper>

+ 2 - 2
target/classes/application.yml

@@ -12,7 +12,7 @@ spring:
     type: com.alibaba.druid.pool.DruidDataSource
     driver-class-name: com.mysql.cj.jdbc.Driver
     #基本属性
-    url: jdbc:mysql://office.bowintek.com:3306/smartSearchDB?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
+    url: jdbc:mysql://office.bowintek.com:3306/smartSearchDB?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
     #url: jdbc:mysql://office.bowintek.com:3306/practicedb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
     username: root
     password: bowin123
@@ -20,7 +20,7 @@ spring:
       # 数据源基本配置
       username: root
       password: bowin123
-      url: jdbc:mysql://office.bowintek.com:3306/smartSearchDB?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
+      url: jdbc:mysql://office.bowintek.com:3306/smartSearchDB?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
       driver-class-name: com.mysql.jdbc.Driver
     postgre:
       # 数据源基本配置

TEMPAT SAMPAH
target/classes/com/bowintek/practice/controller/UserController$ReqUpdatePasswordVo.class


TEMPAT SAMPAH
target/classes/com/bowintek/practice/controller/UserController.class


TEMPAT SAMPAH
target/classes/com/bowintek/practice/mapper/SysUserCQuery.class


TEMPAT SAMPAH
target/classes/com/bowintek/practice/services/impl/UserServiceImpl.class


TEMPAT SAMPAH
target/classes/com/bowintek/practice/services/service/UserService.class


+ 7 - 1
target/classes/mapping/SysUserCQuery.xml

@@ -201,5 +201,11 @@
          inner join sys_user_sys_role ur on rfc.RoleID = ur.RoleID
         where 1=1 and ur.userID=#{userID}
     </select>
-
+    <delete id="deleteUserRoleByUserId">
+        delete from sys_user_sys_role where 1=1
+        and userID in
+        <foreach collection="userIDList" item="userID" index="index" open="(" close=")" separator=",">
+            #{userID}
+        </foreach>
+    </delete>
 </mapper>

+ 41 - 0
vue/src/api/system/user/index.ts

@@ -100,3 +100,44 @@ export function saveTeacher(data: any) {
     },
   );
 }
+
+export function insertUserInfo(data: any) {
+
+  const user = {
+    userID: data.userID,
+    userName: data.userName,
+    loginID: data.loginID,
+    jobNumber: data.jobNumber,
+    departmentName: data.departmentName,
+    pwd_default: crtyptoHelp.encryptDes(`${crtyptoHelp.MD5(data.pwd_default)}`),
+    pwd_confirm: crtyptoHelp.encryptDes(`${crtyptoHelp.MD5(data.pwd_confirm)}`),
+    recordStatus: data.recordStatus,
+    userTypeID:data.userTypeID
+  }
+
+  return request(
+    {
+      url: 'user/saveUserInfo',
+      method: 'post',
+      data: user,
+    },
+    {
+      successMsg: '新增成功!',
+      errorMsg: '新增失败!'
+    },
+  );
+}
+
+export function deleteSysUsers(data:any) {
+  return request<object>(
+    {
+      url: 'user/deleteSysUser',
+      method: 'post',
+      data,
+    },
+    {
+      successMsg: '删除成功!',
+      errorMsg: '删除失败!'
+    },
+  );
+}

+ 154 - 0
vue/src/views/system/users/edit.vue

@@ -0,0 +1,154 @@
+<template>
+  <Modal v-model:visible="visible" title="新增用户" width="50%" @ok="handleOk()" @cancel="visible=false">
+    <div class="card-edit">
+      <Form ref="modalFormRef" :model="formState" autocomplete="off">
+        <a-row type="flex">
+          <a-col :span="24">
+            <a-form-item label="用户名" :label-col="{span:8}" name="userName"
+                         :rules="[{ required: true, message: '用户名不能为空!' }]">
+              <a-input v-model:value="formState.userName" />
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row type="flex">
+          <a-col :span="24">
+            <a-form-item label="帐号" :label-col="{span:8}" name="loginID"
+                         :rules="[{ required: true, message: '帐号不能为空!' }]">
+              <a-input v-model:value="formState.loginID" />
+            </a-form-item>
+          </a-col>
+        </a-row>
+
+        <a-row type="flex">
+          <a-col :span="24">
+            <a-form-item label="密码" :label-col="{span:8}" name="pwd_default" v-bind="validateInfos.pwd_default">
+              <a-input-password v-model:value="formState.pwd_default" placeholder="请填写8到16位密码" type="password"
+                                maxlength="16" minlength="8"/>
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row type="flex">
+          <a-col :span="24">
+            <a-form-item label="确认密码" :label-col="{span:8}" name="pwd_confirm" v-bind="validateInfos.pwd_confirm">
+              <a-input-password v-model:value="formState.pwd_confirm" placeholder="请填写8到16位密码" type="password"
+                                maxlength="16" minlength="8"/>
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row type="flex">
+          <a-col :span="24">
+            <a-form-item name="recordStatus" label="账号状态" :label-col="{span:8}" :rules="[{ required: true, message: '请选择账号状态!' }]">
+              <a-select ref="select" v-model:value="formState.recordStatus">
+                  <a-select-option value="1">正常</a-select-option>
+                  <a-select-option value="2">禁用</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row type="flex">
+          <a-col :span="24">
+            <a-form-item label="用户类型" :label-col="{span:8}" name="userTypeID"
+                         :rules="[{ required: true, message: '请选择用户类型!' }]" placeholder="请选择">
+              <a-select ref="select" v-model:value="formState.userTypeID">
+                <a-select-option value="1">系统管理员</a-select-option>
+                <a-select-option value="2">普通人员</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+        </a-row>
+      </Form>
+    </div>
+  </Modal>
+</template>
+
+<script lang="ts">
+  import {Form, Modal} from 'ant-design-vue';
+  import type {FormInstance} from 'ant-design-vue';
+  import {ref, reactive, defineComponent} from "vue";
+  import {insertUserInfo} from "@/api/system/user";
+
+  export default defineComponent({
+
+    props: {
+      loadData: {
+        type: Function,
+        default: null
+      }
+    },
+    components: {Modal, Form},
+    setup(props) {
+      const modalFormRef = ref<FormInstance>();
+      const visible = ref<boolean>(false);
+      const useForm = Form.useForm;
+
+      const formState = ref({
+        userName:'',
+        loginID:'',
+        jobNumber:  '',
+        departmentName: '',
+        pwd_default:'',
+        pwd_confirm:'',
+        recordStatus:'',
+        userTypeID:''
+      });
+
+      const passwordRegex = /(?=.*[a-z_])(?=.*\d)(?=.*[^a-z0-9_])[\S]{8,}/i;
+      const rulesRef = reactive({
+        pwd_default: [
+          {
+            required: true,
+            message: '请填写8到16位新密码!',
+          }, {
+            min: 8,
+            max: 16,
+            message: '密码必须包含字母、数字和特殊字符,且长度要在8到16位。',
+            trigger: 'blur',
+            pattern:passwordRegex
+          }
+        ],
+        pwd_confirm: [
+          {
+            required: true,
+            message: '请填写8到16位新密码!',
+          }, {
+            min: 8,
+            max: 16,
+            message: '密码必须包含字母、数字和特殊字符,且长度要在8到16位。',
+            trigger: 'blur',
+            pattern:passwordRegex
+          }
+        ]
+      });
+      const {validate, validateInfos} = useForm(formState, rulesRef);
+
+      const show = () => {
+        loadData();
+        visible.value = true;
+      };
+      const loadData = async () => {
+      }
+
+      const handleOk = () => {
+        if (modalFormRef.value != undefined) {
+          modalFormRef.value.validate().then(() => {
+            insertUserInfo(formState.value
+            ).then(result => {
+              if (result) {
+                visible.value = false;
+                props.loadData();
+              }
+            });
+          });
+        }
+      };
+      return {
+      handleOk, visible, show,
+        formState, modalFormRef,
+        loadData,
+        validateInfos,
+        validate
+      };
+    }
+  });
+
+</script>

+ 40 - 37
vue/src/views/system/users/index.vue

@@ -18,19 +18,6 @@
             <a-input v-model:value="searchParamsState.LoginID" placeholder=""/>
           </a-form-item>
         </a-col>
-        <a-col :span="6">
-          <a-form-item label="用户类型" :label-col="{span:8}" name="UserTypeName">
-            <a-select
-              ref="select"
-              v-model:value="searchParamsState.UserTypeName"
-              :options="userTypeList"
-              :field-names="{label:'name',value:'value'}"
-              @change="loadData"
-              :allow-clear="true"
-            >
-            </a-select>
-          </a-form-item>
-        </a-col>
         <a-col :span="6" style="text-align: left">
           <a-button type="primary" html-type="submit" @click="onFinish">查询</a-button>
           <a-button style="margin: 0 8px" @click="() => {formRef.resetFields();loadData()}">重置</a-button>
@@ -38,7 +25,8 @@
       </a-row>
       <a-row class="edit-operation">
         <a-col :span="24" style="text-align: right">
-          <a-button @click="editTeacher"  functioncode="T0199010101">新增</a-button>
+          <a-button @click="addUser" >新增</a-button>
+          <a-button @click="onDelete">删除</a-button>
         </a-col>
       </a-row>
     </a-form>
@@ -61,25 +49,31 @@
       </a-table>
     </div>
     <UpdatePassword ref="updatePasswordRef"></UpdatePassword>
+    <AddUserInfo ref="addUserInfoRef" :loadData="loadData"></AddUserInfo>
   </div>
 </template>
 
 <script lang="ts">
-import {reactive, ref, computed, defineComponent} from 'vue';
+import {reactive, ref, computed, defineComponent,createVNode} from 'vue';
 import type {FormInstance} from 'ant-design-vue';
 import type {TableColumnsType, TableProps, SelectProps} from 'ant-design-vue';
-import {getUserListPage, updateUserStatu} from '@/api/system/user'
+import {getUserListPage, updateUserStatu,deleteSysUsers} from '@/api/system/user'
 import {getSysDictionaryList} from "@/api/system/dictionary";
 import UpdatePassword from '@/views/system/users/updatePassword.vue';
 import {getPaginationTotalTitle} from "@/utils/common";
+import AddUserInfo from '@/views/system/users/edit.vue';
+import {message, Modal} from "ant-design-vue";
+import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
+
 
 export default defineComponent({
   name: 'UserList',
-  components: {UpdatePassword},
+  components: {UpdatePassword,AddUserInfo},
   setup() {
     const modalRoleUserRef = ref();
     const modalRoleEditRef = ref();
     const formRef = ref<FormInstance>();
+    const addUserInfoRef = ref();
     const searchParamsState = reactive({page: 1, limit: 20, Name: '', userTypeID: ''});
     const formState = reactive({
       total: 0,
@@ -96,7 +90,6 @@ export default defineComponent({
       },
       {title: '用户名', dataIndex: 'Name', key: 'Name', width: 150},
       {title: '帐号', dataIndex: 'LoginID', key: 'LoginID', width: 150},
-      {title: '用户类型', dataIndex: 'UserTypeName', key: 'UserTypeName', width: 150},
       {title: '角色', dataIndex: 'roleName', key: 'roleName',},
       {
         title: '账号状态', dataIndex: 'RecordStatus', key: 'RecordStatus', width: 150, customRender: ({record}) => (
@@ -121,7 +114,10 @@ export default defineComponent({
     const onSelectChange = (selectedRowKeys: any) => {
       formState.selectedRowKeys = selectedRowKeys;
     };
+    const addUser = () => {
+      addUserInfoRef.value.show();
 
+    }
     const handleTableChange: TableProps['onChange'] = (
       pag: { pageSize: number; current: number }
     ) => {
@@ -142,23 +138,28 @@ export default defineComponent({
     const onUpdatePassword = (item) => {
       updatePasswordRef.value.show(item.UserID,item.Name,item.LoginID);
     };
-    const editTeacher = () => {
-      TeacherRef.value.show(formState.selectedRowKeys);
-      // getTaskStudentList({
-      //   page: 1,
-      //   rows: 10000,
-      //   taskIdList: formState.selectedRowKeys.join(",")
-      // }).then((result: any) => {
-      //   const studentList = result.list.filter(e => (e.positionID == null || e.positionID == '') && e.recordStatus != 4 && e.arrangeType != 2);
-      //   if (studentList.length <= 0) {
-      //     message.warning("选择的班级已完成指派,请刷新任务数据!");
-      //     return false;
-      //   } else {
-      //     //modalPositionRef.value.show(studentList.map(it => it.practiceTaskStudentID), majorGradeIDs[0].majorGradeID, schoolYearIDs[0].schoolYearID);
-      //   }
-      // });
-
-    }
+    const onDelete = () => {
+      if (formState.selectedRowKeys.length <= 0) {
+        message.warning('请选择需要删除的数据!');
+        return false;
+      }
+      Modal.confirm({
+        title: '确认删除选中用户?',
+        icon: createVNode(ExclamationCircleOutlined),
+        content: '',
+        okText: '确认删除',
+        okType: 'danger',
+        okButtonProps: {},
+        cancelText: '取消',
+        onOk() {
+          deleteSysUsers(formState.selectedRowKeys).then(() => {
+            loadData();
+          });
+        },
+        onCancel() {
+        },
+      });
+    };
     const loadData = async function () {
       formState.loading = true;
       const result: any = await getUserListPage(searchParamsState);
@@ -189,11 +190,13 @@ export default defineComponent({
       onSelectChange,
       handleTableChange,
       onFinish,
-      editTeacher,
+      onDelete,
       onUpdateUserStatu,
       onUpdatePassword,
       TeacherRef,
-      updatePasswordRef
+      updatePasswordRef,
+      addUser,
+      addUserInfoRef
     };
   },
   created() {