# java-web-exp
### 2023春季学期java课程作业
##### 项目名称:在线文件管理器
##### 演示视频链接
[演示视频链接](./README.assets/java-web演示视频.mov)
##### 技术栈:
- 前端:
- Vue2.x
- axios ajax请求库
- bootstrap5.x ui库
- bootstrap icon icon库
- quill.js实现文本编辑
- 后端
- springboot3
- mysql数据库
##### 开发周期:4天(6-17-6.20)
### 功能完成情况
- [x] 用户注册、登陆验证
- [x] 用户信息获取
- [x] 目录导航、子目录创建、目录下文件展示
- [x] 创建文本文件(txt)
- [x] 批量上传文件
- [x] 查看文件、删除文件
- [x] 编辑文本文件并保存
- [x] 拖拽移动文件到文件夹内
- [x] 拖拽移动文件到上一级目录
- [x] 按住ctrl/command多选文件删除
- [x] 缓存用户上次查看的目录
- [x] 部分加了键绑定 比如esc退出查看 非流媒体空格也可以退出
- [ ] 后端的表单校验
### 软件功能说明
注:
1. 进入目录或打开文件需要双击
2. 只有按住cmd或ctrl选择文件后删除图标才会出现
3. 拖拽功能仅支持单个拖拽(主要是没有实现多个同时被拖拽的样式问题)
#### 核心功能为文件管理
- 登陆注册
- 首次访问没有登陆需要先注册登陆
- 注册与登陆页可以相互跳转
- 支持用户上传文件到当前目录
- 支持批量上传
- 最大单个文件不超过20m
- 不支持上传目录
- 支持创建目录到当前目录
- 不支持选择路径创建,如需在创建到某个目录下,需先进入这个目录,或者创建完移动进去
- 可以创建文本(txt)文件到当前目录
- 不支持选择路径,只能创建txt,不需要写文件格式
- 支持网页上拖拽文件到文件夹或上一级目录
- 目前仅支持单个拖拽,拖拽过程会有样式提示,可以拖进去的背景色会变蓝
- 支持拖拽文件或目录
- 按住cmd/ctrl多选文件后删除
- 按住cmd或ctrl可以多选
- 删除按钮只有在多选后才出现
- 可以完整浏览用户所有的目录和文件,文件导航和返回上一级
- 文件导航功能完整,支持跳转到点击的位置
- 当前目录不可点击
- 非根目录文件列表第一个为...名称的文件夹,双击返回上一级目录
- 可以查看大部分流行文件(pdf,流媒体,图片等)
- 不可查看的文件类型会提示不可查看
- 流媒体文件支持倍速控制,下载,音量控制等
- pdf支持下载
- 支持编辑txt文本文件并保存
- 如果打开的文件为txt文本文件,则自动进入编辑
- 退出或保存都可以保存文件到服务器
- 缓存用户上次查看的目录,下次进入网站时会自动跳转到上次访问的目录
- 组件销毁时会缓存当前用户访问的目录
- 下次进入该页面会优先显示上次访问的目录
#### 功能图
![功能图](README.assets/功能图.png)
#### 核心功能实现介绍
##### 文件列表的渲染
1. 数据库 file表
| id | user_id | parent_id | name | type | size | path | updated | status |
| :----: | ------- | ------------------ | ------ | -------- | -------- | ------------ | -------- | -------- |
| 文件id | 用户id | 父文件id(根为-1) | 文件名 | 文件类型 | 文件大小 | 文件存储路径 | 更新时间 | 是否删除 |
2. 接口返回的是当前用户所有的文件
3. 前端得到的是一个扁平的数组,需要处理成树状,核心实现如下
```js
// 处理文件 将扁平的列表变为树状 添加类型信息
handlerFileList(list,pid){
const result = [];
// 遍历列表,找到指定 parentId 的对象
for (const item of list) {
if (item.parent_id == pid) {
// 递归调用
const children = this.handlerFileList(list, item.id);
item.children = children
result.push(item);
}
}
return result;
},
```
4. 初始化数据之后访问时只需要根据pid找到对应item的children即可,查询逻辑如下
```js
// 根据parent_id获取对应节点的children
findChildren(pid){
if(pid == -1) return this.filelist; // pid为-1表示当前文件在根目录下,直接返回总的list
return this.getFileListById(this.filelist,pid)
},
// 递归查询对应pid的children
getFileListById(list,pid){
for(const item of list){
if(item.id == pid)
return item.children
if(item.children && item.children.length > 0 ){
const result = this.getFileListById(item.children,pid)
if(result){
return result
}
}
}
return null
},
```
##### 目录导航功能
1. 导航:
- 使用curPath对象数组变量存储导航栏信息,每个对象中包括当前目录的目录`id`和`folder_name`
- 点击导航栏时获取该item下的id,通过上述`findChildren()`函数找到对应的`children`
```js
// 点击导航栏进入目录
navigateTo(item){
let i = this.curPath.indexOf(item) // 获取点击item在路径中的索引
if(i == this.curIndex) return // 当前路径点击无效
this.curPathIndex = i
this.curlist = this.findChildren(item.id) // 更新当前列表
this.curPath.splice(i+1) // 删除导航栏路径的元素
},
```
2. 点击目录进入
- 将目标元素的`children`赋值给当前列表
- 并将目标元素的对应信息push到导航栏路径
##### 文件拖拽功能
注意点
- 将`tr`标签`draggable`属性设置为`true`
- 给`tr`绑定`drapstart,dragover,dragleave,drop`方法
- 其中`dragover`需要禁止默认事件
1. dragstart
- 开始拖动的函数,记录起始索引
- 代码:
```js
// 开始拖动文件的起始索引
onDragStart(index){
this.curSelectIndex = index
},
```
2. dragover
- 拖动过程执行,检测当前鼠标下的元素是否为folder类型 如果是给该元素添加高亮样式
- 代码:
```js
// 拖动过程
dragOver(event, index) {
event.preventDefault() // 要阻止默认事件drop才能生效
if(index == -1){ // 上一级目录的index为-1
this.isHoveringGoBack = true
return
}
const item = this.curlist[index]
if(item.type == "folder"){
item.isHovering = true
}
}
```
3. dragleave
- 离开元素时执行
- 离开folder以后将对应样式移除
- 代码:
```js
// 离开后让取消样式
dragLeave(item){
if(item == null){
this.isHoveringGoBack = false
return
}
item.isHovering = false
}
```
4. drop
- 鼠标松开执行,即释放拖动的元素
- 判断当前文件是否为文件夹或者是否是“上一层”的,如果是更新文件列表和导航路径
- 代码:
```js
// 释放时
drop(event, index) {
event.preventDefault();
const draggedIndex = this.curSelectIndex
const draggedItem = this.curlist[draggedIndex];
var targetItem = null
if(index != -1){
targetItem = this.curlist[index]
targetItem.isHovering = false;
}
if(draggedIndex==index) return
if(index == -1){
let pid = this.curPath[this.curPathIndex - 1].id
this.changeFilePosition(draggedItem.id,pid)
this.curlist.splice(draggedIndex, 1);
return
}
if (targetItem.type === 'folder' ) {
// 将拖拽的文件或文件夹放入目标文件夹中
targetItem.children.push(draggedItem);
// 改变文件位置
this.changeFilePosition(parseInt(draggedItem.id),targetItem.id)
// window.location.reload();
// 从原位置删除拖拽的文件或文件夹
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Java大学学期期末大作业合集 内容概览: 这份合集是我在大学期间完成的Java学期期末大作业,其中包括了完整的代码、项目、文档和使用说明。内容涵盖了从基础到进阶的Java知识,具体包括: 代码与项目:详细的Java代码,展示了各种数据结构和算法的实际应用。同时,我还创建了一个完整的小型项目,该项目使用Java进行开发,并实现了多种功能。 MD文档:为了帮助他人更好地理解项目,我编写了详细的Markdown文档,对项目进行了全面的介绍,包括项目背景、功能描述、技术栈选择等。 操作手册与使用说明:针对项目的实际使用,我编写了详尽的操作手册和使用说明,确保用户可以轻松上手。 学习笔记:在完成项目的过程中,我记录了大量的学习笔记,这些笔记涵盖了我遇到的问题、解决方案以及学习心得。 适用人群: 这份合集适用于所有正在学习或已经掌握Java基础的人群,无论你是大学生、Java初学者还是有一定经验的开发者,都可以从中获得启发和帮助。 使用建议: 按需阅读:不同的用户可能有不同的需求,你可以根据自己的实际情况选择阅读的内容。例如,如果你对某个算法或数据结构感兴趣,可以直接查看相关的代码实现。 实践为先:虽然这份合集提供了丰富的理论知识和实践代码,但最好的学习方式仍然是亲自动手实践。尝试运行代码、修改项目并解决遇到的问题。 持续学习:Java是一门不断发展的语言,新的特性和技术不断涌现。我建议你在使用这份合集的同时,也要关注Java的最新动态,持续学习和进步。
资源推荐
资源详情
资源评论
收起资源包目录
中国海洋大学2023春java-web期末大作业.zip (26个子文件)
meiyangyagcaoheitailng
pom.xml 2KB
src
test
java
raining
java_web_exp
AppTest.java 648B
main
resources
application.properties 305B
static
register.html 3KB
login.html 3KB
index.html 5KB
userinfo.html 3KB
raining.png 3KB
filelist.html 24KB
java
raining
java_web_exp
controller
FileController.java 10KB
UserController.java 2KB
App.java 372B
model
FileEntity.java 1KB
User.java 993B
db
Conn.java 8KB
README.assets
播放音频.png 155KB
播放视频.png 2.6MB
查看图片.png 2.22MB
编辑文本文件.png 191KB
文件列表页.png 236KB
主页-7263074.png 183KB
java-web演示视频.mov 18.94MB
功能图.png 58KB
查看pdf.png 711KB
主页.png 183KB
README.md 16KB
共 26 条
- 1
资源评论
01红C
- 粉丝: 1918
- 资源: 2134
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功