From 0be5fdd979c9cd5622ebcdf10e76758a2866eb06 Mon Sep 17 00:00:00 2001 From: callmeyan Date: Tue, 24 May 2022 11:51:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=88=86=E4=BA=AB=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../driver/controller/ShareController.java | 19 +++-- .../driver/service/ShareService.java | 85 +++++++++++++++++++ web/src/pages/Share.vue | 74 ++++++++++++++++ web/src/router/index.js | 2 +- web/src/router/routes.js | 5 ++ web/src/service/api.js | 6 ++ 6 files changed, 184 insertions(+), 7 deletions(-) create mode 100644 web/src/pages/Share.vue diff --git a/driver/src/main/java/xyz/longicorn/driver/controller/ShareController.java b/driver/src/main/java/xyz/longicorn/driver/controller/ShareController.java index 6df2967..f16eca6 100644 --- a/driver/src/main/java/xyz/longicorn/driver/controller/ShareController.java +++ b/driver/src/main/java/xyz/longicorn/driver/controller/ShareController.java @@ -4,6 +4,7 @@ import cn.dev33.satoken.stp.StpUtil; import cn.hutool.captcha.generator.RandomGenerator; 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 xyz.longicorn.driver.dto.ApiResult; import xyz.longicorn.driver.pojo.ShareInfo; @@ -16,30 +17,36 @@ import javax.annotation.Resource; public class ShareController { @Resource private ShareService shareService; + /** * 创建分享 + * * @return */ @RequestMapping("/create") - public ApiResult create(@RequestBody ShareInfo info){ + public ApiResult create(@RequestBody ShareInfo info) { String id = StpUtil.getLoginId().toString(); // 设置分享者 info.setUid(Integer.parseInt(id)); // 设置密码 - if("yes".equalsIgnoreCase(info.getPassword())){ + if ("yes".equalsIgnoreCase(info.getPassword())) { RandomGenerator generator = new RandomGenerator("0123456789abcdefg", 4); info.setPassword(generator.generate()); - }else{ + } else { info.setPassword(null); // 不需要密码 } info.setId((new RandomGenerator(10)).generate()); return ApiResult.success(shareService.create(info)); } + @RequestMapping("/info") - public ApiResult info(String id){ + public ApiResult info(String id) { return ApiResult.success(shareService.getById(id)); } - public ApiResult list(ShareInfo info){ - return ApiResult.success(shareService.create(info)); + + @RequestMapping("/list") + public ApiResult list(@RequestParam(required = true) String id, String parent,String password) { + + return ApiResult.success(shareService.listFiles(id, parent,password)); } } diff --git a/driver/src/main/java/xyz/longicorn/driver/service/ShareService.java b/driver/src/main/java/xyz/longicorn/driver/service/ShareService.java index a12147b..2ff92d6 100644 --- a/driver/src/main/java/xyz/longicorn/driver/service/ShareService.java +++ b/driver/src/main/java/xyz/longicorn/driver/service/ShareService.java @@ -1,14 +1,99 @@ package xyz.longicorn.driver.service; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import xyz.longicorn.driver.config.BizException; +import xyz.longicorn.driver.dao.FileInfoMapper; +import xyz.longicorn.driver.dao.FolderInfoMapper; import xyz.longicorn.driver.dao.ShareInfoMapper; +import xyz.longicorn.driver.dto.FileItem; +import xyz.longicorn.driver.pojo.FileInfo; +import xyz.longicorn.driver.pojo.FolderInfo; import xyz.longicorn.driver.pojo.ShareInfo; +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + @Service public class ShareService extends ServiceImpl { + @Resource + private FileInfoMapper fileInfoMapper; + @Resource + private FolderService folderService; + public ShareInfo create(ShareInfo info) { this.save(info); return info; } + + public ShareInfo getById(String id) { + // 查询到分享信息 + QueryWrapper q = new QueryWrapper(); + q.eq("id", id); + q.eq("status", 1); // 只查询状态为1 0:删除 2:违规 3:xxx + final ShareInfo one = getOne(q); + + // 为null或者长期有效则不需要判断 + if (one != null && one.getLive() != -1) { + // 判断有效期 + long diffTime = (new Date()).getTime() - one.getCreateTime().getTime(); // 毫秒 + if (diffTime < 0) return one; // 说明有效期远远还没有到 + // 计算当前时间和创建时间的时间差 + long betweenTime = DateUtil.between(new Date(), one.getCreateTime(), DateUnit.SECOND); + if (betweenTime > one.getLive()) { // 大于有效期 + return null; + } + } + return one; + } + + public List listFiles(String id, String parent, String password) { + ShareInfo info = this.getById(id); + if (null == info) { + throw BizException.create("分享信息有误"); + } + // 需要先验证密码 + if (info.getPassword() != null) { + if (!info.getPassword().equalsIgnoreCase(password)) { + throw BizException.create("提取密码不正确"); + } + } + // 是否是文件 + if (info.getType() == 1) { + // 文件 + return getFileById(info.getFileId()); + } + return getFolderFilesById(info, parent); + } + + private List getFolderFilesById(ShareInfo info, String path) { + if(StringUtils.hasLength(path)){ +// path = path.substring(1); / + } + if(path == null || path.equals("/")){ + path = ""; + } + int uid = info.getUid(); + // 查询根目录信息 + FolderInfo folder = folderService.getById(info.getFileId()); // + String rootPath = folder.getPath(); // 获取真实的逻辑路径 + // 查询目录信息 + System.out.println(rootPath + path); + return folderService.listFolder(uid,rootPath + path); + } + + private List getFileById(Long fileId) { + final FileInfo fileInfo = fileInfoMapper.selectById(fileId); + FileItem item = FileItem.build(fileInfo); + List list = new ArrayList<>(); + list.add(item); + return list; + } } diff --git a/web/src/pages/Share.vue b/web/src/pages/Share.vue new file mode 100644 index 0000000..fc78ae8 --- /dev/null +++ b/web/src/pages/Share.vue @@ -0,0 +1,74 @@ + + + + + \ No newline at end of file diff --git a/web/src/router/index.js b/web/src/router/index.js index 790e58b..79d0b46 100644 --- a/web/src/router/index.js +++ b/web/src/router/index.js @@ -14,7 +14,7 @@ const loginPath = '/login', // 登录路径 // 全局导航守卫 router.beforeEach((to, from, next) => { const toPath = to.path; // 获取要展示得路径 - if (anonymousPaths.includes(toPath)) next() // 判断是否可匿名访问 + if (anonymousPaths.includes(toPath) || /^\/s\/*/i.test(toPath)) next() // 判断是否可匿名访问 else { // 验证token if (!store.getters.userToken) next(loginPath) // 没有登录直接打开登录页面 diff --git a/web/src/router/routes.js b/web/src/router/routes.js index 134d33c..d9a06b3 100644 --- a/web/src/router/routes.js +++ b/web/src/router/routes.js @@ -52,6 +52,11 @@ const routes = [ name: 'Login', path: '/login', component: () => import('../pages/Login.vue') + }, + { + name: 'Share', + path: '/s/:id', // 动态路由 + component: () => import('../pages/Share.vue') } ]; export default routes \ No newline at end of file diff --git a/web/src/service/api.js b/web/src/service/api.js index 09f52e8..113d5c8 100644 --- a/web/src/service/api.js +++ b/web/src/service/api.js @@ -187,6 +187,12 @@ export default { */ create(info) { return request('/api/share/create', 'POST', info) + }, + info(id){ + return request('/api/share/info', 'GET', {id}) + }, + list(id,parent='/'){ + return request('/api/share/list', 'GET', {id,parent}) } }, code() {