1. 效果

截图:(添加一条个人信息时同步创建它的用户信息)

2. 部分代码展示

因为要为个人同步创建,主体在“个人信息”模块,与“用户信息”添加模块无关,只会调用它的部分方法,所以所有代码都在“个人信息”模块进行操作。

2.1 因为操作涉及到两个数据库(expertuser),所以实体表要保存expert的用户id,同时还要在xml中进行链接。

2.1.1 实体层expert.java需要插入:

1
2
3
4
5
6
7
8
9
private User user;                    //专家的用户信息

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}

2.1.2 dao层expertDao.xml的链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<sql id="expertColumns">
..
..
..
a.userId AS "user.id",
..
..
..
</sql>
<sql id="expertJoins">
...
LEFT JOIN sys_user su ON su.id = a.userId
</sql>
<select id="getUser" resultType="User">
SELECT *
FROM sys_user su
WHERE su.login_name = #{string} AND su.del_flag = 0
</select>
<select id="findTheData" resultType="Expert">
SELECT
<include refid="expertColumns"/>
FROM expert a
<include refid="expertJoins"/>
WHERE a.userId = #{user.id}
</select>
后面的insert和update部分参照sql,省略..

2.2.2 controllerexpertController.java协调调用,但主要方法都在service层,所以新增用户的方法写在expertService.java

这是save方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Transactional(readOnly = false)
public void save(Expert expert) {
//新增专家时插入“已分配论文数”为0
if(expert.getDistributeNum() == null || expert.getDistributeNum() < 0 ) {
expert.setDistributeNum(0);
}
User expertUser = new User();
if(expert.getUser() == null){ //用户信息为空,
expertUser = addUser(expert); //新增一条专家的用户信息并返回这条信息
expert.setUser(expertUser); //将这条信息插入专家信息中
}else{
expertUser = this.updateExpertUser(expert); //更新用户信息并返回
expert.setUser(expertUser); //保存更新后的用户信息
}
encryption(expert);
super.save(expert); //保存**专家表**中的专家信息
}

这是addUser方法,这里默认使用手机号作为登录名,手机号后六位作为登录密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//新生成一条专家数据时自动生成一个用户
@Transactional(readOnly = false)
public User addUser(Expert expert) {
User user = new User();
user.setId(IdGen.uuid());
Office company = new Office();
Office office = new Office();
//根据专家类型分配用户归属(校内1和校外5)
if(expert.getExpertType().equals("0")) {
company.setId("1");
office.setId("2");
}else {
company.setId("5");
office.setId("6");
}
//根据用户类型获取一整条数据
company = officeService.findTheData(company);
office = officeService.findTheData(office);
user.setCompany(company);
user.setOffice(office);

//新用户默认用手机号作为登录名
user.setLoginName(expert.getPhone());
//用手机号后6位作为登录密码
user.setPassword(this.getUserPassword(expert.getPhone()));
user.setNo(expert.getId());
user.setName(expert.getExpertName());
user.setEmail(expert.getEmail());
user.setPhone(expert.getPhone());
user.setUserType("2");
user.setUpdateDate(new Date());
user.setCreateDate(user.getUpdateDate());
user.setCreateBy(UserUtils.getUser());
user.setUpdateBy(UserUtils.getUser());

userDao.insert(user);
//角色数据有效性验证,过滤不在授权内的角色
List<Role> roleList = Lists.newArrayList();
Role r = new Role();
r.setId(Expert_Role);
roleList.add(r);
user.setRoleList(roleList);

systemService.saveUser(user);
return user;
}

private String getUserPassword(String phone_num){
if(phone_num != null && phone_num.length() > 6) {
return SystemService.entryptPassword(phone_num.substring(phone_num.length()-6));
}else{
return SystemService.entryptPassword("123456");
}
}

这是updateExpertUser方法,用于更新用户信息

