441 lines
14 KiB
Markdown
441 lines
14 KiB
Markdown
|
# 用户拓展
|
||
|
|
||
|
在用户现有字段基础上,自定义 **拓展属性字段**,新增拓展表,通过 **user_id** 字段关联用户。
|
||
|
|
||
|
## 创建实体类
|
||
|
|
||
|
实体类继承自 `ink.wgink.pojo.dtos.user.UserDTO`
|
||
|
|
||
|
```java
|
||
|
|
||
|
import ink.wgink.pojo.dtos.user.UserDTO;
|
||
|
import io.swagger.annotations.ApiModel;
|
||
|
import io.swagger.annotations.ApiModelProperty;
|
||
|
|
||
|
public class UserExpandDTO extends UserDTO {
|
||
|
|
||
|
private String userExpandId;
|
||
|
private String title;
|
||
|
private String company;
|
||
|
private String summary;
|
||
|
|
||
|
public UserExpandDTO() {
|
||
|
|
||
|
}
|
||
|
|
||
|
public UserExpandDTO(UserDTO userDTO) {
|
||
|
setUserDTO(userDTO);
|
||
|
}
|
||
|
|
||
|
public void setUserDTO(UserDTO userDTO) {
|
||
|
super.setUserId(userDTO.getUserId());
|
||
|
super.setUserUsername(userDTO.getUserUsername());
|
||
|
super.setUserName(userDTO.getUserName());
|
||
|
super.setUserAvatar(userDTO.getUserAvatar());
|
||
|
super.setUserEmail(userDTO.getUserEmail());
|
||
|
super.setUserLatitude(userDTO.getUserLatitude());
|
||
|
super.setUserExpiredDate(userDTO.getUserExpiredDate());
|
||
|
super.setUserLongitude(userDTO.getUserLongitude());
|
||
|
super.setUserPhone(userDTO.getUserPhone());
|
||
|
super.setUserState(userDTO.getUserState());
|
||
|
super.setUserType(userDTO.getUserType());
|
||
|
super.setUserUKey(userDTO.getUserUKey());
|
||
|
super.setDepartmentIds(userDTO.getDepartmentIds());
|
||
|
super.setDepartmentNames(userDTO.getDepartmentNames());
|
||
|
super.setPositionIds(userDTO.getPositionIds());
|
||
|
super.setPositionNames(userDTO.getPositionNames());
|
||
|
super.setRoleIds(userDTO.getRoleIds());
|
||
|
super.setRoleNames(userDTO.getRoleNames());
|
||
|
super.setGmtCreate(userDTO.getGmtCreate());
|
||
|
super.setLastLoginAddress(userDTO.getLastLoginAddress());
|
||
|
super.setLastLoginTime(userDTO.getLastLoginTime());
|
||
|
super.setLoginType(userDTO.getLoginType());
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## 新建接口
|
||
|
|
||
|
实现或继承接口 `ink.wgink.interfaces.user.IUserExpandBaseService<UserExpandDTO extends UserDTO>`
|
||
|
|
||
|
可以直接实现,也可以通过接口继承
|
||
|
|
||
|
```java
|
||
|
import ink.wgink.interfaces.user.IUserExpandBaseService;
|
||
|
|
||
|
import java.util.List;
|
||
|
import java.util.Map;
|
||
|
|
||
|
public interface IUserExpandService extends IUserExpandBaseService<UserExpandDTO> {
|
||
|
|
||
|
/**
|
||
|
* 修改
|
||
|
*
|
||
|
* @param userId 用户ID
|
||
|
* @param userExpandVO 拓展属性
|
||
|
*/
|
||
|
void update(String userId, UserExpandVO userExpandVO);
|
||
|
|
||
|
/**
|
||
|
* 修改
|
||
|
*
|
||
|
* @param token
|
||
|
* @param userExpandVO
|
||
|
* @throws Exception
|
||
|
*/
|
||
|
void updateByToken(String token, UserExpandVO userExpandVO) throws Exception;
|
||
|
|
||
|
/**
|
||
|
* 用户拓展详情
|
||
|
*
|
||
|
* @param params
|
||
|
* @return
|
||
|
*/
|
||
|
UserExpandPO getPO(Map<String, Object> params);
|
||
|
|
||
|
/**
|
||
|
* 用户拓展详情
|
||
|
*
|
||
|
* @param userId
|
||
|
* @return
|
||
|
*/
|
||
|
UserExpandPO getPO(String userId);
|
||
|
|
||
|
/**
|
||
|
* 用户拓展列表
|
||
|
*
|
||
|
* @param params
|
||
|
* @return
|
||
|
*/
|
||
|
List<UserExpandPO> listPO(Map<String, Object> params);
|
||
|
|
||
|
/**
|
||
|
* 详情
|
||
|
*
|
||
|
* @param token
|
||
|
* @return
|
||
|
*/
|
||
|
UserExpandDTO getByToken(String token) throws Exception;
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## 实现接口
|
||
|
|
||
|
当方法 `getRoute` 有返回值时,用户列表中会出现 <kbd>拓展属性</kbd> 按钮,用户通过点击按钮打开拓展属性的编辑页面。在编辑页面打开时,在 `window.location.href` 上会携带 `userId` 字段。
|
||
|
|
||
|
为了保证唯一,在提交时,需判断用户是否已经有值。如果有值则修改,反之新增。
|
||
|
|
||
|
示例代码中,没有完善的方法可根据情况自行处理。
|
||
|
|
||
|
```java
|
||
|
import ink.wgink.interfaces.user.IUserBaseService;
|
||
|
import ink.wgink.pojo.ListPage;
|
||
|
import ink.wgink.pojo.dtos.user.UserDTO;
|
||
|
import ink.wgink.pojo.result.SuccessResultList;
|
||
|
import ink.wgink.util.map.HashMapUtil;
|
||
|
import org.apache.commons.lang3.StringUtils;
|
||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||
|
import org.springframework.stereotype.Service;
|
||
|
|
||
|
import java.util.List;
|
||
|
import java.util.Map;
|
||
|
|
||
|
@Service
|
||
|
public class UserExpandServiceImpl implements IUserExpandService {
|
||
|
|
||
|
@Autowired
|
||
|
private IUserExpandDao userExpandDao;
|
||
|
@Autowired
|
||
|
private IUserBaseService userBaseService;
|
||
|
|
||
|
@Override
|
||
|
public void update(String userId, UserExpandVO userExpandVO) {
|
||
|
UserExpandPO userExpandPO = getPO(userId);
|
||
|
if (userExpandPO != null) {
|
||
|
updateInfo(null, userId, userExpandVO);
|
||
|
} else {
|
||
|
saveInfo(null, userId, userExpandVO);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void updateByToken(String token, UserExpandVO userExpandVO) throws Exception {
|
||
|
String userId = securityComponent.getAppTokenUser(token).getId();
|
||
|
UserExpandPO userExpandPO = getPO(userId);
|
||
|
if (userExpandPO != null) {
|
||
|
updateInfo(token, userId, userExpandVO);
|
||
|
} else {
|
||
|
saveInfo(token, userId, userExpandVO);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 保存
|
||
|
*
|
||
|
* @param token
|
||
|
* @param userId
|
||
|
* @param userExpandVO
|
||
|
*/
|
||
|
private void saveInfo(String token, String userId, UserExpandVO userExpandVO) {
|
||
|
Map<String, Object> params = HashMapUtil.beanToMap(userExpandVO);
|
||
|
params.put("userId", userId);
|
||
|
if (StringUtils.isNotBlank(token)) {
|
||
|
setAppSaveInfo(token, params);
|
||
|
} else {
|
||
|
setSaveInfo(params);
|
||
|
}
|
||
|
userExpandDao.save(params);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 修改
|
||
|
*
|
||
|
* @param token
|
||
|
* @param userId
|
||
|
* @param userExpandVO
|
||
|
*/
|
||
|
private void updateInfo(String token, String userId, UserExpandVO userExpandVO) {
|
||
|
Map<String, Object> params = HashMapUtil.beanToMap(userExpandVO);
|
||
|
params.put("userId", userId);
|
||
|
if (StringUtils.isNotBlank(token)) {
|
||
|
setAppUpdateInfo(token, params);
|
||
|
} else {
|
||
|
setUpdateInfo(params);
|
||
|
}
|
||
|
userExpandDao.update(params);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public UserExpandPO getPO(Map<String, Object> params) {
|
||
|
return userExpandDao.getPO(params);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public UserExpandPO getPO(String userId) {
|
||
|
Map<String, Object> params = getHashMap(2);
|
||
|
params.put("userId", userId);
|
||
|
return getPO(params);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public List<UserExpandPO> listPO(Map<String, Object> params) {
|
||
|
return userExpandDao.listPO(params);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public UserExpandDTO getByToken(String token) throws Exception {
|
||
|
String userId = securityComponent.getAppTokenUser(token).getId();
|
||
|
return get(userId);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public String getRoute() {
|
||
|
// 编辑页面的路径,只有详情页
|
||
|
return "route/userexpand/get.html";
|
||
|
}
|
||
|
|
||
|
private UserExpandDTO getDTO(Map<String, Object> params) {
|
||
|
return userExpandDao.get(params);
|
||
|
}
|
||
|
|
||
|
private UserExpandDTO getDTO(String userId) {
|
||
|
Map<String, Object> params = getHashMap(2);
|
||
|
params.put("userId", userId);
|
||
|
return getDTO(params);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public UserExpandDTO get(String userId) {
|
||
|
UserDTO userDTO = userBaseService.get(userId);
|
||
|
if (userDTO == null) {
|
||
|
return null;
|
||
|
}
|
||
|
UserExpandDTO userExpandDTO = getDTO(userId);
|
||
|
if (userExpandDTO == null) {
|
||
|
return new UserExpandDTO(userDTO);
|
||
|
}
|
||
|
userExpandDTO.setUserDTO(userDTO);
|
||
|
return userExpandDTO;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public UserExpandDTO getByUsername(String username) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public List<UserExpandDTO> listByUserIds(List<String> userIds) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public List<UserExpandDTO> listByUsernames(List<String> usernames) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public List<UserExpandDTO> list(Map<String, Object> params) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public SuccessResultList<List<UserExpandDTO>> listPage(ListPage page) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public SuccessResultList<List<UserExpandDTO>> listPageByIds(List<String> userIds, ListPage page) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public SuccessResultList<List<UserExpandDTO>> listPageByExcludeIds(List<String> excludeUserIds, ListPage page) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public int countDateRange(String startDate, String endDate) {
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public int count() {
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public List<UserExpandDTO> listByKeywords(String keywords) {
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
```
|
||
|
|
||
|
## 页面
|
||
|
|
||
|
```html
|
||
|
<!doctype html>
|
||
|
<html lang="en">
|
||
|
<head>
|
||
|
<meta charset="utf-8">
|
||
|
<meta name="renderer" content="webkit">
|
||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
|
||
|
<link rel="stylesheet" href="assets/fonts/font-awesome/css/font-awesome.css"/>
|
||
|
<link rel="stylesheet" href="assets/layuiadmin/layui/css/layui.css" media="all">
|
||
|
<link rel="stylesheet" href="assets/layuiadmin/style/admin.css" media="all">
|
||
|
</head>
|
||
|
<body>
|
||
|
<div class="layui-anim layui-anim-fadein">
|
||
|
<div class="layui-card">
|
||
|
<div class="layui-card-body" style="padding: 15px;">
|
||
|
<form class="layui-form layui-form-pane" lay-filter="dataForm">
|
||
|
<div class="layui-row">
|
||
|
<div class="layui-form-item">
|
||
|
<label class="layui-form-label">职称</label>
|
||
|
<div class="layui-input-block">
|
||
|
<input type="text" name="title" lay-verify="required" placeholder="请输入职称" class="layui-input">
|
||
|
</div>
|
||
|
</div>
|
||
|
<div class="layui-form-item">
|
||
|
<label class="layui-form-label">单位</label>
|
||
|
<div class="layui-input-block">
|
||
|
<input type="text" name="company" lay-verify="required" placeholder="请输入单位" class="layui-input">
|
||
|
</div>
|
||
|
</div>
|
||
|
<div class="layui-form-item layui-form-text">
|
||
|
<label class="layui-form-label">简介</label>
|
||
|
<div class="layui-input-block">
|
||
|
<textarea name="summary" placeholder="请输入简介" class="layui-textarea"></textarea>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
<div class="layui-form-item layui-layout-admin">
|
||
|
<div class="layui-input-block">
|
||
|
<div class="layui-footer" style="left: 0;">
|
||
|
<button type="button" class="layui-btn" lay-submit lay-filter="submitForm">提交编辑</button>
|
||
|
<button type="button" class="layui-btn layui-btn-primary close">返回上级</button>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</form>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
<script src="assets/layuiadmin/layui/layui.js"></script>
|
||
|
<script>
|
||
|
layui.config({
|
||
|
base: 'assets/layuiadmin/' //静态资源所在路径
|
||
|
}).extend({
|
||
|
index: 'lib/index' //主入口模块
|
||
|
}).use(['index', 'form', 'laydate'], function(){
|
||
|
var $ = layui.$;
|
||
|
var laydate = layui.laydate;
|
||
|
var form = layui.form;
|
||
|
var userId = top.restAjax.params(window.location.href).userId;
|
||
|
|
||
|
function closeBox() {
|
||
|
parent.layer.close(parent.layer.getFrameIndex(window.name));
|
||
|
}
|
||
|
|
||
|
function initDate() {}
|
||
|
initDate();
|
||
|
|
||
|
// 初始化
|
||
|
function initData() {
|
||
|
var self = this;
|
||
|
var loadLayerIndex;
|
||
|
top.restAjax.get(top.restAjax.path('api/user-expand/get/{userId}', [userId]), {}, null, function(code, data) {
|
||
|
form.val('dataForm', {
|
||
|
title: data.title,
|
||
|
company: data.company,
|
||
|
summary: data.summary
|
||
|
});
|
||
|
form.render(null, 'dataForm');
|
||
|
}, function(code, data) {
|
||
|
top.dialog.msg(data.msg);
|
||
|
}, function() {
|
||
|
loadLayerIndex = top.dialog.msg(top.dataMessage.loading, {icon: 16, time: 0, shade: 0.3});
|
||
|
}, function() {
|
||
|
top.dialog.close(loadLayerIndex);
|
||
|
});
|
||
|
}
|
||
|
initData();
|
||
|
|
||
|
// 提交表单
|
||
|
form.on('submit(submitForm)', function(formData) {
|
||
|
top.dialog.confirm(top.dataMessage.commit, function(index) {
|
||
|
top.dialog.close(index);
|
||
|
var loadLayerIndex;
|
||
|
top.restAjax.put(top.restAjax.path('api/user-expand/update/{userId}', [userId]), formData.field, null, function(code, data) {
|
||
|
var layerIndex = top.dialog.msg(top.dataMessage.commitSuccess, {
|
||
|
time: 0,
|
||
|
btn: [top.dataMessage.button.yes, top.dataMessage.button.no],
|
||
|
shade: 0.3,
|
||
|
yes: function(index) {
|
||
|
top.dialog.close(index);
|
||
|
window.location.reload();
|
||
|
},
|
||
|
btn2: function() {
|
||
|
closeBox();
|
||
|
}
|
||
|
});
|
||
|
}, function(code, data) {
|
||
|
top.dialog.msg(data.msg);
|
||
|
}, function() {
|
||
|
loadLayerIndex = top.dialog.msg(top.dataMessage.committing, {icon: 16, time: 0, shade: 0.3});
|
||
|
}, function() {
|
||
|
top.dialog.close(loadLayerIndex);
|
||
|
});
|
||
|
});
|
||
|
return false;
|
||
|
});
|
||
|
|
||
|
$('.close').on('click', function() {
|
||
|
closeBox();
|
||
|
});
|
||
|
});
|
||
|
</script>
|
||
|
</body>
|
||
|
</html>
|
||
|
```
|