校园论坛(Java)—— 考研学习模块

news2024/11/16 19:53:56

校园论坛(Java)—— 考研学习模块

文章目录

  • 校园论坛(Java)—— 考研学习模块
    • 1、写在前面
    • 2、系统结构设计
      • 2.1 各个页面之间的调用关系
      • 2.2. 登录注册模块各层的设计
    • 3、考研学习模块设计
      • 3.1 浏览和查看帖子
      • 3.2 发表帖子
      • 3.3 删除帖子
      • 3.4 回复帖子
      • 3.5 删除回帖
    • 5、项目代码


在这里插入图片描述


1、写在前面

  • Windows版本:Windows10
  • JDK版本:Java8
  • MySQL版本:MySQL5.7
  • Tomcat版本:Tomcat9.0
  • IDE:IntelliJ IDEA Ultimate2020.2.3

2、系统结构设计

2.1 各个页面之间的调用关系

在这里插入图片描述

考研学习模块

  • TouristStudy.jsp:游客模式下,提示登录使用发表功能
  • touristStudyReply.jsp:游客模式下,只有查看学习专帖的权限,提示登录使用回复等功能
  • studyList.jsp:学习专帖的展示页面
  • study.jsp:发表学习专帖
  • releaseStudyJudge.jsp:学习专帖标题判空操作
  • studyReply.jsp:查看回帖信息
  • MdeleteUserStudyServlet:当前登录用户或管理员删除当前登录的学习专帖
  • UpdeleteStudyReplyByIdServlet:当前登录用户删除当前登录的学习专帖回帖
  • userlist.jsp:所有用户包括管理员自身的用户信息列表

2.2. 登录注册模块各层的设计

  • Entity层

实体层声明学习专帖的sid、title、content、cover、createTime等变量以及对应的set、get方法

public class StudyEntity {
    private int sid;
    private String title;
    private String content;
    private String cover;
    private Timestamp createTime;

    //关联用户,多对一额关联
    private UserEntity author = new UserEntity();
    //关联回复
    private List<StudyReplyEntity> studyReplyList = new ArrayList<>();


    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }


    public Timestamp getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Timestamp createTime) {
        this.createTime = createTime;
    }

    public String getCover() {
        return cover;
    }

    public void setCover(String cover) {
        this.cover = cover;
    }

    public UserEntity getAuthor() {
        return author;
    }

    public void setAuthor(UserEntity author) {
        this.author = author;
    }


    public List<StudyReplyEntity> getStudyReplyList() {
        return studyReplyList;
    }

    public void setStudyReplyList(List<StudyReplyEntity> studyReplyList) {
        this.studyReplyList = studyReplyList;
    }

}
  • Dao层

Dao层分别实现一个interface接口类以及一个接口方法实现类

接口类:

public interface StudyDaoInf {
    // TODO 查询所有考研学习信息
    public List<StudyEntity> findStudyList();

    // TODO 根据ID查询某个考研帖子
    public StudyEntity findStudyById(int id);

    // TODO 添加考研帖子
    public int addStudy(StudyEntity study);

    // TODO 根据考研帖子的ID查询所有回复
    public List<StudyReplyEntity> findStudyReplyList(int fid);

    // TODO 添加回复
    public int addStudyReply(StudyReplyEntity reply);

    // TODO 根据用户ID查询用户的所有考研发帖
    public List<StudyEntity> personStudy(int uid);

    // TODO 用户删除个人某个学习帖子
    public void deleteStudy(int fid);

    // TODO 管理员根据学习帖子id删除所有回复
    public void deleteStudyReply(int sid);

    // TODO 用户删除某个考研回帖
    public void deleteStudyReplyByRid(int rid);

    // TODO 用户管理模块
    // TODO 删除用户所有考研发帖
    public void dUserAllStudyByUid(int uid);

    // TODO 删除该用户所有考研回帖
    public void dUserAllStudyReplyByUid(int uid);

    // TODO 删除用户帖子下的所有考研回帖
    public void dUserOtherStudyRelyBySid(int uid);
}

接口实现方法

public class StudyDaoImpl implements StudyDaoInf {
    /**
     * TODO 查询考研帖子列表
     * @return
     */
    public List<StudyEntity> findStudyList() {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<StudyEntity> list = new ArrayList<StudyEntity>();
        String sql = "select * from study_info order by create_time desc";
        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();

            while (rs.next()) {
                StudyEntity study = new StudyEntity();
                study.setSid(rs.getInt(1));
                study.setTitle(rs.getString(2));
                study.setContent(rs.getString(3));
                study.setCover(rs.getString(4));
                study.setCreateTime(rs.getTimestamp(5));
                // TODO 获取对应用户表中的外键
                UserEntity author = new UserEntity();
                author.setUser_id(rs.getInt(6));
                study.setAuthor(author);
                list.add(study);
                System.out.println("查询所有考研帖子:" + rs.getString(3));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(rs, ps, conn);
        }
        return list;
    }

