在该系统的设计中,将大部分Java代码放在src文件夹中并且划分出多个不同的包,访问数据的控制类在control.action包中,单元测试在junit.test包中,工具类在util包中,视图模型放在model包中,接口类放在business.dao中,实现类放在business.impl包中。项目包结构如下图所示:
表5-1 项目结构说明表
包名(结构层次) | 说明 |
business.basic | 数据连接、访问,管理数据库连接类和访问基类 |
business.dao | 业务逻辑设计层,管理业务逻辑设计接口 |
business.impl | 业务逻辑实现层,管理业务逻辑设计的实现类 |
business.factory | 业务逻辑的工厂层,管理业务逻辑的组装工厂类 |
control.action | 业务逻辑控制层,管理用于与页面进行交互的控制类 |
model | 实体层,管理表实体类和视图实体类 |
servlet.common | 公共控制类:验证码、上传控制类 |
util | 工具类包,管理系统中的工具类 |
common.properties | 公共类包,管理公共类 |
junit.test | 单元测试包,管理单元测试类 |
项目中的命名规则:
⑴ 项目中的项目名称、类名采用驼峰命名法,使用与项目、类相关的英文单词命名。如项目名:NovelWeb,类名:LoginAction
⑵ 项目中的类中的变量名和方法名若只有一个单词则采用小写,如:login;若由多个单词组成,除第一个单词外,其余单词首字母大写。如:addNovel
⑶ 项目中的类中如果使用到常量,那么常量名全大写。如:SUCCESS
5.2.1 数据库的命名规范
⑴ 数据库的命名使用和项目名称相关的一个单词或多个单词,并且单词之间的首字母大写+“DB”完成,如NovelDB。
⑵ 数据库中表的命名用“T_”+与表相关的单词首字母大写完成,如果有多个单词组成,则每个单词首字母大写,如T_User。
⑶ 数据库中视图的命名采用“V_” +与视图相关的单词首字母大写完成,如果有多个单词组成,单词之间首字母大写,如V_NovelContent。
5.2.2 项目中文件的命名规范
项目中文件名命名规范如下表所示:
表5-2 文件命名规范表
标识符 | 说明 |
T实体类名 | 表实体类,如T_User表的实体类为TUser |
V实体类名 | 视图实体类,如V_User视图的实体类为VUser |
业务逻辑接口类名DAO | 业务逻辑接口类,如UserDAO |
业务逻辑类名Impl | 业务逻辑实现类,如UserDAOImpl |
控制类类名controller | 业务控制类,如学生管理的控制类LoginController |
Jsp文件 | 动态页面文件,如Login.jsp |
以“T_”定义表(table)
以“V_” 定义视图(view)
以“up_”定义存储过程(userprocedure)
以“utri_”定义触发器(usertrigger)
以“pk_”定义表中列的主键约束
以“fk_”定义表中列的外键约束
以“ck_”定义表中列的check约束
以“def_”定义表中列的默认约束
表5-3 数据库设计中的标识符
标识符 | 说明 |
DBMS | 数据库管理系统,本系统采用Microsoft的sqlserver 2012 企业版 |
表 Table | 数据最小存储结构 |
字段 | 表中的列定义 |
主键 | 唯一约束性和非空约束性,和其他表中的数据进行关联 |
约束 | 确保数据符合某种数据完整性 |
自动编号 | 确保主键值不出现重复 |
视图 | 虚表,展现基本表中的数据,在一定程度上提供逻辑独立 |
存储过程 | 存储在数据库内,由应用程序调用执行,可声明变量和执行其他编程 |
触发器 | 管理数据库,为响应一个特殊表格中的某些事件而自动执行的程序代码 |
数据库用户 | 可对数据库创建对象,操作数据库,执行存储过程等 |
ER图 | 实体联系图,提供了表示实体类型、属性和联系的方法,用图形符号表示 |
对数据库中的设计约定如表5-4所示
表5-4 数据库中的设计约定
对象名 | 设计约定 |
数据库名 | 系统名称+ DB, 如:NovelDB |
数据文件名 | 系统名称+ _data + 序号,如:UserManage_data1.mdf |
表名 | 以T_作为开头,如T_User |
字段名 | 小写字母开头,单词之间不大写,不允许使用包括”_”的一切符号 |
主键名 | 简洁且唯一,如id |
check约束名 | 限制列中的值的范围,右键添加约束 |
默认约束名 | 在视图的相应字段中选择常规属性默认值设置 |
外键约束名 | 右键字段然后选择关系设计 |
索引名 | 加快检索表中数据 |
视图名 | V_ +视图名 如V_User |
存储过程名 | [拥有者.]存储过程名[;程序编号] |
触发器名 | 短线连接,如 trigger_name |
⑴ T_User用户表
表5-5 用户表
列名 | 列注释 | 数据类型 | 非空约束 | 约束 |
userid | 用户账号 | Varchar(50) | not null | 主键 |
pwd | 用户密码 | Varcahr(50) | not null |
|
nickname | 用户昵称 | Varchar(50) | not null |
|
usertype | 用户类型 | int | not null | 外键 |
userphoto | 用户头像 | int |
| 外键 |
signature | 用户简介 | Varcahr(1000) |
|
|
realname | 作者真实姓名 | Varchar(50) |
|
|
mobile | 联系方式 | Varchar(50) |
|
|
agend | 性别 | varcahr(2) |
|
|
bookbean | 书豆 | money |
|
|
novelcount | 小说发表数 | int |
|
|
novelscan | 小说浏览量 | int |
|
|
status | 停用/启用 | bit |
|
|
createtime | 写作开始日期 | datetime |
|
|
isdelete | 删除标志 | bit |
|
|
以userid作为用户表的主键约束
以usertype作为用户表的主键约束,与主表T_UserType中的字段id相对应
以userphoto作为用户表的主键约束,与主表T_Photo中的字段id相对应
⑵ T_Novel小说表
表5-6 小说表
列名 | 列注释 | 数据类型 | 非空约束 | 约束 |
novelid | 小说编号 | int | not null | 主键 |
novelname | 小说名称 | varchar(50) | not null |
|
novelphoto | 封面图片 | int | null |
|
abstrac | 简介 | nvarchar(500) | not null |
|
userid | 发表作者 | Varchar(20) | not null | 外键 |
noveltype | 小说分类 | nvarchar(20) | not null | 外键 |
novelstatus | 状态(完本/连载) | int |
|
|
createtime | 小说创建时间 | datetime | null |
|
scancount | 浏览量 | int | null |
|
reviewcount | 评论数 | int | null |
|
auditstatus | 审核状态 | int |
|
|
isdelete | 删除标志 | bit | null |
|
以novelid作为小说表的主键约束
把novelid设置为Identity属性,种子标识1,种子增量1
以userid作为小说表的外键约束,与主表T_User中的字段 userid相对应
以noveltype作为小说表的外键约束,与主表T_NovelTyp中的字段typename相对应
⑶ T_NovelContent小说章节内容表
表5-7 小说章节内容表
列名 | 列注释 | 数据类型 | 非空约束 | 约束 |
chapterid | 章节编号 | int | not null | 主键 |
novelid | 所属小说编号 | int | not null | 外键 |
chaptername | 章节名称 | nvarchar(50) | not null |
|
textcontent | 内容 | varchar(8000) | not null |
|
charge | 收/免费 | bit |
|
|
以chapterid作为小说章节内容表的主键约束
以novelid作为小说章节内容表的外键约束,与主表T_Novel中的字段novelid相对应
⑷ T_Review 评论内容表
表5-8 评论内容表
列名 | 列注释 | 数据类型 | 非空约束 | 约束 |
reviewid | 评论编号 | int | not null | 主键 |
novelid | 所属小说编号 | int | not null | 外键 |
chapterid | 所属章节编号 | int | not null | 外键 |
userid | 发表用户 | varchar(20) | not noll | 外键 |
reviewcontent | 评论内容 | nvarchar(2000) | not null |
|
ipaddr | IP地址 | Varchar(20) |
|
|
createtime | 发表评论时间 | datetime |
|
|
以reviewid 作为评论内容表的主键约束
以novelid 作为评论内容表的外键约束,与主表T_Novel中的字段novelid相对应
以chaptereid作为评论内容表的外键约束,与主表T_NovelContent中的字段chaptereid相对应
以userid作为评论内容表的外键约束,与主表T_User中的字段userid相对应
⑸ T_Usertype 用户类型表
表5-9 用户类型表
列名 | 列注释 | 数据类型 | 非空约束 | 约束 |
id | 类型编号 | int | not null | 主键 |
name | 类型 | varchar(50) | not null |
|
description | 类型描述 | nvarchar(20) | not null |
|
以id 作为用户类型表的主键约束
把id设置为Identity属性,种子标识1,种子增量1
⑹ T_Photo 图片资源表
表5-10 图片资源表
列名 | 列注释 | 数据类型 | 非空约束 | 约束 |
id | 图片编号 | int | not null | 主键 |
photourl | 图片资源地址 | Varchar(500) | not null |
|
status | 图片状态 | int | not null |
|
以id 作为图片资源表的主键约束
把id设置为Identity属性,种子标识1,种子增量1
⑺ T_NovelType小说分类表
表5-11 小说分类表
列名 | 列注释 | 数据类型 | 非空约束 | 约束 |
id | 类型编号 | int | not null | 主键 |
typename | 类型名称 | nvchar(50) | not null |
|
parentid | 父级id | int | not null |
|
以id 作为小说分类表的主键约束
把id设置为Identity属性,种子标识1,种子增量1
⑻ T_BookCase小说书架表
表5-12 小说书架表
列名 | 列注释 | 数据类型 | 非空约束 | 约束 |
bookcaseid | 书架编号 | int | not null | 主键 |
userid | 用户 | Varchar(20) | not null | 外键 |
novelid | 所属小说编号 | int | not null |
|
chapterid | 所属章节编号 | int | not null |
|
以bookcaseid 作为小说书架表的主键约束
把bookcaseid设置为Identity属性,种子标识1,种子增量1
以userid作为小说书架表的外键约束,与主表T_User中的字段userid相对应
以novelid作为小说书架表的外键约束,与主表T_Novel中的字段novelid相对应
以chapterid作为小说书架表的外键约束,与主表T_NovelContent中的字chapterid相对应
⑴ V_User用户视图
a 依赖表:用户表、用户类型表、图片资源表
b 视图中的字段:用户id、用户密码、用户昵称、用户名字、用户头像、作者简介、真实姓名、联系方式、性别、书豆、发表小说数量、小说浏览量、用户状态、写作日期、用户类型、删除标志、推荐票数量
⑵ V_Novel小说视图
a 依赖表:小说表,小说内容表,小说类型表、图片资源表
b 视图中的字段:小说id、小说名字、小说简介、小说类型、作者昵称、小说封面图片、小说状态、创建时间、浏览量、评论数、审核状态、删除标志、推荐票数量
⑶ V_NovelContent 小说内容视图
a 依赖表:小说表、小说内容表、用户表、图片资源表、小说类型表
b 视图中的字段:小说id、小说名字、小说简介、用户id、小说内容、章节id、付费情况、章节名称、小说分类名称、作者昵称、创建时间、审核状态
⑷ V_Review评论视图
a 依赖表: 用户表、评论内容表、图片资源表
b 视图中的字段:评论id、小说id、章节id、用户id、用户昵称、评论内容、IP地址、发表时间、回复内容
a 依赖表:小说表,用户表
b 作用: 在小说表中添加一本新的小说,若小说添加成功,则在用户表中其发表作者的文章发表数量中加1
c 返回:0为失败,1为成功
a 依赖表:小说表,用户表
b 作用:在小说表中按照小说编号查询出小说,首先删除该小说的评论内容,接着修改该小说的封面图片状态,然后删除小说的章节内容,最后删除整本小说。然后修改用户表中作者发表的小说数量,小说数量减1
c 返回:0为失败,1为成功
a 依赖表:小说表,评论表
b 作用: 在评论表中添加一条评论,若评论发表成功,则在小说表中对应的小说中评论数量加1
c 返回:0为失败,1为成功
(4)up_ addNovelCountent 添加小说章节内容存储过程
a 依赖表:小说内容表
b 作用: 在小说内容表中添加一章新的章节内容,
c 返回:0为失败,1为成功
(5)up_ deleteNovelCountent 删除小说章节内容存储过程
a 依赖表:小说内容表
b 作用:在小说内容表中查询出改章节内容,接着删除小说的章节内容
c 返回:0为失败,1为成功
系统业务接口设计如下表所示,表中各接口所需要实现的方法只举例部分。
表5-13 接口设计表
接口名称 | 接口说明 | 需要实现的方法 |
UserDAO | 用户信息业务处理接口 | login() 登陆方法 addNormolUser() 添加普通用户方法 modifyUserInfo() 修改用户信息方法 upgradeAuthor() 升级为作者用户方法 |
NovelDAO | 小说业务处理接口 | addNovel() 创建小说方法 deleteNovel() 删除小说方法 updateNovel() 修改小说方法 |
NovelContentDAO | 小说章节业务处理接口 | addContent () 创建小说章节方法 deleteContent () 删除小说章节方法 updateNovelContent() 修改小说章节方法 |
ReviewDAO | 评论信息业务处理接口 | addReview() 添加评论方法 deleteReview() 删除评论方法 delReviewChapter() 删除整个章节评论方法 |
PhotoDAO | 图片资源业务处理接口 | getPhotoById() 获取图片方法 addPhoto() 添加图片方法 deletePhoto() 删除图片方法 |
BookCaseDAO | 书架业务处理接口 | getBookCase() 查询书架方法 insertBook()加入书架方法 deleteBook()移除书架方法 |
⑴ 用户信息业务处理接口类:基于用户操作的业务方法接口类。包含有用户账号注册、用户登录、修改用户信息、升级为作者用户等方法。
⑵ 小说业务处理接口类:基于用户对小说操作的业务方法接口类。包含有创建小说、删除小说、更新小说信息等方法。
⑶ 小说章节业务处理接口类:基于用户对小说章节操作的业务方法接口类。包含有创建小说章节、删除小说章节、更新小说章节信息等方法。
⑷ 评论信息业务处理接口类:基于用户对评论操作的业务方法接口类。包含有添加评论信息、删除评论信息、删除所有章节评论信息等方法。
⑸ 图片资源业务处理接口类:基于用户头像或小说封面图片操作的业务方法接口类。包含有查询图片、添加图片、删除图片等方法。
⑹ 书架业务处理接口类:基于小说书架操作的业务接口类。包含有加入书架、查询书架信息、删除藏书等方法。
网站端交互控制类采用Struts2(Action)实现,只举例部分,如下表所示:
表5-14 用户端交互控制类设计表
类名 | 说明 | 需要传入的参数 | 请求URL设计 |
LoginAction | 登录 | userid , pwd | /login |
NovelAction | 获取小说信息 | novelid | /novel |
AddNormaluserAction | 普通用户注册 | userid,pwd,nickname,confirpwd | /addnormaluser |
CreateNovelAction | 创建小说 | novelid,novelname,abstrac,noveltype,userid | /createnovel |
CreateChapterAction | 创建小说中章节 | novelid,textcontent,chaptername,charge | /createchapter |
AddReviewAction | 发表评论 | Chapterid,novelid,userid,reviewtext | /addreview |
系统后台管理端采用了SpringMVC的架构模式,以请求为驱动,将请求到的内容转换为json格式传递到前端,通过模型对象将请求结果渲染为视图。该模式定义了控制类接口,声明访问接口,在前端通过ajax直接请求访问接口,传递相对应的参数。其原理和action一样。下面举例一个控制类(Controller)接口:
以UserController为例:
表5-15 后台管理端交互控制类设计表
访问接口 | 说明 | 需要传入的参数 | 请求URL设计 |
getNormalUserList() | 查询普通用户 | userid , nickname | /getnourmaluserlist |
addNormalUser() | 添加普通用户 | userid,nickname,pwd | /addnormaluser |
modifyNormalUserInfo() | 修改用户信息 | userid,pwd,nickname | /modifyinfo |
deleteUser() | 删除用户 | userid | /deleteuser |
addAuthorUser | 添加作者用户 | userid,pwd,realname,mobile,userphoto,agend,signature,nickname | /addauthoruser |
表5-16 数据交换格式设计表
方法及说明 | 参数 | 返回值 | 案例 |
login (管理员用户登录) | userid 账号 pwd 密码 | 失败:返回 | http://localhost:8080/systemnovel/login |
addadminuser (添加管理员用户) | usesrid 账号 realname 真实姓名 pwd 密码 mobile 联系方式 | 失败:返回
| http://localhost:8080/systemnovel/addadminuser |
deleteadminuser (删除管理员用户) | userid 账号 | 失败:返回 | http://localhost:8080/systemnovel/deleteuser |