当前位置: 首页 > news >正文

SpringBoot+Vue项目在线学习网站

文末获取源码

开发语言:Java

框架:springboot+vue

Node:node.js

JDK版本:JDK1.8

服务器:tomcat7

数据库:mysql 5.7/8.0

数据库工具:Navicat11

开发软件:eclipse/idea,Visual 

Maven包:Maven3.3.9

浏览器:谷歌浏览器

目录

一、前言介绍 

二、系统分析

2.1功能需求分析 

2.2数据流程分析

2.3系统总体设计

三、系统详细设计

3.1登录模块

3.2作业题目模块

3.3学院信息模块

3.4课程信息模块

3.5课程详情模块

四、管理员功能模块

4.1校园资讯模块

4.2作业题目管理模块

4.3学院信息管理模块 

4.4课程信息管理模块

五、部分核心代码

5.1用户登录的关键代码

5.2课程信息关键代码

5.3校园资讯管理关键代码

5.4作业题目管理关键代码

5.5学院信息管理关键代码


一、前言介绍 

在线学习网站主要功能模块包括首页、站点管理(轮播图、公告栏)用户管理(管理员、学生用户、教师用户)、内容管理(话题讨论、话题分类列表、校园资讯、作业题目)、更多管理(学院信息、课程信息),采取面对对象的开发模式进行软件的开发和硬体的架设,能很好的满足实际使用的需求,完善了对应的软体架设以及程序编码的工作,采取MySQL作为后台数据的主要存储单元,采用springboot框架、Java技术、Ajax技术进行业务系统的编码及其开发,实现了本系统的全部功能。本次报告,首先分析了研究的背景、作用、意义,为研究工作的合理性打下了基础。针对在线学习网站  的各项需求以及技术问题进行分析,证明了系统的必要性和技术可行性,然后对设计系统需要使用的技术软件以及设计思想做了基本的介绍,最后来实现在线学习网站和部署运行使用它。 

二、系统分析

2.1功能需求分析 

在线学习网站的功能主要分为前台用户根据自己的需求进行注册登录,浏览课程信息并对选中的教学资源进行学习操作。后台系统管理员根据需求进行校园资讯、用户管理、话题讨论、资讯分类列表、作业题目、学院信息、课程信息进行处理。

用户用例图如下所示。

管理员用例图如下所示。

2.2数据流程分析

对系统的数据流进行分析,系统的使用者分为二类,一般用户,管理员。系统主要对界面信息传送,登录信息的验证,注册信息的接收,用户各种操作的响应做处理。

系统顶层数据流图如下图所示。

2.3系统总体设计

在线学习网站总体分为前台用户模块和后台管理员模块。

两个模块表现上是分别独立存在,但是访问的数据库是一样的。每一个模块的功能都是根据先前完成的需求分析,并查阅相关资料后整理制作的。

综上所述,系统功能结构图如下图所示。

三、系统详细设计

3.1登录模块

3.2作业题目模块

 

3.3学院信息模块

3.4课程信息模块

3.5课程详情模块

四、管理员功能模块

4.1校园资讯模块

校园资讯模块,管理员根据需要添加标题、封面图、文章分类、标签等详情、查看评论,并可根据需要删除或者修改校园资讯信息。

校园资讯管理界面如下图所示。

4.2作业题目管理模块

根据需求,需要对作业题目进行添加、删除或修改音频详情信息。删除或修改音频资源时,系统根据课程资源的状态判定为可删除状态下,才会给出删除和修改链接,点击删除链接按钮时,请求到达后台,还会先查询课程资源状态再次做出判定能否删除。点击修改链接按钮时,会跳转到修改信息的页面,重新填写好数据后,数据提交到后台会对数据库中相应的记录做出修改。

作业题目管理界面如下图所示。

4.3学院信息管理模块 

系统还提供了查询学院信息的功能,管理人员可以查询学院内指定的多个学院信息,但是当需要查询学院时,只需要输入学院的名称,就可以实现查询学院的回复,用户可以登录系统查询学院信息。

学院信息管理界面如下图所示。

4.4课程信息管理模块

 

五、部分核心代码

5.1用户登录的关键代码

