用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字

小蜜锋    -  云代码空间

—— 技术宅拯救世界!

广东海洋大学体育馆管理系统 开发日记(12)——服务层(Service)

2013-01-31|3094阅||

摘要:服务层(Service)主要处理业务逻辑,服务层前面被控制层调用,后面调用数据库访问层,是系统的核心部分。

        同控制层一样,因为本项目有用户前台和管理员后台,所以服务层组件分别放在两个包里,方便管理。用户前台对应com.gym.user.service,管理员对应com.gym.admin.service。
        服务层全部采用实现接口的方式,实现类在对应包下的impl包中。下面以用户个人中心服务层作为例子:

UserService.java
package com.gym.user.service;

import java.util.List;

import com.gym.model.UserModel;

public interface UserService {
	/**
	 * 根据用户id查询用户信息
	 * 
	 * @return
	 */
	public UserModel queryUserInfoById(String uId);

	/**
	 * 根据用户名查询用户信息
	 * 
	 * @return
	 */
	public UserModel queryUserInfoByName(String uName);

	/**
	 * 修改用户信息
	 * 
	 * @param userModel
	 * @return
	 */
	public int alterUserInfo(UserModel userModel);

	/**
	 * 修改用户密码
	 * 
	 * @param userModel
	 * @return
	 */
	public int alterUserPwd(UserModel userModel, String oldPwd, String newPwd1,
			String newPwd2);

	/**
	 * 查询我的预约
	 * 
	 * @return
	 */
	public List queryMyBook(UserModel userModel);

	/**
	 * 查询我的租借
	 * 
	 * @param userModel
	 * @return
	 */
	public List queryMyRent(UserModel userModel);

}
         上面是UserService的接口,该接口具有根据用户id查询用户信息,根据用户名查询用户信息,修改用户信息,修改用户密码,查询我的预约,查询我的器材租借 6个功能。下面是这个接口的实现类:

UserServiceImpl.java
package com.gym.user.service.impl;

import java.util.List;

import com.gym.dao.impl.UserDaoImpl;
import com.gym.model.UserModel;
import com.gym.user.service.UserService;
import com.gym.utils.Constant;
import com.gym.utils.Md5;

public class UserServiceImpl implements UserService {

	public UserModel queryUserInfoById(String uId) {
		// TODO Auto-generated method stub

		UserDaoImpl userDaoImpl = new UserDaoImpl();

		return userDaoImpl.queryUserById(uId);

	}

	public UserModel queryUserInfoByName(String uName) {
		// TODO Auto-generated method stub

		UserDaoImpl userDaoImpl = new UserDaoImpl();

		return userDaoImpl.queryUserByName(uName);

	}

	public int alterUserInfo(UserModel userModel) {
		// TODO Auto-generated method stub

		UserDaoImpl userDaoImpl = new UserDaoImpl();

		if (userDaoImpl.alterUser(userModel) == 1) {
			return Constant.SUCCESS;
		} else {
			return Constant.ERROR;
		}
	}

	/**
	 * 修改用户密码
	 * 
	 * @param userModel
	 * @param oldPwd
	 *            旧密码
	 * @param newPwd1
	 *            新密码1
	 * @param newPwd2
	 *            新密码2
	 * @return
	 */
	public int alterUserPwd(UserModel userModel, String oldPwd, String newPwd1,
			String newPwd2) {
		// TODO Auto-generated method stub

		UserDaoImpl userDaoImpl = new UserDaoImpl();
		// 验证旧密码
		if (!Md5.encryption(oldPwd).equals(
				userDaoImpl.queryUserById(userModel.getuId()).getuPassword())) {
			return Constant.USERPWDERROR;
		}

		if (!newPwd1.equals(newPwd2)) {
			return Constant.PASSWORDDIFFER;
		}

		userModel.setuPassword(Md5.encryption(newPwd1));
		if (userDaoImpl.alterUserPwd(userModel) == 1) {
			return Constant.SUCCESS;
		} else {
			return Constant.ERROR;
		}

	}

	public List queryMyBook(UserModel userModel) {
		// TODO Auto-generated method stub

		UserDaoImpl userDaoImpl = new UserDaoImpl();

		return (List) userDaoImpl.queryMyBook(userModel);
	}

