wg-basic-doc/docs/service-expand/user-expand.md
2022-05-25 18:33:19 +08:00

14 KiB

用户拓展

在用户现有字段基础上,自定义 拓展属性字段,新增拓展表,通过 user_id 字段关联用户。

创建实体类

实体类继承自 ink.wgink.pojo.dtos.user.UserDTO


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>

可以直接实现,也可以通过接口继承

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 有返回值时,用户列表中会出现 拓展属性 按钮,用户通过点击按钮打开拓展属性的编辑页面。在编辑页面打开时,在 window.location.href 上会携带 userId 字段。

为了保证唯一,在提交时,需判断用户是否已经有值。如果有值则修改,反之新增。

示例代码中,没有完善的方法可根据情况自行处理。

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;
    }
}

页面

<!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>