作业在线提交和批改系统

课程管理:

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

文件管理:

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

一些缺点

  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
       
      
      
      
cloudera
https://repository.cloudera.com/artifactory/cloudera-repos/
org.apache.hadoop
hadoop-client
2.6.0-cdh5.7.0

然后就可以新建一个类来连接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.setId(0);
    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 list = new ArrayList();
    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 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
if (s.equals(sufix[i])){
file.setViewflag("Y");
break;
}
}
file.setChild(new ArrayList());
return file;
}

权限管理

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

文件管理UI

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

总结

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

你可能感兴趣的:(作业在线提交和批改系统)