/**
     * 登录
     * @param data
     * @param httpServletRequest
     * @return
     */
    @PostMapping("login")
    public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
        log.info("[执行登录接口]");

        String username = data.get("username");
        String email = data.get("email");
        String phone = data.get("phone");
        String password = data.get("password");

        List resultList = null;
        Map<String, String> map = new HashMap<>();
        if(username != null && "".equals(username) == false){
            map.put("username", username);
            resultList = service.select(map, new HashMap<>()).getResultList();
        }
        else if(email != null && "".equals(email) == false){
            map.put("email", email);
            resultList = service.select(map, new HashMap<>()).getResultList();
        }
        else if(phone != null && "".equals(phone) == false){
            map.put("phone", phone);
            resultList = service.select(map, new HashMap<>()).getResultList();
        }else{
            return error(30000, "账号或密码不能为空");
        }
        if (resultList == null || password == null) {
            return error(30000, "账号或密码不能为空");
        }
        //判断是否有这个用户
        if (resultList.size()<=0){
            return error(30000,"用户不存在");
        }

        User byUsername = (User) resultList.get(0);


        Map<String, String> groupMap = new HashMap<>();
        groupMap.put("name",byUsername.getUserGroup());
        List groupList = userGroupService.select(groupMap, new HashMap<>()).getResultList();
        if (groupList.size()<1){
            return error(30000,"用户组不存在");
        }

        UserGroup userGroup = (UserGroup) groupList.get(0);

        //查询用户审核状态
        if (!StringUtils.isEmpty(userGroup.getSourceTable())){
            String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERE user_id = " + byUsername.getUserId();
            String res = String.valueOf(service.runCountSql(sql).getSingleResult());
            if (res==null){
                return error(30000,"用户不存在");
            }
            if (!res.equals("已通过")){
                return error(30000,"该用户审核未通过");
            }
        }

        //查询用户状态
        if (byUsername.getState()!=1){
            return error(30000,"用户非可用状态,不能登录");
        }

        String md5password = service.encryption(password);
        if (byUsername.getPassword().equals(md5password)) {
            // 存储Token到数据库
            AccessToken accessToken = new AccessToken();
            accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
            accessToken.setUser_id(byUsername.getUserId());
            tokenService.save(accessToken);

            // 返回用户信息
            JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));
            user.put("token", accessToken.getToken());
            JSONObject ret = new JSONObject();
            ret.put("obj",user);
            return success(ret);
        } else {
            return error(30000, "账号或密码不正确");
        }
}

5.2课程信息关键代码

