本次实验项目,开发完整网站,以前只开发过前端界面,本次记录一下完整的开发过程。文末有完整源码地址。

  • 实验过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)

(一)、项目背景、需求分析及系统功能描述

项目背景

网络在我们日常生活中的地位日益增长,给我们的工作生活提供了极大的便利。如今,在大学的学习生活中,由于班级人数较多、而个人的课程较为分散,给班级日常工作带来了一定的困难:例如,班委会成员和老师在班级管理等方面的工作量较大、工作效率不高;而且一些关于班级活动的信息发布零散不系统、更新不及时,交互性差,同学们的相互交流欠缺等。应学校班级师生的需求,我们提出建设一个面向班集体所有成员的班级信息管理网站,做到信息的规范管理、科学统计和快速查询,给大家一个相互交流、获取信息、展示班级风貌的平台,同时也提高班委会成员和老师处理班级管理事务的工作效率,实现班级的系统化、流程化管理,记录下大家大学四年的点滴成长。

需求分析

  1. 班委会和老师:作为班级的日常管理者,可以不定时发布新闻、作业通知等信息给班级成员,即时获取并管理班集体成员的所有个人资料,统计数据;
  2. 普通学生:查看班级历史活动,浏览获取最新新闻资讯、学院通知,查看学科作业、下载最新课程资料,查看其他班级成员信息在线交互。

系统功能描述

  1. 班委会成员和老师作为班级工作的日常管理者,设置为班级建设网站的管理员,登录管理后台,可以不定时发布学院通知、作业要求,上传活动信息,实现对班级成员信息和事务信息的增删改查,添加或者删除管理员,维护网站系统及硬件设施;
  2. 其他学生作为普通用户,可以访问班级管理网站,获取最新的作业信息、新闻,浏览班级活动历史信息等。

(二)、数据库概念设计

分析实体之间的联系,确定实体之间的关系,画出ER图如下所示:

班级网站开发_web开发 数据库应用

(三)、数据库逻辑设计

本次课设涉及的基本表包括:班级成员信息数据表cc_members、班级新闻数据表cc_news、后台管理员信息表cc_users、班级作业信息表cc_works共四个。

(1)班级成员信息数据表cc_members, 各字段名称及数据类型如图(包含成员学号、姓名、年龄、头像以及相应的工作),使用InnoDB存储引擎,自增初始值为1,主键为member_id。

班级网站开发_数据类型_02

(2)班级新闻数据表cc_news,各字段名称及数据类型如图所示(包括新闻编号、标题、文本、日期、发布者等),主键为new_id,定义外键约束 CONSTRAINT `cc_news_new_member` FOREIGN KEY (`new_member`) REFERENCES `cc_users` (`user_id`)。

班级网站开发_web开发 数据库应用_03

