目录
答辩作品
流程
- 获取工作室论坛的网址,用python爬虫爬取需要获取的数据,存入数据库中
- 在后台录入工作室成员的个人信息
- 将爬取的信息和工作室成员信息匹配,对应存储到个人
- 在后台界面中以表格、折线图的形式分别展示爬取的数据
- 个人的签到、回帖汇总信息在模态框中详细展示
- 手动选择时间,以折线图的形式展示每组每周平均签到次数以及个人每周的总签到次数
数据库设计
[成员个人主页信息表]
[帖子表]
[成员周签到详情表]
数据库只是暑期培训的时候才接触,学了最基础的一些知识,自己上手做项目设计数据库建表时开始想的太简单了,后期做的时候出了很多问题就一直删删改改,之后慢慢理解了建库建表的一些逻辑知识。
[经验总结]:
1.建表时现将每一个功能实现需要的信息写下来,然后分析这些信息直接的关系(一对一/一对多/多对多),最后根据一对一/一对多/多对多的关系建立各个表之间的联系;
2.先在纸上模拟好了再开始建库建表!!!
3.错误想法:在有关联的表里增加重复的字段->看起来好像方便了很多,其实是多余的!!
//mysql
DROP TABLE IF EXISTS `post`;
CREATE TABLE `post` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
`title` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '帖子标题',
`uid` int(11) NOT NULL COMMENT '主表中的用户ID',
`time` timestamp(0) NOT NULL COMMENT '发帖时间',
`link` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '帖子链接地址',
`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '帖子内容',
`group` int(11) NOT NULL COMMENT '组别1表示开发组,2表示硬件组',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 43 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
......
后台页面
// 展示用户汇总的签到回帖信息
public String alluserinfo(@RequestBody int gid) throws ParseException {
List<Result> list = new ArrayList<Result>();
List<User> users = new ArrayList<User>();
if (gid == 0) {
users = userService.findAll();
} else {
users = userService.findByGroupID(gid);
}
for (User user : users) {
Result result = new Result();
result.setUid(user.getId());
result.setRealname(user.getRealName());
result.setSex(user.getSex());
Group group = groupService.selectByGid(new Integer(user.getGroupId()));
ArrayList<String> timelen = setTimme();
if (group != null) {
result.setGroupName(group.getGroupName());
Sign sign = signService.findByUidAndTimeRange(user.getId(), timelen.get(0));
int sumsigned = 0;
if (sign != null) {
UserSignInfo userSignInfo = userSignInfoService.selectByPrimaryKey(sign.getSid());
if (userSignInfo != null) {
sumsigned = calSum(userSignInfo);
if (sumsigned >= group.getSignStandard()) {
result.setIfsign(1);
} else {
result.setIfsign(0);
}
}
}
}
List<String> timelen2 = getPostTimeRange();
if (userPostInfoService.selectByUid(result.getUid(), timelen2.get(0), timelen2.get(1)) != null) {
result.setIfpost(1);
} else {
result.setIfpost(0);
}
list.add(result);
}
return new Gson().toJson(list);
}
public int calSum(UserSignInfo userSignInfo){
int sumsigned;
sumsigned = userSignInfo.getMon1() + userSignInfo.getMon2() + userSignInfo.getMon3() +
userSignInfo.getTue1() + userSignInfo.getTue2() + userSignInfo.getTue3() +
userSignInfo.getWed1() + userSignInfo.getWed2() + userSignInfo.getWed3() +
userSignInfo.getThu1() + userSignInfo.getThu2() + userSignInfo.getThu3() +
userSignInfo.getFri1() + userSignInfo.getFri2() + userSignInfo.getFri3() +
userSignInfo.getSat1() + userSignInfo.getSat2() + userSignInfo.getSat3() +
userSignInfo.getSun1() + userSignInfo.getSun2() + userSignInfo.getSun3();
return sumsigned;
}
// 展示用户汇总的签到回帖信息
public String fresult(@RequestBody String name) throws ParseException {
List<Result> list = new ArrayList<>();
List<User> users;
users = userService.findByRealName(name);
ArrayList<String> timelenth = mondayController.setTime();
for (int i = 0; i < users.size(); i++) {
User user = users.get(i);
Result result = new Result();
result.setUid(user.getId());
result.setRealname(user.getRealName());
result.setSex(user.getSex());
Group group = groupService.selectByGid(new Integer(user.getGroupId()));
if (group != null) {
result.setGroupName(group.getGroupName());
Sign sign = signService.findByUidAndTimeRange(user.getId(),timelenth.get(0));
if (sign!=null){
UserSignInfo userSignInfo = userSignInfoService.selectByPrimaryKey(sign.getSid());
Integer sumsigned = calSum(userSignInfo);
if (sumsigned < group.getSignStandard()) {
result.setIfsign(0);
} else {
result.setIfsign(1);
}
}
}
List<String> posttime=getPostTimeRange();
if (userPostInfoService.selectByUid(result.getUid(), posttime.get(0), posttime.get(1)) != null) {
result.setIfpost(1);
} else {
result.setIfpost(0);
}
list.add(result);
}
return new Gson().toJson(list);
}
左侧菜单栏在页面缩放后隐藏,顶部下拉菜单显现
<!--html-->
<header class="navbar-wrapper">
<div class="navbar navbar-fixed-top">
<div class="container-fluid cl">
<a class="logo navbar-logo f-l mr-10 hidden-xs" href="#">启明星签到回帖统计系统</a>
<a class="logo navbar-logo-m f-l mr-10 visible-xs" href="#">启明星签到回帖统计系统</a>
<a aria-hidden="false" class="nav-toggle Hui-iconfont visible-xs" href="#"></a>
<span id="toptime" class="logo navbar-slogan f-l mr-10 hidden-xs" ></span>
<nav id="Hui-userbar" class="nav navbar-nav navbar-userbar hidden-xs">
<ul class="cl">
<li th:switch="${session.admin.identity}">
<span