目录
1.引言 2
1.1编写目的 2
1.2 背景 2
1.3需求分析 3
(1)用户需求: 3
(2)管理员需求: 4
(3) 安全需求 4
1.4参考资料 4
2项目概述 5
2.1 用户分析 7
2.2 用例分析 7
2.2.1 主用例分析 7
2.2.2 管理员用例分析 17
2.3 活动分析 24
2.3.1 游客活动分析 24
2.3.2 用户活动分析 27
2.3.3 管理员活动分析 30
3. 系统设计 39
3.1 系统架构设计 39
3.1.1 系统逻辑结构 39
3.2 包设计 39
3.3类设计 40
3.2顺序图设计 57
3.4 数据库设计 88
3.4.1 概念结构设计 88
3.4.2逻辑结构设计 88
4. 系统测试 91
(1)黑盒测试 91
(2) ab性能测试 96
5. 系统部署 97
5.1引言 97
5.2编写目的 97
5.3web端使用 97
5.4服务端安装部署 97
6. 系统实现 102
1.3需求分析
(1)用户需求:
古诗词系统,浏览古诗、诗人、用户分享的资源等,具体如下:
①浏览不同类别的诗词,例如思闺、战争、悼亡、思乡、怀古、禅、离别等;
②浏览不同朝代的诗词,例如唐朝、宋朝、元朝等;
③浏览推荐页面(此页面的诗词是根据各个诗词的收藏数排序)
④用户可以在诗词展示页中点击特定的诗词,进入详情页中查看诗词全文、诗词注释以及诗词翻译
⑤在线收藏功能:登录用户在浏览诗词的时候,如果是看到自己的喜欢的诗词内容,可以通过在线收藏的方式,本文转载自http://www.biyezuopin.vip/onews.asp?id=15087把内容产品收藏到自己的收藏夹中,可以下次直接在收藏的内容中查找到自己喜欢的诗词内容,很方便。另外,可以对自己收藏的诗词内容进行搜索以及删除;
⑥评论功能:登录用户可以查看诗词详情页中的评论,并且有发表评论的权限,也可以对自己的评论进行搜索以及删除;
⑦分享功能:用户可以在“分享页面”浏览ji其他用户分享的诗词。也可以自己登录后上传想要分享的内容,其中,分享内容框体可自己手动输入文字,也可通过图片识别文字。
⑧修改功能:用户可以修改自己的个人信息
⑨查看管理员发布的所有通知
⑩在头部搜索栏输入关键字,搜索对应信息的诗词列表集
⑪登录
12、注册
13、找回密码
(2)管理员需求:
①个人信息管理:对自己的个人信息进行修改,并且可以对用户信息进行增删改查;
②收藏、评论管理:对用户收藏的诗词以及发表的评论进行增删改查;
③诗词管理:对数据库中存在的诗词、诗人、朝代信息、诗词类别信息等进行增删改查;
④发布通知,并且对通知进行增删改查
⑤对用户上传的资源进行审核,也可以增删查改
(3)安全需求
①直接将密码写入数据库中是极不安全的,因为任何可以打开数据库的人,都将可以直接看到这些密码,所以我们系统使用SHA-1将密码加密后再存储进数据库。

