计算机与信息学院
《软件项目实训(校企)》
报 告
开课学期: 2022年秋学期
专 业: 计算机科学与技术
网选班号: 1班
指导教师: 李碧涛
组 号: 12
学生信息 | 学号 | 姓名 | 贡献量(%) |
---|---|---|---|
组长 | 2020112617 | 喻鑫锐 | 25 |
组员 | 2020112433 | 魏天宇 | 25 |
组员 | 2020112402 | 李林蔚 | 25 |
组员 | 2020112608 | 张成钊 | 25 |
一、课程设计任务
本项目是一个知识分享的平台。知识可以免费分享,也可以以付费的方式分享。平台主要功能有:用户登录、用户注册,除了对数据基本的增删改查以外,还包含创建星球、查看他人的星球,在各个知识板块下分享、讨论相关问题,可以对他人的问题进行回复评论等业务。同时,还可以对自己发布的相关动态设置查阅权限。后续如果需要,可以推出付费会员制,会员可以查阅更多的内容等等。
知识付费成为热点话题,从百度百科上来看简单的发展历程。
从2016年开始,一系列标志性的事件让内容付费渐渐成为时尚 。2016年5月15日,付费语音问答平台——“分答”上线。通过这一平台,你可以快速地找到能给自己提供帮助的那个人,用一分钟时间为你答疑解惑,很多名人和各领域的专家也都加入分答付费问答模式。随后,罗辑思维创始人罗振宇全力打造“得到APP”,喜马拉雅FM创办知识付费节”123知识狂欢节”,知乎上线知乎live等等。
2017年,知识付费行业持续升温,付费用户数增长100%,市场规模增长高达227.2%,达到86.7亿元。2018年我国知识付费市场增速回落,但仍维持在91.2%,产业规模达到165.8亿元;用户规模为2.7亿人,同比增长44.7%。2019年知识付费用户规模将达3.87亿人,产值250亿。预计2020年,市场将规模达到350亿,用户数4亿左右。
目前来看,在知识付费行业内,产品形态和商业模式很多,而且都能占据一定的市场份额。不过,在整个市场上仍然没有诞生滴滴这样的绝对领军企业,更别说BAT这样的垄断性行业巨头。
因此,作为一个比较新的产品形态,还有很大成长空间。但在这行业内,头部企业平台更完善,用户基数大,在吸引优质资源及购买知识版权时,也有更大的议价空间和筹码。因为知识版权是具有独一性和排他性的,这就代表这行业是一个零和竞争行业,头部的企业会占据行业80%的优质资源和吃掉行业80%的利润。并且,这种格局之下,先入局者会天然形成累积优势,并不断压榨后入者的生存空间。
二、需求分析
2.1 Soft function 软件功能
2.2 Functional Requirements 功能需求
UI Model Use Case Diagram UI模块用例图(制作原型图)
2.2.1 Use Case1 用户登录模块
该界面主要实现登录功能,访问者必须输入帐号密码,点击登录时,前端的请求会调用后台的登录接口,进而调用dao层方法,然后在数据库中的用户表中进行查找,若有匹配的用户,则登录成功,然后跳转到主页面;否则提示用户不存在,进而无法登录。
2.2.2 Use Case2 主页面
该界面主要用于展示资源信息,可以对资源进行相应的筛选,比如Java相关资源,按点赞量进行排序,按最新发布的进行排序等等。还可以筛选出免费的资源或者是付费的资源。
前端的请求会调用后台的查询接口,进而调用dao层方法,然后在数据库中的资源表中按照指定的方式进行筛选数据。还会用到多表查询子查询等操作。
2.2.3 Use Case3 用户个人中心
该界面主要用于展示用户的基本信息,用户可以通过编辑来修改个人的信息。
前端的请求会调用后台的修改接口,进而调用dao层方法,然后在数据库中的资源表中按照指定的方式进行选出指定的数据,然后对改数据进行修改并重新存入数据库中。
2.2.4 Use Case4 用户收藏界面
该界面主要用于展示用户收藏的相关资源,可以查看收藏的资源,也可以取消收藏的资源。
前端的请求会调用后台的检索和修改接口,进而调用dao层方法,然后在数据库中的资源表中按照指定的方式进行选出指定的资源进行查看,也可以删除收藏表中对应的数据来取消收藏。
2.2.5 Use Case5 用户推荐记录界面
该界面用于记录用户满足别人心愿时推荐的资源。每当用户满足别人心愿时,推荐记录表就会增加对应的数据。
前端的请求会调用后台的添加接口,进而调用dao层方法,然后在数据库中的推荐记录表中存入对应的资源推荐记录。
2.2.6 Use Case6 用户心愿界面
该界面用于记录用户自己发布的心愿以及心愿是否被别人满足的情况。
前端的请求会调用后台的添加接口,进而调用dao层方法,然后在数据库中的心愿记录表中存入对应的心愿记录。当有人满足对应心愿的时候,会修改数据库中指定字段的数据,将心愿的满足情况改为已满足。
2.2.7 Use Case7 资源界面
该界面用于展示按照不同标签分类的资源信息,更方便用户对资源进行检索,大大提高用户对资源查询的效率。
前端的请求会调用后台的检索接口,进而调用dao层方法,然后在数据库中的资源表中按照指定的标签对数据进行分类检索,然后对检索出的数据进行分页操作。
2.2.8 Use Case8 资源评论界面
该界面用于展示用户在指定资源下的评论消息以及他人的回复情况。
前端的请求会调用后台的添加接口,进而调用dao层方法,然后在数据库中的资源表中按照指定的标签对数据进行分类检索,然后对检索出的数据进行分页操作。
2.2.9 Use Case9 世界评论角界面
该界面用于展示用户在一起讨论交流的信息。
前端的请求会调用后台的添加接口,进而调用dao层方法,然后在数据库中的评论表中添加用户发表的评论信息。
2.3 Performance Requirements 非功能需求
2.3.1 UI Requirements界面要求
- 使用vue3有响应式布局的效果
-
2.3.2 Development Environment 开发环境
开发工具:IntelliJ IDE2021
- 开发语言:Java
-
2.3.3 Development Rules开发规范
统一风格的命名规范(变量名、类名、素材文件名)
- 适当的异常处理
- 重难点代码进行注释
- 关键操作使用日志管理
使用Git + Github进行协同开发,大大提高了开发效率
2.4 需求分级
2.4.1 用户模块
以进行登录和注册,每个用户都有一定的积分,在进行一些操作时候会有积分奖励。
- 用户可以对自己的资料进行配置和修改。
- 用户可以查询一些信息,比如:自己的收藏记录,知识分享记录,查看自己的心愿,查询积分记录。
- 后台需要对用户进行增删改查操作。
- 后台需要对用户进行一定的检索功能,比如根据用户的个人介绍进行查找,根据用户的标签查找。
用户每日登录都可以获得一定的积分,发布资源、知识,或者帮助别人完成心愿,都可以获得一定的积分。
2.4.2 知识管理模块
用户可以发布知识和资源,并设置资源是否付费,付费资源需要访问密码才可以进行访问。
- 用户可以对资源进行收藏,可以查看个人的收藏列表,也可以取消收藏。
- 用户可以对资源进行基本的增删改查操作。
- 用户可以对资源进行相应的检索,筛选出自己需要的资源。
用户可以根据标签检索资源,并按照点赞量或发布时间进行排序,也可以同时筛选出付费资源或者时免费资源。
2.4.3 心愿墙模块
用户可以发表自己的心愿。
- 用户可以对自己的心愿进行基本的增删改查操作。
- 用户可以根据心愿的内容以及心愿的标签来检索心愿。
-
2.4.4评论模块
资源评论
用户可以在别人发布的资源下面进行评论。
- 用户可以查看资源下面的评论。
-
世界评论角
所有用户可以一起在评论角进行讨论交流。
- 用户可以回复其他人的评论。
三、概要设计
3.1 系统功能设计
平台主要功能有:用户登录、用户注册,除了对数据基本的增删改查以外,还包含创建星球、查看他人的星球,在各个知识板块下分享、讨论相关问题,可以对他人的问题进行回复评论等业务。同时,还可以对自己发布的相关动态设置查阅权限。后续如果需要,可以推出付费会员制,会员可以查阅更多的内容等等。
3.2 系统架构设计
架构介绍
本项目采用SpringCloud分布式微服务的架构方式,将系统拆分成各个独立的微服务,而微服务之间可以互相隔离,其优势在于便于团队各个成员之间分工合作,并且对于后续的维护有很大的方便之处。其各个层次之间的关系如下图所示,网关层用于对用户的权限进行鉴别,并且对恶意攻击、请求进行拦截。redis层用于存放一些缓存数据,作为数据库的前置缓存,缓解数据库的压力。在微服务前端还设置了Hystrix熔断器,减少出现服务雪崩的概率。各个微服务之间通过OpenFeign进行调用。最后,所有的数据都存放在MySQL数据库中进行保存。
3.3 Database数据库设计
3.3.1表关系
3.3.2数据表设计
本项目数据库一共包含有14张表,其表结构如下表格所示。
项目所有数据库表见表3.1
表名 | 功能说明 |
---|---|
t_collect_lists | 资源收藏表 |
t_comments | 知识评论表 |
t_comments_platform | 评论标签表 |
t_labels | 标签表 |
t_labels_users | 用户标签表 |
t_label_category | 标签目录表 |
t_replies | 评论回复表 |
t_resources | 知识表 |
t_resources_labels | 资源标签表 |
t_score_list | 用户积分表 |
t_users | 用户表 |
t_wishes | 心愿表 |
t_wishes_labels | 心愿标签表 |
t_wish_reply_list | 满足心愿表 |
表3.1 所有数据表
表t_collect_lists
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
---|---|---|---|---|---|---|---|---|
1 | id | int | 10 | 0 | N | Y | 主键编号 | |
2 | uid | int | 10 | 0 | Y | N | 用户id | |
3 | resource_id | int | 10 | 0 | Y | N | 关联的资源/知识的id | |
4 | create_time | datetime | 19 | 0 | Y | N | 收藏时间 |
表t_comments
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
---|---|---|---|---|---|---|---|---|
1 | id | int | 10 | 0 | N | Y | 主键编号 | |
2 | content | varchar | 255 | 0 | Y | N | 评论内容 | |
3 | collect | int | 10 | 0 | Y | N | 点赞量 | |
4 | resource_id | int | 10 | 0 | Y | N | 关联的资源/知识的id | |
5 | user_id | int | 10 | 0 | Y | N | 关联的用户id | |
6 | publish_time | datetime | 19 | 0 | Y | N | 发布时间 |
表t_comments_platform
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
---|---|---|---|---|---|---|---|---|
1 | id | int | 10 | 0 | N | Y | 评论编号 | |
2 | content | varchar | 255 | 0 | Y | N | 评论内容 | |
3 | user_id | int | 10 | 0 | Y | N | 评论发布人 | |
4 | publish_time | datetime | 19 | 0 | Y | N | 发布时间 |
表t_labels
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
---|---|---|---|---|---|---|---|---|
1 | id | int | 10 | 0 | N | Y | 主键id | |
2 | name | varchar | 255 | 0 | Y | N | 名称 | |
3 | category_id | int | 10 | 0 | Y | N | 标签种类id |
表t_labels_users
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
---|---|---|---|---|---|---|---|---|
1 | user_id | int | 10 | 0 | Y | N | 用户编号 | |
2 | label_id | int | 10 | 0 | Y | N | 标签编号 |
表t_label_category
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
---|---|---|---|---|---|---|---|---|
1 | id | int | 10 | 0 | N | Y | 主键id | |
2 | name | varchar | 30 | 0 | N | N | 标签名 | |
3 | icon_name | varchar | 30 | 0 | Y | N | 图标名 |
表t_replies
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
---|---|---|---|---|---|---|---|---|
1 | id | int | 10 | 0 | N | Y | 主键id | |
2 | content | varchar | 255 | 0 | Y | N | 回复内容 | |
3 | publish_time | datetime | 19 | 0 | Y | N | 发布时间 | |
4 | last_reply_id | int | 10 | 0 | Y | N | 上一级回复的编号 | |
5 | user_id | int | 10 | 0 | Y | N | 关联的用户id | |
6 | comment_id | int | 10 | 0 | Y | N | 关联的评论id |
表t_resources
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
---|---|---|---|---|---|---|---|---|
1 | id | int | 10 | 0 | N | Y | 主键id | |
2 | name | varchar | 255 | 0 | Y | N | 名称 | |
3 | description | varchar | 255 | 0 | Y | N | 资源/知识描述 | |
4 | link | varchar | 255 | 0 | Y | N | 资源链接 | |
5 | icon | varchar | 255 | 0 | Y | N | 资源头像 | |
6 | content | varchar | 255 | 0 | Y | N | 资源内容的描述 | |
7 | collect | int | 10 | 0 | Y | N | 收藏量 | |
8 | is_paid | bit | 1 | 0 | Y | N | 免费or付费 | |
9 | password | varchar | 255 | 0 | Y | N | 随机密码 | |
10 | user_id | int | 10 | 0 | Y | N | 用户名 | |
11 | release_time | datetime | 19 | 0 | Y | N | 资源发布时间 |
表t_resources_labels
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
---|---|---|---|---|---|---|---|---|
1 | resource_id | int | 10 | 0 | Y | N | 资源编号 | |
2 | label_id | int | 10 | 0 | Y | N | 标签编号 |
表t_score_list
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
---|---|---|---|---|---|---|---|---|
1 | id | int | 10 | 0 | N | Y | 主键id | |
2 | uid | int | 10 | 0 | Y | N | 用户id | |
3 | score | int | 10 | 0 | N | N | 获得积分 | |
4 | create_time | datetime | 19 | 0 | Y | N | 获得积分时间 | |
5 | desc | varchar | 60 | 0 | Y | N | 获得积分描述 |
表t_users
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
---|---|---|---|---|---|---|---|---|
1 | uid | int | 10 | 0 | N | Y | 用户编号 | |
2 | username | varchar | 255 | 0 | N | N | 用户名 | |
3 | password | varchar | 255 | 0 | N | N | 密码 | |
4 | salt | varchar | 255 | 0 | N | N | 密码盐值 | |
5 | gender | char | 1 | 0 | Y | N | 男 | 性别 |
6 | varchar | 255 | 0 | N | N | 邮箱 | ||
7 | avatar | varchar | 255 | 0 | Y | N | 头像的url | |
8 | score | int | 10 | 0 | N | N | 0 | 积分 |
9 | description | varchar | 255 | 0 | Y | N | 个人介绍 |
表t_wishes
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
---|---|---|---|---|---|---|---|---|
1 | id | int | 10 | 0 | N | Y | 心愿编号 | |
2 | content | varchar | 255 | 0 | Y | N | 心愿内容 | |
3 | user_id | int | 10 | 0 | Y | N | 发布人编号 | |
4 | publish_time | datetime | 19 | 0 | Y | N | 发布时间 | |
5 | is_finished | bit | 1 | 0 | Y | N | 是否被满足 |
表t_wishes_labels
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
---|---|---|---|---|---|---|---|---|
1 | wish_id | int | 10 | 0 | Y | N | 心愿编号 | |
2 | label_id | int | 10 | 0 | Y | N | 标签编号 |
表t_wish_reply_list
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
---|---|---|---|---|---|---|---|---|
1 | id | int | 10 | 0 | N | Y | 心愿编号 | |
2 | avatar | varchar | 255 | 0 | Y | N | 头像 | |
3 | content | varchar | 255 | 0 | Y | N | 内容 | |
4 | publish_time | datetime | 19 | 0 | Y | N | 发布时间 | |
5 | username | varchar | 255 | 0 | Y | N | 用户名 | |
6 | resource_id | int | 10 | 0 | Y | N | 资源id | |
7 | wish_id | int | 10 | 0 | Y | N | 心愿id |
四、详细设计
4.1 User Model Design 用户模块
4.1.1 用户登录、注册
4.1.1.1 登录:
1. 用户输入用户名和密码。
2. 后台通过输入的用户名查出对应加密后的密码和盐值。
3. 对盐值进行MD5解密,并对输入的密码使用相同的加密方式进行加密。
4. 判断两段密码是否匹配,如果匹配则证明登录成功,反之密码错误,登录失败。
4.1.1.2 注册:
1. 用户输入用户名、密码、邮箱。
2. 判断用户名是否重复,未重复则进入下一步。
3. 对输入的密码进行加密操作,并保存到数据库中,表示注册成功。
4.1.2 通过邮箱找回密码
- 通过发送邮件的接口,将验证码发送到邮箱中。
- 用户输入用户名、新密码和验证码。
- 判断验证码是否正确,如果正确则进入下一步。
- 重新生成新的盐值,并对新密码进行加密。
- 保存数据到数据库中。
4.1.3 查询相关信息
通过SpringData JPA的相关API完成单表和多表之间的查询,从而查询出各个与用户相关的信息4.1.4 获取积分
用户发布资源或每日登录都可以获取一定的积分。
4.2 Resource Model Design 资源模块
- 发布资源:用户个人可以向本平台发布、推荐一些优秀的资源,填写好标题、描述、内容以及上传好与资源对应的图片logo之后,经过管理员审核后,资源便可公开在本平台中,与他人共享。如果是付费资源,那么在分享资源的时候,会设置对应的密码,只有拥有密码的用户才能够进行查看。
- 查看资源:用户可在本平台查看到其他人分享的一些免费资源,也可以进行付费,查看付费资源。
- 评论资源:可对他人发布的资源进行评论。
4.3 Wish Model Design 心愿墙模块
- 发布心愿:如果未发现自己需要的、合适的资源,那么可以在本平台上发布心愿,等待他人帮助完成心愿。
- 查看心愿:可以对他人发布的心愿进行查看。
- 帮助完成心愿:查看他人心愿的同时,如果正好有合适的资源,也可以帮助他人完成心愿,来获取平台奖励的积分。
4.4 Discuss Model Design 讨论角模块
4.5 Rank Model Design 积分榜单模块
在本平台中,用户的一些行为都会触发奖励机制,比如每日签到、发布资源、回复评论、帮助他人完成心愿等等。依据积分奖励制度,本平台还提供了积分榜单模块,可以查看总积分榜、积分周榜、积分月榜等等,从而鼓励大家更多的进行交流,促进知识共享。
4.6 Class Design 类详细设计
4.6.1 IUsersEntity 用户类
4.6.1.1 OverView 简介
4.6.1.2 Class Diagram 类图
4.6.1.3 Attributes 属性
4.6.1.4 Methods 方法
4.6.2 IWishesEntity 用户心愿类
4.6.2.1 OverView 简介
4.6.2.2 Class Diagram 类图
4.6.2.3 Attributes 属性
4.6.2.4 Methods 方法
4.6.3 IResourcesEntity 资源类
4.6.3.1 OverView 简介
4.6.3.2 Class Diagram 类图
4.6.3.3 Attributes 属性
4.6.3.4 Methods 方法
4.6.4 ICommentsEntity 评论类
4.6.4.1 OverView 简介
4.6.4.2 Class Diagram 类图
4.6.4.3 Attributes 属性
4.6.4.4 Methods 方法
4.6.5 IUsersEntity 标签类
4.6.5.1 OverView 简介
4.6.5.2 Class Diagram 类图
4.6.5.3 Attributes 属性
4.6.5.4 Methods 方法
4.6.6 IRepliesEntity 回复类
4.6.6.1 OverView 简介
4.6.6.2 Class Diagram 类图
4.6.6.3 Attributes 属性
4.6.6.4 Methods 方法
五、系统实现
完成以上过程后,即可进行平台的开发。我们选择了VScode、IntelliJ IDEA等开发工具和vue3、spring cloud实现开发。严格按照框架约束和要求,遵循命名规范,对代码进行优化、抽取和封装,最终完成一个高性能的资源分享平台。
5.1 开发环境搭建
5.1.1 下载node.js
点击安装,选择自己要安装的路径,window+R,输入cmd,打开命令提示符窗口,输入
- node -v
- npm -v
5.1.2 改变原有的环境变量
1、首先配置npm的全局模块的存放路径、cache的路径,此处我选择放在:D:\node-v10.14.2-x64
依次输入如下命令:
npm config set prefix “D:\node-v10.14.2-x64\node_global”
npm config set cache “D:\node-v10.14.2-x64\node_cache”
2、在命令行输入以下命令安装express,express是node官方唯一推荐的一个web框架,提供很多基础方便的功能。(注:“-g”表示安装到global目录下,即设置的node_global中)
npm install express -g
可以看到node_global/node_modules下有express了,如图:
3、在系统环境变量添加NODE_PATH,输入路径为: D:\node-v10.14.2-x64\node_global\node_modules
操作如下:我的电脑右击,打开属性->高级系统设置->环境变量->新建(系统变量下)->输入变量名NODE_PATH->变量值:通过“浏览目录”输入上面路径,确定即可。
注:使用NPM命令:
- 下载三方库:npm install vue —save (vue是库名称 —save是保存,这里的横线是2个 —save也可以简写成-S)
- 全局安装bower:npm install bower –g
- 使用bower info 可以查看库的版本:bower info vue
- 下载指定版本的库:npm install vue@2.1.0 (vue是库名称+@符号+版本号)
pom.xml文件配置图如下:
5.2 登陆模块实现
登陆界面采用vue3+js+css来具体实现,效果如图所示:
5.3 主要模块的实现
平台的主要模块有:主页、资源、世界和个人。页面效果如图所示:
六、成员分工及贡献量
6.1 喻鑫锐分工及贡献量(25%)
整体模块 | 具体子模块 | 完成情况 |
---|---|---|
用户模块 | 用户注册模块 | 100%完成 |
用户模块 | 用户登录模块 | 100%完成 |
用户模块 | 发送验证码模块 | 100%完成 |
用户模块 | 找回密码模块 | 100%完成 |
用户模块 | 修改用户信息模块 | 100%完成 |
用户模块 | 通过编号查询用户模块 | 100%完成 |
用户模块 | 根据姓名模糊查询模块 | 100%完成 |
通用模块 | 获取所有标签(分类)模块 | 100%完成 |
通用模块 | 获取所有标签(不分类)模块 | 100%完成 |
心愿墙模块 | 查询心愿列表模块 | 100%完成 |
心愿墙模块 | 查询用户发布的心愿模块 | 100%完成 |
心愿墙模块 | 发布心愿模块 | 100%完成 |
心愿墙模块 | 删除心愿模块 | 100%完成 |
前端“世界”模块 | 心愿墙界面 | 100%完成 |
前端“世界”模块 | 找伙伴界面 | 100%完成 |
前端“世界”模块 | 讨论角界面 | 100%完成 |
前端“世界”模块 | 激励榜界面 | 100%完成 |
文档 | 系统设计说明书 | 100%完成 |
文档 | 各模型原型图 | 100%完成 |
6.2 魏天宇分工及贡献量(25%)
整体模块 | 具体子模块 | 完成情况 |
---|---|---|
知识管理模块 | 发布资源模块 | 100%完成 |
知识管理模块 | 修改资源模块 | 100%完成 |
知识管理模块 | 删除资源模块 | 100%完成 |
知识管理模块 | 通过用户id查找资源模块 | 100%完成 |
知识管理模块 | 资源付费设置模块 | 100%完成 |
知识管理模块 | 标签检索资源模块 | 100%完成 |
知识管理模块 | 用户收藏资源模块 | 100%完成 |
知识管理模块 | 通过id取消收藏资源模块 | 100%完成 |
知识管理模块 | 通过用户id和资源id 取消收藏资源模块 |
100%完成 |
知识管理模块 | 查询用户收藏列表模块 | 100%完成 |
知识管理模块 | 查询指定标签下的资源个数模块 | 100%完成 |
知识管理模块 | 按条件查询所有资源模块 | 100%完成 |
知识管理模块 | 根据id查询资源信息模块 | 100%完成 |
文档 | 需求分析说明书 | 100%完成 |
文档 | 测试报告表 | 100%完成 |
6.3 李林蔚分工及贡献量(25%)
整体模块 | 具体子模块 | 完成情况 |
---|---|---|
用户模块 | 用户登录界面 | 100%完成 |
用户模块 | 用户注册界面 | 100%完成 |
用户模块 | 个人资料界面 | 100%完成 |
用户模块 | 个人收藏界面 | 100%完成 |
用户模块 | 推荐记录界面 | 100%完成 |
用户模块 | 消息通知界面 | 100%完成 |
用户模块 | 我的心愿界面 | 100%完成 |
用户模块 | 邀请好友推广界面 | 100%完成 |
用户模块 | 积分记录界面 | 100%完成 |
主页模块 | 资源推荐界面 | 100%完成 |
资源模块 | 搜索资源界面 | 100%完成 |
资源模块 | 左侧菜单栏 | 100%完成 |
资源模块 | 资源详情界面 | 100%完成 |
文档 | 课程报告 | 100%完成 |
6.4 张成钊分工及贡献量(25%)
整体模块 | 具体子模块 | 完成情况 |
---|---|---|
评论/讨论模块 | 发表评论模块 | 100%完成 |
评论/讨论模块 | 发表回复模块 | 100%完成 |
评论/讨论模块 | 删除评论(同时删除回复)模块 | 100%完成 |
评论/讨论模块 | 删除回复模块 | 100%完成 |
评论/讨论模块 | 获取评论模块 | 100%完成 |
评论/讨论模块 | 获取回复模块 | 100%完成 |
评论/讨论模块 | 评论角添加评论模块 | 100%完成 |
评论/讨论模块 | 评论角删除评论模块 | 100%完成 |
评论/讨论模块 | 评论角获取所有评论模块 | 100%完成 |
文档 | 立项说明书 | 100%完成 |
文档 | 会议记录表 | 100%完成 |
文档 | 编码进度表 | 100%完成 |
七、总结与体会
7.1 喻鑫锐总结与体会
在本次项目实训的过程中,老师带我们学习了前端和后端相关的知识,旨在教会我们全栈开发需要学会的知识。前端方面学习了前端三件套:HTML、CSS和JavaScript后,了解了JQuery和Vue.js相关的知识,后端主要是学习了SpringBoot结合MyBatis和Mybatis Plus进行开发。
在项目开发小组中,我担任小组长一职,在前端进行页面框架设计,后端上主导技术选型和架构设计,与我们组的其他同学之间相互学习、一起进步,期间也遇到了不少的问题:
一、小组成员之间掌握的技术栈存在差异,有的同学只会JPA,有的同学只会Mybatis,因此我们选择了分布式微服务的架构设计,微服务之间存在隔离性,从而每个人可以选择自己合适的技术栈进行开发。
二、在团队协作上,我们使用Github进行代码托管,使用Git进行版本控制。但由于对Git的使用还不是很熟练,因此我们在版本控制上也遇到了些许问题,但在查阅了部分资料之后,我们找到了合适的方式进行解决。
三、在前端开发上,我和另外的一位同学在设计页面上没有很大的天赋,因此我们在设计页面上思考了很长时间,最后拿出了一套比较优秀的方案。
总体来看,我们小组的氛围很好,无论是在学习开发知识上,还是平时的日常交流上,我们都是有问题就及时提出并尽量及时进行解决,每个人会的东西不同因此每个人负责的板块不同,但彼此之间互帮互助,一起学习到了很多新知识。
在架构设计和编码过程中遇到的具体问题:
1. 开发人员的技术栈存在差异:使用SpringCloud微服务分布式架构设计
2. 分布式鉴权问题:由于我们存在微服务存在多台服务,如果实现有效鉴权?后面采用SpringCloud Gateway作为分布式路由+网关,将鉴权操作置于网关中,只有顺利通过鉴权的请求才允许放行。
3. 前端页面设计问题:采用了AntDesign Vue组件库,并使用最新的Vue3+Pinia+TypeScript进行开发。
7.2 魏天宇总结与体会
计科的暑期培训课程结束了,我不仅学到了许多关于java项目开发的知识,还接触到了许多前端的知识。在课堂上,我学到了JavaWeb后台开发的底层基础,接触到了spring boot后台开发框架,学到了使用MyBatis处理持久层,此外我还学习了使用jpa处理持久层,并将其用于实际的业务开发,配合一些注解开发,配置简洁高效,大大提高了开发的效率。前端方面,我学习了HTML + CSS + JavaScript前端三件套,会写一些简单的前端页面,为了提高开发效率,我还学习了Bootstrap和Layui框架以及vue2基础,使得前端页面开发简单高效。
回顾暑期培训的经历,我通过老师布置的课堂和课后作业也进一步提升了自己的能力。通过平时案例作业,既巩固了所学的知识,又加深了映像。但是其中也存在一些不足之处,遇到Bug有时会卡很久还得不到解决,写出来的案例效果一般,有时有漏洞。在今后的学习中我应当不断的加强项目实战,努力从实战中获取项目经验,提升自己解决Bug的能力。
在此次暑期培训,我主要负责完成知识管理模块的设计,完成基本的对资源的增、删、改、查功能、以及对资源按照标签、发布人、是否付费等信息进行检索,还可以按照点赞量或者发布时间进行排序。完成项目需求分析说明书以及测试报告表的编写。学会了一些基本的office软件的使用,
在团队协作开发的过程中,我深刻体会到了团队写作的重要性。在开发项目的过程中,我学会了使用git开发工具,借助开元仓库GitHub,我们一起提交代码,团队成员之间协作开发项目,提高了开发的项目。此外,我还了解到了一些开发规范,因为开发要讲究团队协作,编写代码的过程中,要有必要的注释,为前端开发人员提供好详细的接口开发文档。在项目开发的前后端对接阶段,我还负责了接口测试的工作,使用了Junit单元测试直接调用Dao或Service层的相关方法进行测试;另外,我还使用了ApiPost6开发工具进行接口的测试工作,接口测试这一环节十分必要,在此期间也发现了一些接口有误,并进行了及时的修改,为前后端的对接工作打下了铺垫。
通过参与暑期培训项目的开发,我进一步熟悉了java项目开发的相关流程,进一步熟悉了SpringBoot框架,学到了一些开发规范,学会了使用工具对项目接口进行基本的测试,如Junit单元测试,Swagger,ApiPost,同时还学会了查看一些官方文档,实现一些具体的业务需求。与此同时,也发现了自己的一些不足,解决bug的能力还有待提高。在后面的学习中,我会努力解决自己的不足,提高自己的编程能力。
7.3 李林蔚总结与体会
本次项目学习的过程中,老师带着我们学习巩固了JS、Jquery、json、vue2以及spring boot等技能,在项目进行的过程中,我和我们组的同学们相互磨合、共同进步,我们一起经历了很多问题:
一、我在编写代码的时候没有添加足够的注释,导致我们在开会讨论的时候大家需要把代码理清楚了才能进行下一步;
二、我在为页面起名的时候不小心起了相同的名字,导致后来写路由和代码的时候都出了一些问题,要花时间去分清楚两个页面,再将引用到的地方都进行修改;
三、我的能力较队友来说弱一些,在遇到很多问题的时候都需要我的队友们为我提供帮助或者是我去网页上搜索解决方法;
四、我之前学习的是vue2,需要转到vue3,有很多新的知识,比如说setup的语法糖,我在一开始写的时候不知道,爆了很多错;
五、一开始并不知道文档的重要性,后来才发现文档是项目的指导,可以让我们在项目开始时就搭建好项目的整体框架,安排好整个实训期间组内成员各自的分工与协作,也可以大大加快我们的进度,让我们的逻辑更加清晰,交流更加方便。
但是我们组的学习氛围很好,我们经常开会讨论,一起做项目,有问题就可以随时提出并得到解决,每个人涉及的领域也不甚相同,大家互补互助,没有抱怨,也一起学习了很多新的知识,让我的暑期实训充实而美好。
在编码中遇到的具体问题,以及相应的解决思路(主要是vue2转vue3遇到的一些问题):
1、 生命周期函数的变化。
beforeCreate()—-> setup()
created() —-> setup()
beforeMount() —-> onBeforeMount()
mounted() —-> onMounted()
beforeUpdate()—-> onBeforeUpdate()
updated() —-> onUpdated()
beforeDestroy()—-> onBeforeUnmount()
destroyed() —-> onUnmounted()
errorCaptured —-> onErrorCaptured
vue3中为了生命周期函数的统一性,在命名上做了更改,将vue2中的beforeCreate()和created()都集中在了setup()中。
2、 vue2与vue3中的监听写法有所不同
vue2中的watch写在data()同一级,
vue3 中的watch 写在setup()函数中
3、 setup语法糖
setup不需写 return,所以直接声明数据即可
4、 Vue3中使用component :is加载组件,如果使用setup语法糖,这时候的is如果使用字符串会加载不出来,得使用组件实例。
7.1 张成钊总结与体会
通过这次项目实训,让我对与之前所学习过的知识有了一个更加完整的认识,之前我做过两个基于SpringBoot+MyBatis+Vue的项目。这是我第一次做微服务架构的项目,虽然没有完整的学习过微服务,但是在项目的开发中,我也主动了解了许多微服务,Redis相关的知识,对与之前所学过的后端项目也有了更加深刻的见解。
我的收获有以下几点:
一、以往开发时都是由自己担任组长,两个人开发,出于效率考量,没有使用Git进行代码远程托管。这次小组团队协作,学会了Git的基本操作,对于团队开发的流程也有了基本的 了解,虽然不能像正式工作时开发的那样规范,但也让我在这次开发中学习到许多团队开发的经验。
二、这次开发中、遇到困难会积极与小组成员沟通,共同商讨设计方案是否合理,尽可能兼顾其他成员的开发功能,在交流中相互学习交流技术。
三、合理提出质疑,由于开发经验较少,初始的数据库设计在后阶段的实现中存在困难,我也会在网上多查询一些方法,尽可能合理的优化数据,添加必须的表结构,从而更好的实现后端功能。
四、在编写代码时、多考虑优化问题、例如数据库优化,查询优化、数据返回优化、有些功能虽然没有及时的完全实现,但不能只考虑实现基本功能,更要在实现的基础上提高代码执行的效率。
我的不足有以下几点:
一、我只学习过MyBatis和MyBatisPlus,在做项目之前并没有接触过JPA,所以对于DAO层的一些操作,以及SQL的使用有很大困难,在经过了一天的学习后,我基本了解和使用JPA操作数据库。
二、我负责的模块、有许多功能是通过外键来操作的,通常会涉及到多张表的操作,使用JPA返回的Json数据量十分庞大,而且会面临返回敏感数据的窘境,经过优化后,返回的数据量大大减少,同时有选择性的返回前端需要的数据。
三、在后端接口编写阶段、编写代码时发现几张表同时查询过于复杂,可以通过增加冗余字段的方式来提高查询效率,但苦于数据库已基本定型,暂时没有修改,还是按照原计划实现后端接口。