diff --git a/src/main/java/vip/fuck/sm/common/utils/FileConfig.java b/src/main/java/vip/fuck/sm/common/utils/FileConfig.java index 8757a94..b38ad70 100644 --- a/src/main/java/vip/fuck/sm/common/utils/FileConfig.java +++ b/src/main/java/vip/fuck/sm/common/utils/FileConfig.java @@ -1,16 +1,20 @@ package vip.fuck.sm.common.utils; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.system.SystemUtil; import org.noear.solon.Solon; public class FileConfig { - public static String getFilePath(){ + public static String getFilePath( String... subDir){ String key ; if(SystemUtil.getOsInfo().isWindows()){ key = "file.path-win"; }else{ key = "file.path-linux"; } - return Solon.cfg().get(key,"/file-path"); + String p = Solon.cfg().get(key,"/file-path"); + String sub = ObjectUtil.isNotEmpty(subDir) && ObjectUtil.isNotEmpty(subDir[0]) + ?String.format("/%s",subDir[0]):""; + return String.format("%s%s",p,sub) ; } } diff --git a/src/main/java/vip/fuck/sm/controller/SysFilesController.java b/src/main/java/vip/fuck/sm/controller/SysFilesController.java index 29ce8a6..fa38fa4 100644 --- a/src/main/java/vip/fuck/sm/controller/SysFilesController.java +++ b/src/main/java/vip/fuck/sm/controller/SysFilesController.java @@ -5,6 +5,7 @@ import cn.dev33.satoken.annotation.SaMode; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import vip.fuck.sm.common.exception.BusinessException; +import vip.fuck.sm.common.utils.DateUtils; import vip.fuck.sm.entity.SysFilesEntity; import vip.fuck.sm.service.SysFilesService; import io.swagger.annotations.Api; @@ -17,6 +18,7 @@ import org.noear.solon.validation.annotation.Valid; import org.smartboot.http.server.HttpRequest; import org.smartboot.http.server.HttpResponse; +import java.util.Date; import java.util.List; @@ -40,12 +42,13 @@ public class SysFilesController { @Post @Mapping("/upload") @SaCheckPermission(value = {"sysFiles:add", "sysContent:update", "sysContent:add"}, mode = SaMode.OR) - public String add(UploadedFile file, HttpRequest request) { + public SysFilesEntity add(UploadedFile file) { //判断文件是否空 if (file == null || file.getName() == null || "".equalsIgnoreCase(file.getName().trim())) { throw new BusinessException("文件为空"); } - return sysFilesService.saveFile(file, request); + String createTime = DateUtils.format(new Date(), DateUtils.DATEPATTERN); + return sysFilesService.saveFile(file,createTime); } @ApiOperation(value = "删除") diff --git a/src/main/java/vip/fuck/sm/controller/SysPlugsController.java b/src/main/java/vip/fuck/sm/controller/SysPlugsController.java index 48ec233..c9a55f2 100644 --- a/src/main/java/vip/fuck/sm/controller/SysPlugsController.java +++ b/src/main/java/vip/fuck/sm/controller/SysPlugsController.java @@ -1,5 +1,6 @@ package vip.fuck.sm.controller; +import cn.dev33.satoken.annotation.SaMode; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -14,9 +15,14 @@ import io.swagger.annotations.ApiParam; import java.util.List; import org.noear.solon.core.handle.ModelAndView; +import org.noear.solon.core.handle.UploadedFile; +import org.smartboot.http.server.HttpRequest; +import vip.fuck.sm.common.exception.BusinessException; import vip.fuck.sm.common.utils.DataResult; +import vip.fuck.sm.entity.SysFilesEntity; import vip.fuck.sm.entity.SysPlugsEntity; +import vip.fuck.sm.service.SysFilesService; import vip.fuck.sm.service.SysPlugsService; @@ -43,6 +49,14 @@ public class SysPlugsController { return new ModelAndView("sysplugs/list.html"); } + @ApiOperation(value = "新增") + @Post + @Mapping("sysPlugs/upload") +// @SaCheckPermission(value = {"sysFiles:add", "sysContent:update", "sysContent:add"}, mode = SaMode.OR) + public SysPlugsEntity add(UploadedFile file) throws Exception { + return sysPlugsService.uploadJar(file); + } + @ApiOperation(value = "查询分页数据") @Post @Mapping ("sysPlugs/listByPage") diff --git a/src/main/java/vip/fuck/sm/entity/SysFilesEntity.java b/src/main/java/vip/fuck/sm/entity/SysFilesEntity.java index 5c4f1ac..1e43a79 100644 --- a/src/main/java/vip/fuck/sm/entity/SysFilesEntity.java +++ b/src/main/java/vip/fuck/sm/entity/SysFilesEntity.java @@ -1,9 +1,6 @@ package vip.fuck.sm.entity; -import com.baomidou.mybatisplus.annotation.FieldFill; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import lombok.EqualsAndHashCode; @@ -26,8 +23,8 @@ public class SysFilesEntity extends BasePageEntity implements Serializable { /** * 主键 */ - @TableId("id") - private String id; + @TableId(value = "id",type = IdType.AUTO) + private Long id; /** * URL地址 @@ -35,6 +32,9 @@ public class SysFilesEntity extends BasePageEntity implements Serializable { @TableField("url") private String url; + @TableField("file_size") + private Long fileSize; + /** * 创建时间 */ diff --git a/src/main/java/vip/fuck/sm/service/SysFilesService.java b/src/main/java/vip/fuck/sm/service/SysFilesService.java index a0bee01..f2e9ac2 100644 --- a/src/main/java/vip/fuck/sm/service/SysFilesService.java +++ b/src/main/java/vip/fuck/sm/service/SysFilesService.java @@ -22,10 +22,9 @@ public interface SysFilesService extends IService { * 保存图片返回url * * @param file - * @param request * @return */ - String saveFile(UploadedFile file, HttpRequest request); + SysFilesEntity saveFile(UploadedFile file,String ... subPath); /** * 删除图片 diff --git a/src/main/java/vip/fuck/sm/service/SysPlugsService.java b/src/main/java/vip/fuck/sm/service/SysPlugsService.java index 4bfaabd..82bc140 100644 --- a/src/main/java/vip/fuck/sm/service/SysPlugsService.java +++ b/src/main/java/vip/fuck/sm/service/SysPlugsService.java @@ -1,6 +1,8 @@ package vip.fuck.sm.service; import com.baomidou.mybatisplus.extension.service.IService; +import org.noear.solon.core.handle.UploadedFile; +import org.smartboot.http.server.HttpRequest; import vip.fuck.sm.entity.SysPlugsEntity; /** @@ -12,5 +14,8 @@ import vip.fuck.sm.entity.SysPlugsEntity; */ public interface SysPlugsService extends IService { + + SysPlugsEntity uploadJar(UploadedFile file) throws Exception; + } diff --git a/src/main/java/vip/fuck/sm/service/impl/SysFilesServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/SysFilesServiceImpl.java index 9b3958d..058ab61 100644 --- a/src/main/java/vip/fuck/sm/service/impl/SysFilesServiceImpl.java +++ b/src/main/java/vip/fuck/sm/service/impl/SysFilesServiceImpl.java @@ -1,10 +1,12 @@ package vip.fuck.sm.service.impl; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.noear.solon.data.annotation.Tran; import vip.fuck.sm.common.exception.BusinessException; import vip.fuck.sm.common.utils.DateUtils; import vip.fuck.sm.common.utils.FileConfig; @@ -43,25 +45,27 @@ public class SysFilesServiceImpl extends ServiceImpl new BusinessException("不合法的目录") ); } else { - uploadDirectory.mkdir(); + boolean mkdirs = uploadDirectory.mkdirs(); + Assert.isTrue(mkdirs,()-> new BusinessException("目录创建失败") ); } try { String fileName = file.getName(); //id与filename保持一直,删除文件 String fileNameNew = UUID.randomUUID().toString().replace("-", "") + getFileType(fileName); String newFilePathName = newPath + fileNameNew; - String url = ( "/files/" + createTime + "/" + fileNameNew).replaceAll("/+", "/"); + String url = String.format( "/files/%s/%s" , createTime , fileNameNew) + .replaceAll("/+", "/"); //创建输出文件对象 File outFile = new File(newFilePathName); if(!outFile.exists()){ @@ -75,8 +79,9 @@ public class SysFilesServiceImpl extends ServiceImpl implements SysPlugsService { + @Inject + private SysFilesService sysFilesService; + + + @Override + @Tran + public SysPlugsEntity uploadJar(UploadedFile file) throws Exception { + //判断文件是否空 + if (file == null || file.getName() == null || "".equalsIgnoreCase(file.getName().trim())) { + throw new BusinessException("文件为空"); + } + String extension = file.getExtension(); + Assert.isTrue("jar".equals(extension),()-> new BusinessException("后缀必须是jar") ); + String jarDir = "sysPlugJars"; + SysFilesEntity jf = sysFilesService.saveFile(file,jarDir); + Props p = null; + try{ + JarFile jarFile = new JarFile(jf.getFilePath()); + Assert.isTrue(ObjectUtil.isNotEmpty(jarFile) , ()-> new BusinessException("插件不存在")); + List nameList = new ArrayList<>(); + Enumeration entries = jarFile.entries(); + while (entries.hasMoreElements()) { + JarEntry jarEntry = entries.nextElement(); + String name = jarEntry.getName(); + if (!jarEntry.isDirectory()) { + nameList.add(name); + } + } + List solonMetas = nameList.stream().filter( n -> n.startsWith("META-INF/solon") + && n.endsWith(".properties")).collect(Collectors.toList()); + Assert.isTrue(ObjectUtil.isNotEmpty(solonMetas), ()-> new BusinessException("jar文件不是solon插件,缺少插件元文件:META-INF/solon/*.properties")); + String anyOneMeta = solonMetas.get(0); + boolean hasSolonPlugin; + try{ + JarEntry e = jarFile.getJarEntry(anyOneMeta); + InputStream stream = jarFile.getInputStream(e); + Props vsProp = new Props(); + vsProp.load(stream); + String pluginStr = vsProp.getProperty("solon.plugin"); + hasSolonPlugin = ObjectUtil.isNotEmpty(pluginStr) ; + }catch (Throwable ex){ + hasSolonPlugin = false; + } + Assert.isTrue(hasSolonPlugin, ()-> new BusinessException("solon插件jar文件中,缺少实现类配置: solon.plugin")); + + String PLUGIN_INFO_PATH = "plugin-info.properties"; + String P_AUTHOR = "plugin.author"; + String P_DESCRIPTION = "plugin.description"; + String P_VERSION = "plugin.version"; + String P_QUALIFIED = "plugin.qualified"; + String P_SITE_URL = "plugin.siteUrl"; + String P_DOC_URL = "plugin.docUrl"; + + List pluginInfoPropNames = nameList.stream().filter( n -> n.equals(PLUGIN_INFO_PATH)).collect(Collectors.toList()); + Assert.isTrue(ObjectUtil.isNotEmpty(pluginInfoPropNames) , ()-> new BusinessException("插件缺少描述文件: "+PLUGIN_INFO_PATH)); + String pInfoOne = pluginInfoPropNames.get(0); + p = new Props() ; + boolean pluginInfoPropOk = true; + try{ + JarEntry e = jarFile.getJarEntry(pInfoOne); + InputStream stream = jarFile.getInputStream(e); + p.load(stream); + }catch (Throwable ex){ + pluginInfoPropOk = false; + } + Assert.isTrue(pluginInfoPropOk , ()-> new BusinessException("插件缺少描述文件: "+PLUGIN_INFO_PATH)); + String p_qualified = p.get(P_QUALIFIED); + Assert.isTrue(ObjectUtil.isNotEmpty(p_qualified), ()-> new BusinessException("插件缺少全限定名: "+P_QUALIFIED)); + String p_author = p.get(P_AUTHOR); + Assert.isTrue(ObjectUtil.isNotEmpty(p_author), ()-> new BusinessException("插件缺少作者信息: "+P_AUTHOR)); + + String p_description = p.get(P_DESCRIPTION); + Assert.isTrue(ObjectUtil.isNotEmpty(p_description), ()-> new BusinessException("插件缺少详细说明: "+P_DESCRIPTION)); + + String p_version = p.get(P_VERSION); + Assert.isTrue(ObjectUtil.isNotEmpty(p_version), ()-> new BusinessException("插件缺少版本编号: "+P_VERSION)); + + String p_site_url = p.get(P_SITE_URL); + Assert.isTrue(ObjectUtil.isNotEmpty(p_site_url), ()-> new BusinessException("插件缺少官方地址: "+P_SITE_URL)); + + String p_doc_url = p.get(P_DOC_URL); + Assert.isTrue(ObjectUtil.isNotEmpty(p_doc_url), ()-> new BusinessException("插件缺少文档链接: "+P_DOC_URL)); + + SysPlugsEntity en = new SysPlugsEntity(); + en.setJarSize(jf.getFileSize()); + en.setJarPath(jf.getFilePath()); + en.setStatus(0); + en.setQualifiedVersion(p_qualified); + en.setAuthor(p_author); + en.setDescription(p_description); + en.setVersion(p_version); + en.setDocUrl(p_doc_url); + en.setSiteUrl(p_site_url); + boolean save = this.save(en); + Assert.isTrue(save,()-> new BusinessException("插件信息保存失败") ); + return en; + }catch (Throwable e){ + throw e; + } + } } \ No newline at end of file diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html index 194a4ca..41ab6ce 100644 --- a/src/main/resources/templates/home.html +++ b/src/main/resources/templates/home.html @@ -219,10 +219,15 @@ } }; + + function FrameWH() { var h = $(window).height() - 41 - 10 - 35 - 10 - 44 - 10; $("iframe").css("height", h + "px"); }; + window.addEventListener('resize',()=>{ + FrameWH() + }) diff --git a/src/main/resources/templates/sysfiles/list.html b/src/main/resources/templates/sysfiles/list.html index 16a92db..ec3f27a 100644 --- a/src/main/resources/templates/sysfiles/list.html +++ b/src/main/resources/templates/sysfiles/list.html @@ -70,7 +70,7 @@ //执行实例 var uploadInst = upload.render({ elem: '#upload' //绑定元素 - ,ext: 'jpg|png|gif|bmp|jpeg|jar|doc|docx|txt|mp4|mp3' + ,exts: 'jpg|png|gif|bmp|jpeg|jar|doc|docx|txt|mp4|mp3' ,url: ctx + 'sysFiles/upload' //上传接口 ,done: function(res){ if(res.code){ diff --git a/src/main/resources/templates/sysplugs/list.html b/src/main/resources/templates/sysplugs/list.html index dd37338..aada12a 100644 --- a/src/main/resources/templates/sysplugs/list.html +++ b/src/main/resources/templates/sysplugs/list.html @@ -73,7 +73,7 @@
- +
@@ -84,6 +84,13 @@
+
+
+ +
+
@@ -94,14 +101,15 @@
+
- + + + + + +