package com.springboot.controller;import com.springboot.bean.Result;
import com.springboot.entity.TUser;import com.springboot.security.SHA1Test;
import com.springboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;import java.security.NoSuchAlgorithmException;
import java.util.List;@Controller
@CrossOrigin(origins = {"http://localhost:3000"},allowCredentials = "true",allowedHeaders = {"X-Custom-Header"},maxAge = 3600L, methods={RequestMethod.GET,RequestMethod.POST,RequestMethod.HEAD})
public class AdminController {@Autowiredprivate UserService userService;@GetMapping("/admin/listusers")@ResponseBodypublic Result adminlistalluser(String kw, Model model){if (kw!=null) kw="%"+kw+"%";if (kw==null) kw="%%";Result result = new Result();//通过关键字查询List<TUser> listusers= userService.adminshowAll(kw);//放到data中result.setData(listusers);System.out.println("listusers====="+listusers.toString());return result;}@PostMapping("/admin/listusers")@ResponseBodypublic Result adminlistalluserbykw(@RequestBody String kw){if (kw!=null) kw="%"+kw+"%";if (kw==null) kw="%%";System.out.println(kw);Result result = new Result();//通过关键字查询List<TUser> listusers= userService.adminshowAll(kw);//放到data中result.setData(listusers);return result;}@PostMapping("/admin/deleteuser")@ResponseBodypublic Result admindelete(@RequestBody String id){Result result = new Result();Integer id1=Integer.valueOf(id);userService.deleteById(id1);result.setDescription("删除成功");//添加返回信息描述//添加返回数据String kw="%%";//通过关键字查询List<TUser> listcomms= userService.adminshowAll(kw);//放到data中result.setData(listcomms);return result;}//添加、修改用户 id存在编辑用户信息,不存在则添加用户@PostMapping("/admin/saveuser")@ResponseBodypublic Result save(TUser user, RedirectAttributes attr) {Result result=new Result();try {//如果id为0 jpa的save方法起新增的作用;如果save不为0 那么jpa save方法起update作用if (user.getId() == 0) {//检查邮箱是否已注册if (userService.findEmail(user.getEmail()).size() != 0) {//如果该邮箱已注册attr.addFlashAttribute("message", "该邮箱已注册");result.setDescription("该邮箱已注册");result.setCode(400);result.setNextAction("/saveuser");return result;}//密码加密SHA1Test sha1Test = new SHA1Test();user.setPassword(sha1Test.toHexString(user.getPassword()));}//密码加密SHA1Test sha1Test = new SHA1Test();user.setPassword(sha1Test.toHexString(user.getPassword()));userService.saveUser(user);result.setDescription("保存成功");result.setCode(200);result.setData(user);
//            result.setNextAction("/listusers");return result;} catch (Exception e) {e.printStackTrace();}return result;}//编辑修改用户信息@PostMapping("/admin/modifyuser")@ResponseBodypublic Result ModifyUser(TUser user, RedirectAttributes attr) throws NoSuchAlgorithmException {Result result=new Result();System.out.println("前端传来的数据user====="+user.toString());//前端传来的数据//密码加密SHA1Test sha1Test = new SHA1Test();user.setPassword(sha1Test.toHexString(user.getPassword()));userService.save(user);result.setDescription("修改用户信息成功!");TUser newuser = userService.findById(user.getId());result.setData(newuser);return result;}//
//    //个人信息管理界面中:更改信息后保存
//    @PostMapping("/admin/modifyuser")
//    @ResponseBody
//    public Result SavePersonalInfo(TUser user, HttpSession session) throws NoSuchAlgorithmException {
//        Result result = new Result();
//        TUser user2=userService.findByEmail(user.getEmail());
//        System.out.println("前端传来的数据user====="+user.toString());//前端修后传来重新写入的数据
//        System.out.println("前端修改前数据user2====="+user2.toString());//前端修改前数据
//        System.out.println("111");if(userService.findByEmailNotId(user.getEmail(),user.getId()).size()!=0){result.setDescription("该邮箱已绑定账号,修改失败!");result.setCode(400);System.out.println("222");return result;}else {if(userService.findByEmail(user.getEmail()))SHA1Test sha1Test = new SHA1Test();user.setPassword(sha1Test.toHexString(user.getPassword()));
//        user.setUsername(user2.getUsername());
//            System.out.println("444");
//            userService.modifyUser(user2);
//             System.out.println("555");
//            result.setDescription("修改个人信息成功!");
//            System.out.println("666");
//            TUser usersession = userService.findById(user2.getId());session.setAttribute("usersession", usersession);
//            result.setData(usersession);
//            System.out.println("user2==="+user2.toString());
//            System.out.println("usersession==="+usersession.toString());
//            return result;}
//    }
////    //管理员添加用户
//    @PostMapping("/admin/saveuser")
//    @ResponseBody
//    public Result addUser(TUser user) throws ParseException, NoSuchAlgorithmException {
//        Result result=new Result();
//        //密码加密
//        SHA1Test sha1Test = new SHA1Test();
//        user.setPassword(sha1Test.toHexString(user.getPassword()));
//        userService.save(user);
//        result.setDescription("添加成功");//添加返回信息描述
//        result.setData(user);
//        return  result;
//    }/*@RequestMapping("/listusers")public Result listuserbykw(String kw, ModelMap modelMap, @RequestParam(value = "page", defaultValue = "0") Integer page,@RequestParam(value = "size", defaultValue = "5") Integer size) {Result result=new Result();modelMap.addAttribute("kw", kw);if (kw != null) kw = "%" + kw + "%";if (kw == null) kw = "%%";Page<TUser> datas = userService.findBookCriteria(page, size, kw);//默认分页从0页面(第一页),取每页20条数据modelMap.addAttribute("datas", datas);result.setDescription("查询成功");result.setCode(200);result.setData(datas);result.setNextAction("/listusers");return result;
//        return datas;}//添加、修改用户 id存在编辑用户信息,不存在则添加用户@PostMapping("/saveuser")@CrossOriginpublic Result save(@RequestBody @Valid TUser user, RedirectAttributes attr) {Result result=new Result();try {//如果id为0 jpa的save方法起新增的作用;如果save不为0 那么jpa save方法起update作用if (user.getId() == 0) {//检查邮箱是否已注册if (userService.findEmail(user.getEmail()).size() != 0) {//如果该邮箱已注册attr.addFlashAttribute("message", "该邮箱已注册");result.setDescription("该邮箱已注册");result.setCode(400);result.setNextAction("/saveuser");return result;}//密码加密SHA1Test sha1Test = new SHA1Test();user.setPassword(sha1Test.toHexString(user.getPassword()));}userService.saveUser(user);result.setDescription("保存成功");result.setCode(200);result.setData(user);result.setNextAction("/listusers");return result;} catch (Exception e) {e.printStackTrace();}return result;}//    @RequestMapping@GetMapping("/deleteuser/{id}")public Result delete(@PathVariable("id") Integer id) {Result result=new Result();//        userService.deleteById(id);if (userService.deleteById(id)) {result.setDescription("删除失败");result.setCode(400);result.setNextAction("/listusers");return result;}else {result.setDescription("删除成功");result.setCode(200);result.setData(id);result.setNextAction("/listusers");return result;}}@PostMapping("/deleteusers")public Result deletes(String ids) {Result result=new Result();System.out.println("======" + ids);List<TUser> users = new ArrayList<>();JSONObject json = JSONObject.parseObject(ids);JSONArray arr = json.getJSONArray("ids");//前端传递时使用uods作为json数据的键int ilen = arr.size();for (int i = 0; i < ilen; i++) {//每次循环ilen次来执行ilen个查询,再去删除users.add(userService.findById(arr.getInteger(i)));}if (userService.deletes(users)) {result.setDescription("删除失败");result.setCode(400);result.setNextAction("/listusers");return result;}else {result.setDescription("删除成功");result.setCode(200);result.setData(ids);result.setNextAction("/listusers");return result;}}*///    @PostMapping("/delete")
//    public void delete(@PathVariable("id") Integer id,@RequestParam("ids") String ids) {
//        if (id!=null){
//            userService.deleteById(id);
//        }
//        else {
//            // 接收包含stuId的字符串,并将它分割成字符串数组
//            String[] idList = ids.split(",");
//            // 将字符串数组转为List<Intger> 类型
//            List<Integer> LString = new ArrayList<Integer>();
//            for (String idi : idList) {
//                LString.add(new Integer(idi));
//            }
//
//            int ilen = LString.size();
//            for (int i = 0; i < ilen; i++) {
//                userService.deleteById(LString.get(i));
//            }
//        }
//    }
}





























基于Springboot的古诗词府学习网站系统设计与实现相关推荐