(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`)。

班级网站开发_数据类型_04

(四)设计生成该数据库的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', '关于第一次班会会召开问题,特批此通知', '<p>任公曰:造成今日之老大中国者,则中国老朽之冤业也。!</p>', '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', '<p>编译原理请按时完成网络平台测试</p>', '2018-12-15', '1');

INSERT INTO `cc_works` VALUES ('2', '操作系统', '/img/work/2.jpg', '<p>操作系统考试在即</p>', '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<CcUsers> selectPage(Integer page, Integer pagesize, CcUsers ccUsers) {
        PageHelper.startPage(page, pagesize);
        List<CcUsers> ccusers = this.sst.selectList("cn.cncsnet.mapper.ccusers.find", ccUsers);
        PageInfo<CcUsers> 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<String, Object> selectindex() {
        HashMap<String, Object> data = new HashMap();
        PageHelper.startPage(1, 5);
        List<CcNews> 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() < 25) {
                    int i = 25 - temp.getNew_name().length();
 
                    for(int j = 0; j < i; ++j) {
                        temp.setNew_name(temp.getNew_name() + " ");
                    }
                }
            }
 
            data.put("ccnews", news);
            PageHelper.startPage(1, 8);
            List<CcMembers> members = this.sst.selectList("cn.cncsnet.mapper.ccmembers.find");
            PageHelper.startPage(1, 8);
            List<CcWorks> works = this.sst.selectList("cn.cncsnet.mapper.ccworks.find");
            data.put("ccmembers", members);
            data.put("ccworks", works);
            return data;
        }
    }
 
    public PageInfo<CcWorks> selecWork(Integer page, Integer pagesize) {
        System.out.println(page + "|" + pagesize);
        PageHelper.startPage(page, pagesize);
        List<CcWorks> ccwork = this.sst.selectList("cn.cncsnet.mapper.ccworks.find");
        PageInfo<CcWorks> pageinfo = new PageInfo(ccwork);
        return pageinfo;
    }
 
    public PageInfo<CcMembers> selecMember(Integer page, Integer pagesize) {
        System.out.println(page + "|" + pagesize);
        PageHelper.startPage(page, pagesize);
        List<CcMembers> ccmember = this.sst.selectList("cn.cncsnet.mapper.ccmembers.find");
        PageInfo<CcMembers> pageinfo = new PageInfo(ccmember);
        return pageinfo;
    }
 
    public PageInfo<CcNews> selecNew(Integer page, Integer pagesize) {
        System.out.println(page + "|" + pagesize);
        PageHelper.startPage(page, pagesize);
        List<CcNews> ccnew = this.sst.selectList("cn.cncsnet.mapper.ccnews.find");
        PageInfo<CcNews> pageinfo = new PageInfo(ccnew);
        return pageinfo;
}

编写db.properties连接数据库:

班级网站开发_数据类型_05

(六)设计并实现系统应用基本功能

定义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 < 1) {
            try {
                PrintWriter writer = response.getWriter();
                writer.print("<script type='text/javascript'>alert('添加失败,请检查用户名是否存在');history.go(-1);</script>");
                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("<script type='text/javascript'>top.location.href='/index.jsp'</script>");
        } 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<CcUsers> pageInfo = this.userService.selectPage(page, pageSize, tempUser);
        List<CcUsers> 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 < var4; ++var5) {
            String str = var3[var5];
            Integer Id = new Integer(str);
            this.userService.deleteuser(Id);
        }
 
        return "showuser";
    }
 
    @RequestMapping(
        value = {"/WEB-INF/admin/edituser"},
        method = {RequestMethod.GET},
        params = {"id"}
    )
    public ModelAndView edit(Integer id) {
        CcUsers ccUsers = new CcUsers();
        ccUsers.setUser_id(id);
        CcUsers ccUser = this.userService.selectOne(ccUsers);
        ModelAndView mlv = new ModelAndView("edituser");
        mlv.addObject("data", ccUser);
        return mlv;
    }
 
    @RequestMapping(
        value = {"/WEB-INF/admin/edituser"},
        method = {RequestMethod.POST}
    )
    public String editvalue(CcUsers ccUsers, HttpServletResponse response) {
        Integer rows = this.userService.updateUser(ccUsers);
        if (rows < 1) {
            response.setContentType("text/html;charset=utf-8");
 
            try {
                PrintWriter writer = response.getWriter();
                writer.print("<script type='text/javascript'>alert('修改失败,请检查你的内容和用户是否存在');history.go(-1);</script>");
            } 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)网站首页:

点击进入网站首页后,可以看见导航栏有首页、班级新闻、学科作业等在内的多项栏目,左上角轮播每日精选的图片,激励大家积极的生活态度,右上角则显示最新的班级动态,点击可以直接进入新闻界面,方便浏览信息,后续则为网站主要功能的展示板块。

班级网站开发_数据库_06

(2)班级新闻板块:

以列表形式展示班级动态,点击新闻标题,进入相应的新闻详细页,内有活动图片和活动的文本内容,展示班集体的历史或者最新活动,简洁大方,方便浏览。

班级网站开发_数据类型_07

(2)学科作业板块:

以学科课本的图片作为点击入口,直观简洁,点击具体的作业图片会跳转到相应的学科页面,展示最新的学科作业通知以及相应的学习资料,为大家的课程学习提供便利。

班级网站开发_数据库_08

(4)班级成员板块:

   包括班级成员的头像、姓名、年龄、具体分工等信息,在线展示班集体成员的风貌,有利于加强同学之间的交流。

 

(5)后台登录页:

使用管理员用户名和密码登录。

班级网站开发_数据库_09

(6)后台管理页:

有用户管理、新闻管理、作业管理、班级成员管理四大板块,实现相应的增删改查操作。

班级网站开发_数据库_10

(6)用户管理页:

可以添加或者删除、查找管理员,显示管理员列表,修改管理员信息。

班级网站开发_web开发 数据库应用_11

班级网站开发_List_12

(7)新闻管理页:

   可以添加、查找、删除新闻,修改已经发布的新闻,显示新闻列表。

班级网站开发_web开发 数据库应用_13

其他管理界面类似

班级网页源码使用方法

首先在mysql数据库中建立一个cncsne库(也可以是别的),之后导入压缩包中的cncsnet.sql数据库文件,进入到WEB-INF\classes下找到db.properties,用记事本打开修改

Name=你的数据库名

Pass=你的数据库密码

url=你的数据库地址。

然后把压缩包中所有代码都放入tomcat的webapps/ROOT目录下,运行服务器即可

关于后台,部署好之后访问http://你的ip或域名/admin.jsp

默认默认用户名为:admin

默认密码:ningyang