1
2
3
4
5
6
7
8
9
10
11
//更新**用户表**中的专家用户信息,返回更新后的用户信息
@Transactional(readOnly = false)
public User updateExpertUser(Expert expert) {
User expertUser = systemService.getUser(expert.getUser().getId()); //获取**用户表**中该专家的用户数据
expertUser.setName(expert.getExpertName());
expertUser.setLoginName(expert.getPhone()); //更新登录名
expertUser.setPhone(expert.getPhone()); //更新手机号
expertUser.setEmail(expert.getEmail()); //更新邮箱
systemService.saveUser(expertUser); //更新**用户表**中的用户信息
return expertUser;
}

同时,还要注意,在删除该个人信息时还要同步删除他的用户信息

1
2
3
4
5
6
7
8
9
10
11
@Transactional(readOnly = false)
public void delete(Expert expert) {
super.delete(expert);
this.deleteUser(expert);
}

//删除一条专家数据时同步删除该用户数据
public void deleteUser(Expert expert) {
User user = expert.getUser();
systemService.deleteUser(user);
}

到此,同步新增用户基本结束了,但如果使用该用户登录时,还要注意个人信息与用户信息的同步

3、个人登录时对个人信息的修改

3.1首先,使用个人用户信息登录时的首页,要在菜单项中设置好链接和角色权限

3.2 controller层调转到jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@RequiresPermissions("jwcmis:expert:view")
@RequestMapping(value = "expertLogin")
public String expertLogin(Expert expert, Model model) { //专家通过账号信息登录
expert.setUser(UserUtils.getUser()); //把当前登录的用户信息放入登录的专家个人信息中
expert = expertService.findTheData(expert); //通过用户信息找到该专家的所有个人信息,但此时用户信息中被覆盖只有用户id
expert.setUser(UserUtils.getUser()); //重新插入登录的用户信息
expert = expertService.decryption(expert); //对个人信息解密
model.addAttribute("expert", expert);
return "imd/jwcmis/expertUpdate";
}

//登录用户信息更新
@RequiresPermissions("jwcmis:expert:edit")
@RequestMapping(value = "updateToSave")
public String updateToSave(Expert expert, String oldPhone, Model model, RedirectAttributes redirectAttributes) {
if (!beanValidator(model, expert)){
return form(expert, model);
}
expertService.save(expert);
expertService.decryption(expert);
if(!expert.getPhone().equals(oldPhone)) { //由于手机号作为登录名,当手机号改变时,保存后需要重新登录
UserUtils.getSubject().logout();
return "redirect:" + adminPath + "/login";
}else {
addMessage(redirectAttributes, "已成功保存您的个人信息!");
return "redirect:"+Global.getAdminPath()+"/jwcmis/expert/expertLogin";
}
}

3.3 jsp层展示个人信息(这个文件需要自己在from文件相同位置处新增,可以复制form的部分代码)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
<html>
<head>
<title>专家信息管理</title>
<meta name="decorator" content="default" charset="UTF-8" />
<script type="text/javascript">
var emailOld = "";
var phoneOld = "";
var bankCardNumberOld = "";
$(document).ready(function() {
$("#inputForm").validate({
submitHandler: function (form){
if(checkEmail()){
if(checkPhone()) {
if(checkBankCardNumber()){
loading('正在提交,请稍等...');
form.submit();
}else {
alert("银行卡号验证未通过! ");
return false;
}
}else {
alert("手机号码验证未通过! ");
return false;
}
}else{
alert("邮箱验证未通过! ");
return false;
}
},
errorContainer: "#messageBox",
errorPlacement: function(error, element) {
$("#messageBox").text("输入有误,请先更正。");
if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
error.appendTo(element.parent().parent());
} else {
error.insertAfter(element);
}
}
});
//已分配论文数填充
var distributeNum = $("#distributeNum").val();
if(distributeNum == null || distributeNum == ""){
$("#distributeNum").val(0);
}
//获取原有的用户名、邮箱、手机号、银行卡号
emailOld = $("#email").val();
phoneOld = $("#phone").val();
bankCardNumberOld = $("#bankCardNumber").val();
});