  1. Python+Django基于Python的古诗词在线学习网站#毕业设计

    项目编号:Python+Django205-基于Python的古诗词在线学习网站#毕业设计 开发语言:Python python框架:django 软件版本:python3.7 数据库:mysql 5 ...

  2. 计算机毕业设计Python+Django基于python的古诗词在线学习网站(源码+系统+mysql数据库+Lw文档)

    运行环境 开发语言:Python python框架:django 软件版本:python3.7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:PyCharm/vscode 前端 ...

  3. Python+Django基于python的古诗词在线学习网站

    目前许多人仍将传统的纸质工具作为信息管理的主要工具,而网络技术的应用只是起到辅助作用.在对网络工具的认知程度上,较为传统的office软件等仍是人们使用的主要工具,而相对全面且专业的古诗词在线学习系统 ...

  4. 基于Python+django的 古诗词在线学习网站-计算机毕业设计

    项目介绍 基于Python+django的 古诗词在线学习网站则旨在通过标签分类管理等方式,实现管理员:首页.个人中心.用户管理.诗词管理.主题管理.情感色彩管理.风格管理.我的收藏管理.诗词论坛.系 ...

  5. 基于SpringBoot框架的古风乐曲网站的设计与实现 毕业设计-附源码271611

    springboot古风乐曲网站 摘 要 随着社会的发展,社会的方方面面都在利用信息化时代的优势.互联网的优势和普及使得各种系统的开发成为必需. 本文以实际运用为开发背景,运用软件工程原理和开发方法, ...

