zoukankan      html  css  js  c++  java
  • 作业在线提交和批改系统

    课程管理:

    教师可以创建、删除、修改课程,学生可以加入、退出课程,查询所有的课程,教务主任可以查看所有的课程;

    教师课程管理

    文件管理:

    教师可以在课程对应的文件管理界面上进行文件的所有操作,学生可以在课程对应的文件管理界面进行上传、下载操作,教务主任可以在所有课程对应的文件管理界面上查看文件。
    教师我的课程

    一些缺点

    1. 文件管理执行文件的操作后,UI上没有实时反映更新的结果
    2. 没有文件在线预览功能
    3. 批改功能不知道怎么实现才算好?

    要点介绍

    通过spring boot操作hdfs中的文件

    1. 虚拟机搭建hadoop单机伪分布式环境,环境为vmware,centOS6.5。注意虚拟机名字为hadoop,要能上网,并且ip为静态IP;

    2. 主机下载好hadoop和jdk,通过FileZilla这个软件上传到虚拟机里。jdk最好是rpm格式,从官网下。hadoop版本为hadoop-2.6.0-cdh5.7.0.tar.gz

    3. 安装过程参考网上资料,先装jdk,然后再装ssh,最后装hadoop,然后启动hadoop;

    4. 在spring boot中操作hadoop。pom.xml中的代码为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <repositories>
    <repository>
    <id>cloudera</id>
    <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
    </repository>
    </repositories>
    <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>2.6.0-cdh5.7.0</version>
    </dependency>

    然后就可以新建一个类来连接hadoop了,值得注意的是,对hdfs的操作都要通过FileSystem对象,网上很多都是写在测试类里的@Before方法里,这样可以在执行其他方法时先初始化了然后再调用FileSystem对象,但java类中我不知道怎么全局初始化一个对象,所以我写了个init()方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    String HDFS_PATH = "hdfs://192.168.80.131:9000";
    String USER_NAME = "hadoop";
    public FileSystem init(){
    try {
    Configuration configuration = new Configuration();
    fileSystem = FileSystem.get(new URI(HDFS_PATH), configuration, USER_NAME);
    } catch (Exception e) {
    log.error("IOException:"+e);
    }
    return fileSystem;
    }

    这样在其他方法要用到时就先调用init(),避免报fileSystem为null的错误。注意username为hadoop,也是虚拟机的名字,这里不写这个参数也会报错,因为每次操作都要指定特定的用户;

    1. 对应的文件操作其实都挺简单的,直接调用对应的方法即可,这里重点讲下如何递归地查询文件以及下面的子文件夹:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      public File queryDirs(String dir) throws IOException {
      init();
      File file = new File();
      file.setPath(dir);
      file.setPid(-1);
      file.setTitle("全部文件");
      FileStatus[] fileStatuses = fileSystem.listStatus(new Path(dir));
      int pid = 0;
      queryDir(fileStatuses,file, pid);
      return file;
      }
      private void queryDir(FileStatus[] fileStatuses, File file,int pid) throws IOException {
      if (fileStatuses.length > 0){
      List<File> list = new ArrayList<File>();
      for (FileStatus fs : fileStatuses) {
      File f = getFile(fs);
      f.setId(id++);
      f.setPid(pid);
      list.add(f);
      if (fs.isDirectory()){
      FileStatus[] childFs = fileSystem.listStatus(fs.getPath());
      queryDir(childFs, f, id - 1);
      }
      }
      file.setChild(list);
      }
      }

    这里涉及到一个自定义的File类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    @Data
    public class File {
    //文件(夹)名
    private String title;
    //id
    private Integer id;
    //pid
    private Integer pid;
    //文件(夹)路径
    private String path;
    //类型:文件/文件夹
    private String type;
    //修改日期
    private String date;
    //文件大小
    private String size;
    //是否可读
    private String viewflag="N";
    //子文件夹
    private List<File> child;
    }

    以及一个对应的getFile()方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    //获取文件的各个属性
    public File getFile(FileStatus fs){
    File file = new File();
    file.setTitle(fs.getPath().getName());
    file.setPath(fs.getPath().toString().substring(26));
    file.setSize(HdfsUtil.FormatFileSize(fs.getLen()));
    file.setDate(HdfsUtil.longToString(fs.getModificationTime()));
    file.setType(fs.isDirectory()?"D":"F");
    //判断文件是不是可读取的类型,如果是,设置标志为可读
    String s = HdfsUtil.getFileSufix(file.getTitle());
    for (int i = 0; i <sufix.length ; i++) {
    if (s.equals(sufix[i])){
    file.setViewflag("Y");
    break;
    }
    }
    file.setChild(new ArrayList<File>());
    return file;
    }

    权限管理

    这里我直接在github上找了一个现成的:idea spring boot的后台基础权限管理系统
    第一次使用别人的代码,才发现真的挺坑的,不过这个虽然star人数不多,有些bug,但总体来说代码逻辑结构清晰,功能全面,修改起来还算可以。

    文件管理UI

    这个也是从github上找的,模拟百度云界面:百度云界面功能实现
    全是用html+css+jquery写的,几十个jquery函数改起来很要命…..,但没办法,界面确实是我想要的。

    mark

    总结

    上面就是这个项目有必要说明的地方,不建议下载我的代码,因为实在是很渣,通过这次意识到自己很多的不足,希望以后在github能有更多自己写的优质的项目。(ง •̀_•́)ง

  • 相关阅读:
    keyCode的使用
    写自已的类库需要的核心代码
    50个必备的实用jQuery代码段
    javascript基础
    给js原生Array增加each方法
    jquery中一些容易让人困惑的东西总结[转载]
    ajax编程
    oracle的正则表达式 [转载]
    eclipse 插件大全
    SlickGrid Options
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12259021.html
Copyright © 2011-2022 走看看