/*这一部分是邮箱、手机号、银行卡号的验证,可以参照我的其他笔记*/
</script>
</head>
<body>

<ul class="nav nav-tabs">
<li><a href="${ctx}/jwcmis/expert/expertLogin">基本信息修改</a></li>
</ul><br/>
<form:form id="inputForm" modelAttribute="expert" action="${ctx}/jwcmis/expert/updateToSave?oldPhone=${expert.phone}" method="post" class="form-horizontal">
<form:hidden path="id" />
<sys:message content="${message}" />
<div class="control-group">
<label class="control-label">专家姓名:</label>
<div class="controls">
<span class="help-inline"><font color="black" size="4" >${expert.expertName}</font></span>
</div>
</div>
<div class="control-group">
<label class="control-label">专业:</label>
<div class="controls">
<form:input path="major" htmlEscape="false" maxlength="64" class="input-xlarge required" />
<span class="help-inline"><font color="red">*</font> </span>
</div>
</div>
<div class="control-group">
<label class="control-label">研究方向:</label>
<div class="controls">
<form:input path="researchName" htmlEscape="false" maxlength="64" class="input-xlarge required" />
<span class="help-inline"><font color="red">*</font> </span>
</div>
</div>
<div class="control-group">
<label class="control-label">专家类型:</label>
<div class="controls">
<form:radiobuttons path="expertType" id="expertType" items="${fns:getDictList('expertType')}" itemLabel="label" itemValue="value" htmlEscape="false" class="required" />
<span class="help-inline"><font color="red">*</font> </span>
</div>
</div>
<div class="control-group">
<label class="control-label">已分配论文数:</label>
<div class="controls">
<span class="help-inline"><font color="black">${expert.distributeNum}</font> </span>
</div>
</div>
<div class="control-group">
<label class="control-label">邮箱:</label>
<div class="controls">
<form:input path="email" id="email" value="" oninput="checkEmail()" htmlEscape="false" maxlength="64" class="input-xlarge required" />
<span class="help-inline" id="email_notice"><font color="red">*</font> </span>
</div>
</div>
<div class="control-group">
<label class="control-label">手机号:</label>
<div class="controls">
<form:input path="phone" id="phone" value="" oninput="checkPhone()" htmlEscape="false" maxlength="11" class="input-xlarge required" />
<span class="help-inline" id="phone_notice"><font color="red">*</font> </span>
</div>
</div>
<div class="control-group">
<label class="control-label">银行卡号:</label>
<div class="controls">
<form:input path="bankCardNumber" id="bankCardNumber" oninput="checkBankCardNumber()" htmlEscape="false" maxlength="64" class="input-xlarge required" />
<span class="help-inline" id="bankCardNumber_notice"><font color="red">*</font> </span>
</div>
</div>
<div class="control-group">
<label class="control-label">单位:</label>
<div class="controls">
<form:input path="place" htmlEscape="false" maxlength="64" class="input-xlarge required" />
<span class="help-inline"><font color="red">*</font> </span>
</div>
</div>
<div class="control-group">
<label class="control-label">备注信息:</label>
<div class="controls">
<form:textarea path="remarks" htmlEscape="false" rows="4" maxlength="255" class="input-xxlarge " />
</div>
</div>
<div class="form-actions">
<shiro:hasPermission name="jwcmis:expert:edit">
<input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存" />&nbsp;
</shiro:hasPermission>
</div>
</form:form>
</body>
</html>

3.4 service层用户信息调用

1
2
3
4
5
//根据登录名返回用户数据 
@Transactional(readOnly = false)
public Expert findTheData(Expert expert) {
return expertDao.findTheData(expert);
}

3.5 xml中的sql语言上面已经列出

该功能的代码差不多就是这样了,有错误红叉的地方可以根据错误提示修改

/ *小白一个,仅留做自我学习记忆,时常修改,有不对不全之处还望不吝赐教!* /