  6. 基于SpringBoot框架的古风乐曲网站的设计与实现毕业设计源码271611

    springboot古风乐曲网站 摘 要 随着社会的发展,社会的方方面面都在利用信息化时代的优势.互联网的优势和普及使得各种系统的开发成为必需. 本文以实际运用为开发背景,运用软件工程原理和开发方法, ...

  7. 计算机毕业设计springboot基于Springboot的手机电商网站lmo47源码+系统+程序+lw文档+部署

    计算机毕业设计springboot基于Springboot的手机电商网站lmo47源码+系统+程序+lw文档+部署 计算机毕业设计springboot基于Springboot的手机电商网站lmo47源 ...

  8. (附源码)基于SpringBoot框架的古风乐曲网站的设计与实现 毕业设计271611

    springboot古风乐曲网站 摘 要 随着社会的发展,社会的方方面面都在利用信息化时代的优势.互联网的优势和普及使得各种系统的开发成为必需. 本文以实际运用为开发背景,运用软件工程原理和开发方法, ...

  9. nodejs+express+Vue 古诗词在线学习网站

    古诗词在线学习网站则旨在通过标签分类管理等方式,实现管理员:首页.个人中心.用户管理.诗词管理.主题管理.情感色彩管理.风格管理.我的收藏管理.诗词论坛.系统管理,用户:首页.个人中心.诗词管理.主题 ...

最新文章

  1. 原来BCH是这样转给别人的
  2. SDWebImage的使用及图片不改变问题的解决
  3. Jenkins定时构建任务
  4. hdu6000 Wash 思维、贪心
  5. mysql dba系统学习(2)了解mysql的源码目录及源文件
  6. 【运营】运营高手的“葵花宝典”,你就是下一个东方不败
  7. gin redis 链接不上_内存优化,Redis是如何实现的!
  8. java由大到小输出整数xvz_【视频+图文】Java经典基础练习题(三):输入3个整数,并将其由小到大输出...
  9. 24--反转字符串中的单词 III
  10. 相关不是因果,哪又是啥?
  11. zookeeper使用问题汇总
  12. Kafka学习之(四)PHP操作Kafka
  13. html 怎么绘制曲线图,用html5绘制折线图的实例代码_html5教程技巧
  14. Python Scrapy 创建第一个爬虫项目
  15. 再见,MySQL !
  16. day21_Lambda表达式、函数式接口
  17. HC-05-USB蓝牙模块绑定唯一的蓝牙模块
  18. 创建vue项目的时候报错:Skipped git commit due to missing username and email in git config.
  19. Day8--复数和复变函数之拉普拉斯变换及反变换和Z变换及反变换
  20. 从零開始学习制作H5应用——V5.0:懊悔机制,整理文件夹,压缩,模板化

热门文章

  1. 有限元FEM求解一维电磁场问题 Rits法 Galerkin法
  2. MySQL计算结束时间和开始时间的差值,并统计差值
  3. Xlinx FFT IP的注意点
  4. rdma oracle,NFS Over RDMA
  5. dEFEND Explainable Fake News Detection 可【解释的假新闻检测】
  6. android高仿今日头条 --新闻阅读器
  7. 怎么用mcgspro打开mcgs文件_留言赠书 | 快速从Mcgs嵌入版升级到McgsPro
  8. 深入浅出的数据分析方法
  9. 2016年研究生数学建模A题
  10. android 怎么导入和应用特殊字体在app项目