用户管理页面开发

This commit is contained in:
暮光:城中城
2019-06-28 23:23:51 +08:00
parent 9d6ab9e159
commit 49c1929746
8 changed files with 219 additions and 86 deletions

View File

@@ -69,6 +69,16 @@ public class UserInfo implements Serializable {
*/
private Date updateTime;
/**
* 手机号
*/
private String phone;
/**
* 性别 0=女 1=男
*/
private Integer sex;
public Long getId() {
return id;
}
@@ -155,4 +165,20 @@ public class UserInfo implements Serializable {
", updateTime=" + updateTime +
"}";
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
}

View File

@@ -1,6 +1,9 @@
package com.zyplayer.doc.manage.web.manage;
import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zyplayer.doc.core.json.DocResponseJson;
import com.zyplayer.doc.core.json.ResponseJson;
import com.zyplayer.doc.core.annotation.AuthMan;
@@ -9,9 +12,11 @@ import com.zyplayer.doc.data.config.security.DocUserUtil;
import com.zyplayer.doc.data.repository.manage.entity.AuthInfo;
import com.zyplayer.doc.data.repository.manage.entity.UserAuth;
import com.zyplayer.doc.data.repository.manage.entity.UserInfo;
import com.zyplayer.doc.data.repository.manage.entity.WikiPage;
import com.zyplayer.doc.data.service.manage.AuthInfoService;
import com.zyplayer.doc.data.service.manage.UserAuthService;
import com.zyplayer.doc.data.service.manage.UserInfoService;
import com.zyplayer.doc.manage.web.manage.param.UserListParam;
import com.zyplayer.doc.manage.web.manage.vo.AuthInfoVo;
import org.apache.commons.lang.StringUtils;
import org.dozer.Mapper;
@@ -21,6 +26,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -30,27 +36,63 @@ import java.util.stream.Collectors;
@AuthMan("USER_MANAGE")
public class UserInfoController {
@Autowired
@Resource
UserInfoService userInfoService;
@Autowired
@Resource
AuthInfoService authInfoService;
@Autowired
@Resource
UserAuthService userAuthService;
@Autowired
@Resource
Mapper mapper;
@PostMapping("/list")
public ResponseJson<Object> list(String userName) {
public ResponseJson<Object> list(UserListParam param) {
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
if (StringUtils.isNotBlank(userName)) {
queryWrapper.like("user_name", userName);
if (StringUtils.isNotBlank(param.getKeyword())) {
queryWrapper.like(param.getType() == 1, "id", param.getKeyword());
queryWrapper.like(param.getType() == 2, "user_no", param.getKeyword());
queryWrapper.like(param.getType() == 3, "user_name", param.getKeyword());
queryWrapper.like(param.getType() == 4, "phone", param.getKeyword());
queryWrapper.like(param.getType() == 5, "email", param.getKeyword());
}
queryWrapper.eq("del_flag", 0);
queryWrapper.ne("del_flag", 1);
PageHelper.startPage(param.getPageNum(), param.getPageSize(), true);
List<UserInfo> userInfoList = userInfoService.list(queryWrapper);
if (userInfoList != null && userInfoList.size() > 0) {
userInfoList.forEach(val -> val.setPassword(null));
}
return DocResponseJson.ok(userInfoList);
PageInfo<UserInfo> pageInfo = new PageInfo<>(userInfoList);
return DocResponseJson.ok(pageInfo);
}
@PostMapping("/update")
public ResponseJson<Object> update(UserInfo userInfo) {
// 不允许修改密码
userInfo.setPassword(null);
if (userInfo.getId() != null && userInfo.getId() > 0) {
userInfo.setUpdateTime(new Date());
userInfoService.updateById(userInfo);
} else {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
userInfo.setCreationTime(new Date());
userInfo.setCreateUid(currentUser.getUserId());
userInfoService.save(userInfo);
}
return DocResponseJson.ok();
}
@PostMapping("/resetPassword")
public ResponseJson<Object> resetPassword(UserInfo userInfo) {
String password = RandomUtil.randomNumbers(6);
UserInfo userInfoUp = new UserInfo();
if (StringUtils.isNotBlank(password)) {
String newPassword = DigestUtils.md5DigestAsHex(password.getBytes());
userInfoUp.setPassword(newPassword);
}
userInfoUp.setId(userInfo.getId());
userInfoUp.setUpdateTime(new Date());
userInfoService.updateById(userInfoUp);
return DocResponseJson.ok(password);
}
@PostMapping("/auth/list")
@@ -111,23 +153,4 @@ public class UserInfoController {
userInfoService.updateById(userInfo);
return DocResponseJson.ok();
}
@PostMapping("/update")
public ResponseJson<Object> update(UserInfo userInfo) {
String password = userInfo.getPassword();
if (StringUtils.isNotBlank(password)) {
password = DigestUtils.md5DigestAsHex(password.getBytes());
userInfo.setPassword(password);
}
if (userInfo.getId() != null && userInfo.getId() > 0) {
userInfo.setUpdateTime(new Date());
userInfoService.updateById(userInfo);
} else {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
userInfo.setCreationTime(new Date());
userInfo.setCreateUid(currentUser.getUserId());
userInfoService.save(userInfo);
}
return DocResponseJson.ok();
}
}

View File

@@ -0,0 +1,40 @@
package com.zyplayer.doc.manage.web.manage.param;
public class UserListParam {
private Integer type;
private String keyword;
private Integer pageNum;
private Integer pageSize;
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public String getKeyword() {
return keyword;
}
public void setKeyword(String keyword) {
this.keyword = keyword;
}
public Integer getPageNum() {
return pageNum;
}
public void setPageNum(Integer pageNum) {
this.pageNum = pageNum;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
}

View File

@@ -33,7 +33,9 @@ CREATE TABLE `wiki_page_history` (
KEY `idx_page_id` (`page_id`) USING BTREE COMMENT '页面ID索引'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
ALTER TABLE `user_info` ADD COLUMN `phone` varchar(20) NULL COMMENT '手机号';
ALTER TABLE `user_info` ADD COLUMN `sex` tinyint NOT NULL DEFAULT 0 COMMENT '性别 0=女 1=男';
ALTER TABLE `user_info` MODIFY COLUMN `del_flag` tinyint(4) NULL DEFAULT 0 COMMENT '是否删除 0=未删除 1=已删除 2=已停用';
-- ------------------------全新的库:------------------------
@@ -133,10 +135,12 @@ CREATE TABLE `user_info` (
`user_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
`email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',
`avatar` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '头像',
`del_flag` tinyint(4) NULL DEFAULT 0 COMMENT '是否删除 0=未删除 1=已删除',
`del_flag` tinyint(4) NULL DEFAULT 0 COMMENT '是否删除 0=未删除 1=已删除 2=已停用',
`creation_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`create_uid` bigint(20) NULL DEFAULT NULL COMMENT '创建人用户ID',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
`phone` varchar(20) NULL COMMENT '手机号',
`sex` tinyint NOT NULL DEFAULT 0 COMMENT '性别 0=女 1=男',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `idx_userNo`(`user_no`) USING BTREE COMMENT '登录用户名'
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户信息表' ROW_FORMAT = Compact;

View File

@@ -2,27 +2,10 @@ var URL = {
userLogin: '/login',
userLogout: '/logout',
getUserInfo: '/user/getUserInfo',
pageUpdate: '/zyplayer-doc-wiki/page/update',
pageChangeParent: '/zyplayer-doc-wiki/page/changeParent',
pageList: '/zyplayer-doc-wiki/page/list',
updatePage: '/zyplayer-doc-wiki/page/update',
pageDetail: '/zyplayer-doc-wiki/page/detail',
pageDelete: '/zyplayer-doc-wiki/page/delete',
pageNews: '/zyplayer-doc-wiki/page/news',
pageLock: '/zyplayer-doc-wiki/page/lock',
pageUnlock: '/zyplayer-doc-wiki/page/unlock',
spaceList: '/zyplayer-doc-wiki/space/list',
updateSpace: '/zyplayer-doc-wiki/space/update',
getPageUserAuthList: '/zyplayer-doc-wiki/page/auth/list',
assignPageUserAuth: '/zyplayer-doc-wiki/page/auth/assign',
getUserInfoList: '/user/info/list',
updateUserInfo: '/user/info/update',
resetPassword: '/user/info/resetPassword',
updatePageFile: '/zyplayer-doc-wiki/page/file/update',
pageCommentList: '/zyplayer-doc-wiki/page/comment/list',
updatePageComment: '/zyplayer-doc-wiki/page/comment/update',
pageZanList: '/zyplayer-doc-wiki/page/zan/list',
updatePageZan: '/zyplayer-doc-wiki/page/zan/update',
commonUpload: '/zyplayer-doc-wiki/common/upload',
getUserBaseInfo: '/zyplayer-doc-wiki/common/user/base',
systemUpgradeInfo: '/system/info/upgrade',

View File

@@ -5,11 +5,11 @@ var href = window.location.href;
var _fn = {
href: href,
// 本地启动时使用本地接口调试
// HOST: 'http://local.zyplayer.com:8083/zyplayer-doc-manage',
// HOST1: 'http://local.zyplayer.com:8083/zyplayer-doc-manage',
HOST: 'http://local.zyplayer.com:8083/zyplayer-doc-manage',
HOST1: 'http://local.zyplayer.com:8083/zyplayer-doc-manage',
// 也可以直接使用线上的服务调试
HOST: 'http://doc.zyplayer.com/zyplayer-doc-manage',
HOST1: 'http://doc.zyplayer.com/zyplayer-doc-manage',
// HOST: 'http://doc.zyplayer.com/zyplayer-doc-manage',
// HOST1: 'http://doc.zyplayer.com/zyplayer-doc-manage',
// 打包时使用下面这两行,文件就放在根目录下,所以当前路劲就好
// HOST: './',
// HOST1: './',

View File

@@ -24,7 +24,9 @@ export default {
} else if (res.data.errCode == 400) {
global.vue.$message('请先登录');
var href = encodeURIComponent(window.location.href);
global.vue.$router.push({path: '/user/login', query: {redirect: href}});
if (global.vue.$router.currentRoute.path != '/user/login') {
global.vue.$router.push({path: '/user/login', query: {redirect: href}});
}
} else if (res.data.errCode == 402) {
global.vue.$router.push("/common/noAuth");
} else if (res.data.errCode !== 200) {

View File

@@ -1,6 +1,10 @@
<template>
<div>
<div style="border-bottom: 1px solid #fafafa;padding: 10px;margin-bottom: 10px;">用户管理</div>
<div class="user-list-vue">
<el-breadcrumb separator-class="el-icon-arrow-right" style="padding: 20px 10px;">
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
<el-breadcrumb-item>系统管理</el-breadcrumb-item>
<el-breadcrumb-item>用户列表</el-breadcrumb-item>
</el-breadcrumb>
<el-form :inline="true" :model="searchParam" class="search-form-box">
<el-form-item label="搜索类型">
<el-select v-model="searchParam.type" placeholder="请选择">
@@ -15,27 +19,30 @@
<el-input v-model="searchParam.keyword" placeholder="输入关键字"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="">查询</el-button>
<el-button type="primary" @click="getUserList">查询</el-button>
</el-form-item>
</el-form>
<div style="padding: 10px;">
<div style="padding: 10px;" v-loading="searchLoading">
<el-table :data="searchResultList" border style="width: 100%; margin-bottom: 5px;" max-height="500">
<el-table-column prop="id" label="编号" width="60"></el-table-column>
<el-table-column prop="name" label="账号"></el-table-column>
<el-table-column prop="spaceExplain" label="用户名"></el-table-column>
<el-table-column prop="createUserName" label="手机号"></el-table-column>
<el-table-column prop="createUserName" label="性别"></el-table-column>
<el-table-column prop="createTime" label="创建时间"></el-table-column>
<el-table-column prop="userNo" label="账号"></el-table-column>
<el-table-column prop="email" label="邮箱"></el-table-column>
<el-table-column prop="userName" label="用户名"></el-table-column>
<el-table-column prop="phone" label="手机号"></el-table-column>
<el-table-column label="性别">
<template slot-scope="scope">{{scope.row.sex==0?'女':'男'}}</template>
</el-table-column>
<el-table-column prop="creationTime" label="创建时间"></el-table-column>
<el-table-column label="状态">
<template slot-scope="scope">
<el-switch v-model="scope.row.status" active-text="正常" inactive-text="停用">
</el-switch>
<el-switch v-on:change="delFlagChange" v-model="scope.row.delFlag" :active-value="0" active-text="正常" :inactive-value="1" inactive-text="停用"></el-switch>
</template>
</el-table-column>
<el-table-column label="操作">
<el-table-column label="操作" width="240">
<template slot-scope="scope">
<el-button size="small" plain type="primary" v-on:click="editUserInfo(scope.row)">修改</el-button>
<el-button size="small" plain type="warning" v-on:click="resetPassword(scope.row)">重置密码</el-button>
<el-button size="mini" plain type="primary" v-on:click="editUserInfo(scope.row)">修改</el-button>
<el-button size="mini" plain type="warning" v-on:click="resetPassword(scope.row)">重置密码</el-button>
<el-button size="mini" plain type="danger" v-on:click="deleteUser(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
@@ -56,31 +63,31 @@
<el-dialog title="修改用户" :visible.sync="editUserDialogVisible" width="600px">
<el-form ref="form" :model="editUserForm" label-width="80px">
<el-form-item label="账号">
<el-input v-model="editUserForm.name"></el-input>
<el-input v-model="editUserForm.userNo"></el-input>
</el-form-item>
<el-form-item label="用户名">
<el-input v-model="editUserForm.name"></el-input>
<el-input v-model="editUserForm.userName"></el-input>
</el-form-item>
<el-form-item label="手机号">
<el-input v-model="editUserForm.name"></el-input>
<el-input v-model="editUserForm.phone"></el-input>
</el-form-item>
<el-form-item label="邮箱">
<el-input v-model="editUserForm.name"></el-input>
<el-input v-model="editUserForm.email"></el-input>
</el-form-item>
<el-form-item label="性别">
<el-radio-group v-model="editUserForm.resource">
<el-radio label=""></el-radio>
<el-radio label=""></el-radio>
<el-radio-group v-model="editUserForm.sex">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="角色">
<el-select v-model="editUserForm.xx" multiple filterable placeholder="请选择">
<el-select v-model="editUserForm.role" multiple filterable placeholder="请选择">
<el-option v-for="item in roleOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="">确定</el-button>
<el-button>取消</el-button>
<el-button type="primary" @click="updateEditUser">确定</el-button>
<el-button @click="editUserDialogVisible = false">取消</el-button>
</el-form-item>
</el-form>
</el-dialog>
@@ -88,11 +95,13 @@
</template>
<script>
import toast from '../../common/lib/common/toast'
var app;
export default {
data() {
return {
searchLoading: false,
editUserDialogVisible: false,
totalCount: 0,
searchParam: {
@@ -101,9 +110,7 @@
pageSize: 20,
pageNum: 1,
},
searchResultList: [
{name: '张三'}
],
searchResultList: [],
roleOptions: [
{value: '管理员'}
],
@@ -112,25 +119,73 @@
},
mounted: function () {
app = this;
this.getUserList();
},
methods: {
handleSizeChange(val) {
this.searchParam.pageSize = val;
this.getUserList();
},
handleCurrentChange(val) {
this.searchParam.pageNum = val;
this.getUserList();
},
editUserInfo() {
editUserInfo(row) {
this.editUserDialogVisible = true;
this.editUserForm = row;
},
resetPassword() {
resetPassword(row) {
this.$confirm('确定要重置此用户密码吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.editUserForm = row;
this.common.post(this.apilist1.resetPassword, this.editUserForm, function (json) {
app.$confirm("重置成功!新的密码为:" + json.data).then(()=> {
done();
}).catch(()=> {});
});
}).catch(()=>{});
},
delFlagChange(row, xx) {
debugger
// this.editUserForm = row;
},
deleteUser(row) {
this.$confirm('确定要删除此用户吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.editUserForm = row;
this.editUserForm.delFlag = 1;
this.updateEditUser();
}).catch(()=>{});
},
updateEditUser() {
this.common.post(this.apilist1.updateUserInfo, this.editUserForm, function (json) {
toast.success("保存成功!");
app.editUserDialogVisible = false;
app.getUserList();
});
},
getUserList() {
this.searchLoading = true;
this.common.post(this.apilist1.getUserInfoList, this.searchParam, function (json) {
// 让加载动画停留一会
setTimeout(()=>{app.searchLoading = false;}, 500);
app.totalCount = json.total;
app.searchResultList = json.data;
});
},
}
}
</script>
<style>
.search-form-box{padding: 10px;}
.page-info-box{text-align: right;margin: 20px 0 50px 0;}
.user-list-vue .search-form-box{padding: 10px;}
.user-list-vue .page-info-box{text-align: right;margin: 20px 0 50px 0;}
.user-list-vue .el-button+.el-button{margin-left: 5px;}
</style>