基于SSM的毕业设计流程管理系统

简介: 基于SSM的毕业设计流程管理系统

项目编号:BS-GX-063

一,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

前端开发技术:Vue+ElementUI

后台开发技术:SSM框架

二,项目简介

2.1 绪 论

21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。

论文主要是对毕业设计管理系统,进行了介绍,包括研究的现状,还有涉及的开发背景,然后还对系统的设计目标进行了论述,还有系统的需求,以及整个的设计方案,对系统的设计以及实现,也都论述的比较细致,最后对毕业设计管理系统 进行了一些具体测试。

本文以Java为开发技术,实现了一个毕业设计管理系统 。 毕业设计管理系统的主要实现功能包括:管理员:首页、个人中心、个人信息、学生管理、教师管理、文件模板管理 、论坛管理 、系统管理、在线选题管理、开题报告管理、中期报告管理、毕业论文管理等等。,教师管理:个人中心、个人信息、文件模板管理 、在线选题管理、老师答疑管理、开题报告管理、中期报告管理、毕业论文管理、学生提题管理、论文进度管理等等。学生管理:个人中心、个人信息、学生提问管理、 、老师答疑管理、开题报告管理、中期报告管理、毕业论文管理、学生提题管理、论文进度管理、我的收藏管理等等功能。通过这些功能模块的设计,基本上实现了整个毕业设计管理系统的过程。

具体在系统设计上,采用了B/S的结构,同时,也使用Java技术在动态页面上进行了设计,后台上采用Mysql数据库,是一个非常优秀的 毕业设计管理系统 。

2.2 用例需求分析

管理员用例图

系统中的核心教师是系统管理员,管理员登录后,通过管理员菜单来管理后台系统。主要功能有;首页、个人中心、个人信息、学生管理、教师管理、文件模板管理 、论坛管理 、系统管理、在线选题管理、开题报告管理、中期报告管理、毕业论文管理、学生提题管理、论文进度管理等功能。管理员用例如图1所示。

教师:个人中心、个人信息、文件模板管理 、在线选题管理、老师答疑管理、开题报告管理、中期报告管理、毕业论文管理、学生提题管理、论文进度管理等功能。教师用例如图2所示。

学生:个人中心、个人信息、学生提问管理、 老师答疑管理、开题报告管理、

中期报告管理、毕业论文管理、学生提题管理、论文进度管理、我的收藏等功能。学生用例如图3所示。

2.3 系统功能设计

系统架构图属于系统设计阶段,系统架构图只是这个阶段一个产物,系统的总体架构决定了整个系统的模式,是系统的基础。 毕业设计管理系统 的整体结构设计如图4-2所示。

2.4 数据库设计

数据库的表信息属于设计的一部分,下面介绍数据库中的各个表的详细信息。

guanliyuanxinxi

列名

数据类型

长度

约束

id

int

11

PRIMARY KEY

username

varchar

50

DEFAULT NULL

pwd

varchar

50

DEFAULT NULL

cx

varchar

50

DEFAULT NULL

表3 xuesheng

列名

数据类型

长度

约束

id

int

10

PRIMARY KEY

xueshengxuehao

int

50

DEFAULT NULL

xueshengxingming

varchar

50

DEFAULT NULL

xingbie

varchar

50

DEFAULT NULL

nianji

varchar

50

DEFAULT NULL

banji

varchar

50

DEFAULT NULL

shenfenzheng

varchar

50

DEFAULT NULL

lianxidianhua

varchar

50

DEFAULT NULL

表5 jiaoshi数据表

列名

数据类型

长度

约束

id

int

11

PRIMARY KEY

jiaoshigonghao

varchar

50

DEFAULT NULL

jiaoshixingming

varchar

50

DEFAULT NULL

mima

varchar

50

DEFAULT NULL

zhicheng

varchar

50

DEFAULT NULL

lianxidianhua

int

10

DEFAULT NULL

shenfenzheng

int

500

DEFAULT NULL