    /**
     * TODO 添加考研帖子
     * @param study
     * @return
     */
    public int addStudy(StudyEntity study) {
        Connection conn = null;
        PreparedStatement ps = null;
        String sql = "insert into study_info(title,content,cover,create_time,user_id) values(?,?,?,?,?)";

        System.out.println("添加考研帖子");
        int i = 0;
        System.out.println(study.getCreateTime());
        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setString(1, study.getTitle());
            ps.setString(2, study.getContent());
            ps.setString(3, study.getCover());
            ps.setTimestamp(4, study.getCreateTime());
            ps.setInt(5, study.getAuthor().getUser_id());
            i = ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(null, ps, conn);
        }
        return i;
    }

    /**
     * TODO 根据ID查询某个考研帖子
     * @param sid
     * @return
     */
    public StudyEntity findStudyById(int sid) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        StudyEntity study = null;
        String sql = "select * from study_info where sid = ?";
        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1, sid);
            rs = ps.executeQuery();
            if(rs.next()){
                study = new StudyEntity();
                study.setSid(rs.getInt(1));
                study.setTitle(rs.getString(2));
                study.setContent(rs.getString(3));
                study.setCover(rs.getString(4));
                study.setCreateTime(rs.getTimestamp(5));
                // TODO 获取对应用户表中的外键
                UserEntity author = new UserEntity();
                author.setUser_id(rs.getInt(6));
                study.setAuthor(author);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(rs, ps, conn);
        }
        return study;
    }

    /**
     * TODO 查询考研帖子对应的所有回复
     * @param sid
     * @return
     */
    public List<StudyReplyEntity> findStudyReplyList(int sid) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<StudyReplyEntity> list = new ArrayList<StudyReplyEntity>();
        // TODO 根据外键作为条件查询当前帖子的所有回复
        String sql = "select * from study_reply_info where sid = ?";
        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1, sid);
            rs = ps.executeQuery();
            while(rs.next()){
                StudyReplyEntity reply = new StudyReplyEntity();
                reply.setRid(rs.getInt(1));
                reply.setContent(rs.getString(2));
                reply.setStudyReplyTime(rs.getTimestamp(3));
                // TODO 获取对应用户表中的外键
                UserEntity replyUser = new UserEntity();
                replyUser.setUser_id(rs.getInt(4));
                reply.setUser(replyUser);
                list.add(reply);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(rs, ps, conn);
        }
        return list;
    }

    /**
     * TODO 添加考研回复
     * @param reply
     * @return
     */
    public int addStudyReply(StudyReplyEntity reply) {
        Connection conn = null;
        PreparedStatement ps = null;
        int i = 0;

        System.out.println("添加回复成功");
        String sql = "insert into study_reply_info(reply_content, reply_time, user_id, sid) values(?,?,?,?)";
        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setString(1, reply.getContent());
            ps.setTimestamp(2, reply.getStudyReplyTime());
            // TODO 将相应的两个外键设值
            ps.setInt(3, reply.getUser().getUser_id());
            ps.setInt(4, reply.getStudy().getSid());

            i = ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(null, ps, conn);
        }
        return i;
    }

    /**
     * TODO 根据用户ID查询用户的所有考研发帖
     * @param pid
     * @return
     */
    public List<StudyEntity> personStudy(int pid){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        String sql = "select * from study_info where user_id=?";
        List<StudyEntity> list = new ArrayList<StudyEntity>();

        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1, pid);
            rs = ps.executeQuery();

            while (rs.next()) {
                StudyEntity study = new StudyEntity();
                study.setSid(rs.getInt(1));
                study.setTitle(rs.getString(2));
                study.setContent(rs.getString(3));
                study.setCover(rs.getString(4));
                study.setCreateTime(rs.getTimestamp(5));

                UserEntity user = new UserEntity();
                user.setUser_id(rs.getInt(6));
                study.setAuthor(user);
                list.add(study);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

    /**
     * TODO 用户删除个人某个学习帖子
     * @param sid
     */
    public void deleteStudy(int sid){
        Connection conn = null;
        PreparedStatement ps = null;

        String sql = "delete from study_info where sid =?";

        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1, sid);
            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(null, ps, conn);
        }
    }

    /**
     * TODO 管理员根据学习帖子id删除所有回复
     * @param sid
     */
    public void deleteStudyReply(int sid){

        System.out.println("sid: " + sid);
        Connection conn = null;
        PreparedStatement ps = null;

        String sql = "delete from study_reply_info where sid = ?";

        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1, sid);

            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(null, ps, conn);
        }
    }

    /**
     * TODO 用户删除某个考研学习回帖
     * @param rid
     */
    public void deleteStudyReplyByRid(int rid){
        Connection conn = null;
        PreparedStatement ps = null;

        String sql = "delete from study_reply_info where reply_id = ?";

        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1, rid);
            ps.executeUpdate();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            DBUtil.close(null, ps, conn);
        }
    }

    // TODO 2. 用户管理模块

    /**
     * TODO 删除用户所有考研发帖
     * @param uid
     */
    public void dUserAllStudyByUid(int uid){
        Connection conn = null;
        PreparedStatement ps = null;

        String sql = "delete from study_info where user_id=?";

        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1, uid);

            ps.executeUpdate();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            DBUtil.close(null, ps, conn);
        }
    }

    /**
     * TODO 删除用户的所有考研回帖
     * @param uid
     */
    public void dUserAllStudyReplyByUid(int uid){
        Connection conn = null;
        PreparedStatement ps = null;

        String sql = "delete from study_reply_info where user_id=?";

        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1, uid);

            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(null, ps, conn);
        }
    }

    /**
     * TODO 删除用户帖子下的所有考研回帖
     * @param uid
     */
    public void dUserOtherStudyRelyBySid(int uid){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        String sql = "select sid from study_info where user_id=?";

        List<StudyEntity> sidlist = new ArrayList<StudyEntity>();
        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1, uid);
            rs = ps.executeQuery();

            while (rs.next()) {
                StudyEntity forum=new StudyEntity();
                forum.setSid(rs.getInt(1));
                sidlist.add(forum);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(null, ps, conn);
        }

        String ssql = "delete from study_reply_info where sid=?";

        try {
            for (StudyEntity forum : sidlist) {
                conn = DBUtil.getConnection();
                ps = conn.prepareStatement(ssql);
                ps.setInt(1, forum.getSid());

                ps.executeUpdate();
                DBUtil.close(null, ps, conn);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
  • service层

实现servlet层调用的方法,对数据库进行增删改查操作。

  • Servlet层

在该层,通过jsp页面传递的参数,调用相应的方法进行操作。

3、考研学习模块设计

考研学习模块分为浏览、查看、发表、删除、回复帖子的功能。

3.1 浏览和查看帖子

考研学习模块的帖子列表如下图所示:

在这里插入图片描述

单击帖子标题,即可查看该帖子的详细内容,同时,如果查看的帖子的发表者是当前登录用户或者当前登录用户是管理员,则均具有删除本帖的权限,否则,不会显示「删除本帖」按钮。三种情况分别如下方3张图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

与普通帖子一样,学习专帖也可以通过单击用户名即可查看发表者的信息,如图3-22所示。

在这里插入图片描述

3.2 发表帖子

发表考研学习帖子:

点击学习专区的「发表学习专帖」按钮进入发表页面,此处不同于普通帖子的是,学习专区的帖子新增了帖子封面壁纸的选择,完成帖子信息的填写之后,点击“发表”按钮即可发表成功。如下图所示:

在这里插入图片描述

发表的学习专帖可以通过考研学习专区帖子列表来查看。

3.3 删除帖子

通过studyReply.jsp页面的“删除本帖”按钮,页面设计和逻辑实现和普通帖子的删除也是大同小异的。

若查看的学习专帖的发表者为当前登录用户或者当前登录用户为管理员身份,均拥有删除此条帖子的功能。如下图所示:

在这里插入图片描述

3.4 回复帖子

在studyReply.jsp页面底部设置有回复框,页面设计和逻辑实现和普通帖子的回复也是大同小异的。

与普通帖子的回复如出一辙,学习专帖的回复如下图所示:

回帖前:

在这里插入图片描述

回帖后:

在这里插入图片描述

3.5 删除回帖

在studyReply.jsp页面,主帖下的每一条回帖都设置有“删除回帖”按钮,页面设计和逻辑实现和普通帖子的删除回帖也是大同小异的。

如下图所示,若查看的学习专帖的发表者为当前登录用户,则当前用户拥有删除此条帖子下所有回帖的权限。

在这里插入图片描述

5、项目代码

  • GitHub
  • Gitee

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/56373.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GJB 5000B二级-CM配置管理

主要变化情况 继承3条、修订3条 一、修订的主要内容 CM2.2 建立并维护配置管理系统(SP1.2:建立配置管理系统). 实践陈述:建立并维护配置管理系统和管理规程,建立多级控制机制,实现对已标识配置项的存储、检索、访问控制、变更控制、备份和恢复; CM2.4:跟踪和控制变更…

数据结构-难点突破(C++实现图的基本操作(邻接矩阵,邻接表,十字链表法储存代码))

关于图的数据结构&#xff0c;我曾经自己学过一部分&#xff0c;图论专栏&#xff0c;但是学习本就是重复的过程&#xff0c;这里打算系统的学习一下图。第一步当然是图的储存和基本操作的实现。 要用C实现图的基本操作 Adjacent(x&#xff0c;y)&#xff1a;判断图是否存在边…

[附源码]Python计算机毕业设计Django健康医疗体检

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

[附源码]计算机毕业设计JAVA校园闲置物品交易

[附源码]计算机毕业设计JAVA校园闲置物品交易 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

第十五章 如何编写README文档

README 文档对于开源项目的重要性甚至会超过代码本身。你试想一下&#xff0c;你打开一个 Github 项目&#xff0c;第一时间就会看到 README 文档&#xff0c;而这时候同一类的项目你可能有很多选择&#xff0c;如果这个README不正规&#xff0c;无法快速上手&#xff0c;你可能…

4.springboot中整合Mybatis

Springboot整合mybatis 在 SpringSpringMVC 中整合 MyBatis 步骤需要在配置文件里配置多个 Bean&#xff0c;比如MapperScannerConfigurer&#xff0c;SqlSessionFactoryBean 等&#xff0c;步骤还是比较复杂的&#xff0c;Spring Boot 中对此做了进一步的简化&#xff0c;使 …

GIS工具maptalks开发手册(三)03——官网示例之添加图层和移除图层

GIS工具maptalks开发手册(三)03——官网示例之添加图层和移除图层 效果 代码 index.html <!DOCTYPE html> <html> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1"> <ti…

Android系统启动流程

Android系统完整的启动过程&#xff0c;从系统层次角度可分为 Linux 系统层、Android 系统服务层、Zygote进程模型三个阶段&#xff1b;从开机到启动 Home Launcher 完成具体的任务细节可分为七个步骤&#xff0c;下面就从具体的细节来解读 Android 系统完整的初始化过程。 Lo…

java计算机毕业设计基于springboot电商项目(附源码讲解)

目录 1. 用户端 1.1 主页&#xff08;未登录时可以查看商品但是不可以购买&#xff09; 1.2 登录&#xff08;账号密码登录) 1.3 登录&#xff08;手机验证码登录&#xff09; 1.4 注册 1.5 查看商品详情 1.6 将商品加入购物车 1.7 在商品购物车中选中商品购买 1.8 …

Jenkins用户权限配置 (三)

平时开发会分为测试环境、生产环境&#xff0c;多个开发人员需要区分不同的权限。例如普通开发人员只能看到测试视图和发布测试环境&#xff0c;生产环境的发布则由负责把控的人员进行统一发布&#xff0c;所以需要在新建用户的同时也分配好权限 (一) 安装Role-based Authoriz…

基于C#的公交充值管理系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做C#程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问题…

利用SCRM进行精细化社群运营

有很多企业凭借私域模式获得爆发式的流量增长&#xff0c;但流量转化仍旧是个问题&#xff0c;因此企业在获得流量的同时&#xff0c;还要守住流量&#xff0c;进行精细化运营才行。 前言 近年来&#xff0c;私域、社群、裂变的模式已成为各行各业进行营销的主旋律&#xff0c…

【Matplotlib绘制图像大全】(八):Matplotlib使用text()添加文字标注

前言 大家好,我是阿光。 本专栏整理了《Matplotlib绘制图像大全》,内包含了各种常见的绘图方法,以及Matplotlib各种内置函数的使用方法,帮助我们快速便捷的绘制出数据图像。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmMatp…

[附源码]计算机毕业设计招聘系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

GIS工具maptalks开发手册(三)02——层级缩放工具

GIS工具maptalks开发手册(三)02——层级缩放工具 效果-层级缩放工具 代码 index.html <!DOCTYPE html> <html><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><title>…

[附源码]Python计算机毕业设计SSM抗新冠肺炎药品进销存管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]计算机毕业设计疫情防控管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Mysql - 读写分离与读负载均衡之Maxscale

原文地址 Mysql - 读写分离与读负载均衡之Maxscale - 小豹子加油 - 博客园 maxscale会自动识别出集群的master与slave角色。所以我们可以将maxscale与mha结合起来&#xff0c;既能实现主库的故障转移&#xff0c;又能实现读写分离和从库的负载均衡。 一、概述 常见的高可用…

干货 | Burpsuite的使用tips总结

渗透测试用到Burp时候很多&#xff0c;整理了一些tips供测试时候更得心应手~ tips1:光标错位和中文显示 新版一打开容易光标错位&#xff0c;默认情况下使用字体是Courier New&#xff0c;显示不了中文。 换用Monospaced字体即可正常显示中文&#xff0c;一般这里就不会错位了…

[附源码]Python计算机毕业设计Django基于Web的绿色环保网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…