	public List queryMyRent(UserModel userModel) {
		// TODO Auto-generated method stub

		UserDaoImpl userDaoImpl = new UserDaoImpl();

		return (List) userDaoImpl.queryMyRent(userModel);
	}

}
         这里的增、删、改操作也用到了Constant常量工具类,能直观地传递操作状态;而查询操作一般是返回List对象,里面封装了查询数据集合,前端模版可以通过<c:foreach>标签遍历。
         由于时间关系,这里某些业务逻辑没有实现,而是直接调用数据库访问层,例如查询的一些判断与过滤,这些都直接影响到系统安全,但这只是课程设计,旨在实现基本功能,MVC设计模式,有兴趣的朋友可以拿源码去完善。

        系统的核心业务是场地预约和器材租借,这两个业务也是最复杂的。
        一、场地预约
        预约前要查询该场地是否有效,是否已被预约,预约提交后要根据预约的时间量计算总金额......
        下面是预定场地服务层方法

GroundServiceImpl.java
	public int bookGround(GroundBookModel groundBookModel,
			GroundModel groundModel) {
		// TODO Auto-generated method stub

		CompareUtil compareUtil = new CompareUtil();
		// 验证起始时间是否大于结束时间
		if (compareUtil.compareDateTime(groundBookModel.getbStartTime(),
				groundBookModel.getbEndTime(), "yyyy-MM-dd HH:mm") >= 0) {

			return Constant.TIMEERROR;

		}

		// ------------------待开发(惩罚规则)--------------------

		// 判断用户是否被冻结

		// ------------------待开发(惩罚规则)--------------------

		// 检测场地是否存在并有效
		if (groundModel.getgId().equals("") || groundModel.getgStatus() == "0") {
			return Constant.GROUNDINVALID;
		}

		// 检测场地此时间段是否空闲
		GroundbookDaoImpl groundbookDaoImpl = new GroundbookDaoImpl();
		List groundBookList = groundbookDaoImpl.queryByTime(
				groundBookModel.getbStartTime(), groundBookModel.getbEndTime());

		if (groundBookList.size() != 0) {
			return Constant.TIMECLASH;
		}

		// 计算费用
		groundBookModel.setbFee(new CalculationUitl().calculaBookMoney(
				groundBookModel, groundModel) + "");

		if (groundbookDaoImpl.addGroundbook(groundBookModel) == 1) {
			return Constant.SUCCESS;

		} else {
			return Constant.ERROR;
		}

	}
         时间比较器封装在CompareUtil工具类中,用于验证起始时间是否大于结束时间,防止用户输入错误。实现代码如下:
	/**
	 * 比较时间日期先后 格式例子:2012-12-30 11:30
	 * 
	 * @param begin
	 * @param end
	 * @return begin在end前返回负数;begin在end后返回正数;格式错误或时间相等返回0
	 */
	public long compareDateTime(String begin, String end, String format) {

		DateFormat df = new SimpleDateFormat(format);
		try {
			Date d1 = df.parse(begin);
			Date d2 = df.parse(end);
			long diff = d1.getTime() - d2.getTime();

			return diff;

		} catch (Exception e) {
		}

		return 0; }
        计算总金额方法封装在CalculationUitl工具类中,用于根据预定小时数计算金额,不足一小时按一小时计。实现代码如下:
	/**
	 * 按预定小时数计算金额,不足一小时按一小时计
	 * 
	 * @param groundBookModel
	 * @param groundModel
	 * @return
	 */
	public float calculaBookMoney(GroundBookModel groundBookModel,
			GroundModel groundModel) {

		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");

		Date begin = null;
		Date end = null;

		try {
			begin = dateFormat.parse(groundBookModel.getbStartTime());
			end = dateFormat.parse(groundBookModel.getbEndTime());
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		long l = end.getTime() - begin.getTime();

		long day = l / (24 * 60 * 60 * 1000);
		long hour = (l / (60 * 60 * 1000) + (l % (60 * 60 * 1000) > 0 ? 1 : 0)); // 不足一小时按一小时计

		float fee = Float.parseFloat(groundModel.getgFee()) * hour;

		return fee;
	}

        、器材租借        
        租借前
查询该场地是否有效,是否已被租借,租借订单提交后要根据租借的时间量计算总金额......
        器材租借业务逻辑大概相似,下面是器材租借服务层实现方法:
EquipmentServiceImpl.java
package com.gym.user.service.impl;

import java.util.List;

import com.gym.dao.impl.EquipmentDaoImpl;
import com.gym.dao.impl.EquipmentRentDaoImpl;
import com.gym.model.EquipmentModel;
import com.gym.model.EquipmentRentModel;
import com.gym.model.UserModel;
import com.gym.user.service.EquipmentService;
import com.gym.utils.CalculationUitl;
import com.gym.utils.CompareUtil;
import com.gym.utils.Constant;

public class EquipmentServiceImpl implements EquipmentService {

	public List queryEquipment() {
		// TODO Auto-generated method stub

		EquipmentDaoImpl equipmentDaoImpl = new EquipmentDaoImpl();

		return equipmentDaoImpl.queryEquipment();

	}

	public EquipmentModel queryById(String eId) {
		// TODO Auto-generated method stub

		EquipmentDaoImpl equipmentDaoImpl = new EquipmentDaoImpl();

		return equipmentDaoImpl.queryById(eId);

	}

	public EquipmentModel queryByName(String eName) {
		// TODO Auto-generated method stub
		return null;
	}

	public int rentEquipment(EquipmentRentModel equipmentRentModel,
			EquipmentModel equipmentModel, UserModel userModel) {
		// TODO Auto-generated method stub

		EquipmentServiceImpl equipmentServiceImpl = new EquipmentServiceImpl();
		equipmentModel = equipmentServiceImpl.queryById(equipmentRentModel
				.geteId()); // 根据场地id查询

		if (equipmentModel == null) { // 找不到此器材
			return Constant.EQUIPMENTINVALID;
		}

		// 重新设置相关参数,防止某些参数被用户在前台篡改
		equipmentRentModel.setBorrowFee(equipmentModel.geteFee());
		equipmentRentModel.setStatus(equipmentModel.getStatus());
		equipmentRentModel.setuId(userModel.getuId());

		CompareUtil compareUtil = new CompareUtil();
		// 验证起始时间是否大于结束时间
		if (compareUtil.compareDateTime(equipmentRentModel.getBorrowBegin(),
				equipmentRentModel.getBorrowEnd(), "yyyy-MM-dd HH:mm") >= 0) {

			return Constant.TIMEERROR;

		}

		// ------------------待开发(惩罚规则)--------------------

		// 判断用户是否被冻结

		// ------------------待开发(惩罚规则)--------------------

		// 检测器材此时间段是否空闲
		EquipmentRentDaoImpl equipmentRentDaoImpl = new EquipmentRentDaoImpl();

		List groundBookList = equipmentRentDaoImpl.queryByTime(
				equipmentRentModel.getBorrowBegin(),
				equipmentRentModel.getBorrowEnd());
		if (groundBookList.size() != 0) {
			return Constant.TIMECLASH;
		}

		// 查询该用户此时间段内是否有其他预定

		// 计算费用
		equipmentRentModel.setBorrowFee(new CalculationUitl().calculaRentMoney(
				equipmentRentModel, equipmentModel) + "");

		if (equipmentRentDaoImpl.addEquipmentRent(equipmentRentModel) == 1) {

			return Constant.SUCCESS;

		} else {

			return Constant.ERROR;

		}

	}

}
        验证时间是否正确和计算费用同样封装在CompareUtil和CalculationUitl工具类中。
        
        这里的惩罚规则没有完善,原本的思路是:如果时间过了没有到场打卡使用,即为失约。下一次预约或租借时检测上一次预约或租借的状态(statu字段),发现不是已使用状态,则封禁帐号,并且不允许继续预约和租借
。直到缴纳违约金,管理员可在后台解封。如果一直不缴纳违约金,则大四毕业时由学校收取后才给予毕业,类似图书馆借书超期缴纳的超期费用。这样就需要在管理员后台增加一个功能,查询学号以xxxx开头的帐号(学号前4位数为入学年份)。
        其他模块的服务层不是核心,就不一一列举了,可以看最后一篇文章上传的源码。
顶 10踩 2收藏
文章评论
    发表评论

    个人资料

    • 昵称: 小蜜锋
    • 等级: 高级设计师
    • 积分: 7088
    • 代码: 757 个
    • 文章: 360 篇
    • 随想: 211 条
    • 访问: 1263 次
    • 关注

    标签

    设计模式(4)java(9)命名规范(2)广告创意(1)愤怒的小鸟(1)游戏(5)jsp(1)配置(1)Surface(1)windows(1)javabean(1)设计方法(1)开发工具(2)web(4)大数据(2)GPU(1)硬盘(1)内部结构(1)黑客(1)窃取(1)编码(1)解决方法(1)php(28)mysql(9)数据库备份(1)数据库还原(1)命令(2)数据库(1)安装(1)2012(2)世界末日(3)仙剑5前传(1)默哀(1)电源(1)女生(1)装饰器模式(2)古剑奇谭(1)电脑桌(1)史上最牛(1)编程语言(2)小米(3)电视机顶盒(1)营销策略(1)Android(8)手势(1)诺亚方舟(1)Eclipse(1)汽车(1)操作系统(1)软件(1)互联网(5)大事记(1)设计师(2)壁纸(1)古剑奇谭2(1)古剑奇谭网络版(1)云计算(2)服务器(1)框架(2)Socket(1)jquery(1)构造函数执行顺序(1)火车票(1)3D(1)数据中心(2)正则表达式(2)Web前端(1)开发框架(1)系统瘫痪(1)12306(2)cpu(1)javascript(2)开发日记(15)体育馆管理系统(15)网页设计(1)CSS3(3)腾讯(3)小游戏(1)interface(1)平板(2)面试(2)设计(5)摄影(2)数据挖掘(1)钢琴谱(1)情人节(1)陈欧体(1)程序员(3)漫画(1)UserAgent(1)iPhone(2)NoSQL(1)ui(9)越狱(1)指南(1)abstract(1)css(3)git(2)八核(2)三星(1)linux(11)数据类型(1)html5(2)UML(2)perftools(1)创意(1)logo(1)色谱(1)响应式(5)Metro(2)虚拟机(1)jvm(1)垃圾回收(1)left(1)join(1)连接查询(1)溯源系统(1)Override(1)SAE(2)WordPress(1)指针(1)链表(1)系统分析师(1)中间件(1)corba(1)static(1)无线(1)监控(1)iPad(1)Apache(2)比特币(2)命名规则(1)手机支付(1)curl(3)笔记(1)导航(1)thinkphp(1)异常导致本地路径泄漏(1)web设计(1)网络安全(1)诗句(1)4K对齐(1)代码库(1)色彩(1)动画片(1)struts2(3)漏洞(5)确认框(1)心情驿站(1)ArscEditor(1)resources.(1)apktool(1)AppKey(1)新浪微博(1)app(5)广告(3)赚钱(1)响应式布局(1)html(1)淘宝(2)微信(1)重构(5)缓存(1)破解(1)后门(1)七夕(1)SEO(2)概念设计(1)面向对象(1)bootstrap(1)性能(2)优化(1)iis(1)爬虫(1)采集(1)算法(2)文本相似度(2)cto(1)js(1)fsockopen(1)扁平化设计(2)网页(1)心情(7)小米电视(1)开箱(1)励志(2)招聘(3)命名(1)notepad++(1)python(1)配色(3)扁平化(4)ps(2)搞笑(2)创业(3)渲染(1)电影(1)模板(1)微博(1)企业家(1)公司(1)总结(1)前端(1)运营(1)变形(1)svn(4)教程(3)搜狗(1)泄密(1)双11(1)天猫(1)UC(1)启动界面(1)光棍节(1)双十一(2)物流(1)备份(1)更新(1)插入(1)插件(2)jsTree(1)(1)海量数据(1)分辨率(1)草图(1)手绘(1)速度(1)文本处理(1)实习(1)感想(1)文件(1)简历(1)65.49.2.17(1)yum(1)解决办法(1)阿里云(2)推广(1)来往(1)春运(1)LBS(1)gb2312(1)utf-8(1)log4j(1)详解(1)收购(1)私服(1)TortoiseGi(1)post(1)异常(2)flappyBird(1)应用创新大赛(1)宙斯杯(1)学习方法(1)xp(1)退役(1)安全(1)技术贴(1)flash(1)刷机(1)京东(1)电商(1)Tomcat(1)JDK(1)免费(1)长投影(1)图标(1)Photoshop(1)云端集成开发环境(1)软件开发(1)可视化(1)工具(2)OpenSSL(1)Heartbleed(1)vsftp(1)中国知网(1)学术论文(1)免费下载(1)开发(1)手册(1)速查表(1)追随战略(1)sdk(1)文章(1)发布(1)文件管理(1)沙画(1)动效(2)原型(1)感悟人生(1)哲理(1)Bash(1)类图(1)知识管理(1)Console(1)调试命令(1)rpm(1)报错(1)挂载(1)数据盘(1)云主机(1)产品经理(1)原型设计(1)mql4(1)mt4(1)ea(1)程序化交易(1)CURLOPT_PO(1)阿里云​(1)CentOS6(2)OpenSSH(1)漏洞修复(2)升级(1)安骑士(1)链克(1)

    站长推荐