表6`zaixianxuanti数据表

列名

数据类型

长度

约束

id

int

11

PRIMARY KEY

ketitimu

varchar

10

DEFAULT NULL

tupian

varchar

500

DEFAULT NULL

jianjie

varchar

20

DEFAULT NULL

jiaoshigonghao

varchar

4

DEFAULT NULL

fabushijian

varchar

20

DEFAULT NULL

sfsh

varchar

20

DEFAULT NULL

shhf

varchar

20

DEFAULT NULL

表6`xueshengtiwen数据表

列名

数据类型

长度

约束

id

int

11

PRIMARY KEY

woyaotiwen

varchar

10

DEFAULT NULL

xueshengxuehao

varchar

500

DEFAULT NULL

xueshengxingming

varchar

20

DEFAULT NULL

jiaoshigonghao

varchar

4

DEFAULT NULL

jiaoshixingming

varchar

20

DEFAULT NULL

tiwenshijian

varchar

20

DEFAULT NULL

  表6`laoshidayi数据表

列名

数据类型

长度

约束

id

int

11

PRIMARY KEY

laoshidayi

varchar

10

DEFAULT NULL

xueshengxuehao

varchar

500

DEFAULT NULL

xueshengxingming

varchar

20

DEFAULT NULL

jiaoshigonghao

varchar

4

DEFAULT NULL

jiaoshixingming

varchar

20

DEFAULT NULL

dayishijian

varchar

20

DEFAULT NULL

 

三,系统展示

前端展示

在线选题效果图

管理员管理

不再一一展示

四,核心代码展示

package com.controller;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.annotation.IgnoreAuth;
import com.entity.ZhongqibaogaoEntity;
import com.entity.view.ZhongqibaogaoView;
import com.service.ZhongqibaogaoService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MPUtil;
import com.utils.CommonUtil;
/**
 * 中期报告
 * 后端接口
 * @author 
 * @email 
 * @date 2020-11-02 10:24:01
 */
@RestController
@RequestMapping("/zhongqibaogao")
public class ZhongqibaogaoController {
    @Autowired
    private ZhongqibaogaoService zhongqibaogaoService;
    /**
     * 后端列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,ZhongqibaogaoEntity zhongqibaogao, HttpServletRequest request){
    String tableName = request.getSession().getAttribute("tableName").toString();
    if(tableName.equals("xuesheng")) {
      zhongqibaogao.setXueshengxuehao((String)request.getSession().getAttribute("username"));
    }
    if(tableName.equals("jiaoshi")) {
      zhongqibaogao.setJiaoshigonghao((String)request.getSession().getAttribute("username"));
    }
        EntityWrapper<ZhongqibaogaoEntity> ew = new EntityWrapper<ZhongqibaogaoEntity>();
    PageUtils page = zhongqibaogaoService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, zhongqibaogao), params), params));
        return R.ok().put("data", page);
    }
    /**
     * 前端列表
     */
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params,ZhongqibaogaoEntity zhongqibaogao, HttpServletRequest request){
        EntityWrapper<ZhongqibaogaoEntity> ew = new EntityWrapper<ZhongqibaogaoEntity>();
    PageUtils page = zhongqibaogaoService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, zhongqibaogao), params), params));
        return R.ok().put("data", page);
    }
  /**
     * 列表
     */
    @RequestMapping("/lists")
    public R list( ZhongqibaogaoEntity zhongqibaogao){
        EntityWrapper<ZhongqibaogaoEntity> ew = new EntityWrapper<ZhongqibaogaoEntity>();
        ew.allEq(MPUtil.allEQMapPre( zhongqibaogao, "zhongqibaogao")); 
        return R.ok().put("data", zhongqibaogaoService.selectListView(ew));
    }
   /**
     * 查询
     */
    @RequestMapping("/query")
    public R query(ZhongqibaogaoEntity zhongqibaogao){
        EntityWrapper< ZhongqibaogaoEntity> ew = new EntityWrapper< ZhongqibaogaoEntity>();
    ew.allEq(MPUtil.allEQMapPre( zhongqibaogao, "zhongqibaogao")); 
    ZhongqibaogaoView zhongqibaogaoView =  zhongqibaogaoService.selectView(ew);
    return R.ok("查询中期报告成功").put("data", zhongqibaogaoView);
    }
    /**
     * 后端详情
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") String id){
        ZhongqibaogaoEntity zhongqibaogao = zhongqibaogaoService.selectById(id);
        return R.ok().put("data", zhongqibaogao);
    }
    /**
     * 前端详情
     */
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") String id){
        ZhongqibaogaoEntity zhongqibaogao = zhongqibaogaoService.selectById(id);
        return R.ok().put("data", zhongqibaogao);
    }
    /**
     * 后端保存
     */
    @RequestMapping("/save")
    public R save(@RequestBody ZhongqibaogaoEntity zhongqibaogao, HttpServletRequest request){
      zhongqibaogao.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
      //ValidatorUtils.validateEntity(zhongqibaogao);
        zhongqibaogaoService.insert(zhongqibaogao);
        return R.ok();
    }
    /**
     * 前端保存
     */
    @RequestMapping("/add")
    public R add(@RequestBody ZhongqibaogaoEntity zhongqibaogao, HttpServletRequest request){
      zhongqibaogao.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
      //ValidatorUtils.validateEntity(zhongqibaogao);
        zhongqibaogaoService.insert(zhongqibaogao);
        return R.ok();
    }
    /**
     * 修改
     */
    @RequestMapping("/update")
    public R update(@RequestBody ZhongqibaogaoEntity zhongqibaogao, HttpServletRequest request){
        //ValidatorUtils.validateEntity(zhongqibaogao);
        zhongqibaogaoService.updateById(zhongqibaogao);//全部更新
        return R.ok();
    }
    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        zhongqibaogaoService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
    /**
     * 提醒接口
     */
  @RequestMapping("/remind/{columnName}/{type}")
  public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, 
             @PathVariable("type") String type,@RequestParam Map<String, Object> map) {
    map.put("column", columnName);
    map.put("type", type);
    if(type.equals("2")) {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      Calendar c = Calendar.getInstance();
      Date remindStartDate = null;
      Date remindEndDate = null;
      if(map.get("remindstart")!=null && !map.get("remindstart").toString().equals("")) {
        Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
        c.setTime(new Date()); 
        c.add(Calendar.DAY_OF_MONTH,remindStart);
        remindStartDate = c.getTime();
        map.put("remindstart", sdf.format(remindStartDate));
      }
      if(map.get("remindend")!=null && !map.get("remindend").toString().equals("")) {
        Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
        c.setTime(new Date());
        c.add(Calendar.DAY_OF_MONTH,remindEnd);
        remindEndDate = c.getTime();
        map.put("remindend", sdf.format(remindEndDate));
      }
    }
    Wrapper<ZhongqibaogaoEntity> wrapper = new EntityWrapper<ZhongqibaogaoEntity>();
    if(map.get("remindstart")!=null && !map.get("remindstart").toString().equals("")) {
      wrapper.ge(columnName, map.get("remindstart"));
    }
    if(map.get("remindend")!=null && !map.get("remindend").toString().equals("")) {
      wrapper.le(columnName, map.get("remindend"));
    }
    String tableName = request.getSession().getAttribute("tableName").toString();
    if(tableName.equals("xuesheng")) {
      wrapper.eq("xueshengxuehao", (String)request.getSession().getAttribute("username"));
    }
    if(tableName.equals("jiaoshi")) {
      wrapper.eq("jiaoshigonghao", (String)request.getSession().getAttribute("username"));
    }
    int count = zhongqibaogaoService.selectCount(wrapper);
    return R.ok().put("count", count);
  }
}
package com.controller;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.annotation.IgnoreAuth;
import com.entity.ZaixianxuantiEntity;
import com.entity.view.ZaixianxuantiView;
import com.service.ZaixianxuantiService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MPUtil;
import com.utils.CommonUtil;
/**
 * 在线选题
 * 后端接口
 * @author 
 * @email 
 * @date 2020-11-02 10:24:01
 */
@RestController
@RequestMapping("/zaixianxuanti")
public class ZaixianxuantiController {
    @Autowired
    private ZaixianxuantiService zaixianxuantiService;
    /**
     * 后端列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,ZaixianxuantiEntity zaixianxuanti, HttpServletRequest request){
    String tableName = request.getSession().getAttribute("tableName").toString();
    if(tableName.equals("jiaoshi")) {
      zaixianxuanti.setJiaoshigonghao((String)request.getSession().getAttribute("username"));
    }
        EntityWrapper<ZaixianxuantiEntity> ew = new EntityWrapper<ZaixianxuantiEntity>();
    PageUtils page = zaixianxuantiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, zaixianxuanti), params), params));
        return R.ok().put("data", page);
    }
    /**
     * 前端列表
     */
  @IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params,ZaixianxuantiEntity zaixianxuanti, HttpServletRequest request){
        EntityWrapper<ZaixianxuantiEntity> ew = new EntityWrapper<ZaixianxuantiEntity>();
    PageUtils page = zaixianxuantiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, zaixianxuanti), params), params));
        return R.ok().put("data", page);
    }
  /**
     * 列表
     */
    @RequestMapping("/lists")
    public R list( ZaixianxuantiEntity zaixianxuanti){
        EntityWrapper<ZaixianxuantiEntity> ew = new EntityWrapper<ZaixianxuantiEntity>();
        ew.allEq(MPUtil.allEQMapPre( zaixianxuanti, "zaixianxuanti")); 
        return R.ok().put("data", zaixianxuantiService.selectListView(ew));
    }
   /**
     * 查询
     */
    @RequestMapping("/query")
    public R query(ZaixianxuantiEntity zaixianxuanti){
        EntityWrapper< ZaixianxuantiEntity> ew = new EntityWrapper< ZaixianxuantiEntity>();
    ew.allEq(MPUtil.allEQMapPre( zaixianxuanti, "zaixianxuanti")); 
    ZaixianxuantiView zaixianxuantiView =  zaixianxuantiService.selectView(ew);
    return R.ok("查询在线选题成功").put("data", zaixianxuantiView);
    }
    /**
     * 后端详情
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") String id){
        ZaixianxuantiEntity zaixianxuanti = zaixianxuantiService.selectById(id);
        return R.ok().put("data", zaixianxuanti);
    }
    /**
     * 前端详情
     */
  @IgnoreAuth
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") String id){
        ZaixianxuantiEntity zaixianxuanti = zaixianxuantiService.selectById(id);
        return R.ok().put("data", zaixianxuanti);
    }
    /**
     * 后端保存
     */
    @RequestMapping("/save")
    public R save(@RequestBody ZaixianxuantiEntity zaixianxuanti, HttpServletRequest request){
      zaixianxuanti.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
      //ValidatorUtils.validateEntity(zaixianxuanti);
        zaixianxuantiService.insert(zaixianxuanti);
        return R.ok();
    }
    /**
     * 前端保存
     */
    @RequestMapping("/add")
    public R add(@RequestBody ZaixianxuantiEntity zaixianxuanti, HttpServletRequest request){
      zaixianxuanti.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
      //ValidatorUtils.validateEntity(zaixianxuanti);
        zaixianxuantiService.insert(zaixianxuanti);
        return R.ok();
    }
    /**
     * 修改
     */
    @RequestMapping("/update")
    public R update(@RequestBody ZaixianxuantiEntity zaixianxuanti, HttpServletRequest request){
        //ValidatorUtils.validateEntity(zaixianxuanti);
        zaixianxuantiService.updateById(zaixianxuanti);//全部更新
        return R.ok();
    }
    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        zaixianxuantiService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
    /**
     * 提醒接口
     */
  @RequestMapping("/remind/{columnName}/{type}")
  public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, 
             @PathVariable("type") String type,@RequestParam Map<String, Object> map) {
    map.put("column", columnName);
    map.put("type", type);
    if(type.equals("2")) {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      Calendar c = Calendar.getInstance();
      Date remindStartDate = null;
      Date remindEndDate = null;
      if(map.get("remindstart")!=null && !map.get("remindstart").toString().equals("")) {
        Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
        c.setTime(new Date()); 
        c.add(Calendar.DAY_OF_MONTH,remindStart);
        remindStartDate = c.getTime();
        map.put("remindstart", sdf.format(remindStartDate));
      }
      if(map.get("remindend")!=null && !map.get("remindend").toString().equals("")) {
        Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
        c.setTime(new Date());
        c.add(Calendar.DAY_OF_MONTH,remindEnd);
        remindEndDate = c.getTime();
        map.put("remindend", sdf.format(remindEndDate));
      }
    }
    Wrapper<ZaixianxuantiEntity> wrapper = new EntityWrapper<ZaixianxuantiEntity>();
    if(map.get("remindstart")!=null && !map.get("remindstart").toString().equals("")) {
      wrapper.ge(columnName, map.get("remindstart"));
    }
    if(map.get("remindend")!=null && !map.get("remindend").toString().equals("")) {
      wrapper.le(columnName, map.get("remindend"));
    }
    String tableName = request.getSession().getAttribute("tableName").toString();
    if(tableName.equals("jiaoshi")) {
      wrapper.eq("jiaoshigonghao", (String)request.getSession().getAttribute("username"));
    }
    int count = zaixianxuantiService.selectCount(wrapper);
    return R.ok().put("count", count);
  }
}

五,相关作品展示

基于Java开发、Python开发、PHP开发、C#开发等相关语言开发的实战项目

基于Nodejs、Vue等前端技术开发的前端实战项目

基于微信小程序和安卓APP应用开发的相关作品

基于51单片机等嵌入式物联网开发应用

基于各类算法实现的AI智能应用

基于大数据实现的各类数据管理和推荐系统

相关文章
|
7月前
|
人工智能 前端开发 JavaScript
基于SSM+VUE实现毕业设计流程管理系统(三)
基于SSM+VUE实现毕业设计流程管理系统
|
7月前
基于SSM+VUE实现毕业设计流程管理系统(二)
基于SSM+VUE实现毕业设计流程管理系统
|
7月前
|
存储 测试技术 应用服务中间件
基于SSM+VUE实现毕业设计流程管理系统(一)
基于SSM+VUE实现毕业设计流程管理系统
|
7月前
|
前端开发 JavaScript 测试技术
基于SSM+VUE实现毕业设计流程管理系统
基于SSM+VUE实现毕业设计流程管理系统
|
4月前
|
Java 数据库连接 Maven
手把手教你如何搭建SSM框架、图书商城系统案例
这篇文章是关于如何搭建SSM框架以及实现一个图书商城系统的详细教程,包括了项目的配置文件整合、依赖管理、项目结构和运行效果展示,并提供了GitHub源码链接。
手把手教你如何搭建SSM框架、图书商城系统案例
|
3月前
|
Java 应用服务中间件 数据库连接
ssm项目整合,简单的用户管理系统
文章介绍了一个使用SSM框架(Spring、SpringMVC、MyBatis)构建的简单用户管理系统的整合过程,包括项目搭建、数据库配置、各层代码实现以及视图展示。
ssm项目整合,简单的用户管理系统
|
6月前
|
前端开发 JavaScript Java
计算机Java项目|SSM智能仓储系统
计算机Java项目|SSM智能仓储系统
|
3月前
|
XML Java 数据库连接
如何搭建SSM框架、图书商城系统
这是一份详尽的《Spring + SpringMVC + Mybatis 整合指南》,作者耗时良久整理出约五万字的内容,现已经全部笔记公开。此文档详细地介绍了如何搭建与整合SSM框架,具体步骤包括创建Maven项目、添加web骨架、配置pom文件以及整合Spring、SpringMVC和Mybatis等。无论是对初学者还是有一定基础的开发者来说,都是很好的学习资源。此外,作者还提供了项目源码的GitHub链接,方便读者实践。虽然当前主流推荐学习SpringBoot,但了解SSM框架仍然是不可或缺的基础。
45 0
|
4月前
|
SQL Java 应用服务中间件
使用SSM搭建图书商城管理系统(完整过程介绍、售后服务哈哈哈)
这篇文章是关于如何使用SSM框架搭建图书商城管理系统的教程,包括完整过程介绍、常见问题解答和售后服务,提供了项目地址、运行环境配置、效果图展示以及运行代码的步骤。
使用SSM搭建图书商城管理系统(完整过程介绍、售后服务哈哈哈)
|
5月前
|
存储 关系型数据库 测试技术
基于ssm+vue的校园驿站管理系统+(源码+部署说明+演示视频+源码介绍)(2)
基于ssm+vue的校园驿站管理系统+(源码+部署说明+演示视频+源码介绍)
78 1