仰望星空——冲刺日志Day2
Part1 各个成员今日完成的任务
- 20211302:搭建项目基础结构,创建客户端和服务器的框架。
- 20211304:设计数据库模型,包括用户管理功能的数据库表结构。
- 20211308:实现用户注册和登录功能,包括身份认证。
- 20211317:开始实现安全防护功能的框架,包括访问控制和日志记录。
- 20211318:研究国密算法SM2、SM3、SM4,并开始集成它们到项目中。
登录和注册代码
package cn.edu.nuc.article.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import cn.edu.nuc.article.entity.User;
/**
* 用户Mapper
* @author 仰望星空
*
*/
public interface UserMapper {
/**
* 检查用户名是否重复
* @param userid 用户id
* @param loginname 登录名
* @return
*/
List<User> loginnameValidate(@Param("userid") Integer userid,
@Param("loginname") String loginname);
/**
* 登录检查
* @param loginname 登录名
* @param password 密码
* @return 符合用户名密码组合的用户记录
*/
User loginValidate(@Param("loginname") String loginname,
@Param("password") String password);
/**
* 按条件模糊查询
* @param user
* @return
*/
List<User> selectByKeyWord(User user);
/**
* 按主键更新
* @param userid
* @return
*/
User selectByPrimaryKey(Integer userid);
/**
* 动态插入记录
* @param record
* @return
*/
int insertSelective(User record);
/**
* 动态更新记录
* @param record
* @return 受影响行数
*/
int updateByPrimaryKeySelective(User record);
}
密码校验代码
package cn.edu.nuc.article.entity;
import java.io.Serializable;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import cn.edu.nuc.article.validategroup.UserValidateGroupForInsert;
import cn.edu.nuc.article.validategroup.UserValidateGroupForPasswordModify;
import cn.edu.nuc.article.validategroup.UserValidateGroupForUpdate;
import cn.edu.nuc.article.validategroup.UserValidateGroupForUserModify;
/**
* 用户实体类
* @author 仰望星空
*
*/
public class User implements Serializable{
/**
* 序列化id
*/
private static final long serialVersionUID = 1L;
/**
* 用户id(主键)
*/
private Integer userid;
/**
* 登录名
*/
@NotNull(message="登录名不可以为空!", groups={UserValidateGroupForInsert.class})
@NotBlank(message="登录名不可以填写空格!", groups={UserValidateGroupForInsert.class})
@Length(min = 4, max = 30, message="登录名输入长度不合法!",
groups={UserValidateGroupForInsert.class})
@Pattern(message="登录名登录名只能由字母和数字组成!",regexp="[A-Za-z0-9]+",
groups={UserValidateGroupForInsert.class})
private String loginname;
/**
* 密码
*/
@NotNull(message="密码不可以为空!",
//校验组指定校验规则什么时候生效
groups={UserValidateGroupForInsert.class,
UserValidateGroupForPasswordModify.class})
@NotBlank(message="密码不可以填写空格!",
//校验组指定校验规则什么时候生效
groups={UserValidateGroupForInsert.class,
UserValidateGroupForPasswordModify.class})
@Length(max = 30, message="密码输入长度不合法!",
//校验组指定校验规则什么时候生效
groups={UserValidateGroupForInsert.class,
UserValidateGroupForPasswordModify.class})
private String password;
/**
* 旧密码(数据库没有对应列)
*/
@NotNull(message="旧密码不可以为空!",
//校验组指定校验规则什么时候生效
groups={UserValidateGroupForPasswordModify.class})
@NotBlank(message="旧密码不可以填写空格!",
//校验组指定校验规则什么时候生效
groups={UserValidateGroupForPasswordModify.class})
@Length(max = 30, message="旧密码输入长度不合法!",
//校验组指定校验规则什么时候生效
groups={UserValidateGroupForPasswordModify.class})
private String oldPassword;
/**
* 用户真实姓名
*/
@NotNull(message="用户真实姓名不可以为空!",
groups={UserValidateGroupForInsert.class})
@NotBlank(message="用户真实姓名不可以填写空格!",
groups={UserValidateGroupForInsert.class})
@Length(min = 2, max = 20, message="用户真实姓名输入长度不合法!",
groups={UserValidateGroupForInsert.class})
@Pattern(regexp="[\\u4E00-\\u9FA5\\uF900-\\uFA2D]+",
message="用户真实姓名只能输入中文汉字!",
groups={UserValidateGroupForInsert.class})
private String usertruename;
/**
* 职称
*/
@NotNull(message="职称不可以为空!")
@NotBlank(message="职称不可以填写空格!")
@Pattern(regexp="[\\u4E00-\\u9FA5\\uF900-\\uFA2D]+",
message="职称只能输入中文汉字!",
groups={UserValidateGroupForInsert.class,
UserValidateGroupForUpdate.class,
UserValidateGroupForUserModify.class})
private String job;
/**
* 手机号
*/
@NotBlank(message="手机号不可以填写空格!",
groups={UserValidateGroupForInsert.class,
UserValidateGroupForUpdate.class,
UserValidateGroupForUserModify.class})
@Pattern(regexp="1[3|5|7|8]\\d{9}", message="手机号格式不正确!",
groups={UserValidateGroupForInsert.class,
UserValidateGroupForUpdate.class,
UserValidateGroupForUserModify.class})
private String phone;
/**
* 邮箱
*/
@Email(message="您输入的邮箱格式不合法!",
groups={UserValidateGroupForInsert.class,
UserValidateGroupForUpdate.class,
UserValidateGroupForUserModify.class})
@NotBlank(message="邮箱不可以填写空格!",
groups={UserValidateGroupForInsert.class,
UserValidateGroupForUpdate.class,
UserValidateGroupForUserModify.class})
private String email;
/**
* 所属机构(外键)
*/
private Integer instId;
/**
* 所属机构信息
*/
private Institution institution;
/**
* 角色id(外键)
*/
private Integer roleId;
/**
* 用户角色
*/
private Role role;
/**
* 用户状态(1正常,0禁用)
*/
private Integer userstate;
public Integer getUserid() {
return userid;
}
public void setUserid(Integer userid) {
this.userid = userid;
}
public String getLoginname() {
return loginname;
}
public void setLoginname(String loginname) {
this.loginname = loginname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getOldPassword() {
return oldPassword;
}
public void setOldPassword(String oldPassword) {
this.oldPassword = oldPassword;
}
public String getUsertruename() {
return usertruename;
}
public void setUsertruename(String usertruename) {
this.usertruename = usertruename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getInstId() {
return instId;
}
public void setInstId(Integer instId) {
this.instId = instId;
}
public Institution getInstitution() {
return institution;
}
public void setInstitution(Institution institution) {
this.institution = institution;
}
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
public Integer getUserstate() {
return userstate;
}
public void setUserstate(Integer userstate) {
this.userstate = userstate;
}
@Override
public String toString() {
return "User [userid=" + userid + ", loginname=" + loginname + ", password=" + password + ", oldPassword="
+ oldPassword + ", usertruename=" + usertruename + ", job=" + job + ", phone=" + phone + ", email="
+ email + ", instId=" + instId + ", institution=" + institution + ", roleId=" + roleId + ", role="
+ role + ", userstate=" + userstate + "]";
}
/**
* 用用户id作为唯一标识
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((userid == null) ? 0 : userid.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (userid == null) {
if (other.userid != null)
return false;
} else if (!userid.equals(other.userid))
return false;
return true;
}
}
对应登录界面设计
Part2 各个成员遇到的问题
- 搭建项目基础结构、创建框架(20211302): 在搭建项目基础结构时,需要选择适合项目需求的技术栈,包括编程语言、框架、数据库等,并选择相关的平台。因此我们进行了技术选型评估,考虑团队成员的技能、项目的规模和要求,以及社区支持等因素。进行原型开发和小规模试验来评估不同技术的适用性。
- 设计数据库模型(20211304): 设计数据库模型时,需要考虑数据库的性能和随着数据量增长的扩展性。进行数据库规模估算,选择合适的数据库引擎,并优化数据库查询语句。可以考虑使用数据库索引、分表分库等技术来提高性能和扩展性。
- 实现用户注册和登录功能(20211308): 用户注册和登录涉及到用户身份信息,需要考虑安全性,防止恶意攻击,如 SQL 注入、XSS、CSRF 等。使用安全的密码存储方式,如哈希加盐;采用 HTTPS 协议传输用户敏感信息;进行输入验证和过滤,防止注入攻击;使用 CSRF Token 防止 CSRF 攻击。
- 实现安全防护功能的框架(20211317):访问控制和日志记录难以集成: 实现访问控制和日志记录功能可能需要对整个系统进行修改和添加代码。使用现有的安全框架或库,如 Spring Security、Django Security 等,以简化访问控制的实现。合理地设计系统架构,将安全功能集成到模块中,确保易于维护和扩展。定期审查和更新安全策略。
- 研究国密算法并集成到项目中(20211318):算法集成和性能影响: 国密算法的集成可能对系统性能产生影响,需要在安全性和性能之间取得平衡。在集成国密算法前,进行性能测试和评估。选择适当的国密算法和参数,根据实际需求进行优化。考虑使用硬件加速或优化算法实现以提高性能。
Part3 明日各个成员的任务安排
- 20211302:继续搭建项目结构,准备开始客户端和服务器的开发。
- 20211304:继续设计数据库模型,准备创建数据库表。
- 20211308:继续开发用户管理功能,实现用户注册和登录的逻辑。
- 20211317:继续完善安全防护功能,开始编写访问控制和日志记录的代码。
- 20211318:继续集成国密算法,完成其集成并进行初步测试。
Part4 各个成员今日对项目的贡献量
Part5 燃尽图与站立式会议照片