2017831日常笔记——后端总结(一)

xiaoxiao2021-02-28  102

8月的最后一天,台风在这一周已经是第三次光临,每次下雨都是那么让人激动又让人愁,我几乎不怎么带伞,带伞的时候几乎都不会下雨...

言归正传,这是我工作的第二个月,在此记录一些可能对自己有用的东西,欢迎大家指正。

这次我想记录的是DTO(数据传输对象),在有时候,对数据库查出的数据不好直接处理的时候,我就选择创建一个近似于那个对象的DTO去接收数据,然后进行一系列的处理。在我涉及到项目中,用到DTO的有两个地方,一个登陆模块,一个修改密码模块。

登陆代码:

@Ignore public class LoginParam { /** * 因为User里面的password不能参与json格式化(向前端传递) * 所以这里专门新建了一个数据传输对象,此对象不参与spring解析 * 所以记得要加上@Ignore注解,而在真正的实体类中的password属性需要加上@JsonIgnore注解 */ //用户登录账号 private String account; //用户登录密码 private String password; public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "LoginParam [account=" + account + ", password=" + password + "]"; } }数据处理代码:

@RequestMapping(value = "/login", method = { RequestMethod.POST }) public ResponseEntity<User> login(@RequestBody LoginParam userLogin) { User user = userRepository.findByAccount(userLogin.getAccount()); if (user != null) { String loginPwd = userLogin.getPassword(); String userPwd = user.getPassword(); if (userPwd.length() == 32) { if (loginPwd.equals(userPwd)) { return new ResponseEntity<User>(user, HttpStatus.OK); } else { return new ResponseEntity<User>(HttpStatus.BAD_REQUEST); } } else { userPwd = MD5Util.string2MD5(userPwd); if (loginPwd.equals(userPwd)) { return new ResponseEntity<User>(user, HttpStatus.OK); } else { // 400 return new ResponseEntity<User>(HttpStatus.BAD_REQUEST); } } } else { // 417 return new ResponseEntity<User>(HttpStatus.EXPECTATION_FAILED); } }这里写的可能不是很完善,因为我找不到适合的错误状态码返回到前端。这里的string2MD5()方法是工具类。代码如下:

public static String string2MD5(String inStr) { MessageDigest md5 = null; try { // 获得MD5摘要算法的 MessageDigest 对象 md5 = MessageDigest.getInstance("MD5"); } catch (Exception e) { System.out.println(e.toString()); e.printStackTrace(); return ""; } byte[] byteArray = inStr.getBytes(); // 获取加密byte数组 byte[] md5Bytes = md5.digest(byteArray); // 把密文转换成十六进制的字符串形式 StringBuffer hexValue = new StringBuffer(); for (int i = 0; i < md5Bytes.length; i++) { // 转成16进制int int val = ((int) md5Bytes[i]) & 0xff; if (val < 16) hexValue.append("0"); hexValue.append(Integer.toHexString(val)); } // return hexValue.toString().substring(8, 24);//16位 return hexValue.toString(); // 32位 }至于修改密码这个模块用法这个大同小异,无非多了一个对表的更新操作,就不贴出来了。

除了用DTO之外,还可以使用@Transient注解,在实体类中添加一个没有具体数据库字段的属性。代码如下:

@Entity @Table(name="OM_GOODSINFO_TB") public class GoodsInfo { /** * 唯一标识,主键 */ @Id @GeneratedValue(generator = "OM_GOODSNFO_TB_SQ", strategy = GenerationType.SEQUENCE) @SequenceGenerator(name = "OM_GOODSNFO_TB_SQ", sequenceName = "OM_GOODSNFO_TB_SQ", allocationSize = 1) @Column(name = "good_id", nullable = false, length = 10) private Integer goodId; /** * 商品名称 */ @Column(name = "good_name", nullable = true, length = 128) private String goodName; /** * 商品价格 */ @Column(name = "good_price", nullable = true, length = 128) private Integer goodPrice; /** * 商品类型 */ @Column(name = "good_type", nullable = true, length = 20) private String goodType; /** * 商品名称 */ @Column(name = "good_image", nullable = true, length = 128) private String goodImage; /** * 商品详情 */ @Column(name = "good_detail", nullable = true, length = 512) private String goodDetail; /** * 快递邮费 */ @Column(name = "courier_fee", nullable = true, length = 512) private Integer courierFee; @Column(name = "create_time", nullable = true, length = 512) private Date createTime; @Column(name = "update_time", nullable = true, length = 512) private Date updateTime; @Transient private double testPrice; @Transient private double testFee; public double getTestPrice() { return testPrice; } public void setTestPrice(double testPrice) { this.testPrice = testPrice; } public double getTestFee() { return testFee; } public void setTestFee(double testFee) { this.testFee = testFee; } public Integer getGoodId(){ return goodId; } public void setGoodId(Integer goodId){ this.goodId = goodId; } public String getGoodName(){ return goodName; } public void setGoodName(String goodName){ this.goodName = goodName; } public Integer getGoodPrice(){ return goodPrice; } public void setGoodPrice(Integer goodPrice){ this.goodPrice = goodPrice; } public String getGoodType(){ return goodType; } public void setGoodType(String goodType){ this.goodType = goodType; } public String getGoodDetail(){ return goodDetail; } public void setGoodDetail(String goodDetail){ this.goodDetail = goodDetail; } public Integer getCourierFee(){ return courierFee; } public void setCourierFee(Integer courierFee){ this.courierFee = courierFee; } public Date getCreateTime(){ return createTime; } public void setCreateTime(Date createTime){ this.createTime = createTime; } public Date getUpdateTime(){ return updateTime; } public void setUpdateTime(Date updateTime){ this.updateTime = updateTime; } public String getGoodImage(){ return goodImage; } public void setGoodImage(String goodImage){ this.goodImage = goodImage; } @Override public String toString() { return "GoodsInfo [goodId=" + goodId + ", goodName=" + goodName + ", goodPrice=" + goodPrice + ", goodType=" + goodType + ", goodImage=" + goodImage + ", goodDetail=" + goodDetail + ", courierFee=" + courierFee + ", createTime=" + createTime + ", updateTime=" + updateTime + "]"; } }这个命名可能不是很规范,不过将就看,哈哈哈~这里还要说一下的是,@Column注解中的length只对字符串生效,所以其他类型写什么都无所谓。在这里使用额外的两个属性是因为在这个项目中,钱的单位是分,所以需要单独处理,而后台最终得到的对象Page<GoodsInfo>操作起来有点难,我就搞了这个两个属性缓冲了一下。关于这个Page对象的处理,后来搞清楚也不是很复杂,用迭代器遍历,然后对得到的对象直接调用set方法,就可以改变之中的值了。

好啦,这次的总结就写到这里。才参加工作,我希望自己能更加踏实一些。

在没有足够的实力之前,收敛好自己脾气,不管怎样。

转载请注明原文地址: https://www.6miu.com/read-45893.html

最新回复(0)