2017/8/31日常笔记——后端总结(一)

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方法,就可以改变之中的值了。



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

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值