@PostMapping("/add")
    @Transactional
    public Map<String, Object> add(HttpServletRequest request) throws IOException {
        service.insert(service.readBody(request.getReader()));
        return success(1);
    }

    @Transactional
    public Map<String, Object> addMap(Map<String,Object> map){
        service.insert(map);
        return success(1);
}

    public Map<String,Object> readBody(BufferedReader reader){
        BufferedReader br = null;
        StringBuilder sb = new StringBuilder("");
        try{
            br = reader;
            String str;
            while ((str = br.readLine()) != null){
                sb.append(str);
            }
            br.close();
            String json = sb.toString();
            return JSONObject.parseObject(json, Map.class);
        }catch (IOException e){
            e.printStackTrace();
        }finally{
            if (null != br){
                try{
                    br.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
        return null;
}

    public void insert(Map<String,Object> body){
        StringBuffer sql = new StringBuffer("INSERT INTO ");
        sql.append("`").append(table).append("`").append(" (");
        for (Map.Entry<String,Object> entry:body.entrySet()){
            sql.append("`"+humpToLine(entry.getKey())+"`").append(",");
        }
        sql.deleteCharAt(sql.length()-1);
        sql.append(") VALUES (");
        for (Map.Entry<String,Object> entry:body.entrySet()){
            Object value = entry.getValue();
            if (value instanceof String){
                sql.append("'").append(entry.getValue()).append("'").append(",");
            }else {
                sql.append(entry.getValue()).append(",");
            }
        }
        sql.deleteCharAt(sql.length() - 1);
        sql.append(")");
        log.info("[{}] - 插入操作:{}",table,sql);
        Query query = runCountSql(sql.toString());
        query.executeUpdate();
    }

5.3校园资讯管理关键代码

@RequestMapping(value = "/del")
    @Transactional
    public Map<String, Object> del(HttpServletRequest request) {
        service.delete(service.readQuery(request), service.readConfig(request));
        return success(1);
}

    @Transactional
    public void delete(Map<String,String> query,Map<String,String> config){
        StringBuffer sql = new StringBuffer("DELETE FROM ").append("`").append(table).append("`").append(" ");
        sql.append(toWhereSql(query, "0".equals(config.get(FindConfig.GROUP_BY))));
        log.info("[{}] - 删除操作:{}",table,sql);
        Query query1 = runCountSql(sql.toString());
        query1.executeUpdate();
    }

5.4作业题目管理关键代码

@PostMapping("/set")
@Transactional
    public Map<String, Object> set(HttpServletRequest request) throws IOException {
        service.update(service.readQuery(request), service.readConfig(request), service.readBody(request.getReader()));
        return success(1);
}

    public Map<String,String> readConfig(HttpServletRequest request){
        Map<String,String> map = new HashMap<>();
        map.put(FindConfig.PAGE,request.getParameter(FindConfig.PAGE));
        map.put(FindConfig.SIZE,request.getParameter(FindConfig.SIZE));
        map.put(FindConfig.LIKE,request.getParameter(FindConfig.LIKE));
        map.put(FindConfig.ORDER_BY,request.getParameter(FindConfig.ORDER_BY));
        map.put(FindConfig.FIELD,request.getParameter(FindConfig.FIELD));
        map.put(FindConfig.GROUP_BY,request.getParameter(FindConfig.GROUP_BY));
        map.put(FindConfig.MAX_,request.getParameter(FindConfig.MAX_));
        map.put(FindConfig.MIN_,request.getParameter(FindConfig.MIN_));
        return map;
}

    public Map<String,String> readQuery(HttpServletRequest request){
        String queryString = request.getQueryString();
        if (queryString != null && !"".equals(queryString)) {
            String[] querys = queryString.split("&");
            Map<String, String> map = new HashMap<>();
            for (String query : querys) {
                String[] q = query.split("=");
                map.put(q[0], q[1]);
            }
            map.remove(FindConfig.PAGE);
            map.remove(FindConfig.SIZE);
            map.remove(FindConfig.LIKE);
            map.remove(FindConfig.ORDER_BY);
            map.remove(FindConfig.FIELD);
            map.remove(FindConfig.GROUP_BY);
            map.remove(FindConfig.MAX_);
            map.remove(FindConfig.MIN_);
            return map;
        }else {
            return new HashMap<>();
        }
}

    @Transactional
    public void update(Map<String,String> query,Map<String,String> config,Map<String,Object> body){
        StringBuffer sql = new StringBuffer("UPDATE ").append("`").append(table).append("`").append(" SET ");
        for (Map.Entry<String,Object> entry:body.entrySet()){
            Object value = entry.getValue();
            if (value instanceof String){
                sql.append("`"+humpToLine(entry.getKey())+"`").append("=").append("'").append(value).append("'").append(",");
            }else {
                sql.append("`"+humpToLine(entry.getKey())+"`").append("=").append(value).append(",");
            }

        }
        sql.deleteCharAt(sql.length()-1);
        sql.append(toWhereSql(query,"0".equals(config.get(FindConfig.LIKE))));
        log.info("[{}] - 更新操作:{}",table,sql);
        Query query1 = runCountSql(sql.toString());
        query1.executeUpdate();
}

    public String toWhereSql(Map<String,String> query, Boolean like) {
        if (query.size() > 0) {
            try {
                StringBuilder sql = new StringBuilder(" WHERE ");
                for (Map.Entry<String, String> entry : query.entrySet()) {
                    if (entry.getKey().contains(FindConfig.MIN_)) {
                        String min = humpToLine(entry.getKey()).replace("_min", "");
                        sql.append("`"+min+"`").append(" >= '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("' and ");
                        continue;
                    }
                    if (entry.getKey().contains(FindConfig.MAX_)) {
                        String max = humpToLine(entry.getKey()).replace("_max", "");
                        sql.append("`"+max+"`").append(" <= '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("' and ");
                        continue;
                    }
                    if (like == true) {
                        sql.append("`"+humpToLine(entry.getKey())+"`").append(" LIKE '%").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("%'").append(" and ");
                    } else {
                        sql.append("`"+humpToLine(entry.getKey())+"`").append(" = '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("'").append(" and ");
                    }
                }
                sql.delete(sql.length() - 4, sql.length());
                sql.append(" ");
                return sql.toString();
            } catch (UnsupportedEncodingException e) {
                log.info("拼接sql 失败:{}", e.getMessage());
            }
        }
        return "";
    }

5.5学院信息管理关键代码

@RequestMapping("/get_list")
    public Map<String, Object> getList(HttpServletRequest request) {
        Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));
        return success(map);

相关文章:

  • antd tree 懒加载+局部刷新
  • c# RestClient 请求接口
  • 为了面试大厂,熬夜肝完这份 “测试” 笔记后,我终于“硬”了一回
  • T1095 数1的个数(信息学一本通C++)
  • 八、class 与 style 绑定(1)
  • 职言 | 编码是测试自动化职业生涯的关键:你准备好了吗?
  • 92-Java的缓冲流概述、体系、字节缓冲流使用
  • 检测网络框架越来越多
  • Gee引擎常用功能简介
  • 微信小程序 - - - - - 瀑布流效果实现
  • 前端面试问题(3)
  • 面试复习题二(综合类)
  • HCIA网络基础7-VRP和命令行基础
  • mybatis获取参数的两种方式: #{ } 和 ${ }
  • 为什么SDWAN成为了组网发展大趋势呢?
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 230. Kth Smallest Element in a BST
  • 4. 路由到控制器 - Laravel从零开始教程
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Linux链接文件
  • react 代码优化(一) ——事件处理
  • vue 个人积累(使用工具,组件)
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • vue2.0项目引入element-ui
  • vue-router 实现分析
  • vue的全局变量和全局拦截请求器
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 分享一份非常强势的Android面试题
  • 力扣(LeetCode)22
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 想写好前端,先练好内功
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 找一份好的前端工作,起点很重要
  • # 飞书APP集成平台-数字化落地
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (笔试题)合法字符串
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (算法)求1到1亿间的质数或素数
  • (一)VirtualBox安装增强功能
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • .form文件_SSM框架文件上传篇
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • @Resource和@Autowired的区别
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [1] 平面(Plane)图形的生成算法
  • [bzoj1324]Exca王者之剑_最小割
  • [C#]C#学习笔记-CIL和动态程序集