本次实验项目,开发完整网站,以前只开发过前端界面,本次记录一下完整的开发过程。文末有完整源码地址。
- 实验过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)
(一)、项目背景、需求分析及系统功能描述
项目背景:
网络在我们日常生活中的地位日益增长,给我们的工作生活提供了极大的便利。如今,在大学的学习生活中,由于班级人数较多、而个人的课程较为分散,给班级日常工作带来了一定的困难:例如,班委会成员和老师在班级管理等方面的工作量较大、工作效率不高;而且一些关于班级活动的信息发布零散不系统、更新不及时,交互性差,同学们的相互交流欠缺等。应学校班级师生的需求,我们提出建设一个面向班集体所有成员的班级信息管理网站,做到信息的规范管理、科学统计和快速查询,给大家一个相互交流、获取信息、展示班级风貌的平台,同时也提高班委会成员和老师处理班级管理事务的工作效率,实现班级的系统化、流程化管理,记录下大家大学四年的点滴成长。
需求分析:
- 班委会和老师:作为班级的日常管理者,可以不定时发布新闻、作业通知等信息给班级成员,即时获取并管理班集体成员的所有个人资料,统计数据;
- 普通学生:查看班级历史活动,浏览获取最新新闻资讯、学院通知,查看学科作业、下载最新课程资料,查看其他班级成员信息在线交互。
系统功能描述:
- 班委会成员和老师作为班级工作的日常管理者,设置为班级建设网站的管理员,登录管理后台,可以不定时发布学院通知、作业要求,上传活动信息,实现对班级成员信息和事务信息的增删改查,添加或者删除管理员,维护网站系统及硬件设施;
- 其他学生作为普通用户,可以访问班级管理网站,获取最新的作业信息、新闻,浏览班级活动历史信息等。
(二)、数据库概念设计
分析实体之间的联系,确定实体之间的关系,画出ER图如下所示:
(三)、数据库逻辑设计
本次课设涉及的基本表包括:班级成员信息数据表cc_members、班级新闻数据表cc_news、后台管理员信息表cc_users、班级作业信息表cc_works共四个。
(1)班级成员信息数据表cc_members, 各字段名称及数据类型如图(包含成员学号、姓名、年龄、头像以及相应的工作),使用InnoDB存储引擎,自增初始值为1,主键为member_id。
(2)班级新闻数据表cc_news,各字段名称及数据类型如图所示(包括新闻编号、标题、文本、日期、发布者等),主键为new_id,定义外键约束 CONSTRAINT `cc_news_new_member` FOREIGN KEY (`new_member`) REFERENCES `cc_users` (`user_id`)。
(3)后台管理员信息表cc_users,各字段名称及数据类型如图所示(包括管理员编号、姓名、密码),主键为user_id。用户密码MD5加密储存。
(4)班级作业信息表cc_works,各字段名称及数据类型如图所示(包括作业编号、名称、图片、文本、日期、发布者),主键为work_id,外键为work_member。建立外键约束为CONSTRAINT `cc_works_work_member` FOREIGN KEY (`work_member`) REFERENCES `cc_users` (`user_id`)。
(四)设计生成该数据库的SQL语句
(1)创建班级成员信息数据表cc_members,并插入记录:
SET FOREIGN_KEY_CHECKS=0;
— —————————-
— Table structure for cc_members
— —————————-
DROP TABLE IF EXISTS `cc_members`;
CREATE TABLE `cc_members` (
`member_id` int(11) NOT NULL AUTO_INCREMENT,
`member_name` varchar(10) NOT NULL,
`member_old` int(11) NOT NULL,
`member_image` varchar(36) NOT NULL,
`member_work` varchar(50) NOT NULL,
PRIMARY KEY (`member_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
— —————————-
— Records of cc_members
— —————————-
INSERT INTO `cc_members` VALUES (‘1’, ‘小吴’, ’19’, ‘/img/member/8.jpg’, ‘hhh’);
INSERT INTO `cc_members` VALUES (‘2’, ‘小张’, ’22’, ‘/img/member/7.jpg’, ‘hhh’);
INSERT INTO `cc_members` VALUES (‘3’, ‘小王’, ’25’, ‘/img/member/6.jpg’, ‘hhh’);
INSERT INTO `cc_members` VALUES (‘4’, ‘小明’, ’20’, ‘/img/member/5.jpg’, ‘hhh’);
INSERT INTO `cc_members` VALUES (‘5’, ‘小伊’, ’20’, ‘/img/member/4.jpg’, ‘美工’);
INSERT INTO `cc_members` VALUES (‘6’, ‘小殊’, ’20’, ‘/img/member/3.jpg’, ‘设计’);
INSERT INTO `cc_members` VALUES (‘7’, ‘小琪’, ’20’, ‘/img/member/2.jpg’, ‘文案’);
INSERT INTO `cc_members` VALUES (‘8’, ‘小宇’, ’20’, ‘/img/member/1.jpg’, ‘开发’);
(2)创建班级新闻数据表cc_news,并插入记录:
— —————————-
— Table structure for cc_news
— —————————-
DROP TABLE IF EXISTS `cc_news`;
CREATE TABLE `cc_news` (
`new_id` int(11) NOT NULL AUTO_INCREMENT,
`new_name` varchar(36) NOT NULL,
`new_value` text NOT NULL,
`new_date` date NOT NULL,
`new_member` int(11) NOT NULL,
PRIMARY KEY (`new_id`),
KEY `cc_news_new_member` (`new_member`),
CONSTRAINT `cc_news_new_member` FOREIGN KEY (`new_member`) REFERENCES `cc_users` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
— —————————-
— Records of cc_news
— —————————-
INSERT INTO `cc_news` VALUES (‘1’, ‘关于第一次班会会召开问题,特批此通知’, ‘
任公曰:造成今日之老大中国者,则中国老朽之冤业也。!
‘, ‘2018-12-15’, ‘1’);
(3)创建后台管理员信息表cc_users,并插入记录:
— —————————-
— Table structure for cc_users
— —————————-
DROP TABLE IF EXISTS `cc_users`;
CREATE TABLE `cc_users` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(16) NOT NULL,
`password` varchar(50) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
— —————————-
— Records of cc_users
— —————————-
INSERT INTO `cc_users` VALUES (‘1’, ‘admin’, ‘5B274BA46BBCF3053D2C9329365B2649’);
(4)创建班级作业信息表cc_works,并插入记录:
— —————————-
— Table structure for cc_works
— —————————-
DROP TABLE IF EXISTS `cc_works`;
CREATE TABLE `cc_works` (
`work_id` int(11) NOT NULL AUTO_INCREMENT,
`work_name` varchar(36) NOT NULL,
`work_image` varchar(36) NOT NULL,
`work_value` text NOT NULL,
`work_date` date NOT NULL,
`work_member` int(11) NOT NULL,
PRIMARY KEY (`work_id`),
KEY `cc_works_work_member` (`work_member`),
CONSTRAINT `cc_works_work_member` FOREIGN KEY (`work_member`) REFERENCES `cc_users` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
— —————————-
— Records of cc_works
— —————————-
INSERT INTO `cc_works` VALUES (‘1’, ‘编译原理’, ‘/img/work/1.jpg’, ‘
编译原理请按时完成网络平台测试
‘, ‘2018-12-15’, ‘1’);
INSERT INTO `cc_works` VALUES (‘2’, ‘操作系统’, ‘/img/work/2.jpg’, ‘
操作系统考试在即
‘, ‘2018-12-15’, ‘1’);
(五)设计数据库加载的接口
为管理员、新闻、学科作业、班级成员分别定义一个类,并设置属性:CcUsers.class、CcNews.class、CcWorks.class、CcMembers.class。
以CcUsers.class为例,设置其属性:
public class CcUsers {
private Integer user_id;
private String username;
private String password;
public CcUsers() {
}
public Integer getUser_id() {
return this.user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username == null ? null : username.trim();
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password == null ? null : password.trim();
}
}
再分别定义UserService.class、WorkService.class、MembersService.class、NewService.class和LoadIndexService.class,设置方法实现对数据库中相应的信息表的增删改查功能。
以UserService.class为例,定义方法提供了在数据库中添加、删除、修改的功能:
public class UserService {
@Autowired
private SqlSessionTemplate sst;
public UserService() {
}
public CcUsers selectOne(CcUsers ccUsers) {
if (ccUsers.getPassword() != null) {
ccUsers.setPassword(Md5.MD5(ccUsers.getPassword()));
}
return (CcUsers)this.sst.selectOne("cn.cncsnet.mapper.ccusers.find", ccUsers);
}
public int insertAdd(CcUsers ccUsers) {
CcUsers TempUser = new CcUsers();
TempUser.setUsername(ccUsers.getUsername());
if (this.selectOne(TempUser) != null) {
return 0;
} else {
ccUsers.setPassword(Md5.MD5(ccUsers.getPassword()));
return this.sst.insert("cn.cncsnet.mapper.ccusers.save", ccUsers);
}
}
public Integer updateUser(CcUsers ccUsers) {
CcUsers temp = new CcUsers();
temp.setUsername(ccUsers.getUsername());
CcUsers ccUser = this.selectOne(temp);
int update = 0;
if (ccUser == null) {
if (ccUsers.getPassword() != null) {
System.out.println("进行复制");
ccUsers.setPassword(Md5.MD5(ccUsers.getPassword()));
}
update = this.sst.update("cn.cncsnet.mapper.ccusers.edit", ccUsers);
}
return update;
}
public PageInfo selectPage(Integer page, Integer pagesize, CcUsers ccUsers) {
PageHelper.startPage(page, pagesize);
List ccusers = this.sst.selectList("cn.cncsnet.mapper.ccusers.find", ccUsers);
PageInfo pageInfo = new PageInfo(ccusers);
return pageInfo;
}
public int deleteuser(int id) {
int delete = this.sst.delete("cn.cncsnet.mapper.ccusers.del", id);
return delete;
}
}
其中LoadIndexService.class如下所示,提供在数据库中的模糊查找功能:
public class LoadIndexService {
@Autowired
SqlSessionTemplate sst;
public LoadIndexService() {
}
public HashMap selectindex() {
HashMap data = new HashMap();
PageHelper.startPage(1, 5);
List news = this.sst.selectList("cn.cncsnet.mapper.ccnews.find");
Iterator var3 = news.iterator();
while(true) {
while(var3.hasNext()) {
CcNews temp = (CcNews)var3.next();
if (temp.getNew_name().length() > 25) {
temp.setNew_name(temp.getNew_name().substring(0, 26));
} else if (temp.getNew_name().length() members = this.sst.selectList("cn.cncsnet.mapper.ccmembers.find");
PageHelper.startPage(1, 8);
List works = this.sst.selectList("cn.cncsnet.mapper.ccworks.find");
data.put("ccmembers", members);
data.put("ccworks", works);
return data;
}
}
public PageInfo selecWork(Integer page, Integer pagesize) {
System.out.println(page + "|" + pagesize);
PageHelper.startPage(page, pagesize);
List ccwork = this.sst.selectList("cn.cncsnet.mapper.ccworks.find");
PageInfo pageinfo = new PageInfo(ccwork);
return pageinfo;
}
public PageInfo selecMember(Integer page, Integer pagesize) {
System.out.println(page + "|" + pagesize);
PageHelper.startPage(page, pagesize);
List ccmember = this.sst.selectList("cn.cncsnet.mapper.ccmembers.find");
PageInfo pageinfo = new PageInfo(ccmember);
return pageinfo;
}
public PageInfo selecNew(Integer page, Integer pagesize) {
System.out.println(page + "|" + pagesize);
PageHelper.startPage(page, pagesize);
List ccnew = this.sst.selectList("cn.cncsnet.mapper.ccnews.find");
PageInfo pageinfo = new PageInfo(ccnew);
return pageinfo;
}
编写db.properties连接数据库:
(六)设计并实现系统应用基本功能
定义MemberController.class、NewController.class、UserController.class、WorkController.class、LoadIndex.class、LoadFilter.class,在这些类中依赖于对应的Service类,调用Service类中的方法,实现对数据库的增删改查和数据列表的展示。
以UserController.class为例,实现管理员的登录和退出,增加、删除、修改管理员信息,并显示管理员列表等功能:
public class UserController {
@Autowired
private UserService userService;
public UserController() {
}
@RequestMapping(
value = {"/admin"},
method = {RequestMethod.POST},
params = {"username", "password"}
)
public String userLogin(HttpServletRequest request, CcUsers ccUsers) {
System.out.println(ccUsers.getUsername() + ccUsers.getPassword());
CcUsers ccUser = this.userService.selectOne(ccUsers);
if (ccUser == null) {
System.out.println("登陆失败");
return "redirect:admin.jsp";
} else {
System.out.println("登陆成功");
HttpSession session = request.getSession();
session.setAttribute("admin", ccUser);
return "index";
}
}
@RequestMapping(
value = {"/WEB-INF/admin/adduser"},
method = {RequestMethod.POST},
params = {"username", "password"}
)
public String addUser(CcUsers ccUsers, HttpServletResponse response) {
int rows = this.userService.insertAdd(ccUsers);
if (rows alert('添加失败,请检查用户名是否存在');history.go(-1);");
writer.close();
} catch (IOException var5) {
var5.printStackTrace();
}
return null;
} else {
return "redirect:showuser.jsp";
}
}
@RequestMapping({"/WEB-INF/admin/loginout"})
public String loginOut(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
session.removeAttribute("admin");
response.setContentType("text/html;charset=utf-8");
try {
PrintWriter writer = response.getWriter();
writer.print("top.location.href='/index.jsp'");
} catch (IOException var5) {
var5.printStackTrace();
}
return null;
}
@RequestMapping({"/WEB-INF/admin/showuser"})
public ModelAndView showUser(@RequestParam(required = true,defaultValue = "1") Integer page, @RequestParam(defaultValue = "1",required = true) Integer juan, CcUsers ccUsers) {
Integer pageSize = 5;
CcUsers tempUser = new CcUsers();
System.out.println(ccUsers.getUsername());
if (ccUsers.getUsername() != null && !ccUsers.getUsername().equals("")) {
tempUser.setUsername("%" + ccUsers.getUsername() + "%");
}
tempUser.setUser_id(ccUsers.getUser_id());
ModelAndView mlv = new ModelAndView("showuser");
PageInfo pageInfo = this.userService.selectPage(page, pageSize, tempUser);
List dateList = pageInfo.getList();
int pages = pageInfo.getPages();
long total = pageInfo.getTotal();
mlv.addObject("dateList", dateList);
mlv.addObject("pages", pages);
mlv.addObject("page", page);
mlv.addObject("pagesize", pageSize);
mlv.addObject("total", total);
mlv.addObject("condition", ccUsers);
mlv.addObject("oladstop", "ok");
mlv.addObject("juansum", pageInfo.getPages() % 5 == 0 ? pageInfo.getPages() / 5 : pageInfo.getPages() / 5 + 1);
mlv.addObject("juan", juan);
return mlv;
}
@RequestMapping(
value = {"/WEB-INF/admin/deluser"},
method = {RequestMethod.GET},
params = {"id"}
)
public String delUser(String id) {
String[] split = id.split(",");
String[] var3 = split;
int var4 = split.length;
for(int var5 = 0; var5 alert('修改失败,请检查你的内容和用户是否存在');history.go(-1);");
} catch (IOException var5) {
var5.printStackTrace();
}
return null;
} else {
return "redirect:showuser.jsp";
}
}
}
其中LoadFilter.class如下所示,验证管理员请求到达时,是否已经通过登录授权:
public class LoadFilter implements Filter {
public LoadFilter() {
}
public void destroy() {
}
- 实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)
(1)网站首页:
点击进入网站首页后,可以看见导航栏有首页、班级新闻、学科作业等在内的多项栏目,左上角轮播每日精选的图片,激励大家积极的生活态度,右上角则显示最新的班级动态,点击可以直接进入新闻界面,方便浏览信息,后续则为网站主要功能的展示板块。
(2)班级新闻板块:
以列表形式展示班级动态,点击新闻标题,进入相应的新闻详细页,内有活动图片和活动的文本内容,展示班集体的历史或者最新活动,简洁大方,方便浏览。
(2)学科作业板块:
以学科课本的图片作为点击入口,直观简洁,点击具体的作业图片会跳转到相应的学科页面,展示最新的学科作业通知以及相应的学习资料,为大家的课程学习提供便利。
(4)班级成员板块:
包括班级成员的头像、姓名、年龄、具体分工等信息,在线展示班集体成员的风貌,有利于加强同学之间的交流。
(5)后台登录页:
使用管理员用户名和密码登录。
(6)后台管理页:
有用户管理、新闻管理、作业管理、班级成员管理四大板块,实现相应的增删改查操作。
(6)用户管理页:
可以添加或者删除、查找管理员,显示管理员列表,修改管理员信息。
(7)新闻管理页:
可以添加、查找、删除新闻,修改已经发布的新闻,显示新闻列表。
其他管理界面类似
班级网页源码使用方法
首先在mysql数据库中建立一个cncsne库(也可以是别的),之后导入压缩包中的cncsnet.sql数据库文件,进入到WEB-INFclasses下找到db.properties,用记事本打开修改
Name=你的数据库名
Pass=你的数据库密码
url=你的数据库地址。
然后把压缩包中所有代码都放入tomcat的webapps/ROOT目录下,运行服务器即可
关于后台,部署好之后访问http://你的ip或域名/admin.jsp
默认默认用户名为:admin
默认密码:ningyang
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: 【2023 · CANN训练营第一季】进阶班笔记1
1.在AscendCL中,关于媒体数据处理V1版本中的内存申请/释放接口acldvppMalloc/acldvppFree: 该接口主要用于分配内存给Device侧媒体数据处理时使用,申请的大页内存满足数据处理的要求(例如,内存首地址128字节对齐)。 调用该…