mirror of
https://github.com/dataease/dataease.git
synced 2025-02-24 11:32:57 +08:00
fix: 删除原有菜单'系统参数'、'角色管理',初步整合xpack插件模块
This commit is contained in:
parent
d6d6dcda18
commit
ae733b0776
@ -351,6 +351,13 @@
|
||||
<artifactId>c3p0</artifactId>
|
||||
<version>0.9.1.2</version>
|
||||
</dependency>
|
||||
<!--由于暂时插件接口未注册到公司仓库,请先down下代码安装到本地仓库
|
||||
https://github.com/dataease/dataease-plugins-->
|
||||
<dependency>
|
||||
<groupId>io.dataease</groupId>
|
||||
<artifactId>dataease-plugin-xpack</artifactId>
|
||||
<version>1.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
@ -29,6 +29,8 @@ public class DynamicMenuDto implements Serializable {
|
||||
|
||||
private Integer type;
|
||||
|
||||
private Boolean isPlugin;
|
||||
|
||||
private List<DynamicMenuDto> children;
|
||||
|
||||
}
|
||||
|
@ -13,9 +13,11 @@ import io.dataease.auth.util.RsaUtil;
|
||||
import io.dataease.commons.utils.BeanUtils;
|
||||
import io.dataease.commons.utils.CodingUtil;
|
||||
import io.dataease.commons.utils.ServletUtils;
|
||||
/*import io.dataease.plugins.config.SpringContextUtil;
|
||||
import io.dataease.plugins.xpack.dto.response.SysSettingDto;
|
||||
import io.dataease.plugins.xpack.service.DePluginXpackService;*/
|
||||
|
||||
import io.dataease.plugins.config.SpringContextUtil;
|
||||
|
||||
import io.dataease.plugins.xpack.display.dto.response.SysSettingDto;
|
||||
import io.dataease.plugins.xpack.display.service.DisPlayXpackService;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.shiro.SecurityUtils;
|
||||
@ -108,14 +110,15 @@ public class AuthServer implements AuthApi {
|
||||
SysUserEntity userById = authUserService.getUserById(4L);
|
||||
String nickName = userById.getNickName();
|
||||
// System.out.println(nickName);
|
||||
/* Map<String, DePluginXpackService> beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType(DePluginXpackService.class);
|
||||
Map<String, DisPlayXpackService> beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType(DisPlayXpackService.class);
|
||||
for (Map.Entry entry : beansOfType.entrySet()) {
|
||||
Object key = entry.getKey();
|
||||
DePluginXpackService value = (DePluginXpackService)entry.getValue();
|
||||
DisPlayXpackService value = (DisPlayXpackService)entry.getValue();
|
||||
List<SysSettingDto> sysSettingDtos = value.systemSettings();
|
||||
|
||||
String name = entry.getValue().getClass().getName();
|
||||
System.out.println("key: "+ key + ", value: "+ name);
|
||||
}*/
|
||||
}
|
||||
return "apple";
|
||||
}
|
||||
}
|
||||
|
@ -5,6 +5,11 @@ import io.dataease.auth.entity.SysUserEntity;
|
||||
import io.dataease.base.mapper.ext.AuthMapper;
|
||||
import io.dataease.auth.service.AuthUserService;
|
||||
import io.dataease.commons.constants.AuthConstants;
|
||||
import io.dataease.plugins.common.dto.PluginSysMenu;
|
||||
import io.dataease.plugins.common.service.PluginMenuService;
|
||||
import io.dataease.plugins.config.SpringContextUtil;
|
||||
import io.dataease.plugins.util.PluginUtils;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.cache.annotation.CacheEvict;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
@ -53,6 +58,14 @@ public class AuthUserServiceImpl implements AuthUserService {
|
||||
@Override
|
||||
public List<String> permissions(Long userId){
|
||||
List<String> permissions = authMapper.permissions(userId);
|
||||
List<PluginSysMenu> pluginSysMenus = PluginUtils.pluginMenus();
|
||||
if (CollectionUtils.isNotEmpty(pluginSysMenus)) {
|
||||
List<Long> menuIds = authMapper.userMenuIds(userId);
|
||||
List<String> pluginPermissions = pluginSysMenus.stream().
|
||||
filter(sysMenu -> menuIds.contains(sysMenu.getMenuId()))
|
||||
.map(menu -> menu.getPermission()).collect(Collectors.toList());
|
||||
permissions.addAll(pluginPermissions);
|
||||
}
|
||||
return permissions.stream().filter(StringUtils::isNotEmpty).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
|
@ -6,6 +6,9 @@ import io.dataease.auth.service.DynamicMenuService;
|
||||
import io.dataease.base.domain.SysMenu;
|
||||
import io.dataease.base.domain.SysMenuExample;
|
||||
import io.dataease.base.mapper.SysMenuMapper;
|
||||
import io.dataease.plugins.common.dto.PluginSysMenu;
|
||||
import io.dataease.plugins.util.PluginUtils;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import java.util.ArrayList;
|
||||
@ -25,6 +28,12 @@ public class DynamicMenuServiceImpl implements DynamicMenuService {
|
||||
sysMenuExample.setOrderByClause(" menu_sort ");
|
||||
List<SysMenu> sysMenus = sysMenuMapper.selectByExample(sysMenuExample);
|
||||
List<DynamicMenuDto> dynamicMenuDtos = sysMenus.stream().map(this::convert).collect(Collectors.toList());
|
||||
//增加插件中的菜单
|
||||
List<PluginSysMenu> pluginSysMenus = PluginUtils.pluginMenus();
|
||||
if (CollectionUtils.isNotEmpty(pluginSysMenus) ) {
|
||||
List<DynamicMenuDto> pluginDtos = pluginSysMenus.stream().map(this::convert).collect(Collectors.toList());
|
||||
dynamicMenuDtos.addAll(pluginDtos);
|
||||
}
|
||||
List<DynamicMenuDto> result = buildTree(dynamicMenuDtos);
|
||||
return result;
|
||||
}
|
||||
@ -44,6 +53,25 @@ public class DynamicMenuServiceImpl implements DynamicMenuService {
|
||||
dynamicMenuDto.setMeta(menuMeta);
|
||||
dynamicMenuDto.setPermission(sysMenu.getPermission());
|
||||
dynamicMenuDto.setHidden(sysMenu.getHidden());
|
||||
dynamicMenuDto.setIsPlugin(false);
|
||||
return dynamicMenuDto;
|
||||
}
|
||||
private DynamicMenuDto convert(PluginSysMenu sysMenu){
|
||||
DynamicMenuDto dynamicMenuDto = new DynamicMenuDto();
|
||||
dynamicMenuDto.setId(sysMenu.getMenuId());
|
||||
dynamicMenuDto.setPid(sysMenu.getPid());
|
||||
dynamicMenuDto.setName(sysMenu.getName());
|
||||
dynamicMenuDto.setPath(sysMenu.getPath());
|
||||
dynamicMenuDto.setRedirect(null);
|
||||
dynamicMenuDto.setType(sysMenu.getType());
|
||||
dynamicMenuDto.setComponent(sysMenu.getComponent());
|
||||
MenuMeta menuMeta = new MenuMeta();
|
||||
menuMeta.setTitle(sysMenu.getTitle());
|
||||
menuMeta.setIcon(sysMenu.getIcon());
|
||||
dynamicMenuDto.setMeta(menuMeta);
|
||||
dynamicMenuDto.setPermission(sysMenu.getPermission());
|
||||
dynamicMenuDto.setHidden(sysMenu.getHidden());
|
||||
dynamicMenuDto.setIsPlugin(true);
|
||||
return dynamicMenuDto;
|
||||
}
|
||||
|
||||
|
@ -47,7 +47,7 @@ public class ShiroServiceImpl implements ShiroService {
|
||||
|
||||
|
||||
filterChainDefinitionMap.put("/system/ui/**", ANON);
|
||||
filterChainDefinitionMap.put("/PluginDemo.js", ANON);
|
||||
filterChainDefinitionMap.put("/SystemParam.js", ANON);
|
||||
filterChainDefinitionMap.put("/DeXPack.js", ANON);
|
||||
|
||||
filterChainDefinitionMap.put("/api/auth/test", ANON);
|
||||
|
@ -21,6 +21,8 @@ public class MyPlugin implements Serializable {
|
||||
|
||||
private String creator;
|
||||
|
||||
private Boolean loadMybatis;
|
||||
|
||||
private Long releaseTime;
|
||||
|
||||
private Long installTime;
|
||||
|
@ -624,6 +624,66 @@ public class MyPluginExample {
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andLoadMybatisIsNull() {
|
||||
addCriterion("load_mybatis is null");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andLoadMybatisIsNotNull() {
|
||||
addCriterion("load_mybatis is not null");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andLoadMybatisEqualTo(Boolean value) {
|
||||
addCriterion("load_mybatis =", value, "loadMybatis");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andLoadMybatisNotEqualTo(Boolean value) {
|
||||
addCriterion("load_mybatis <>", value, "loadMybatis");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andLoadMybatisGreaterThan(Boolean value) {
|
||||
addCriterion("load_mybatis >", value, "loadMybatis");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andLoadMybatisGreaterThanOrEqualTo(Boolean value) {
|
||||
addCriterion("load_mybatis >=", value, "loadMybatis");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andLoadMybatisLessThan(Boolean value) {
|
||||
addCriterion("load_mybatis <", value, "loadMybatis");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andLoadMybatisLessThanOrEqualTo(Boolean value) {
|
||||
addCriterion("load_mybatis <=", value, "loadMybatis");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andLoadMybatisIn(List<Boolean> values) {
|
||||
addCriterion("load_mybatis in", values, "loadMybatis");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andLoadMybatisNotIn(List<Boolean> values) {
|
||||
addCriterion("load_mybatis not in", values, "loadMybatis");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andLoadMybatisBetween(Boolean value1, Boolean value2) {
|
||||
addCriterion("load_mybatis between", value1, value2, "loadMybatis");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andLoadMybatisNotBetween(Boolean value1, Boolean value2) {
|
||||
addCriterion("load_mybatis not between", value1, value2, "loadMybatis");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andReleaseTimeIsNull() {
|
||||
addCriterion("release_time is null");
|
||||
return (Criteria) this;
|
||||
|
@ -10,6 +10,7 @@
|
||||
<result column="version" jdbcType="VARCHAR" property="version" />
|
||||
<result column="install_type" jdbcType="INTEGER" property="installType" />
|
||||
<result column="creator" jdbcType="VARCHAR" property="creator" />
|
||||
<result column="load_mybatis" jdbcType="BIT" property="loadMybatis" />
|
||||
<result column="release_time" jdbcType="BIGINT" property="releaseTime" />
|
||||
<result column="install_time" jdbcType="BIGINT" property="installTime" />
|
||||
<result column="module_name" jdbcType="VARCHAR" property="moduleName" />
|
||||
@ -75,8 +76,8 @@
|
||||
</where>
|
||||
</sql>
|
||||
<sql id="Base_Column_List">
|
||||
plugin_id, `name`, `free`, cost, descript, version, install_type, creator, release_time,
|
||||
install_time, module_name, bean_name, icon
|
||||
plugin_id, `name`, `free`, cost, descript, version, install_type, creator, load_mybatis,
|
||||
release_time, install_time, module_name, bean_name, icon
|
||||
</sql>
|
||||
<select id="selectByExample" parameterType="io.dataease.base.domain.MyPluginExample" resultMap="BaseResultMap">
|
||||
select
|
||||
@ -111,14 +112,14 @@
|
||||
<insert id="insert" parameterType="io.dataease.base.domain.MyPlugin">
|
||||
insert into my_plugin (plugin_id, `name`, `free`,
|
||||
cost, descript, version,
|
||||
install_type, creator, release_time,
|
||||
install_time, module_name, bean_name,
|
||||
icon)
|
||||
install_type, creator, load_mybatis,
|
||||
release_time, install_time, module_name,
|
||||
bean_name, icon)
|
||||
values (#{pluginId,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{free,jdbcType=BIT},
|
||||
#{cost,jdbcType=INTEGER}, #{descript,jdbcType=VARCHAR}, #{version,jdbcType=VARCHAR},
|
||||
#{installType,jdbcType=INTEGER}, #{creator,jdbcType=VARCHAR}, #{releaseTime,jdbcType=BIGINT},
|
||||
#{installTime,jdbcType=BIGINT}, #{moduleName,jdbcType=VARCHAR}, #{beanName,jdbcType=VARCHAR},
|
||||
#{icon,jdbcType=VARCHAR})
|
||||
#{installType,jdbcType=INTEGER}, #{creator,jdbcType=VARCHAR}, #{loadMybatis,jdbcType=BIT},
|
||||
#{releaseTime,jdbcType=BIGINT}, #{installTime,jdbcType=BIGINT}, #{moduleName,jdbcType=VARCHAR},
|
||||
#{beanName,jdbcType=VARCHAR}, #{icon,jdbcType=VARCHAR})
|
||||
</insert>
|
||||
<insert id="insertSelective" parameterType="io.dataease.base.domain.MyPlugin">
|
||||
insert into my_plugin
|
||||
@ -147,6 +148,9 @@
|
||||
<if test="creator != null">
|
||||
creator,
|
||||
</if>
|
||||
<if test="loadMybatis != null">
|
||||
load_mybatis,
|
||||
</if>
|
||||
<if test="releaseTime != null">
|
||||
release_time,
|
||||
</if>
|
||||
@ -188,6 +192,9 @@
|
||||
<if test="creator != null">
|
||||
#{creator,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="loadMybatis != null">
|
||||
#{loadMybatis,jdbcType=BIT},
|
||||
</if>
|
||||
<if test="releaseTime != null">
|
||||
#{releaseTime,jdbcType=BIGINT},
|
||||
</if>
|
||||
@ -238,6 +245,9 @@
|
||||
<if test="record.creator != null">
|
||||
creator = #{record.creator,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="record.loadMybatis != null">
|
||||
load_mybatis = #{record.loadMybatis,jdbcType=BIT},
|
||||
</if>
|
||||
<if test="record.releaseTime != null">
|
||||
release_time = #{record.releaseTime,jdbcType=BIGINT},
|
||||
</if>
|
||||
@ -268,6 +278,7 @@
|
||||
version = #{record.version,jdbcType=VARCHAR},
|
||||
install_type = #{record.installType,jdbcType=INTEGER},
|
||||
creator = #{record.creator,jdbcType=VARCHAR},
|
||||
load_mybatis = #{record.loadMybatis,jdbcType=BIT},
|
||||
release_time = #{record.releaseTime,jdbcType=BIGINT},
|
||||
install_time = #{record.installTime,jdbcType=BIGINT},
|
||||
module_name = #{record.moduleName,jdbcType=VARCHAR},
|
||||
@ -301,6 +312,9 @@
|
||||
<if test="creator != null">
|
||||
creator = #{creator,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="loadMybatis != null">
|
||||
load_mybatis = #{loadMybatis,jdbcType=BIT},
|
||||
</if>
|
||||
<if test="releaseTime != null">
|
||||
release_time = #{releaseTime,jdbcType=BIGINT},
|
||||
</if>
|
||||
@ -328,6 +342,7 @@
|
||||
version = #{version,jdbcType=VARCHAR},
|
||||
install_type = #{installType,jdbcType=INTEGER},
|
||||
creator = #{creator,jdbcType=VARCHAR},
|
||||
load_mybatis = #{loadMybatis,jdbcType=BIT},
|
||||
release_time = #{releaseTime,jdbcType=BIGINT},
|
||||
install_time = #{installTime,jdbcType=BIGINT},
|
||||
module_name = #{moduleName,jdbcType=VARCHAR},
|
||||
|
@ -16,6 +16,8 @@ public interface AuthMapper {
|
||||
|
||||
List<String> permissions(@Param("userId") Long userId);
|
||||
|
||||
List<Long> userMenuIds(@Param("userId") Long userId);
|
||||
|
||||
|
||||
SysUserEntity findUser(@Param("userId") Long userId);
|
||||
|
||||
|
@ -42,6 +42,13 @@
|
||||
where sur.user_id = #{userId}
|
||||
</select>
|
||||
|
||||
<select id="userMenuIds" resultType="Long">
|
||||
select srm.menu_id
|
||||
from sys_roles_menus srm
|
||||
left join sys_users_roles sur on sur.role_id = srm.role_id
|
||||
where sur.user_id = #{userId}
|
||||
</select>
|
||||
|
||||
<select id="roles" resultMap="roleMap">
|
||||
select r.role_id, r.name
|
||||
from sys_role r
|
||||
|
@ -4,6 +4,7 @@ import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.io.*;
|
||||
import java.nio.channels.FileChannel;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class DeFileUtils {
|
||||
|
||||
@ -112,4 +113,14 @@ public class DeFileUtils {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static void deleteFile(String path) {
|
||||
File file = new File(path);
|
||||
if (file.exists()){
|
||||
if (file.isDirectory()) {
|
||||
Arrays.stream(file.listFiles()).forEach(item -> deleteFile(item.getAbsolutePath()));
|
||||
}
|
||||
file.delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -17,7 +17,7 @@ import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
@Configuration
|
||||
@MapperScan(basePackages = {"io.dataease.base.mapper", "io.dataease.xpack.mapper"}, sqlSessionFactoryRef = "sqlSessionFactory")
|
||||
@MapperScan(basePackages = {"io.dataease.base.mapper", "io.dataease.plugins"}, sqlSessionFactoryRef = "sqlSessionFactory")
|
||||
@EnableTransactionManagement
|
||||
public class MybatisConfig {
|
||||
|
||||
|
@ -6,6 +6,7 @@ import io.dataease.base.domain.MyPlugin;
|
||||
import io.dataease.commons.utils.PageUtils;
|
||||
import io.dataease.commons.utils.Pager;
|
||||
import io.dataease.controller.sys.base.BaseGridRequest;
|
||||
import io.dataease.controller.sys.request.PluginStatus;
|
||||
import io.dataease.service.sys.PluginService;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
@ -32,8 +33,21 @@ public class SysPluginController {
|
||||
return PageUtils.setPageInfo(page, pluginService.query(request));
|
||||
}
|
||||
|
||||
@ApiOperation("安装插件")
|
||||
@PostMapping("upload")
|
||||
public Map<String, Object> localUpload(@RequestParam("file") MultipartFile file) throws Exception {
|
||||
return pluginService.localInstall(file);
|
||||
}
|
||||
|
||||
@ApiOperation("卸载插件")
|
||||
@PostMapping("/uninstall/{pluginId}")
|
||||
public Boolean unInstall(@PathVariable Long pluginId) {
|
||||
return pluginService.uninstall(pluginId);
|
||||
}
|
||||
|
||||
@ApiOperation("切换插件状态")
|
||||
@PostMapping("/changeStatus")
|
||||
public Boolean changeStatus(@RequestBody PluginStatus pluginStatus) {
|
||||
return pluginService.changeStatus(pluginStatus.getPluginId(), pluginStatus.getStatus());
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,12 @@
|
||||
package io.dataease.controller.sys.request;
|
||||
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class PluginStatus {
|
||||
|
||||
private Long pluginId;
|
||||
|
||||
private Boolean status;
|
||||
}
|
@ -1,7 +1,10 @@
|
||||
package io.dataease.plugins.config;
|
||||
|
||||
import io.dataease.base.domain.MyPlugin;
|
||||
import io.dataease.plugins.loader.ClassloaderResponsity;
|
||||
import io.dataease.plugins.loader.ModuleClassLoader;
|
||||
import io.dataease.plugins.loader.MybatisLoader;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.io.File;
|
||||
@ -15,27 +18,27 @@ import java.util.Map;
|
||||
@Component
|
||||
public class LoadjarUtil {
|
||||
|
||||
public List<?> loadJar(String jarPath){
|
||||
@Autowired
|
||||
private MybatisLoader mybatisLoader;
|
||||
|
||||
public List<?> loadJar(String jarPath, MyPlugin myPlugin) throws Exception{
|
||||
File jar = new File(jarPath);
|
||||
URI uri = jar.toURI();
|
||||
String moduleName = jarPath.substring(jarPath.lastIndexOf("/")+1,jarPath.lastIndexOf("."));
|
||||
try {
|
||||
|
||||
if(ClassloaderResponsity.getInstance().containsClassLoader(moduleName)){
|
||||
ClassloaderResponsity.getInstance().removeClassLoader(moduleName);
|
||||
}
|
||||
|
||||
ModuleClassLoader classLoader = new ModuleClassLoader(new URL[]{uri.toURL()}, Thread.currentThread().getContextClassLoader());
|
||||
SpringContextUtil.getBeanFactory().setBeanClassLoader(classLoader);
|
||||
Thread.currentThread().setContextClassLoader(classLoader);
|
||||
classLoader.initBean();
|
||||
ClassloaderResponsity.getInstance().addClassLoader(moduleName,classLoader);
|
||||
|
||||
} catch (MalformedURLException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
if(ClassloaderResponsity.getInstance().containsClassLoader(moduleName)){
|
||||
ClassloaderResponsity.getInstance().removeClassLoader(moduleName);
|
||||
}
|
||||
|
||||
ModuleClassLoader classLoader = new ModuleClassLoader(new URL[]{uri.toURL()}, Thread.currentThread().getContextClassLoader());
|
||||
SpringContextUtil.getBeanFactory().setBeanClassLoader(classLoader);
|
||||
Thread.currentThread().setContextClassLoader(classLoader);
|
||||
classLoader.initBean();
|
||||
mybatisLoader.loadMybatis(myPlugin);
|
||||
ClassloaderResponsity.getInstance().addClassLoader(moduleName,classLoader);
|
||||
|
||||
|
||||
return SpringContextUtil.getAllBean();
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,53 @@
|
||||
package io.dataease.plugins.config;
|
||||
|
||||
import io.dataease.base.domain.MyPlugin;
|
||||
import io.dataease.commons.utils.DeFileUtils;
|
||||
import io.dataease.controller.sys.base.BaseGridRequest;
|
||||
import io.dataease.service.sys.PluginService;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.ApplicationArguments;
|
||||
import org.springframework.boot.ApplicationRunner;
|
||||
import org.springframework.stereotype.Component;
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
|
||||
@Component
|
||||
public class PluginRunner implements ApplicationRunner {
|
||||
|
||||
@Value("${dataease.plugin.dir:/opt/dataease/plugins/}")
|
||||
private String pluginDir;
|
||||
|
||||
@Autowired
|
||||
private PluginService pluginService;
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void run(ApplicationArguments args) throws Exception {
|
||||
// 执行加载插件逻辑
|
||||
BaseGridRequest request = new BaseGridRequest();
|
||||
List<MyPlugin> plugins = pluginService.query(request);
|
||||
plugins.stream().forEach(plugin -> {
|
||||
String name = plugin.getName();
|
||||
String version = plugin.getVersion();
|
||||
String versionDir = pluginDir + name + "/" + version + "/";
|
||||
File fileDir = new File(versionDir);
|
||||
File[] jarFiles = fileDir.listFiles(this::isPluginJar);
|
||||
File jarFile = jarFiles[0];
|
||||
String jarPath = jarFile.getAbsolutePath();
|
||||
try {
|
||||
pluginService.loadJar(jarPath, plugin);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
private boolean isPluginJar(File file) {
|
||||
String name = file.getName();
|
||||
return StringUtils.equals(DeFileUtils.getExtensionName(name), "jar");
|
||||
}
|
||||
}
|
@ -1,6 +1,11 @@
|
||||
package io.dataease.plugins.loader;
|
||||
|
||||
import io.dataease.plugins.common.annotation.PluginResultMap;
|
||||
import io.dataease.plugins.config.SpringContextUtil;
|
||||
import org.apache.ibatis.io.Resources;
|
||||
import org.apache.ibatis.session.Configuration;
|
||||
import org.apache.ibatis.session.SqlSessionFactory;
|
||||
import org.apache.ibatis.type.TypeAliasRegistry;
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -53,15 +58,20 @@ public class ModuleClassLoader extends URLClassLoader {
|
||||
@Override
|
||||
public Class<?> loadClass(String name) throws ClassNotFoundException {
|
||||
if(findLoadedClass(name)==null){
|
||||
return super.loadClass(name);
|
||||
Class<?> aClass = super.loadClass(name);
|
||||
Optional.ofNullable(aClass.getAnnotation(PluginResultMap.class)).ifPresent(anno -> {
|
||||
SqlSessionFactory sqlSessionFactory = SpringContextUtil.getBean(SqlSessionFactory.class);
|
||||
Configuration configuration = sqlSessionFactory.getConfiguration();
|
||||
TypeAliasRegistry typeAliasRegistry = configuration.getTypeAliasRegistry();
|
||||
typeAliasRegistry.registerAlias(name.toLowerCase(), aClass);
|
||||
});
|
||||
return aClass;
|
||||
}else{
|
||||
return cacheClassMap.get(name);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 方法描述 初始化类加载器,保存字节码
|
||||
* @method init
|
||||
@ -76,8 +86,8 @@ public class ModuleClassLoader extends URLClassLoader {
|
||||
JarEntry je = en.nextElement();
|
||||
String name = je.getName();
|
||||
//这里添加了路径扫描限制
|
||||
if (name.endsWith(".class")) {
|
||||
String className = name.replace(".class", "").replaceAll("/", ".");
|
||||
if (name.endsWith(".class")) {String className = name.replace(".class", "").replaceAll("/", ".");
|
||||
|
||||
input = jarFile.getInputStream(je);
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
int bufferSize = 4096;
|
||||
@ -89,6 +99,9 @@ public class ModuleClassLoader extends URLClassLoader {
|
||||
byte[] classBytes = baos.toByteArray();
|
||||
classBytesMap.put(className,classBytes);
|
||||
}
|
||||
/*if (name.endsWith(".xml")) {
|
||||
loadMapperXml(name);
|
||||
}*/
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
|
@ -0,0 +1,39 @@
|
||||
package io.dataease.plugins.loader;
|
||||
|
||||
import io.dataease.plugins.config.SpringContextUtil;
|
||||
import org.mybatis.spring.mapper.MapperScannerConfigurer;
|
||||
import org.springframework.beans.BeansException;
|
||||
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
@Component
|
||||
public class MyScanner implements BeanDefinitionRegistryPostProcessor {
|
||||
|
||||
@Resource
|
||||
private MapperScannerConfigurer mapperScannerConfigurer;
|
||||
|
||||
private BeanDefinitionRegistry beanDefinitionRegistry;
|
||||
|
||||
@Override
|
||||
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
|
||||
this.beanDefinitionRegistry = beanDefinitionRegistry;
|
||||
System.out.println("-----");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
|
||||
|
||||
}
|
||||
|
||||
public void scanner() {
|
||||
if (null == mapperScannerConfigurer){
|
||||
mapperScannerConfigurer = SpringContextUtil.getBean(MapperScannerConfigurer.class);
|
||||
}
|
||||
|
||||
mapperScannerConfigurer.postProcessBeanDefinitionRegistry(this.beanDefinitionRegistry);
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package io.dataease.plugins.loader;
|
||||
|
||||
import io.dataease.base.domain.MyPlugin;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class MybatisLoader {
|
||||
|
||||
|
||||
|
||||
@Autowired
|
||||
private MyScanner myScanner;
|
||||
|
||||
|
||||
|
||||
public void loadMybatis(MyPlugin myPlugin) {
|
||||
if (!myPlugin.getLoadMybatis()) return;
|
||||
myScanner.scanner();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package io.dataease.plugins.server;
|
||||
|
||||
|
||||
import io.dataease.plugins.config.SpringContextUtil;
|
||||
import io.dataease.plugins.xpack.display.dto.response.SysSettingDto;
|
||||
import io.dataease.plugins.xpack.display.service.DisPlayXpackService;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@RequestMapping("/api/display")
|
||||
@RestController
|
||||
public class DisplayServer {
|
||||
|
||||
|
||||
|
||||
|
||||
@GetMapping("/uiInfo")
|
||||
public List<SysSettingDto> uiInfo() {
|
||||
DisPlayXpackService disPlayXpackService = SpringContextUtil.getBean(DisPlayXpackService.class);
|
||||
return disPlayXpackService.systemSettings();
|
||||
}
|
||||
|
||||
@PostMapping(value="/save", consumes = {"multipart/form-data"})
|
||||
public void saveUIInfo(@RequestPart("request") Map<String,List<SysSettingDto>> systemParameterMap, @RequestPart(value = "files", required = false) List<MultipartFile> bodyFiles) throws Exception {
|
||||
DisPlayXpackService disPlayXpackService = SpringContextUtil.getBean(DisPlayXpackService.class);
|
||||
disPlayXpackService.save(systemParameterMap, bodyFiles);
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,65 @@
|
||||
package io.dataease.plugins.server;
|
||||
|
||||
import io.dataease.commons.utils.ServletUtils;
|
||||
import io.dataease.plugins.common.dto.PluginSysMenu;
|
||||
import io.dataease.plugins.common.service.PluginMenuService;
|
||||
import io.dataease.plugins.config.SpringContextUtil;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/pluginCommon")
|
||||
public class PluginCommonServer {
|
||||
|
||||
@GetMapping("/async/{menuId}")
|
||||
public void componentInfo(@PathVariable Long menuId) {
|
||||
Map<String, PluginMenuService> pluginMenuServiceMap = SpringContextUtil.getApplicationContext().getBeansOfType(PluginMenuService.class);
|
||||
pluginMenuServiceMap.values().stream().forEach(service -> {
|
||||
AtomicReference<PluginSysMenu> atomicReference = new AtomicReference<>();
|
||||
List<PluginSysMenu> menus = service.menus();
|
||||
if (menus.stream().anyMatch(menu -> {
|
||||
atomicReference.set(menu);
|
||||
return menu.getMenuId() == menuId;
|
||||
})) {
|
||||
String jsName = atomicReference.get().getComponent();
|
||||
HttpServletResponse response = ServletUtils.response();
|
||||
BufferedInputStream bis = null;
|
||||
InputStream inputStream = null;
|
||||
OutputStream os = null; //输出流
|
||||
try{
|
||||
inputStream = service.vueResource(jsName);
|
||||
byte[] buffer = new byte[1024];
|
||||
os = response.getOutputStream();
|
||||
bis = new BufferedInputStream(inputStream);
|
||||
int i = bis.read(buffer);
|
||||
while(i != -1){
|
||||
os.write(buffer, 0, i);
|
||||
i = bis.read(buffer);
|
||||
}
|
||||
os.flush();
|
||||
}catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}finally {
|
||||
try {
|
||||
bis.close();
|
||||
inputStream.close();
|
||||
os.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
package io.dataease.plugins.server;
|
||||
|
||||
|
||||
import com.github.pagehelper.Page;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import io.dataease.commons.utils.PageUtils;
|
||||
import io.dataease.commons.utils.Pager;
|
||||
import io.dataease.plugins.common.entity.XpackGridRequest;
|
||||
import io.dataease.plugins.config.SpringContextUtil;
|
||||
import io.dataease.plugins.xpack.role.dto.response.XpackRoleDto;
|
||||
import io.dataease.plugins.xpack.role.dto.response.XpackRoleItemDto;
|
||||
import io.dataease.plugins.xpack.role.service.RoleXpackService;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
@RequestMapping("/plugin/role")
|
||||
@RestController
|
||||
public class RoleServer {
|
||||
|
||||
|
||||
@PostMapping("/create")
|
||||
public void create(@RequestBody XpackRoleDto role){
|
||||
RoleXpackService roleXpackService = SpringContextUtil.getBean(RoleXpackService.class);
|
||||
roleXpackService.save(role);
|
||||
}
|
||||
|
||||
|
||||
@PostMapping("/delete/{roleId}")
|
||||
public void delete(@PathVariable("roleId") Long roleId){
|
||||
RoleXpackService roleXpackService = SpringContextUtil.getBean(RoleXpackService.class);
|
||||
roleXpackService.delete(roleId);
|
||||
}
|
||||
|
||||
|
||||
@PostMapping("/update")
|
||||
public void update(@RequestBody XpackRoleDto role){
|
||||
RoleXpackService roleXpackService = SpringContextUtil.getBean(RoleXpackService.class);
|
||||
roleXpackService.update(role);
|
||||
}
|
||||
|
||||
@PostMapping("/roleGrid/{goPage}/{pageSize}")
|
||||
public Pager<List<XpackRoleDto>> roleGrid(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody XpackGridRequest request) {
|
||||
RoleXpackService roleXpackService = SpringContextUtil.getBean(RoleXpackService.class);
|
||||
Page<Object> page = PageHelper.startPage(goPage, pageSize, true);
|
||||
Pager<List<XpackRoleDto>> listPager = PageUtils.setPageInfo(page, roleXpackService.query(request));
|
||||
return listPager;
|
||||
}
|
||||
|
||||
@PostMapping("/all")
|
||||
public List<XpackRoleItemDto> all() {
|
||||
RoleXpackService roleXpackService = SpringContextUtil.getBean(RoleXpackService.class);
|
||||
return roleXpackService.allRoles();
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package io.dataease.plugins.util;
|
||||
|
||||
import io.dataease.plugins.common.dto.PluginSysMenu;
|
||||
import io.dataease.plugins.common.service.PluginMenuService;
|
||||
import io.dataease.plugins.config.SpringContextUtil;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class PluginUtils {
|
||||
|
||||
public static List<PluginSysMenu> pluginMenus() {
|
||||
Map<String, PluginMenuService> pluginMenuServiceMap = SpringContextUtil.getApplicationContext().getBeansOfType(PluginMenuService.class);
|
||||
List<PluginSysMenu> menus = pluginMenuServiceMap.values().stream().flatMap(item -> item.menus().stream()).collect(Collectors.toList());
|
||||
return menus;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
@ -66,9 +66,9 @@ public class FileService {
|
||||
example2.createCriteria().andFileIdIn(ids);
|
||||
fileContentMapper.deleteByExample(example2);
|
||||
|
||||
LoadTestFileExample example3 = new LoadTestFileExample();
|
||||
/* LoadTestFileExample example3 = new LoadTestFileExample();
|
||||
example3.createCriteria().andFileIdIn(ids);
|
||||
loadTestFileMapper.deleteByExample(example3);
|
||||
loadTestFileMapper.deleteByExample(example3);*/
|
||||
}
|
||||
|
||||
public void deleteFileRelatedByIds(List<String> ids) {
|
||||
|
@ -5,17 +5,16 @@ import io.dataease.base.domain.MyPlugin;
|
||||
import io.dataease.base.mapper.MyPluginMapper;
|
||||
import io.dataease.base.mapper.ext.ExtSysPluginMapper;
|
||||
import io.dataease.base.mapper.ext.query.GridExample;
|
||||
import io.dataease.commons.utils.BeanUtils;
|
||||
import io.dataease.commons.utils.DeFileUtils;
|
||||
import io.dataease.commons.utils.ZipUtils;
|
||||
import io.dataease.controller.sys.base.BaseGridRequest;
|
||||
import io.dataease.plugins.config.LoadjarUtil;
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
@ -38,9 +37,10 @@ public class PluginService {
|
||||
@Resource
|
||||
private MyPluginMapper myPluginMapper;
|
||||
|
||||
@Resource
|
||||
@Autowired
|
||||
private LoadjarUtil loadjarUtil;
|
||||
|
||||
|
||||
public List<MyPlugin> query(BaseGridRequest request) {
|
||||
GridExample gridExample = request.convertExample();
|
||||
List<MyPlugin> results = extSysPluginMapper.query(gridExample);
|
||||
@ -60,6 +60,8 @@ public class PluginService {
|
||||
try {
|
||||
ZipUtils.upZipFile(dest, folder);
|
||||
} catch (IOException e) {
|
||||
DeFileUtils.deleteFile(pluginDir+"temp/");
|
||||
DeFileUtils.deleteFile(folder);
|
||||
// 需要删除文件
|
||||
e.printStackTrace();
|
||||
}
|
||||
@ -67,29 +69,80 @@ public class PluginService {
|
||||
File folderFile = new File(folder);
|
||||
File[] jsonFiles = folderFile.listFiles(this::isPluginJson);
|
||||
if (ArrayUtils.isEmpty(jsonFiles)) {
|
||||
DeFileUtils.deleteFile(pluginDir+"temp/");
|
||||
DeFileUtils.deleteFile(folder);
|
||||
throw new RuntimeException("缺少插件描述文件");
|
||||
}
|
||||
MyPlugin myPlugin = formatJsonFile(jsonFiles[0]);
|
||||
//4.加载jar包 失败则 直接返回错误 删除文件
|
||||
File[] jarFiles = folderFile.listFiles(this::isPluginJar);
|
||||
if (ArrayUtils.isEmpty(jarFiles)) {
|
||||
DeFileUtils.deleteFile(pluginDir+"temp/");
|
||||
DeFileUtils.deleteFile(folder);
|
||||
throw new RuntimeException("缺少插件jar文件");
|
||||
}
|
||||
File jarFile = jarFiles[0];
|
||||
String jarRoot = pluginDir+"jar/";
|
||||
String jarPath = null;
|
||||
String versionDir = null;
|
||||
try {
|
||||
jarPath = DeFileUtils.copy(jarFile, jarRoot);
|
||||
} catch (IOException e) {
|
||||
File jarFile = jarFiles[0];
|
||||
versionDir = makeVersionDir(myPlugin);
|
||||
String jarPath = null;
|
||||
jarPath = DeFileUtils.copy(jarFile, versionDir);
|
||||
//DeFileUtils.copy(folderFile, versionDir);
|
||||
loadJar(jarPath, myPlugin);
|
||||
myPluginMapper.insert(myPlugin);
|
||||
} catch (Exception e) {
|
||||
if (StringUtils.isNotEmpty(versionDir)) {
|
||||
DeFileUtils.deleteFile(versionDir);
|
||||
}
|
||||
e.printStackTrace();
|
||||
}finally {
|
||||
DeFileUtils.deleteFile(pluginDir+"temp/");
|
||||
DeFileUtils.deleteFile(folder);
|
||||
}
|
||||
loadjarUtil.loadJar(jarPath);
|
||||
|
||||
//mybatisLoader.loadMybatis(myPlugin);
|
||||
//5.写表到my_plugin
|
||||
myPlugin.setPluginId(0L);
|
||||
myPluginMapper.insert(myPlugin);
|
||||
// myPlugin.setPluginId(0L);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public void loadJar(String jarPath, MyPlugin myPlugin) throws Exception {
|
||||
loadjarUtil.loadJar(jarPath, myPlugin);
|
||||
}
|
||||
|
||||
|
||||
|
||||
private String makeVersionDir(MyPlugin myPlugin) {
|
||||
String name = myPlugin.getName();
|
||||
String dir = pluginDir + name + "/" + myPlugin.getVersion() + "/";
|
||||
File fileDir = new File(dir);
|
||||
if (!fileDir.exists()) {
|
||||
fileDir.mkdirs();
|
||||
}
|
||||
return dir;
|
||||
}
|
||||
|
||||
/**
|
||||
* 卸载插件
|
||||
* @param pluginId
|
||||
* @return
|
||||
*/
|
||||
public Boolean uninstall(Long pluginId) {
|
||||
myPluginMapper.deleteByPrimaryKey(pluginId);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 改变插件状态
|
||||
* @param pluginId
|
||||
* @param status true ? 使用状态 : 禁用状态
|
||||
* @return
|
||||
*/
|
||||
public Boolean changeStatus(Long pluginId, Boolean status) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//判断当前文件是否实插件描述文件
|
||||
//文件名称必须plugin.json
|
||||
private boolean isPluginJson(File file) {
|
||||
@ -110,6 +163,7 @@ public class PluginService {
|
||||
Gson gson = new Gson();
|
||||
Map<String, Object> myPlugin = gson.fromJson(str, Map.class);
|
||||
myPlugin.put("free", (Double)myPlugin.get("free") > 0.0);
|
||||
myPlugin.put("loadMybatis", (Double)myPlugin.get("loadMybatis") > 0.0);
|
||||
MyPlugin result = new MyPlugin();
|
||||
try {
|
||||
org.apache.commons.beanutils.BeanUtils.populate(result, myPlugin);
|
||||
|
@ -164,21 +164,22 @@ CREATE TABLE `sys_users_roles` (
|
||||
|
||||
DROP TABLE IF EXISTS `my_plugin`;
|
||||
CREATE TABLE `my_plugin` (
|
||||
`plugin_id` bigint(20) NOT NULL COMMENT '主键',
|
||||
`name` varchar(255) DEFAULT NULL COMMENT '插件名称',
|
||||
`free` tinyint(1) DEFAULT NULL COMMENT '是否免费',
|
||||
`cost` int(10) DEFAULT NULL COMMENT '费用',
|
||||
`descript` varchar(255) DEFAULT NULL COMMENT '描述',
|
||||
`version` varchar(255) DEFAULT NULL COMMENT '版本号',
|
||||
`install_type` int(4) DEFAULT NULL COMMENT '安装类型',
|
||||
`creator` varchar(255) DEFAULT NULL COMMENT '开发者',
|
||||
`release_time` bigint(13) DEFAULT NULL COMMENT '发布时间',
|
||||
`install_time` bigint(13) DEFAULT NULL COMMENT '安装时间',
|
||||
`module_name` varchar(255) DEFAULT NULL COMMENT 'jar包名称',
|
||||
`bean_name` varchar(40) DEFAULT NULL COMMENT 'bean名称',
|
||||
`icon` varchar(255) DEFAULT NULL COMMENT '图标',
|
||||
PRIMARY KEY (`plugin_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
`plugin_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`name` varchar(255) DEFAULT NULL COMMENT '插件名称',
|
||||
`free` tinyint(1) DEFAULT '0' COMMENT '是否免费',
|
||||
`cost` int(10) DEFAULT NULL COMMENT '费用',
|
||||
`descript` varchar(255) DEFAULT NULL COMMENT '描述',
|
||||
`version` varchar(255) DEFAULT NULL COMMENT '版本号',
|
||||
`install_type` int(4) DEFAULT NULL COMMENT '安装类型',
|
||||
`creator` varchar(255) DEFAULT NULL COMMENT '开发者',
|
||||
`load_mybatis` tinyint(1) DEFAULT '0' COMMENT '是否需要加载mybatis',
|
||||
`release_time` bigint(13) DEFAULT NULL COMMENT '发布时间',
|
||||
`install_time` bigint(13) DEFAULT NULL COMMENT '安装时间',
|
||||
`module_name` varchar(255) DEFAULT NULL COMMENT 'jar包名称',
|
||||
`bean_name` varchar(40) DEFAULT NULL COMMENT 'bean名称',
|
||||
`icon` varchar(255) DEFAULT NULL COMMENT '图标',
|
||||
PRIMARY KEY (`plugin_id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='插件表';
|
||||
|
||||
DROP TABLE IF EXISTS `license`;
|
||||
CREATE TABLE `license` (
|
||||
|
@ -14,8 +14,9 @@ INSERT INTO `sys_menu` VALUES (1, 0, 3, 0, '系统管理', 'system', 'Layout', 6
|
||||
INSERT INTO `sys_menu` VALUES (2, 1, 4, 1, '用户管理', 'system-user', 'system/user/index', 1, 'peoples', 'user', NULL, b'0', b'0', 'user:read', NULL, NULL, NULL, 1620281952752);
|
||||
INSERT INTO `sys_menu` VALUES (3, 1, 3, 1, '菜单管理', 'system-menu', 'system/menu/index', 2, 'menu', 'menu', NULL, b'0', b'0', 'menu:read', NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `sys_menu` VALUES (4, 1, 3, 1, '组织管理', 'system-dept', 'system/dept/index', 3, 'dept', 'dept', NULL, b'0', b'0', 'dept:read', NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `sys_menu` VALUES (5, 1, 3, 1, '角色管理', 'system-role', 'system/role/index', 4, 'role', 'role', b'0', b'0', b'0', 'role:read', NULL, NULL, 1614683852133, 1614683852133);
|
||||
INSERT INTO `sys_menu` VALUES (6, 1, 0, 1, '参数管理', 'system-param', 'system/systemParamSettings/index', 5, 'sys-tools', 'systemParamSettings', NULL, b'0', b'0', 'sysparam:read', NULL, NULL, NULL, 1615790294169);
|
||||
|
||||
---INSERT INTO `sys_menu` VALUES (5, 1, 3, 1, '角色管理', 'system-role', 'system/role/index', 4, 'role', 'role', b'0', b'0', b'0', 'role:read', NULL, NULL, 1614683852133, 1614683852133);
|
||||
---INSERT INTO `sys_menu` VALUES (6, 1, 0, 1, '参数管理', 'system-param', 'system/systemParamSettings/index', 5, 'sys-tools', 'systemParamSettings', NULL, b'0', b'0', 'sysparam:read', NULL, NULL, NULL, 1615790294169);
|
||||
INSERT INTO `sys_menu` VALUES (8, 0, 0, 1, '数据集', 'dataset', 'dataset/index', 3, '', '/dataset', NULL, b'0', b'0', 'data:read', NULL, NULL, NULL, 1614916684821);
|
||||
INSERT INTO `sys_menu` VALUES (10, 0, 0, 1, '视图', 'view', 'chart/index', 2, '', '/chart', NULL, b'0', b'0', 'chart:read', NULL, NULL, NULL, 1614915491036);
|
||||
INSERT INTO `sys_menu` VALUES (12, 3, 0, 2, '创建菜单', NULL, NULL, 999, NULL, NULL, b'0', b'0', b'0', 'menu:add', NULL, NULL, 1614924617327, 1614924617327);
|
||||
@ -40,7 +41,7 @@ INSERT INTO `sys_menu` VALUES (34, 0, 4, 1, '数据源', 'datasource', 'system/d
|
||||
INSERT INTO `sys_menu` VALUES (35, 1, 0, 1, '用户表单', 'system-user-form', 'system/user/form', 10, '', 'user-form', b'0', b'0', b'1', NULL, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `sys_menu` VALUES (36, 1, 0, 1, '菜单表单', 'system-menu-form', 'system/menu/form', 11, '', 'menu-form', b'0', b'0', b'1', NULL, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `sys_menu` VALUES (37, 1, 0, 1, '组织表单', 'system-dept-form', 'system/dept/form', 12, '', 'dept-form', b'0', b'0', b'1', NULL, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `sys_menu` VALUES (38, 1, 0, 1, '角色表单', 'system-role-form', 'system/role/form', 13, '', 'role-form', b'0', b'0', b'1', NULL, NULL, NULL, NULL, NULL);
|
||||
---INSERT INTO `sys_menu` VALUES (38, 1, 0, 1, '角色表单', 'system-role-form', 'system/role/form', 13, '', 'role-form', b'0', b'0', b'1', NULL, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `sys_menu` VALUES (39, 0, 0, 1, '数据源表单', 'datasource-form', 'system/datasource/form', 5, NULL, '/ds-form', b'0', b'0', b'1', NULL, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `sys_menu` VALUES (40, 1, 0, 1, '模板管理', 'system-template', 'panel/template/index', 13, 'dashboard', 'panel/template/index', NULL, b'0', b'0', 'template:read', NULL, NULL, NULL, 1620444227389);
|
||||
INSERT INTO `sys_menu` VALUES (41, 1, 0, 1, '权限管理', 'system-auth', 'system/authority/index', 14, 'password', 'system/authority/index', b'0', b'0', b'0', 'auth:read', NULL, NULL, NULL, 1620447312657);
|
||||
|
@ -1,6 +1,7 @@
|
||||
import request from '@/utils/request'
|
||||
const pathMap = {
|
||||
queryPath: '/api/plugin/pluginGrid/'
|
||||
queryPath: '/api/plugin/pluginGrid/',
|
||||
uninstallPath: 'api/plugin/uninstall/'
|
||||
}
|
||||
export function pluginLists(page, size, data) {
|
||||
return request({
|
||||
@ -11,3 +12,11 @@ export function pluginLists(page, size, data) {
|
||||
})
|
||||
}
|
||||
|
||||
export function uninstall(pluginId) {
|
||||
return request({
|
||||
url: pathMap.queryPath + pluginId,
|
||||
method: 'post',
|
||||
loading: true
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -7,7 +7,9 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Axios from 'axios'
|
||||
// import Axios from 'axios'
|
||||
|
||||
import { get } from '@/api/system/dynamic'
|
||||
|
||||
export default {
|
||||
name: 'AsyncComponent',
|
||||
@ -36,13 +38,15 @@ export default {
|
||||
}
|
||||
let res
|
||||
if (!window.SyncComponentCache[this.url]) {
|
||||
window.SyncComponentCache[this.url] = Axios.get(this.url)
|
||||
window.SyncComponentCache[this.url] = get(this.url)
|
||||
|
||||
// window.SyncComponentCache[this.url] = Axios.get(this.url)
|
||||
res = await window.SyncComponentCache[this.url]
|
||||
} else {
|
||||
res = await window.SyncComponentCache[this.url]
|
||||
}
|
||||
const Fn = Function
|
||||
this.mode = new Fn(`return ${res.data}`)()
|
||||
this.mode = new Fn(`return ${res.data || res}`)()
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -36,6 +36,14 @@ export const filterAsyncRouter = (routers) => { // 遍历后台传来的路由
|
||||
if (router.type === 1 && router.pid === 0 && router.component && router.component !== 'Layout') {
|
||||
router = decorate(router)
|
||||
}
|
||||
if (router.isPlugin) {
|
||||
const jsName = router.component
|
||||
router.component = 'system/plugin/dynamic'
|
||||
router.props = {
|
||||
jsname: jsName,
|
||||
menuid: router.id
|
||||
}
|
||||
}
|
||||
if (router.component) {
|
||||
if (router.component === 'Layout') { // Layout组件特殊处理
|
||||
router.component = Layout
|
||||
@ -47,6 +55,7 @@ export const filterAsyncRouter = (routers) => { // 遍历后台传来的路由
|
||||
if (router.children && router.children.length) {
|
||||
router.children = filterAsyncRouter(router.children)
|
||||
}
|
||||
|
||||
router.hasOwnProperty('id') && delete router.id
|
||||
router.hasOwnProperty('type') && delete router.type
|
||||
router.hasOwnProperty('pid') && delete router.pid
|
||||
|
@ -54,7 +54,7 @@ import ComplexTable from '@/components/business/complex-table'
|
||||
|
||||
import { checkPermission } from '@/utils/permission'
|
||||
import { formatCondition } from '@/utils/index'
|
||||
import { pluginLists } from '@/api/system/plugin'
|
||||
import { pluginLists, uninstall } from '@/api/system/plugin'
|
||||
import { getToken } from '@/utils/auth'
|
||||
export default {
|
||||
|
||||
@ -131,6 +131,12 @@ export default {
|
||||
cancelButtonText: this.$t('commons.cancel'),
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
uninstall(row.pluginId).then(res => {
|
||||
this.search()
|
||||
this.$success('卸载成功')
|
||||
}).catch(() => {
|
||||
this.$error('卸载失败')
|
||||
})
|
||||
}).catch(() => {
|
||||
this.$info(this.$t('commons.delete_cancel'))
|
||||
})
|
||||
|
Loading…
Reference in New Issue
Block a user