演示地址
系统包层次设计
在该项目中,后台代码主要放在src文件夹中,在 src中又具体分不同的包,数据库的连接参数在hibernate.cfg.xml文件中,访问数据的控制类在controller.service包中,视图模型放在在model中,接口类放在bussiness.dao中,实现类放在bussiness.impl中。包结构如图5-4所示:
图 5-1 项目包结构图
包名(结构层次) | 说明 |
business.basic | 数据连接、访问,管理数据库连接类和访问基类 |
annotation | 存放日志切面文件 |
bussiness.dao | 业务逻辑设计层,管理业务逻辑设计接口 |
bussiness.impl | 业务逻辑实现层,管理业务逻辑设计的实现类 |
bussiness.factory | 业务逻辑的工厂层,管理业务逻辑的组装工厂类 |
Controller.service | 业务逻辑控制层,管理用于与页面进行交互的控制类 |
model | 实体层,管理表实体类和视图实体类 |
servlet.filter | 网站过滤器包,管理网站过滤器类 |
util | 工具类包,管理系统中的工具类 |
test | 测试包,测试文件存放位置 |
Common.properties | 公共类包,管理公共类 |
表 5-1 项目结构说明表
命名规则:
-
- 项目的名称采用与内容相关的单词首字母大写完成,多个单词的采用驼峰命名法,即首字母大写其余小写。如RepairWeb;
- 项目中的包名的每个字母都是小写。如controller;
- 项目中的类名用与内容符合的单词大写首字母,若一个单词无法完整表达,则命名和项目名一样。如:SysUserController。
- 项目中的变量名和方法名的命名与类名不同的是,第一个单词的首字母需要小写,其余单词的首字母需要大写。如updateUser。
- 常量名都大写。如SUCCESS。
5.2 系统项目规范
5.2.1数据库的命名规范
-
-
- 数据库的命名采用与之相关的一个单词或多个单词,并且单词首字母大写+“DB”完成,如RepairCustomerMSDB;
- 数据库中表的命名用“T_”+与它内容相关的单词首字母大写完成,如T_User;
- 数据库中视图的命名采用“V_” +与内容相关的单词首字母大写完成,如V_User;
-
5.2.2项目文件命名规范
项目文件命名规范如下表5-2所示:
标识符 | 说明 |
T实体类名 | 表实体类,如T_User表的实体类为TUser |
V实体类名 | 视图实体类,如V_User视图的实体类为VUser |
业务逻辑类名DAO | 业务逻辑接口类,如UserDAO |
业务逻辑类名Impl | 业务逻辑实现类,如UserDAOImpl |
控制类类名controller | 业务控制类,如学生管理的控制类UserController |
Jsp文件 | 业务类,如Login.jsp |
表 5-2 项目文件名称命名规范
5.3数据库的实体设计
5.3.1数据库背景
- 数据库名称:汽车修理企业的客户管理系统
- 数据库名:RepairCustomerMSDB
- 数据库软件名称:SQL Server2008
- 用户名: sa
- 密码:123456
- 访问连接:仅允许localhost连接
5.3.2术语定义
T_ : 表名前缀,表示table_
V_ : 视图前缀,表示view_
up_ : 存储过程前缀,表示userprocedure_
utri_ : 触发器前缀,表示usertrigger
pk_ : 表列的主键约束前缀
fk_ : 表列的外键约束前缀
ck_ : 表列的check约束前缀
def_ : 表列的默认约束前缀
5.3.3 表详细设计
(1) T_Customer 前端网站客户表
customeraccount设置为主键约束,作为前端网站用户登录账号
序号 | 字段名 | 数据类型 | 主键 | 非空 | 描述 |
1 | customeraccount | INT | 是 | 是 | 客户账号 |
2 | pwd | VARCHAR | 否 | 否 | 客户密码 |
3 | Customername | VARCHAR | 否 | 否 | 客户名称 |
4 | tel | INT | 否 | 否 | 客户电话 |
5 | agend | VARCHAR | 否 | 否 | 客户性别 |
6 | state | BIT | 否 | 否 | 客户账户状态 |
7 | customercreatetime | DATETIME | 否 | 否 | 客户创建时间 |
表 5-3 前端网站客户表
(2)T_Articles文章表
articlesid为主键约束
序号 | 字段名 | 数据类型 | 主键 | 非空 | 描述 |
1 | articlesid | INT | 是 | 是 | 文章id主键 |
2 | title | VARCHAR | 否 | 是 | 文章标题 |
3 | articlestypeid | INT | 否 | 否 | 文章类型 |
4 | description | VARCHAR | 否 | 否 | 文章描述 |
5 | photoid | INT | 否 | 否 | 文章标志图 |
6 | state | BIT | 否 | 否 | 状态 |
7 | author | VARCHAR | 否 | 否 | 文章作者 |
8 | articlescreatetime | DATETIME | 否 | 否 | 文章创建时间 |
表 5-4 网站文章表
(3)T_ArticlesContent文章内容表
articlescontentid为主键约束
序号 | 字段名 | 数据类型 | 主键 | 非空 | 描述 |
1 | articlescontentid | INT | 是 | 是 | 文章内容id |
2 | articlesid | INT | 否 | 否 | 文章id |
3 | ordernum | INT | 否 | 否 | 内容序号 |
4 | photoid | INT | 否 | 否 | 图片id |
5 | content | VARCHAR | 否 | 否 | 内容 |
6 | issign | INT | 否 | 否 | 是否是标志图 |
7 | state | BIT | 否 | 否 | 状态 |
表 5-5 网站文章内容表
(4)T_ArticlesType网站文章类型表
articlestypeid为主键约束
序号 | 字段名 | 数据类型 | 主键 | 非空 | 描述 |
1 | articlestypeid | INT IDENTITY | 是 | 是 | 文章类型id |
2 | state | VARCHAR(50) | 否 | 否 | 状态 |
3 | articlestypename | VARCHAR(2) | 否 | 否 | 文章类型名称 |
表 5-6 网站文章类型表
(5)T_Photo图片表
photoid为主键约束
序号 | 字段名 | 数据类型 | 主键 | 非空 | 描述 |
1 | photoid | INT IDENTITY | 是 | 是 | 照片id |
2 | path | VARCHAR(500) | 否 | 是 | 路径 |
3 | status | VARCHAR(10) | 否 | 否 | 状态 |
表 5-7 图片表
(6)T_CustomerCar客户爱车表
customercarid为主键约束
序号 | 字段名 | 数据类型 | 主键 | 非空 | 描述 |
1 | customercarid | INT | 是 | 是 | 车辆id |
2 | series | VARCHAR | 否 | 否 | 车系 |
3 | chassisnumber | VARCHAR | 否 | 是 | 底盘号码 |
4 | brand | VARCHAR | 否 | 是 | 品牌 |
5 | manufacturer | VARCHAR | 否 | 是 | 厂商 |
6 | licenseplatenumber | VARCHAR | 否 | 是 | 车牌号 |
7 | engine number | VARCHAR | 否 | 是 | 发动机号码 |
8 | cartypeid | INT | 否 | 否 | 车辆类型 |
9 | photoid | INT | 否 | 否 | 上传照片 |
10 | state | BIT | 否 | 否 | 状态 |
11 | customercaraccount | INT | 否 | 否 | 客户id |
12 | carname | VARCHAR | 否 | 否 | 车系名称 |
表 5-8 客户爱车表
(7)T_Car车辆表
carid为主键约束
序号 | 字段名 | 数据类型 | 主键 | 非空 | 描述 |
1 | carid | INT | 是 | 是 | 车辆id |
2 | series | VARCHAR | 否 | 是 | 车系 |
3 | guideprice | DOUBLE | 否 | 否 | 厂商指导价 |
4 | brandid | VARCHAR | 否 | 否 | 品牌 |
5 | manufacturer | VARCHAR | 否 | 否 | 厂商 |
6 | licenseplatenumber | VARCHAR | 否 | 否 | 销售状态 |
7 | engine number | VARCHAR | 否 | 否 | 上市时间 |
8 | cartypeid | INT | 否 | 否 | 车辆类型 |
7 | photoid | INT | 否 | 否 | 照片 |
10 | state | BIT | 否 | 否 | 状态 |
11 | carname | VARCHAR | 否 | 否 | 车系名称 |
表 5-9 车辆信息表
(8)T_Appointment预约表
titleid为主键约束
序号 | 字段名 | 数据类型 | 主键 | 非空 | 描述 |
1 | appointmentid | INT | 是 | 是 | 预约id |
2 | appointmenttypeid | INT | 否 | 是 | 预约类型 |
3 | appointmentname | VARCHAR | 否 | 否 | 预约名称 |
4 | appointmenttime | DATETIME | 否 | 否 | 预约时间 |
5 | customerid | INT | 否 | 否 | 预约客户id |
6 | state | BIT | 否 | 否 | 预约状态 |
7 | customercreatetime | DATETIME | 否 | 否 | 预约创建时间 |
8 | remark | VARCHAR | 否 | 否 | 备注 |
表 5-10 预约表
(9)T_User员工表表
userid为主键约束
序号 | 字段名 | 数据类型 | 主键 | 非空 | 描述 |
1 | userid | INT | 是 | 是 | 员工账号 |
2 | userpassword | INT | 否 | 是 | 员工密码 |
3 | usertel | VARCHAR | 否 | 否 | 员工电话 |
4 | gender | VARCHAR | 否 | 否 | 性别 |
5 | realname | VARCHAR | 否 | 否 | 真实姓名 |
6 | state | BIT | 否 | 否 | 状态 |
7 | usercreatetime | DATETIME | 否 | 否 | 创建时间 |
8 | photoid | INT |
|
| 员工照片 |
表 5-11 员工表
(10)T_Role后台管理员角色表
id为主键约束
序号 | 字段名 | 数据类型 | 主键 | 非空 | 描述 |
1 | id | INT IDENTITY | 是 | 是 | 角色编号 |
2 | name | NVARCHAR(30) | 否 | 是 | 角色名称 |
3 | description | NVARCHAR(300) | 否 | 否 | 描述 |
4 | deepth | INT | 否 | 否 | 深度 |
5 | parentid | INT | 否 | 否 | 父id |
6 | status | VARCHAR(10) | 否 | 否 | 启用状态 |
表 5-12 管理员角色表
5.3.4 视图详细设计
(1) V_User后台管理员视图
查询员工信息
序号 | 字段名 | 描述 |
1 | userid | 员工账号 |
2 | userpassword | 员工密码 |
3 | usertel | 员工电话 |
4 | gender | 性别 |
5 | realname | 真实姓名 |
6 | state | 状态 |
7 | usercreatetime | 创建时间 |
8 | photoid | 员工照片 |
9 | path | 员工照片路径 |
表 5-13 员工信息视图
(2) V_Car 车辆视图
查询车辆信息
序号 | 字段名 | 描述 |
1 | carid | 车辆id |
2 | series | 车系 |
3 | guideprice | 厂商指导价 |
4 | brandid | 品牌 |
5 | manufacturer | 厂商 |
6 | licenseplatenumber | 销售状态 |
7 | engine number | 上市时间 |
8 | cartypeid | 车辆类型 |
9 | photoid | 照片 |
10 | state | 状态 |
11 | carname | 车系名称 |
表 5-14 车辆信息视图
(3) V_Appointment预约视图 查询预约信息
序号 | 字段名 | 描述 |
1 | appointmentid | 用户id |
2 | appointmenttypeid | 电话 |
3 | appointmentname | 密码 |
4 | appointmenttime | 角色id |
5 | customerid | 用户状态 |
6 | state | 真实姓名 |
7 | customercreatetime | 创建时间 |
8 | remark | 登陆状态 |
9 | Customername | 客户名称 |
10 | tel | 客户电话 |
11 | agend | 客户性别 |
表 5-15 后台管理员视图
5.4 系统业务接口设计
系统业务接口设计如下表所示,表中需要实现的方法之例举了部分,在接口说明中需要实现的方法会详细说明。
接口名称 | 接口说明 | 需要实现的方法 |
CustomerDAO | 客户处理业务接口 | addTCustomer ():添加客户方法,用来提供游客注册,成功后返回客户账号。 delTCustomer():根据客户id删除客户账号,返回成功或失败。 updateTCustomer():传入客户实体,更新客户信息,返回成功或失败 getTCustomerByid():根据客户账号查询客户所有信息 |
ArticlesDAO | 文章处理业务接口 | addTArticles ():添加文章方法,传入文章实体,添加成功后返回文章id。 delTArticles():根据文章id删除文章,返回成功或失败。 updateTArticles():传入文章实体数据,更新文章信息,返回成功或失败 getTArticlesByid():根据根据问章id获取文章信息 |
AppointmentDAO | 预约单业务处理接口 | addTAppointment ():添加预约单方法,添加成功后返回预约单id delTAppointment():根据预约单id删除预约单,返回成功或失败。 updateTAppointment():传入预约单实体,更新预约信息,返回成功或失败 getTAppointmentByid():根据预约单id获取所有信息 |
表 5-16 网站端接口设计与说明
接口名称 | 接口说明 | 需要实现的方法 |
UserDAO | 员工管理业务接口 | addTUser ():添加员工方法,添加成功后返回员工账号 delTUser():根据员工账号删除员工,返回成功或失败。 updateTUser():传入员工实体,更新员工信息,返回成功或失败 getTUserByid():根据员工账号获取员工信息 getTUserByPage():根据条件查询员工分页信息 |
UserTypeDAO | 员工类型管理业务接口 | addTUserType ():添加员工类型方法,添加成功后返回员工类型id delTUserType():根据员工类型id删除员工类型,返回成功或失败。 updateTUserType():传入员工类型实体,更新员工类型信息,返回成功或失败 getTUserTypeByid():根据员工类型id获取员工类型信息 getUserTypeByPage():根据条件查询员工类型分页信息 |
SystemLogDAO | 系统日志业务类接口 | getaAllSystemList ():获取所有日志信息方法 getSystemLogList():根据条件获取日志分页数据 deleteLogById():根据日志id删除单一日志 deleteLogById():根据日志id数组,实现批量删除日志 addLog():传入日志实体,添加日志,返回日志id getLogById():根据日志id获取日志信息 |
RoleDAO | 角色管理业务类接口 | addTRole ():添加角色方法,添加成功后返回角色id delTRole():根据角色id删除角色记录,返回成功或失败。 updateTRole():传入角色实体,更新角色信息,返回成功或失败 getTRoleByid():根据角色id获取角色信息 getTRoleByPage():根据条件查询角色分页信息 |
PhotoDAO | 网站图片管理业务类接口 | addTPhoto ():添加图片方法,添加成功后返回图片id delTPhoto():根据图片id删除图片记录,返回成功或失败。 updateTPhoto():传入图片实体,更新图片信息,返回成功或失败 getTPhotoByid():根据图片id获取图片信息 getTPhotoByPage():根据条件查询图片分页信息 getTPhotoList():获取所有图片方法 |
CarDAO | 车辆管理业务类接口 | addCar ():添加车辆方法,添加成功后返回车辆id delCar():根据车辆id删除车辆记录,返回成功或失败。 updateCar():传入车辆实体,更新车辆信息,返回成功或失败 getCarByid():根据车辆id获取车辆信息 getCarByPage():根据条件查询车辆分页信息 getCarList():获取所有车辆方法 |
BrandDAO | 品牌管理业务类接口 | addBrand ():添加品牌方法,添加成功后返回品牌id delBrand():根据品牌id删除品牌记录,返回成功或失败。 updateBrand():传入品牌实体,更新品牌信息,返回成功或失败 getBrandByid():根据品牌id获取品牌信息 getBrandByPage():根据条件查询品牌分页信息 getBrandList():获取所有品牌方法 |
ArticlesTypeDAO | 文章类型处理业务接口 | addArticlesType ():添加文章类型方法,添加成功后返回文章类型id delArticlesType():根据文章类型id删除文章类型记录,返回成功或失败。 updateArticlesType():传入文章类型实体,更新文章类型信息,返回成功或失败 getArticlesTypeByid():根据文章类型id获取文章类型信息 getArticlesTypeByPage():根据条件查询文章类型分页信息 getArticlesTypeList():获取所有文章类型方法 |
表 5-17后台管理端接口设计与说明
5.5 系统交互动作接口设计
后端交互动作接口设计如下表所示(只列出了部分)。
类名:CarController | ||
方法名称:getCarList | ||
说明:分页获取车辆信息 | ||
http的url请求及参数声明 | 请求url地址 | 请求参数 |
car/ getcar | Page:当前页数 Limit:每页数量 Condition:查询条件 | |
返回值 | 成功JSON | 失败 JSON |
{code:0,data:carlist,msg:“查询成功”} | { code:1,msg:“查询失败”} | |
案例 | http://localhost:8080/RepairCusAdminMS/car/getcar?page=1&limit=10 | |
方法名称:addCar | ||
说明:实现一个车辆的添加 | ||
http的url请求及参数声明 | 请求url地址 | 请求参数 |
car/ addcar | photoid: 车辆图片id carname: 车辆名称 carseries: 车系 brandid: 车辆品牌id cartypeid: 车辆类型id manufacturer: 厂商 markettime: 上市时间 guideprice: 厂家指导价 carstate: 是否热销 | |
返回值 | 成功JSON | 失败 JSON |
{code:0,msg:“添加成功”} | { code:1,msg:“添加失败”} | |
案例 | http://localhost:8080/RepairCusAdminMS/car/addcar | |
方法名称:delCar | ||
说明:删除车辆信息 | ||
http的url请求及参数声明 | 请求url地址 | 请求参数 |
car/ delcar | Carid:车辆id | |
返回值 | 成功JSON | 失败 JSON |
{code:0,msg:“删除成功”} | { code:1,msg:“删除失败”} | |
案例 | http://localhost:8080/RepairCusAdminMS/car/delcar?carid=1 | |
方法名称:updateCar | ||
说明:更新车辆信息 | ||
http的url请求及参数声明 | 请求url地址 | 请求参数 |
car/ updatecar | photoid: 车辆图片id carname: 车辆名称 carseries: 车系 brandid: 车辆品牌id cartypeid: 车辆类型id manufacturer: 厂商 markettime: 上市时间 guideprice: 厂家指导价 carstate: 是否热销 | |
返回值 | 成功JSON | 失败 JSON |
{code:0,msg:“更新成功”} | { code:1,msg:“更新失败”} | |
案例 | http://localhost:8080/RepairCusAdminMS/car/updatecar | |
类名:CustomerController | ||
方法名称:getCustomList | ||
说明:获取客户信息列表 | ||
http的url请求及参数声明 | 请求url地址 | 请求参数 |
customer/ getcustomer | Page:当前页数 Limit:每页数量 Condition:查询条件 | |
返回值 | 成功JSON | 失败 JSON |
{code:0,data:customerlist,msg:“查询成功”} | { code:1,msg:“查询失败”} | |
案例 | http://localhost:8080/RepairCusAdminMS/customer/getcustomer?page=1&limit=10 | |
方法名称:addCustomer | ||
说明:实现客户的注册 | ||
http的url请求及参数声明 | 请求url地址 | 请求参数 |
customer/ addcustomer | Tcustomer:客户实体类信息 | |
返回值 | 成功JSON | 失败 JSON |
{code:0,msg:“添加成功”} | { code:1,msg:“添加失败”} | |
案例 | http://localhost:8080/RepairCusAdminMS/customer/ addcustomer | |
方法名称:delcustomer | ||
说明:删除客户信息 | ||
http的url请求及参数声明 | 请求url地址 | 请求参数 |
customer/ delcustomer | customerid:客户id | |
返回值 | 成功JSON | 失败 JSON |
{code:0,msg:“删除成功”} | { code:1,msg:“删除失败”} | |
案例 | http://localhost:8080/RepairCusAdminMS/customer/delcustomer?customerid=1 | |
方法名称:updateCustomer | ||
说明:更新客户信息 | ||
http的url请求及参数声明 | 请求url地址 | 请求参数 |
customer/ updatecustomer | TCustomer:客户实体类信息 | |
返回值 | 成功JSON | 失败 JSON |
{code:0,msg:“更新成功”} | { code:1,msg:“更新失败”} | |
案例 | http://localhost:8080/RepairCusAdminMS/customer/updatecustomer | |
方法名称:customerLogin | ||
说明:实现客户登录 | ||
http的url请求及参数声明 | 请求url地址 | 请求参数 |
customer/ customerlogin | Customeraccount:客户账户 Customerpassword:客户密码 | |
返回值 | 成功JSON | 失败 JSON |
{code:0,msg:“登录成功”} | { code:1,msg:“登录失败”} | |
案例 | http://localhost:8080/RepairCusAdminMS/customer/customerlogin?Customeraccount=user001& Customerpassword=123456 | |
类名:AppointmenController | ||
方法名称:getAllAppList | ||
说明:分页获取预约单信息 | ||
http的url请求及参数声明 | 请求url地址 | 请求参数 |
appointment/getallappointment | Page:当前页数 Limit:每页数量 Condition:查询条件 | |
返回值 | 成功JSON | 失败 JSON |
{code:0,data: AppList,msg:“查询成功”} | { code:1,msg:“查询失败”} | |
案例 | http://localhost:8080/RepairCusAdminMS/appointment/getallappointment?page=1&limit=10 | |
方法名称:addappointment | ||
说明:实现一个预约单的添加 | ||
http的url请求及参数声明 | 请求url地址 | 请求参数 |
appointment / addappointment | Tappointment:预约单实体信息 | |
返回值 | 成功JSON | 失败 JSON |
{code:0,msg:“添加成功”} | { code:1,msg:“添加失败”} | |
案例 | http://localhost:8080/RepairCusAdminMS/appointment/addappointment | |
方法名称:delappointment | ||
说明:删除预约单信息 | ||
http的url请求及参数声明 | 请求url地址 | 请求参数 |
appointment/ delappointment | appointmentid:预约单id | |
返回值 | 成功JSON | 失败 JSON |
{code:0,msg:“删除成功”} | { code:1,msg:“删除失败”} | |
案例 | http://localhost:8080/RepairCusAdminMS/appointment/delappointment?appointmentid=1 | |
方法名称:updateAppointment | ||
说明:更新预约单信息 | ||
http的url请求及参数声明 | 请求url地址 | 请求参数 |
appointment/ updateappointment | TAppointment:预约单信息实体 | |
返回值 | 成功JSON | 失败 JSON |
{code:0,msg:“更新成功”} | { code:1,msg:“更新失败”} | |
案例 | http://localhost:8080/RepairCusAdminMS/appointment/updateappointment |
表 5-18 网站端接口设计与说明
后台管理端采用Spring MVC的架构模式,以请求为驱动,通过模型对象,分派器来展示请求结果视图。需要定义一个控制类接口,声名访问接口。在前台,通过ajax直接访问接口,传递对应参数,就能完成对数据的增删改查操作。
由于控制类较多,下面值列举其中一个。
ArticlesController(用户处理控制类)
类名 | 说明 | 需要传入的参数 |
addArticles | 添加文章 | Articles |
updateArticles | 更新文章 | ArticlesId Articles |
getArticlesByid | 根据id查询文章信息 | Articlesid |
delArticlesByid | 根据id删除文章 | Articlesid |
getArticlesByOP | 获取文章分页信息 | Op limite,page |
getAllArticles | 得到所有的文章信息 (不带分页) |
|
getAllArticlesType | 得到所有的文章信息类型(不带分页) |
|
addArticlesType | 将一条文章类型添加到数据库 | title、typename、 |
delArticlesType | 根据文章id删除文章 | ArticlesTypeid |
updateArticlesType | 修改文章类型 | ArticlesType |
getArticlesTypeList | 根据条件文章类型分页 | title、page、limit |
getArticlesContentByid | 根据文章id获取文章内容 | Articlesid |
getArticlescontentByOP | 根据条件得到文章内容 | op、page、limit |
addArticlesContent | 添加一条文章内容 | ArticlesContent |
delArticlesContent | 根据传入文章内容id删除文章内容 | ArticlesContentid |
表 5-19 网站端接口设计与说明