Commit d9025067 by renrui
2 parents ca8bb87c e8800fa0
Showing with 8 additions and 4437 deletions
# 1.微服务
## 1.1 arch-overall 总体架构微服务
## 1.2 arch-clouds (微服务组件-在线文档、文件存储、日志管理等)
## 1.1 framework-overall 总体架构微服务
## 1.2 framework-clouds (微服务组件-在线文档、文件存储、日志管理等)
### 1.2.1 common(数据传输对象dto、视图对象vo)
### 1.2.2 filter (过滤器-处理sql注入、xss跨站脚本攻击)
### 1.2.3 log (记录日志微服务)
......@@ -9,12 +9,12 @@
### 1.2.6 storage (对象存储服务)
### 1.2.7 nacos (nacos组件,后期可对nacos账号进行加密)
### 1.2.X (其他组件可在改包下面添加)
## 1.3 arch-system (系统架构微服务)
## 1.4 arch-analysis (综合分析)
## 1.5 system-manage 系统管理微服务(字典管理、菜单管理、用户及组织管理)
## 1.6 arch-gateway
## 1.7 arch-base 基础服务-包括工具类、枚举类
## 1.8 arch-knowledge 知识库微服务
## 1.3 framework-system (系统架构微服务)
## 1.4 framework-analysis (综合分析)
## 1.5 framework-system-manage 系统管理微服务(字典管理、菜单管理、用户及组织管理)
## 1.6 framework-gateway
## 1.7 framework-base 基础服务-包括工具类、枚举类
## 1.8 framework-knowledge 知识库微服务
# <span style="color: red;">*************重要***********</span>
## vo(View Object):视图对象,用于展示层
## dto(Data Transfer Object):数据传输对象 再参数传递中 统一模块参数传递尽量统一DTO 不要每个方法创建一个,方便后期维护
......
/**
* Copyright (C) 2018-2020
* All rights reserved, Designed By www.yixiang.co
* 注意:
* 本软件为www.yixiang.co开发研制
*/
package org.arch.mybatis.common.web.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("查询参数对象")
public abstract class QueryParam implements Serializable{
private static final long serialVersionUID = -3263921252635611410L;
@ApiModelProperty(value = "页码,默认为1")
private Integer page =1;
@ApiModelProperty(value = "页大小,默认为10")
private Integer limit = 10;
@ApiModelProperty(value = "搜索字符串")
private String keyword;
public void setCurrent(Integer current) {
if (current == null || current <= 0){
this.page = 1;
}else{
this.page = current;
}
}
public void setSize(Integer size) {
if (size == null || size <= 0){
this.limit = 10;
}else{
this.limit = size;
}
}
}
/**
* Copyright (C) 2018-2020
* All rights reserved, Designed By www.yixiang.co
* 注意:
* 本软件为www.yixiang.co开发研制
*/
package org.arch.mybatis.common.web.vo;
import com.alibaba.fastjson.annotation.JSONField;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;
@ApiModel("分页")
@SuppressWarnings("unchecked")
public class Paging<T> implements Serializable {
private static final long serialVersionUID = -1683800405530086022L;
@ApiModelProperty("总行数")
@JSONField(name = "total")
@JsonProperty("total")
private long total = 0;
@ApiModelProperty("数据列表")
@JSONField(name = "records")
@JsonProperty("records")
private List<T> records = Collections.emptyList();
public Paging() {
}
public Paging(IPage page) {
this.total = page.getTotal();
this.records = page.getRecords();
}
public long getTotal() {
return total;
}
public void setTotal(long total) {
this.total = total;
}
public List<T> getRecords() {
return records;
}
public void setRecords(List<T> records) {
this.records = records;
}
@Override
public String toString() {
return "Paging{" +
"total=" + total +
", records=" + records +
'}';
}
}
package org.arch.mybatis.config;
import com.alibaba.fastjson2.JSONArray;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JsonArrayHandler implements TypeHandler<Object> {
@Override
public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
if (parameter == null) {
ps.setNull(i, JdbcType.OTHER.TYPE_CODE);
} else {
ps.setObject(i, parameter.toString(), JdbcType.VARCHAR.TYPE_CODE);
}
}
@Override
public JSONArray getResult(ResultSet rs, String columnName) throws SQLException {
String json = rs.getString(columnName);
return parseJson(json);
}
@Override
public JSONArray getResult(ResultSet rs, int columnIndex) throws SQLException {
String json = rs.getString(columnIndex);
return parseJson(json);
}
@Override
public JSONArray getResult(CallableStatement cs, int columnIndex) throws SQLException {
String json = cs.getString(columnIndex);
return parseJson(json);
}
private JSONArray parseJson(String json) {
// 这里可以使用你喜欢的JSON库来解析JSON
// 例如使用Jackson,Gson等
// return new ObjectMapper().readValue(json, YourClass.class);
// 暂时只是简单的返回json字符串
return JSONArray.parse(json);
}
}
package org.arch.mybatis.config;
import com.alibaba.fastjson2.JSONObject;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JsonTypeHandler implements TypeHandler<Object> {
@Override
public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
if (parameter == null) {
ps.setNull(i, JdbcType.OTHER.TYPE_CODE);
} else {
ps.setObject(i, parameter.toString(), JdbcType.VARCHAR.TYPE_CODE);
}
}
@Override
public JSONObject getResult(ResultSet rs, String columnName) throws SQLException {
String json = rs.getString(columnName);
return parseJson(json);
}
@Override
public JSONObject getResult(ResultSet rs, int columnIndex) throws SQLException {
String json = rs.getString(columnIndex);
return parseJson(json);
}
@Override
public JSONObject getResult(CallableStatement cs, int columnIndex) throws SQLException {
String json = cs.getString(columnIndex);
return parseJson(json);
}
private JSONObject parseJson(String json) {
// 这里可以使用你喜欢的JSON库来解析JSON
// 例如使用Jackson,Gson等
// return new ObjectMapper().readValue(json, YourClass.class);
// 暂时只是简单的返回json字符串
return JSONObject.parseObject(json);
}
}
/**
* Copyright (C) 2018-2020
* All rights reserved, Designed By www.yixiang.co
* 注意:
* 本软件为www.yixiang.co开发研制
*/
package org.arch.mybatis.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 处理新增和更新的基础数据填充,配合BaseEntity和MyBatisPlusConfig使用
*/
@Slf4j
@Component
public class MyMetaHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); // 起始版本 3.3.0(推荐使用)
this.strictInsertFill(metaObject, "lastUpdateTime", Date.class, new Date()); // 起始版本 3.3.0(推荐)
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.strictUpdateFill(metaObject, "lastUpdateTime", Date.class, new Date()); // 起始版本 3.3.0(推荐)
}
}
/**
* Copyright (C) 2018-2020
* All rights reserved, Designed By www.yixiang.co
* 注意:
* 本软件为www.yixiang.co开发研制
*/
package org.arch.mybatis.config;
/**
* @author :LionCity
* @date :Created in 2020-04-10 15:11
* @description:MybatisConfig
* @modified By:
* @version:
*/
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;
@Slf4j
@Configuration
@MapperScan(basePackages = {"org.arch.*.*.mapper","org.arch.**.mapper"})
public class MybatisConfig {
public MybatisConfig() {
log.info("加载MybatisPlus配置...");
}
/**
* 配置mybatis的分页插件pageHelper
* @return
*/
@Bean
public PageHelper pageHelper(){
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
properties.setProperty("offsetAsPageNum","true");
properties.setProperty("rowBoundsWithCount","true");
properties.setProperty("reasonable","true");
//配置mysql数据库的方言
properties.setProperty("dialect","mysql");
pageHelper.setProperties(properties);
return pageHelper;
}
}
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.arch.mybatis.config.MybatisConfig
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.arch</groupId>
<artifactId>arch-clouds</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>nacos</artifactId>
<name>注册中心</name>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--openfeign-->
<!--<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>-->
<!--sentinel依赖-->
<!--<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>-->
</dependencies>
</project>
\ No newline at end of file
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.arch.nacos.NacosRegisterConfig
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.arch</groupId>
<artifactId>arch-clouds</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>office</artifactId>
<name>在线文档</name>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.arch</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.arch</groupId>
<artifactId>storage</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package org.arch.office.config;/*
package com.eadc.office.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*") // SpringBoot2.4.0 [allowedOriginPatterns]代替[allowedOrigins]
.allowedMethods("*")
.maxAge(3600)
.allowCredentials(true);
}
}
*/
package org.arch.office.config;
import org.arch.office.model.documentServer.EditorConfig;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Data
@ConfigurationProperties(prefix = "office")
@Component
public class OnlyOfficeProperties {
// 本地服务ip地址
private String ip;
/**
* 编辑器默认语言【只允许中文!】
*/
private String lang;
/**
* logo信息
*/
private EditorConfig.Customization.Logo logo;
/**
* 文档服务器回调接口【交互接口非常非常重要】
*
*/
private String callbackUrl;
private String downloadUrl;
private String goBack;
/**
* 文档服务器js文件
*/
private String api;
// 可编辑、查看、转换的文件类型
private List<String> viewedDocs;
private List<String> editedDocs;
private List<String> convertDocs;
public Set<String> getFillExts(){
HashSet<String> result = new HashSet<>();
result.addAll(viewedDocs);
result.addAll(editedDocs);
result.addAll(convertDocs);
return result;
}
public String getCallbackUrl(){
return ip + callbackUrl;
}
public String getDownloadUrl(){
return ip + downloadUrl;
}
}
package org.arch.office.model.documentServer;
import lombok.Data;
import java.util.ArrayList;
import java.util.HashMap;
/**
* 针对DocEditor需要的配置项
*/
@Data
public class Config {
// 文档配置项目
private Document document;
// 编辑类型
private DocumentType documentType;
// 文档编辑器定制化配置项
private EditorConfig editorConfig;
//token
private String token;
//显示类型
private String type;
public static class ConfigBuildr{
// 文件名称
private String filename;
// 文件后缀
private String fileSuffix;
}
public static Config build(){
Config config = new Config();
EditorConfig editorConfig = new EditorConfig();
Document document = new Document();
EditorConfig.Customization customization = new EditorConfig.Customization();
EditorConfig.Customization.Goback goBack = new EditorConfig.Customization.Goback();
EditorConfig.Customization.Logo logo = new EditorConfig.Customization.Logo();
editorConfig.setTemplates(new ArrayList<>(1));
editorConfig.setCoEditing(new HashMap<>());
customization.setLogo(logo);
customization.setGoback(goBack);
editorConfig.setCustomization(customization);
config.setEditorConfig(editorConfig);
document.setInfo(new Document.Info());
config.setDocument(document);
return config;
}
}
package org.arch.office.model.documentServer;
import lombok.Data;
import java.util.List;
@Data
public class Document {
// 文档的附加参数(文档所有者、存储文档的文件夹、上传日期,共享设置)
private Info info;
// 文档是否被编辑和下载的权限
private Permission permissions;
// 文件类型 docx ppt
private String fileType;
// 文档服务器唯一标识
private String key;
// 文件名称
private String title;
// 文档服务器下载文件的地址
private String url;
@Data
public static class Info {
// 文件创建人的名称
private String owner;
// 收藏图标的高亮显示状态
private Boolean favorite;
// 文件上传日期
private String uploaded;
}
@Data
public static class Permission {
// 文档注释功能
private Boolean comment = true;
// 文档注释权限控制功能,根据用户组
private CommentGroup commentGroup;
// 文档copy功能
private Boolean copy = true;
// 文档下载功能
private Boolean download = true;
// 文档编辑功能(在model为view时这个设置不起作用)
private Boolean edit = true;
// 文档打印功能
private Boolean print = true;
// 文档填写表单功能
private Boolean fillForms = true;
// 文档过滤器功能
private Boolean modifyFilter = true;
// 文档更改内容控件设置功能
private Boolean modifyContentControl = true;
// 文档审阅模式功能
private Boolean review = true;
// 文档聊天功能
private Boolean chat = true;
// 定义用户可以接受/拒绝其更改的组
private List<String> reviewGroups;
private List<String> userInfoGroups;
@Data
public static class CommentGroup{
private List<String> view;
private List<String> edit;
private List<String> remove;
}
}
}
package org.arch.office.model.documentServer;
public enum DocumentType {
word,
cell,
slide
}
package org.arch.office.model.dto;
import org.arch.office.model.documentServer.EditorConfig;
import lombok.Data;
import java.util.List;
/**
* 文档服务器callback数据
*/
@Data
public class Callback {
// 文件类型 docx
private String filetype;
// 最新文档下载地址
private String url;
// 唯一key值
private String key;
// ...
private String changesurl;
// 历史记录
private History history;
// token
private String token;
// 定义执行强制保存请求时启动器的类型
private Integer forcesavetype;
// 当前的操作状态
private Integer status;
//全部用户存储用户id
private List<String> users;
// 只有当前操作人的信息
private List<Action> actions;
//
private String userdata;
//
private String lastsave;
private Boolean notmodified;
@Data
public static class History {
private String serverVersion;
private String key;
private Integer version;
private String created;
private EditorConfig.User user;
// private List<ChangesHistory> changes;
}
@Data
public static class Action {
// 用户id
private String userid;
// 操作类型
private org.arch.office.model.documentServer.Action type;
}
}
package org.arch.office.model.entity;
import lombok.Data;
/**
* 附件(aid, aname, apath, rid)
*
* ClassName: Attach
* Function: TODO
* Date: 2020/2/12 0012 20:25
* author XieWenYing
* version V1.0
*/
@Data
public class Attach {
private String aid;//附件Id
private String aname;//附件名
private String apath;//附件文件路径
//private String rid;//对应需求id
private String fileId;
}
package org.arch.office.model.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class OnlyOfficeFile implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 文件id
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 文件唯一标识
*/
private String fileKey;
/**
* 文件名称
*/
private String title;
/**
* 文件名称
*/
private String name;
/**
* 文件后缀
*/
private String suffix;
/**
* 文件content-type
*/
private String contentType;
/**
* 文件大小
*/
private Long length;
/**
* 文件真实地址
*/
private String url;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
private String creater;
/**
* 跟新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 跟新人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updater;
/**
* 状态
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
private Integer status;
/**
* 版本
*/
@Version
private Integer version;
/**
* md5值
*/
private String md5;
/**
* 过期时间
*/
private Long expiry;
}
package org.arch.office.model.entity;
import lombok.Data;
import java.util.List;
/**
* 每条需求(id, title, content, outline)
* ClassName: ReqBase
* Date: 2020/2/12 0012 19:36
* author XieWenYing
* version V1.0
*/
@Data
public class Reqbase {
private String rid;
private String title;
private String content;
private Integer outline;
private String pid;
private List<String> headingNotes;
private List<Attach> attachList;
}
package org.arch.office.model.vo;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.arch.office.service.Flag;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Data
public class OnlyOfficeFileVo {
@NotNull(message = "id不能为空",groups = Runnable.class)
private Long id;
@NotEmpty(message = "fileKey不能为空",groups = Flag.class)
private String fileKey;
@NotEmpty(message = "title不能为空",groups = Flag.class)
private String title;
@NotEmpty(message = "url不能为空",groups = Flag.class)
private String url;
private Long length;
private String contentType;
private String md5;
public String getName() {
if (StringUtils.isNotBlank(title)) {
return title.substring(0, title.lastIndexOf("."));
}
return StringUtils.EMPTY;
}
public String getSuffix() {
if (StringUtils.isNotBlank(title)) {
// 获取文件后缀
String suffix = title.substring(title.lastIndexOf(".") + 1);
return suffix;
}
return StringUtils.EMPTY;
}
}
package org.arch.office.service;
import org.arch.office.service.impl.CallbackHandler;
import org.springframework.beans.factory.annotation.Autowired;
/**
* 处理文档服务器返回的数据
*/
public interface Callback {
int handle(org.arch.office.model.dto.Callback body, Long fileId);
int getStatus();
@Autowired
default void selfRegistration(CallbackHandler callbackHandler) {
callbackHandler.register(getStatus(), this);
}
}
package org.arch.office.service;
import org.arch.office.model.documentServer.Config;
import java.io.UnsupportedEncodingException;
public interface FileConfigurer<W> extends Configurer<Config, W>{
void configure(Config model, W wrapper) throws UnsupportedEncodingException;
Config getFileModel(W wrapper) throws UnsupportedEncodingException;
}
package org.arch.office.service;
public interface Flag {
}
package org.arch.office.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.arch.office.model.documentServer.Config;
import org.arch.office.model.entity.OnlyOfficeFile;
import org.arch.office.model.vo.OnlyOfficeFileVo;
import java.util.List;
public interface OnlyOfficeFileService {
Integer removeByIds(List<Long> ids);
OnlyOfficeFile updateById(OnlyOfficeFileVo onlyOfficeFileVo);
IPage<OnlyOfficeFile> queryByPage(Long current, Integer rows, OnlyOfficeFileVo onlyOfficeFileVo);
List<OnlyOfficeFile> queryByIds(List<Long> ids);
OnlyOfficeFile queryById(Long id);
OnlyOfficeFile saveOnlyOfficeFile(OnlyOfficeFileVo onlyOfficeFileVo);
/**
* 根据文件的id构建文档编辑器需要的config对象
*/
Config buildConfigByFileId(Long fileId);
}
package org.arch.office.service.impl;
import org.arch.office.service.Callback;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
@Service
public class CallbackHandler {
private final Logger logger = LoggerFactory.getLogger(CallbackHandler.class);
private final Map<Integer, Callback> callbackHandlers = new HashMap<>();
public void register(int code, Callback callback) {
callbackHandlers.put(code, callback);
}
public int handle(org.arch.office.model.dto.Callback body, Long fileId) {
Callback callback = callbackHandlers.get(body.getStatus());
if (callback == null) {
logger.warn("Callback status " + body.getStatus() + " is not supported yet");
return 0;
}
return callback.handle(body, fileId);
}
}
package org.arch.office.service.impl;
import org.arch.office.config.OnlyOfficeProperties;
import org.arch.office.model.documentServer.DefaultCustomizationWrapper;
import org.arch.office.model.documentServer.EditorConfig;
import org.arch.office.service.CustomizationConfigurer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class CustomizationConfigurerImpl implements CustomizationConfigurer<DefaultCustomizationWrapper> {
@Autowired
private OnlyOfficeProperties onlyOfficeProperties;
@Override
public void configure(EditorConfig.Customization customization, DefaultCustomizationWrapper wrapper) {
customization.setSubmitForm(false);
customization.setLogo(onlyOfficeProperties.getLogo());
EditorConfig.Customization.Goback goback = new EditorConfig.Customization.Goback();
goback.setUrl(onlyOfficeProperties.getGoBack());
customization.setGoback(goback);
}
}
package org.arch.office.service.impl;
import org.arch.office.config.OnlyOfficeProperties;
import org.arch.office.model.documentServer.DefaultDocumentWrapper;
import org.arch.office.model.documentServer.Document;
import org.arch.office.service.DocumentConfigurer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DocumentConfigurerImpl implements DocumentConfigurer<DefaultDocumentWrapper> {
@Autowired
private OnlyOfficeProperties onlyOfficeProperties;
@Override
public void configure(Document document, DefaultDocumentWrapper wrapper) {
String fileName = wrapper.getFileName();
Document.Permission permission = wrapper.getPermission();
// 设置文件名称
document.setTitle(fileName);
// 设置访问地址
document.setUrl(onlyOfficeProperties.getDownloadUrl() + wrapper.getOnlyOfficeFile().getId());
document.setFileType(wrapper.getOnlyOfficeFile().getSuffix());
Document.Info info = document.getInfo();
info.setFavorite(wrapper.getFavorite());
info.setOwner(wrapper.getOnlyOfficeFile().getCreateMan().toString());
info.setUploaded(wrapper.getOnlyOfficeFile().getCreateTime().toString());
document.setKey(wrapper.getOnlyOfficeFile().getFileKey());
document.setPermissions(permission);
}
}
package org.arch.office.service.impl;
import org.arch.office.model.documentServer.Status;
import org.arch.office.service.Callback;
import org.springframework.stereotype.Service;
@Service
public class EditCallback implements Callback {
@Override
public int handle(org.arch.office.model.dto.Callback body, Long fileId) {
return 0;
}
@Override
public int getStatus() {
return Status.EDITING.getCode();
}
}
package org.arch.office.service.impl;
import org.arch.office.config.OnlyOfficeProperties;
import org.arch.office.model.documentServer.Action;
import org.arch.office.model.documentServer.DefaultCustomizationWrapper;
import org.arch.office.model.documentServer.DefaultFileWrapper;
import org.arch.office.model.documentServer.EditorConfig;
import org.arch.office.service.EditorConfigConfigurer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
@Service
public class EditorConfigConfigurerImpl implements EditorConfigConfigurer<DefaultFileWrapper> {
@Autowired
private OnlyOfficeProperties onlyOfficeProperties;
@Autowired
private CustomizationConfigurerImpl customizationConfigurer;
@Override
public void configure(EditorConfig editorConfig, DefaultFileWrapper wrapper) {
// 不显示新建
editorConfig.setTemplates(null);
editorConfig.setCreateUrl(null);
// 设置回调接口
editorConfig.setCallbackUrl(onlyOfficeProperties.getCallbackUrl() + wrapper.getOnlyOfficeFile().getId());
editorConfig.setLang("zh"); // 语言,写死不允许修改
Boolean canEdit = wrapper.getCanEdit();
Action action = wrapper.getAction();
editorConfig.setCoEditing(action.equals(Action.view) ? new HashMap<String, Object>() {{
put("mode", "strict");
put("change", false);
}} : new HashMap<String, Object>() {{
put("mode", "fast");
put("change", true);
}});
// define the customization configurer
customizationConfigurer.configure(editorConfig.getCustomization(),
DefaultCustomizationWrapper.builder()
.action(action)
.build());
// 设置Model
editorConfig.setMode(canEdit && !action.equals(Action.view) ? EditorConfig.Mode.edit : EditorConfig.Mode.view);
editorConfig.setUser(wrapper.getUser());
// 设置embedded
editorConfig.setEmbedded(null);
}
}
package org.arch.office.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.arch.office.config.OnlyOfficeProperties;
import org.arch.office.mapper.OnlyOfficeFileMapper;
import org.arch.office.model.documentServer.Config;
import org.arch.office.model.entity.OnlyOfficeFile;
import org.arch.office.model.vo.OnlyOfficeFileVo;
import org.arch.office.service.OnlyOfficeFileService;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import java.util.ArrayList;
import java.util.List;
@Service
public class OnlyOfficeFileServiceImpl implements OnlyOfficeFileService {
private final OnlyOfficeFileMapper onlyOfficeFileMapper;
private final OnlyOfficeProperties onlyOfficeProperties;
public OnlyOfficeFileServiceImpl (OnlyOfficeFileMapper onlyOfficeFileMapper,OnlyOfficeProperties onlyOfficeProperties){
this.onlyOfficeFileMapper = onlyOfficeFileMapper;
this.onlyOfficeProperties = onlyOfficeProperties;
}
@Override
public Integer removeByIds(List<Long> ids) {
return onlyOfficeFileMapper.deleteById(ids.get(0));
}
@Override
public OnlyOfficeFile updateById(OnlyOfficeFileVo onlyOfficeFileVo) {
Assert.isTrue(onlyOfficeFileVo.getId() != null,"file id is null!");
OnlyOfficeFile onlyOfficeFile = new OnlyOfficeFile();
BeanUtils.copyProperties(onlyOfficeFileVo,onlyOfficeFile);
String title = onlyOfficeFileVo.getTitle();
if(StringUtils.isNotBlank(title)) {
onlyOfficeFile.setName(onlyOfficeFileVo.getName());
onlyOfficeFile.setSuffix(onlyOfficeFileVo.getSuffix());
}
return onlyOfficeFileMapper.updateById(onlyOfficeFile) > 0 ? onlyOfficeFile : null;
}
@Override
public IPage<OnlyOfficeFile> queryByPage(Long current, Integer rows, OnlyOfficeFileVo onlyOfficeFileVo) {
LambdaQueryWrapper<OnlyOfficeFile> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ObjectUtils.isNotEmpty(onlyOfficeFileVo.getId()),OnlyOfficeFile::getId,onlyOfficeFileVo.getId());
wrapper.eq(StringUtils.isNotBlank(onlyOfficeFileVo.getTitle()),OnlyOfficeFile::getTitle,onlyOfficeFileVo.getTitle());
wrapper.eq(StringUtils.isNotBlank(onlyOfficeFileVo.getFileKey()),OnlyOfficeFile::getFileKey,onlyOfficeFileVo.getFileKey());
return onlyOfficeFileMapper.selectPage(new Page<>(current, rows), wrapper);
}
@Override
public List<OnlyOfficeFile> queryByIds(List<Long> ids) {
LambdaQueryWrapper<OnlyOfficeFile> wrapper = new LambdaQueryWrapper<>();
return new ArrayList<>();
}
@Override
public OnlyOfficeFile queryById(Long id) {
return onlyOfficeFileMapper.selectById(id);
}
@Override
public OnlyOfficeFile saveOnlyOfficeFile(OnlyOfficeFileVo onlyOfficeFileVo) {
OnlyOfficeFile onlyOfficeFile = new OnlyOfficeFile();
BeanUtils.copyProperties(onlyOfficeFileVo,onlyOfficeFile);
onlyOfficeFile.setId(null);
if(StringUtils.isNotBlank(onlyOfficeFileVo.getTitle())) {
onlyOfficeFile.setName(onlyOfficeFileVo.getName());
onlyOfficeFile.setSuffix(onlyOfficeFileVo.getSuffix());
}
return onlyOfficeFileMapper.insert(onlyOfficeFile) > 0 ? onlyOfficeFile : null;
}
@Override
public Config buildConfigByFileId(Long fileId) {
Config config = new Config();
return config;
}
}
package org.arch.office.service.impl;
import cn.hutool.core.lang.Assert;
import org.arch.base.utils.FileUtils;
import org.arch.common.modules.base.entity.File;
import org.arch.office.model.documentServer.Status;
import org.arch.office.service.Callback;
import org.arch.office.utils.HttpUtil;
import org.arch.office.utils.MD5Util;
import org.arch.office.utils.MockMultipartFile;
import lombok.RequiredArgsConstructor;
import org.arch.storage.mapper.FileMapper;
import org.dromara.x.file.storage.core.FileInfo;
import org.dromara.x.file.storage.core.FileStorageService;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@Service
@RequiredArgsConstructor
public class SaveCallback implements Callback {
private final MD5Util md5Util;
private final FileMapper sysFileMapper;
private final FileStorageService fileStorageService;
@Override
public int handle(org.arch.office.model.dto.Callback body, Long fileId) {
File file = sysFileMapper.selectById(fileId);
Assert.notNull(file, "上传文件不能为空");
byte[] bytes = HttpUtil.downloadFile(body.getUrl(), null);
MultipartFile multipartFile = new MockMultipartFile(file.getTitle(), file.getTitle(), file.getContentType(), bytes);
FileInfo upload = fileStorageService.of(multipartFile)
.setPath(FileUtils.filePath()).upload();
Assert.notNull(file, "上传失败");
//DateTime dateTime = DateUtil.offsetDay(new Date(), 7);
//String url = fileStorageService.generatePresignedUrl(upload, dateTime);
String url = upload.getUrl();
File temp = new File();
temp.setId(file.getId());
temp.setUrl(url);
temp.setStoreFileName(upload.getObjectId());
String md5 = md5Util.encrypt(bytes);
temp.setMd5(md5);
temp.setFileKey(md5Util.key(md5));
temp.setTitle(file.getTitle());
sysFileMapper.updateById(temp);
// 历史记录信息
return 0;
}
@Override
public int getStatus() {
return Status.SAVE.getCode();
}
}
package org.arch.office.utils;
import org.arch.office.model.documentServer.DocumentType;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Component
public class FileUtility {
private List<String> extsDocument = Arrays.asList(
"doc", "docx", "docm",
"dot", "dotx", "dotm",
"odt", "fodt", "ott", "rtf", "txt",
"html", "htm", "mht", "xml",
"pdf", "djvu", "fb2", "epub", "xps", "oform");
private List<String> extsSpreadsheet = Arrays.asList(
"xls", "xlsx", "xlsm", "xlsb",
"xlt", "xltx", "xltm",
"ods", "fods", "ots", "csv");
private List<String> extsPresentation = Arrays.asList(
"pps", "ppsx", "ppsm",
"ppt", "pptx", "pptm",
"pot", "potx", "potm",
"odp", "fodp", "otp");
/**
* 根据后缀名称返回文档类型
*/
public DocumentType getDocumentType(String suffix) {
suffix = suffix.toLowerCase();
if (extsDocument.contains(suffix)) {
return DocumentType.word;
}
if (extsSpreadsheet.contains(suffix)) {
return DocumentType.cell;
}
if (extsPresentation.contains(suffix)) {
return DocumentType.slide;
}
return DocumentType.word;
}
}
package org.arch.office.utils;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
@Component
public class JWTUtil {
@Value("${token.secret}")
private String secret;
@Value("${token.expire}")
private Integer expire;
/**
* only office获取token
*/
public String onlyOfficeCreateToken(Map<String,Object> params) {
try {
JWTCreator.Builder builder = JWT.create();
builder.withExpiresAt(getExpire());
Class<? extends JWTCreator.Builder> aClass = builder.getClass();
Method addClaim = aClass.getDeclaredMethod("addClaim", String.class,Object.class);
addClaim.setAccessible(true);
for (Map.Entry<String, Object> entry : params.entrySet()) {
addClaim.invoke(builder,entry.getKey(),entry.getValue());
}
return builder.sign(Algorithm.HMAC256(secret));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private Date getExpire() {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MINUTE, expire);
return calendar.getTime();
}
}
package org.arch.office.utils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Random;
@Component
public class MD5Util {
/**
* 获取md5字符串
*/
public String encrypt(String dataStr) {
return encrypt(dataStr.getBytes(StandardCharsets.UTF_8));
}
public String encrypt(byte[] bytes){
try {
MessageDigest m = MessageDigest.getInstance("MD5");
m.update(bytes);
byte s[] = m.digest();
String result = "";
for (int i = 0; i < s.length; i++) {
result += Integer.toHexString((0x000000FF & s[i]) | 0xFFFFFF00).substring(6);
}
return result;
} catch (Exception e) {
e.printStackTrace();
}
return StringUtils.EMPTY;
}
public String key(String u){
Random random = new Random();
StringBuilder sbr = new StringBuilder();
for (int i = 0; i < 10; i++) {
sbr.append(u.charAt(random.nextInt(u.length())));
}
return sbr.toString();
}
}
package org.arch.office.utils;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public class MockMultipartFile implements MultipartFile {
private final String name;
private String originalFilename;
@Nullable
private String contentType;
private final byte[] content;
public MockMultipartFile(String name, @Nullable byte[] content) {
this(name, "", (String)null, (byte[])content);
}
public MockMultipartFile(String name, InputStream contentStream) throws IOException {
this(name, "", (String)null, (byte[])FileCopyUtils.copyToByteArray(contentStream));
}
public MockMultipartFile(String name, @Nullable String originalFilename, @Nullable String contentType, @Nullable byte[] content) {
Assert.hasLength(name, "Name must not be null");
this.name = name;
this.originalFilename = originalFilename != null ? originalFilename : "";
this.contentType = contentType;
this.content = content != null ? content : new byte[0];
}
public MockMultipartFile(String name, @Nullable String originalFilename, @Nullable String contentType, InputStream contentStream) throws IOException {
this(name, originalFilename, contentType, FileCopyUtils.copyToByteArray(contentStream));
}
public String getName() {
return this.name;
}
public String getOriginalFilename() {
return this.originalFilename;
}
@Nullable
public String getContentType() {
return this.contentType;
}
public boolean isEmpty() {
return this.content.length == 0;
}
public long getSize() {
return (long)this.content.length;
}
public byte[] getBytes() throws IOException {
return this.content;
}
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(this.content);
}
public void transferTo(File dest) throws IOException, IllegalStateException {
FileCopyUtils.copy(this.content, dest);
}
}
package org.arch.office.utils;
import cn.hutool.core.lang.Assert;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.arch.common.modules.base.entity.File;
import org.arch.storage.mapper.FileMapper;
import org.dromara.x.file.storage.core.Downloader;
import org.dromara.x.file.storage.core.FileStorageService;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.io.IOException;
/**
* 解析pdf工具类【对于扫描版的pdf是无法解析的】
*/
@Service
public class PrasePdfUtils {
public static PrasePdfUtils prasePdfUtils;
@Resource
private FileStorageService fileStorageService;
@Resource
private FileMapper sysFileMapper;
@PostConstruct
public void init() {
prasePdfUtils = this;
prasePdfUtils.fileStorageService = this.fileStorageService;
prasePdfUtils.sysFileMapper = this.sysFileMapper;
}
public static String prasePdf(String fileId) throws IOException {
PDDocument document = null;
ByteArrayInputStream byteArrayInputStream = null;
String text = "";
try{
File file = prasePdfUtils.sysFileMapper.selectById(fileId);
Assert.notNull(file, "文件不存在");
Downloader download = prasePdfUtils.fileStorageService.download(file.getUrl());
byte[] bytes = download.bytes();
byteArrayInputStream = new ByteArrayInputStream(bytes);
document = PDDocument.load(byteArrayInputStream);
// 创建PDFTextStripper对象并从文档中提取文本
PDFTextStripper pdfStripper = new PDFTextStripper();
text = pdfStripper.getText(document);
return text;
}catch (Exception e){
e.printStackTrace();
} finally {
if(null!=document){
document.close();
}
if(null!=byteArrayInputStream){
byteArrayInputStream.close();
}
}
return null;
}
}
package org.arch.office.utils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.poi.openxml4j.util.ZipSecureFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;
import java.util.UUID;
/**
* word转图片工具类
*/
public class WordConvertImageUtils {
public static void wordChangeImage(InputStream fileStream, String targetPath){
ZipSecureFile.setMinInflateRatio(-1.0d);
try {
PDDocument document = PDDocument.load(fileStream);
String dirName = UUID.randomUUID().toString().replaceAll("-","").toUpperCase();
String filePath = targetPath +File.separator + dirName;
File file = new File(filePath);
if(!file.exists()){
file.mkdir();
}
PDFRenderer pdfRenderer = new PDFRenderer(document);
for (int page = 0; page < document.getNumberOfPages(); ++page) {
BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 70); // 设置DPI,可以调整输出图片的分辨率
ImageIO.write(bim, "PNG", new File(filePath+ File.separator + (UUID.randomUUID()
.toString().replaceAll("-","")+"-"+(page + 1)) + ".png"));
}
document.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/* public static void main(String[] args) throws Exception {
String targetPath="C:\\测试pdf转图片.pdf";
File file = new File(targetPath);
FileInputStream fileInputStream = new FileInputStream(file);
wordChangeImage(fileInputStream,"F:\\");
}*/
}
package org.arch.office.utils;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
public class WordUtils {
public static MultipartFile convertToMultipartFile(String filename, String contentType, InputStream inputStream) throws IOException {
return new MockMultipartFile(filename, filename, contentType, inputStream);
}
}
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.arch.office.OfficeConfig
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.arch</groupId>
<artifactId>arch</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<name>微服务组件</name>
<packaging>pom</packaging>
<artifactId>arch-clouds</artifactId>
<modules>
<module>log</module>
<module>office</module>
<module>storage</module>
<module>mybatis</module>
<module>nacos</module>
<module>filters</module>
<module>common</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.arch</groupId>
<artifactId>arch-base</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.arch</groupId>
<artifactId>arch-clouds</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<version>1.0-SNAPSHOT</version>
<name>文件存储</name>
<artifactId>storage</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- minio -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
</dependency>
<dependency>
<groupId>org.arch</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package org.arch.storage.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Slf4j
@Configuration
@ComponentScan("org.arch.storage")
public class StoreConfiguration {
public StoreConfiguration(){
log.info("加载StoreConfiguration~~~");
}
}
package org.arch.storage.mapper;
import cn.hutool.core.io.FileUtil;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import lombok.SneakyThrows;
import org.apache.ibatis.annotations.Mapper;
import org.arch.base.utils.MD5Utils;
import org.arch.common.modules.base.entity.File;
import org.dromara.x.file.storage.core.FileInfo;
import org.springframework.web.multipart.MultipartFile;
/**
* <p>
* 附件表 Mapper 接口
* </p>
*
* @author audit
* @since 2020-09-12
*/
@Mapper
public interface FileMapper extends BaseMapper<File> {
@SneakyThrows
default File saveFile(FileInfo upload, MultipartFile file) {
File sysFile = new File();
String suffix = FileUtil.getSuffix(upload.getOriginalFilename());
String prefix = FileUtil.getPrefix(upload.getOriginalFilename());
sysFile.setFileName(upload.getOriginalFilename());
sysFile.setContentType(upload.getContentType());
sysFile.setUrl(upload.getUrl());
sysFile.setFileType(suffix);
sysFile.setSuffix(suffix);
String encrypt = MD5Utils.encrypt(file.getBytes());
sysFile.setMd5(encrypt);
sysFile.setFileKey(MD5Utils.key(encrypt));
sysFile.setLength(upload.getSize());
sysFile.setTitle(upload.getOriginalFilename());
sysFile.setName(prefix);
sysFile.setStoreFileName(upload.getFilename());
sysFile.setPlatform(upload.getPlatform());
sysFile.setBasePath(upload.getBasePath());
insert(sysFile);
return sysFile;
}
}
package org.arch.storage.service;
import org.arch.common.modules.base.dto.DelDTO;
import org.arch.common.modules.base.dto.DownloadObjectDTO;
import org.arch.common.modules.base.vo.UpLoadVO;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
/**
* oss对象存储管理
*
* @author makejava
* @since 2023-05-04 13:29:23
*/
public interface OssService {
/**
* oss对象存储上传
*
* @param file {@link MultipartFile}
* @return {@link UpLoadVO}
*/
UpLoadVO upload(MultipartFile file);
/**
* 下载对象
*/
void downloadObject(DownloadObjectDTO params, HttpServletResponse response);
/**
* oss对象存储删除
*
* @param dto 参数
* @return {@link UpLoadVO}
*/
Boolean delObject(DelDTO dto);
}
package org.arch.storage.service.impl;
import cn.hutool.core.io.file.FileNameUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.arch.common.modules.base.entity.File;
import org.arch.storage.mapper.FileMapper;
import org.dromara.x.file.storage.core.FileInfo;
import org.dromara.x.file.storage.core.recorder.FileRecorder;
import org.dromara.x.file.storage.core.upload.FilePartInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Component
public class FileRecorderImpl implements FileRecorder {
@Autowired
private FileMapper fileMapper;
@Override
public boolean save(FileInfo fileInfo) {
return true;
}
@Override
public void update(FileInfo fileInfo) {
}
@Override
public FileInfo getByUrl(String s) {
FileInfo fileInfo = new FileInfo();
File file = fileMapper.selectOne(Wrappers.lambdaQuery(File.class).eq(File::getUrl, s));
if (Objects.nonNull(file)) {
fileInfo.setPlatform(file.getPlatform());
fileInfo.setUrl(s);
fileInfo.setPath(extractDateFromUrl(s) + "/");
fileInfo.setBasePath(file.getBasePath());
fileInfo.setFilename(FileNameUtil.getName(s));
}
return fileInfo;
}
@Override
public boolean delete(String s) {
return true;
}
@Override
public void saveFilePart(FilePartInfo filePartInfo) {
}
@Override
public void deleteFilePartByUploadId(String s) {
}
public static String extractDateFromUrl(String url) {
// 使用正则表达式来匹配日期部分
String regex = "/(\\d{4}/\\d{2}/\\d{2})/";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(url);
if (matcher.find()) {
return matcher.group(1);
} else {
return "Date not found";
}
}
}
package org.arch.storage.service.impl;
import cn.hutool.core.lang.Assert;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.arch.base.utils.FileUtils;
import org.arch.common.modules.base.entity.File;
import org.arch.common.modules.base.dto.DelDTO;
import org.arch.common.modules.base.dto.DownloadObjectDTO;
import org.arch.common.modules.base.vo.UpLoadVO;
import org.arch.storage.mapper.FileMapper;
import org.arch.storage.service.OssService;
import org.dromara.x.file.storage.core.Downloader;
import org.dromara.x.file.storage.core.FileInfo;
import org.dromara.x.file.storage.core.FileStorageService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
/**
* oss对象存储管理
*
* @author makejava
* @since 2023-05-04 13:29:24
*/
@Service
@Slf4j
@RequiredArgsConstructor
public class OssServiceImpl implements OssService {
private final FileMapper sysFileMapper;
private final FileStorageService fileStorageService;
/**
* oss对象存储上传
*
* @param file {@link MultipartFile}
* @return {@link UpLoadVO}
*/
@SneakyThrows
@Override
@Transactional(rollbackFor = Exception.class)
public UpLoadVO upload(MultipartFile file) {
UpLoadVO uploadFileVO = new UpLoadVO();
Assert.notNull(file, "上传文件不能为空");
FileInfo upload = fileStorageService.of(file)
.setPath(FileUtils.filePath()).upload();
Assert.notNull(uploadFileVO, "上传失败");
File saveFile = sysFileMapper.saveFile(upload, file);
uploadFileVO.setFileId(saveFile.getId());
return uploadFileVO;
}
@SneakyThrows
@Override
public void downloadObject(DownloadObjectDTO params, HttpServletResponse response) {
File file = sysFileMapper.selectById(params.getFileId());
Assert.notNull(file, "文件不存在");
Downloader download = fileStorageService.download(file.getUrl());
response.setContentType(file.getFileType());
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getFileName(), StandardCharsets.UTF_8.name()));
response.getOutputStream().write(download.bytes());
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean delObject(DelDTO dto) {
boolean flag = false;
Long fileId = dto.getFileId();
File file = sysFileMapper.selectById(fileId);
Assert.notNull(file, "文件不存在");
// 判断文件是否存在
FileInfo fileInfo = fileStorageService.getFileInfoByUrl(file.getUrl());
boolean exists = fileStorageService.exists(fileInfo);
Assert.isTrue(exists, "文件不存在");
boolean delete = fileStorageService.delete(fileInfo);
if (delete) {
// 删除文件数据表sys_file里的记录信息
int i = this.sysFileMapper.deleteById(file.getId());
if (i >= 0) {
flag = true;
}
}
return flag;
}
}
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.arch.storage.config.StoreConfiguration
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.arch</groupId>
<artifactId>arch</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>arch-gateway</artifactId>
<name>微服务网关</name>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-gateway-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.arch</groupId>
<artifactId>nacos</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--gateway依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--jwt-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
</dependency>
<!--SM4-CBC加密需要-->
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
</dependency>
<dependency>
<groupId>org.arch</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>org.arch</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package org.arch.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
/**
* Hello world!
*/
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class GatewayApp {
public static void main(String[] args) {
SpringApplication.run(GatewayApp.class, args);
}
}
package org.arch.gateway.common;
public class Constant {
/**
* redis过期时间,以秒为单位,一分钟
*/
public static final int EXRP_MINUTE = 60;
/**
* redis过期时间,以秒为单位,一小时
*/
public static final int EXRP_HOUR = 60 * 60;
/**
* redis过期时间,以秒为单位,一天
*/
public static final int EXRP_DAY = 60 * 60 * 24;
/**
* redis-key-前缀-shiro:cache:
*/
public static final String PREFIX_SHIRO_CACHE = "shiro:cache:";
/**
* 用户信息缓存
*/
public static final String USER_ACCOUNT = "user_account:";
/**
* redis-key-前缀-shiro:access_token:
*/
public static final String PREFIX_SHIRO_ACCESS_TOKEN = "shiro:access_token:";
/**
* redis-key-前缀-shiro:refresh_token:
*/
public static final String PREFIX_SHIRO_REFRESH_TOKEN = "shiro:refresh_token:";
/**
* redis-key-前缀-tkv:refresh_token:
*/
public static final String PREFIX_TKV_REFRESH_TOKEN = "tkv:refresh_token:";
/**
* JWT-account:
*/
public static final String ACCOUNT = "account";
/**
* JWT-currentTimeMillis:
*/
public static final String CURRENT_TIME_MILLIS = "currentTimeMillis";
/**
* PASSWORD_MAX_LEN
*/
public static final Integer PASSWORD_MAX_LEN = 8;
//token
public static final int RESCODE_REFTOKEN_MSG = 1006; //刷新TOKEN(有返回数据)
public static final int RESCODE_REFTOKEN = 1007; //刷新TOKEN
public static final int JWT_ERRCODE_NULL = 4000; //Token不存在
public static final int JWT_ERRCODE_EXPIRE = 4001; //Token过期
public static final int JWT_ERRCODE_FAIL = 4002; //验证不通过
//密匙
public static final String JWT_SECRET = "8677df7fc87d23u87k61c89s54312hpk";
public static final String TOKEN_ISSUER="IT4IT";
//token失效的时间,单位:秒,默认设置3天
public static final Long ACCESS_TOKEN_EXPIRE = 7*24*60*60L;
//accessToken在header中的key
public static final String ACCESS_TOKEN_HEADER_KEY = "accessToken";
//用户sessionKey前缀
public static final String USER_SESSION_KEY = "User:Session:key:";
//用户令牌前缀
public static final String JWT_TOKEN_REDIS_KEY_PREFIX = "UserAuth:JWT:Key:";
//省市区redis key,缓存7天
public static final String AREA_REDIS_KEY = "areaKey";
public static final Long AREA_REDIS_EXPEPIRE = 7*24*60*60L;
//一次最多只能两个时段
public static final Integer EVERY_TIME_MAX_TWO_TIMES = 2;
//排队受理业务人均时长,单位:分钟
public static final Integer LINE_PER_TIMES = 3;
//订单到期规定的时间不能取消订单(分钟)
public static final Integer VALID_EXPIRE_TIME = 120;
//演示系统账户
public static String DEMO_ACCOUNT = "test";
//自动去除表前缀
public static String AUTO_REOMVE_PRE = "true";
//停止计划任务
public static String STATUS_RUNNING_STOP = "stop";
//开启计划任务
public static String STATUS_RUNNING_START = "start";
//通知公告阅读状态-未读
public static String OA_NOTIFY_READ_NO = "0";
//通知公告阅读状态-已读
public static int OA_NOTIFY_READ_YES = 1;
//部门根节点id
public static Long DEPT_ROOT_ID = 0l;
//缓存方式
public static String CACHE_TYPE_REDIS ="redis";
public static String LOG_ERROR = "error";
}
package org.arch.gateway.config;
import org.springframework.util.AntPathMatcher;
import java.util.ArrayList;
import java.util.List;
/**
* 不需要登录的请求路径
*/
public class AnonFilterChainDefinitionMap {
//不需要登录的路径
public static List<String> anonUrlList = new ArrayList<>();
static{
anonUrlList.add("/project/updateFile2");
anonUrlList.add("/adsproject/updateFile2");
anonUrlList.add("/file/webDownload");
anonUrlList.add("/directoryList/getJiagoutu");
anonUrlList.add("/project/getTableDatas");//架构表/
anonUrlList.add("/psrPlan/getPsrPlansByFsrId");////插入需求
anonUrlList.add("/expose/getEquipmentList");
anonUrlList.add("/expose/getBusList");
anonUrlList.add("/expose/getRelatedList");
anonUrlList.add("/auth/isclogin");////插入需求
anonUrlList.add("/auth/login");////插入需求
anonUrlList.add("/file/upload");////插入需求
anonUrlList.add("/version/getCurrentVersion");////插入需求
// 架构元模型管理
anonUrlList.add("/architecture/vi/file/getById");
}
/**
* 验证是否不需要登录
* @param url 路径
* @return 是否需要登录
*/
public static boolean isNotPermission(String url) {
AntPathMatcher matcher = new AntPathMatcher();
for (String p : anonUrlList) {
if (matcher.match(p,url)) {
return true;
}
}
return false;
}
}
package org.arch.gateway.config;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
/**
* 把body中的数据缓存起来
* @author zg_xl920
* @create 2022-05-26 19:43
*/
@Component
public class CacheBodyGlobalFilter implements Ordered, GlobalFilter {
// public static final String CACHE_REQUEST_BODY_OBJECT_KEY = "cachedRequestBodyObject";
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
if (exchange.getRequest().getHeaders().getContentType() == null) {
return chain.filter(exchange);
} else {
return DataBufferUtils.join(exchange.getRequest().getBody())
.flatMap(dataBuffer -> {
DataBufferUtils.retain(dataBuffer);
Flux<DataBuffer> cachedFlux = Flux
.defer(() -> Flux.just(dataBuffer.slice(0, dataBuffer.readableByteCount())));
ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(
exchange.getRequest()) {
@Override
public Flux<DataBuffer> getBody() {
return cachedFlux;
}
};
//exchange.getAttributes().put(CACHE_REQUEST_BODY_OBJECT_KEY, cachedFlux);
return chain.filter(exchange.mutate().request(mutatedRequest).build());
});
}
}
@Override
public int getOrder() {
return -2;
}
}
package org.arch.gateway.config;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSONObject;
import org.arch.gateway.config.sm4jm.SM4Utils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
/**
* 国网SM4加密
*/
@Component
@ConditionalOnProperty(value = "sm4.enable", havingValue = "true")
public class ParamsSM4EncryptionFilter implements GlobalFilter, Ordered {
@Value("${sm4.CBCSecretKey}")
private String CBCSecretKey;
@Value("${sm4.CBCIV}")
private String CBCIV;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest serverHttpRequest = exchange.getRequest();
HttpMethod method = serverHttpRequest.getMethod();
String uri = serverHttpRequest.getURI().toString();
if (uri.contains("upload") || method != HttpMethod.POST) {
return chain.filter(exchange);
}
String bodyStr = serverHttpRequest.getBody().toString();
String plainParams = SM4Utils.decryptData_CBC(bodyStr, CBCSecretKey, CBCIV);
if (StrUtil.isBlank(plainParams)) {
return errorResponse(exchange, "已开启加密模式,请先加密");
}
return chain.filter(exchange);
}
private Mono<Void> errorResponse(ServerWebExchange exchange, String message) {
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.BAD_REQUEST);
response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
JSONObject json = new JSONObject();
json.put("code", 500);
json.put("msg", message);
json.put("data", "");
return response.writeWith(Mono.just(response.bufferFactory().wrap(json.toString().getBytes())));
}
@Override
public int getOrder() {
return -1;
}
}
\ No newline at end of file
package org.arch.gateway.config.fileFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.nio.charset.StandardCharsets;
/**
* 限值文件上传
*/
public class FileUploadInterceptor implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
// 检查请求是否包含文件
if (request.getHeaders().getContentType() != null
&& request.getHeaders().getContentType().includes(MediaType.MULTIPART_FORM_DATA)) {
// 文件上传拦截逻辑
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.UNAUTHORIZED);
response.getHeaders().setContentType(MediaType.TEXT_PLAIN);
return response.writeWith(Mono.just(response.bufferFactory().wrap("File upload is not allowed.".getBytes(StandardCharsets.UTF_8))));
}
// 继续过滤器链
return chain.filter(exchange);
}
}
\ No newline at end of file
package org.arch.gateway.config.fileFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Objects;
/**
* 文件上传大小限制
*/
public class FileUploadSizeLimitFilter implements GlobalFilter {
private final int maxFileSize = 100 * 1024 * 1024; // 设置最大文件大小为100MB
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
// 如果是POST请求且内容类型是multipart/form-data,则检查文件大小
if ("POST".equals(request.getMethodValue()) && request.getHeaders().getContentType().includes(MediaType.MULTIPART_FORM_DATA)) {
return DataBufferUtils.join(exchange.getRequest().getBody())
.flatMap(dataBuffer -> {
try {
// 此处可以获取文件数据,进行大小校验
// 示例仅为检查是否超出最大文件大小
long contentLength = request.getHeaders().getContentLength();
if (!Objects.isNull(contentLength) && contentLength > maxFileSize) {
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(org.springframework.http.HttpStatus.PAYLOAD_TOO_LARGE);
// 可以返回错误信息到客户端
return response.writeWith(
Mono.just(response.bufferFactory().wrap(
"File size exceeds the maximum allowed limit.".getBytes()))
);
}
} catch (Exception e) {
// 处理异常
}
return chain.filter(exchange);
});
}
return chain.filter(exchange);
}
}
\ No newline at end of file
package org.arch.gateway.config.fileFilter;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
//@Configuration
public class FilterConfig {
@Bean
public GlobalFilter fileUploadSizeLimitFilter() {
return new FileUploadSizeLimitFilter();
}
}
\ No newline at end of file
package org.arch.gateway.config.sm4jm;
class SM4Context {
public int mode;
public int[] sk;
public boolean isPadding;
public SM4Context() {
this.mode = 1;
this.isPadding = true;
this.sk = new int[32];
}
}
package org.arch.gateway.systemLog;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GatewayLog {
/**请求来源**/
private String origin;
/**访问实例*/
private String targetServer;
/**请求路径*/
private String requestPath;
/**请求方法*/
private String requestMethod;
/**协议 */
private String schema;
/**请求类型 */
private String requestContentType;
/**请求头 */
private String headers;
/**请求体*/
private String requestBody;
/**响应体*/
private String responseData;
/**请求ip*/
private String ip;
/**IP所属城市*/
private String city;
/**开始时间*/
private Long startTime;
/**结束时间*/
private Long endTime;
/**请求时间*/
private String requestTime;
/**响应时间*/
private String responseTime;
/**执行时间*/
private long executeTime;
/**路由配置*/
private String routeConfig;
/**响应状态*/
private String status;
}
server:
port: 19000
nacos:
server-addr: 192.168.0.200:18848
username: nacos
password: nacos
namespace: ${NAMESPACE:arch}
file-extension: yaml
spring:
cloud:
nacos:
config:
group: DEFAULT_GROUP
server-addr: ${nacos.server-addr}
username: ${nacos.username}
password: ${nacos.password}
namespace: ${nacos.namespace}
# 公共配置
shared-configs:
- data-id: common-redis.${nacos.file-extension}
refresh: true
- data-id: common-gateway.${nacos.file-extension}
refresh: true
discovery:
server-addr: ${nacos.server-addr}
username: ${nacos.username}
password: ${nacos.password}
namespace: ${nacos.namespace}
# 动态服务转发
gateway:
discovery:
locator:
enabled: true # 启用动态路由服务名称转发功能
lower-case-service-id: true #开启服务名称小写
# 网关全局跨域配置
globals:
cors-configurations:
'[/**]':
allowedOriginPatterns: "*"
allowedMethods: "*"
allowedHeaders: "*"
allowCredentials: true
# 解决options请求被拦截的问题
add-to-simple-url-handler-mapping: true
config:
activate:
on-profile: dev
server:
port: 19000
nacos:
server-addr: localhost:8848
username: nacos
password: nacos
namespace: ${NAMESPACE:public}
file-extension: yaml
spring:
cloud:
nacos:
config:
group: DEFAULT_GROUP
server-addr: ${nacos.server-addr}
username: ${nacos.username}
password: ${nacos.password}
namespace: ${nacos.namespace}
# 公共配置
shared-configs:
# - data-id: common-isc.${nacos.file-extension}
# refresh: true
- data-id: common-redis.${nacos.file-extension}
refresh: true
- data-id: common-gateway.${nacos.file-extension}
refresh: true
discovery:
server-addr: ${nacos.server-addr}
username: ${nacos.username}
password: ${nacos.password}
namespace: ${nacos.namespace}
# 动态服务转发
gateway:
discovery:
locator:
enabled: true # 启用动态路由服务名称转发功能
lower-case-service-id: true #开启服务名称小写
# 网关全局跨域配置
globals:
cors-configurations:
'[/**]':
allowedOriginPatterns: "*"
allowedMethods: "*"
allowedHeaders: "*"
allowCredentials: true
# 解决options请求被拦截的问题
add-to-simple-url-handler-mapping: true
server:
port: 19000
nacos:
server-addr: 192.168.0.120:18848
username: nacos
password: nacos
namespace: ${NAMESPACE:sit}
file-extension: yaml
spring:
cloud:
nacos:
config:
group: DEFAULT_GROUP
server-addr: ${nacos.server-addr}
username: ${nacos.username}
password: ${nacos.password}
namespace: ${nacos.namespace}
# 公共配置
shared-configs:
# - data-id: common-isc.${nacos.file-extension}
# refresh: true
- data-id: common-redis.${nacos.file-extension}
refresh: true
- data-id: common-gateway.${nacos.file-extension}
refresh: true
discovery:
server-addr: ${nacos.server-addr}
username: ${nacos.username}
password: ${nacos.password}
namespace: ${nacos.namespace}
# 动态服务转发
gateway:
discovery:
locator:
enabled: true # 启用动态路由服务名称转发功能
lower-case-service-id: true #开启服务名称小写
# 网关全局跨域配置
globals:
cors-configurations:
'[/**]':
allowedOriginPatterns: "*"
allowedMethods: "*"
allowedHeaders: "*"
allowCredentials: true
# 解决options请求被拦截的问题
add-to-simple-url-handler-mapping: true
config:
activate:
on-profile: sit
spring:
application:
name: arch-gateway
main:
# 解决升级 Spring Boot 2.6后,因循环引用导致启动时报错是否允许循环引用
allow-circular-references: true
servlet:
multipart:
max-file-size: 50MB
max-request-size: 100MB
profiles:
active: dev
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.arch</groupId>
<artifactId>arch</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>arch-knowledge</artifactId>
<name>知识库</name>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.arch</groupId>
<artifactId>arch</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>arch-overall</artifactId>
<name>总体架构</name>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.github.davidfantasy</groupId>
<artifactId>mybatis-plus-generator-ui</artifactId>
</dependency>
<dependency>
<groupId>org.arch</groupId>
<artifactId>office</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.arch</groupId>
<artifactId>log</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.arch</groupId>
<artifactId>nacos</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.arch</groupId>
<artifactId>filters</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.nasdanika.core</groupId>
<artifactId>mxgraph</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package org.arch.overall;
import org.dromara.x.file.storage.spring.EnableFileStorage;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableMBeanExport;
import org.springframework.jmx.support.RegistrationPolicy;
@SpringBootApplication
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
@EnableFileStorage
public class ArchOverallApp {
public static void main(String[] args) {
SpringApplication.run(ArchOverallApp.class, args);
}
}
package org.arch.overall.controller;
import io.swagger.annotations.ApiOperation;
import org.arch.base.Result;
import org.arch.log.entity.DescContent;
import org.arch.common.modules.archoverall.dto.ele.ArchiEleRelaDTO;
import org.arch.common.modules.archoverall.dto.BatchUpdateRelaDTO;
import org.arch.common.modules.archoverall.entity.ArchiEleRela;
import org.arch.overall.service.ArchiElePropertyService;
import org.arch.overall.service.ArchiEleRelaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.arch.log.annotation.OperLog;
import org.arch.log.logenum.LogOperTypeEnum;
import org.arch.log.logenum.LogTypeEnum;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("ele-rel")
public class ArchiEleRelaController {
@Autowired
private ArchiEleRelaService archiEleRelaService;
@Autowired
private ArchiElePropertyService archiElePropertyService;
@PostMapping(value = "/")
@ApiOperation(DescContent.QUERY_LIST_ELEMENT_RELATIONSHIPS)
@OperLog(value = LogOperTypeEnum.QUERY, logTypeValue = LogTypeEnum.BUSI_LOG, operDes = "获取元素关系",moduleName = "元素管理")
public Result gtArchiEleRela(@RequestBody ArchiEleRelaDTO dto) {
return Result.success(archiEleRelaService.gtArchiEleRela(dto));
}
@PostMapping("/ad-ele-rel")
@ApiOperation(value = "新增元素关系")
@OperLog(value = LogOperTypeEnum.ADD, logTypeValue = LogTypeEnum.BUSI_LOG, moduleName = "元素管理", operDes = "新增元素关系")
public Result addArchiEleRela(@RequestBody ArchiEleRela archiEleRelas) {
return Result.success(archiEleRelaService.insert(archiEleRelas));
}
@PostMapping(value = "/upd-ele-rel")
@ApiOperation(value = "修改元素关系")
@OperLog(value = LogOperTypeEnum.UPDATE, logTypeValue = LogTypeEnum.BUSI_LOG, moduleName = "元素管理", operDes = "修改元素关系")
public Result updArchiEleRela(@RequestBody ArchiEleRela archiEleRelas) {
return Result.success(archiEleRelaService.update(archiEleRelas));
}
@PostMapping(value = "/del-ele-rel")
@ApiOperation(value = "根据Id删除元素关系")
@OperLog(value = LogOperTypeEnum.ADD, logTypeValue = LogTypeEnum.BUSI_LOG, moduleName = "元素管理", operDes = "根据id删除元素关系")
public Result delArchiEleRela(@RequestBody ArchiEleRela archiEleRelas) {
return Result.success(archiEleRelaService.del(archiEleRelas));
}
@PostMapping(value = "/batchupd-ele-rel")
@ApiOperation(value = "批量发布版本")
@OperLog(value = LogOperTypeEnum.UPDATE, logTypeValue = LogTypeEnum.BUSI_LOG, moduleName = "元素管理", operDes = "批量发布版本")
public Result updateEleRelBatch(@RequestBody BatchUpdateRelaDTO requestMap) {
return Result.success(archiEleRelaService.updBatch(requestMap));
}
@ApiOperation("根据元素关系查询元素信息")
@PostMapping(value = "/qEle")
@OperLog(value = LogOperTypeEnum.QUERY, logTypeValue = LogTypeEnum.BUSI_LOG, moduleName = "元素管理",operDes="根据元素关系查询元素信息")
public Result qEle(@RequestBody ArchiEleRelaDTO dto) {
return Result.success(archiEleRelaService.findEleRelaConstrainList(dto.getEleRelaId()));
}
@ApiOperation("查询元素关系(只包含元素关系名称)")
@PostMapping(value = "/qEleRela")
@OperLog(value = LogOperTypeEnum.QUERY, logTypeValue = LogTypeEnum.BUSI_LOG, moduleName = "元素管理",operDes="询元素关系(只包含元素关系名称)")
public Result qEleRela() {
return Result.success(archiEleRelaService.findEleRelaList());
}
@ApiOperation("批量新增/修改元素")
@PostMapping(value = "/updEleBatch")
@OperLog(value = LogOperTypeEnum.ADD, logTypeValue = LogTypeEnum.BUSI_LOG, moduleName = "元素管理",operDes = "批量新增/修改元素")
public Result updEleBatch(@RequestBody List<Map<String, Object>> requestList) {
return Result.success(archiElePropertyService.updateEleRelBatch(requestList));
}
@PostMapping(value = "/rel-list")
@ApiOperation(value = "获取元素关系列表")
@OperLog(value = LogOperTypeEnum.QUERY, logTypeValue = LogTypeEnum.BUSI_LOG, moduleName = "元素管理", operDes = "获取元素关系列表")
public Result gtEleRelList(@RequestBody ArchiEleRelaDTO dto) {
return Result.success(archiEleRelaService.gtEleRelList(dto));
}
}
package org.arch.overall.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.arch.base.Result;
import org.arch.log.annotation.OperLog;
import org.arch.log.logenum.LogOperTypeEnum;
import org.arch.log.logenum.LogTypeEnum;
import org.arch.common.modules.archoverall.dto.ele.ArchiElementDTO;
import org.arch.common.modules.archoverall.dto.BatchUpdateDTO;
import org.arch.common.modules.archoverall.entity.ArchiElement;
import org.arch.overall.service.ArchiElementService;
import org.springframework.web.bind.annotation.*;
@Api(tags = {"元素管理"})
@RestController
@RequestMapping("ele")
@RequiredArgsConstructor
public class ArchiElementController {
private final ArchiElementService archiElementService;
@PostMapping(value = "/")
// @ApiOperation(DescContent.QUERY_PAGINATED_LIST_ELEMENTS)
@OperLog(value = LogOperTypeEnum.QUERY, logTypeValue = LogTypeEnum.BUSI_LOG, operDes = "获取元素信息",moduleName = "元素管理")
public Result gtArchiElement(@RequestBody ArchiElementDTO dto) {
return Result.success(archiElementService.gtArchiElement(dto));
}
@PostMapping("/ad-ele")
@ApiOperation("新增元素")
@OperLog(value = LogOperTypeEnum.ADD, logTypeValue = LogTypeEnum.BUSI_LOG, operDes = "新增元素",moduleName = "元素管理")
public Result adEle(@RequestBody ArchiElement archiElements) {
return Result.success(archiElementService.insert(archiElements));
}
@PostMapping("/upd-ele")
@ApiOperation("修改元素")
@OperLog(value = LogOperTypeEnum.UPDATE, logTypeValue = LogTypeEnum.BUSI_LOG, operDes = "更新元素",moduleName = "元素管理")
public Result updEle(@RequestBody ArchiElement archiElement) {
return Result.success(archiElementService.update(archiElement));
}
@PostMapping("/del-ele")
@ApiOperation("根据Id删除元素")
@OperLog(value = LogOperTypeEnum.DELETE, logTypeValue = LogTypeEnum.BUSI_LOG, operDes = "删除元素",moduleName = "元素管理")
public Result delEle(@RequestBody ArchiElement archiElement) {
return Result.success(archiElementService.delete(archiElement));
}
@PostMapping(value = "/updEleBatch")
@ApiOperation(value = "批量发布版本")
@OperLog(value = LogOperTypeEnum.OTHER, logTypeValue = LogTypeEnum.BUSI_LOG, operDes = "批量发布版本",moduleName = "元素管理")
public Result updEleBatch(@RequestBody BatchUpdateDTO requestMap) {
return Result.success(archiElementService.updEleBatch(requestMap));
}
@PostMapping(value = "/archi-ele-list")
@ApiOperation(value = "查询元素列表")
@OperLog(value = LogOperTypeEnum.QUERY, logTypeValue = LogTypeEnum.BUSI_LOG, operDes = "查询元素列表",moduleName = "元素管理")
public Result gtEleList(@RequestBody ArchiElement params) {
return Result.success(archiElementService.gtEle(params));
}
@PostMapping(value = "/ele-list")
@ApiOperation(value = "获取元素列表")
@OperLog(value = LogOperTypeEnum.QUERY, logTypeValue = LogTypeEnum.BUSI_LOG, operDes = "获取元素列表",moduleName = "元素管理")
public Result getEleList(@RequestBody ArchiElementDTO dto) {
return Result.success(archiElementService.gtEleList(dto));
}
}
package org.arch.overall.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.arch.base.Result;
import org.arch.common.modules.archoverall.dto.asset.ArchiAssetInfoDTO;
import org.arch.common.modules.archoverall.dto.ele.ArchiMetaModelDTO;
import org.arch.common.modules.archoverall.dto.MetaModel;
import org.arch.log.annotation.OperLog;
import org.arch.log.logenum.LogTypeEnum;
import org.arch.log.logenum.LogOperTypeEnum;
import org.arch.common.modules.archoverall.entity.ArchiMetaModel;
import org.arch.overall.service.ArchiAssetInfoService;
import org.arch.overall.service.ArchiAssetService;
import org.arch.overall.service.ArchiMetaModelService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@Api(tags = "元模型管理")
@RestController
@RequestMapping("ma-ml")
@RequiredArgsConstructor
public class ArchiMetaModelController {
private final ArchiMetaModelService archiMetaModelService;
private final ArchiAssetInfoService archiAssetInfoService;
private final ArchiAssetService archiAssetService;
@ApiOperation("新增元模型")
@PostMapping("/add")
@OperLog(value = LogOperTypeEnum.ADD, logTypeValue = LogTypeEnum.BUSI_LOG, operDes = "新增元模型",moduleName = "元模型管理")
public Result addArchiMetaModel(@RequestBody ArchiMetaModel archiMetaModels) {
return Result.success(archiMetaModelService.insert(archiMetaModels));
}
@ApiOperation("修改元模型")
@PostMapping("/updArchiMetaModel")
@OperLog(value = LogOperTypeEnum.UPDATE, logTypeValue = LogTypeEnum.BUSI_LOG, operDes = "修改元模型",moduleName = "元模型管理")
public Result updArchiMetaModel(@RequestBody ArchiMetaModel archiMetaModels) {
return Result.success(archiMetaModelService.update(archiMetaModels));
}
@ApiOperation("查询元模型列表")
@PostMapping("/")
@OperLog(value = LogOperTypeEnum.QUERY, logTypeValue = LogTypeEnum.BUSI_LOG, operDes = "查询元模型列表",moduleName = "元模型管理")
public Result gtArchiMetaModel(@RequestBody ArchiMetaModelDTO dto) {
return Result.success(archiMetaModelService.gtArchiMetaModel(dto));
}
@ApiOperation(value = "根据Id删除", notes = "根据Id删除", httpMethod = "POST")
@PostMapping(value = "/del")
@OperLog(value = LogOperTypeEnum.DELETE, logTypeValue = LogTypeEnum.BUSI_LOG, operDes = "根据Id删除",moduleName = "元模型管理")
public Result delArchiMetaModel(@RequestBody ArchiMetaModel archiMetaModels) {
return Result.success(archiMetaModelService.del(archiMetaModels));
}
@ApiOperation("根据元模型ID查询元模型")
@PostMapping("/gBMMId")
@OperLog(value = LogOperTypeEnum.QUERY, logTypeValue = LogTypeEnum.BUSI_LOG, operDes = "根据元模型ID查询元模型",moduleName = "元模型管理")
public Result gBMMId(@RequestBody ArchiMetaModelDTO dto) {
Long metaModelId = dto.getMetaModelId();
return Result.success(archiMetaModelService.findMetaModelById(metaModelId));
}
@ApiOperation("更新画布信息")
@PostMapping("/upMxGraph")
@OperLog(value = LogOperTypeEnum.UPDATE, logTypeValue = LogTypeEnum.BUSI_LOG, operDes = "更新画布信息",moduleName = "元模型管理")
public Result updateMxGraph(@RequestBody ArchiMetaModelDTO dto) {
return Result.success(archiMetaModelService.updateMxGraphModel(dto));
}
@ApiOperation("根据元模型获取结构化数据")
@PostMapping("/fdBmd")
@OperLog(value = LogOperTypeEnum.QUERY, logTypeValue = LogTypeEnum.BUSI_LOG, operDes = "根据元模型获取结构化数据",moduleName = "元模型管理")
public Result getMxCellByMetaModelId(@RequestBody MetaModel model) {
return Result.success(archiAssetService.getMxCellByMetaModelId(model.getMetaModelId()));
}
@ApiOperation("加载画布左侧元素资产列表接口")
@PostMapping(value = "/archi-asset-list")
@OperLog(value = LogOperTypeEnum.QUERY, logTypeValue = LogTypeEnum.BUSI_LOG, operDes = "加载画布左侧元素资产列表接口",moduleName = "元模型管理")
public Result getArchiAssetList(@RequestBody ArchiAssetInfoDTO params) {
return Result.success(archiMetaModelService.getArchiAssetList(params));
}
@ApiOperation("加载画布右侧清单列表")
@PostMapping("/asset-ele-list")
@OperLog(value = LogOperTypeEnum.QUERY, logTypeValue = LogTypeEnum.BUSI_LOG, operDes = "加载画布右侧清单列表",moduleName = "元模型管理")
public Result gtAssetByEleList(@RequestBody ArchiAssetInfoDTO params) {
params.setArchiStage(1);
params.setArchiAssetState(2);
params.setLimit(10L);
return Result.success(archiAssetInfoService.assetList(params));
}
@ApiOperation("加载画布左侧元素资产列表")
@PostMapping("/archi-asset-list1")
@OperLog(value = LogOperTypeEnum.QUERY, logTypeValue = LogTypeEnum.BUSI_LOG, operDes = "加载画布左侧元素资产列表",moduleName = "元模型管理")
public Result getArchiAssetList1(@RequestBody ArchiAssetInfoDTO params) {
return Result.success(archiMetaModelService.getArchiAssetList1(params));
}
@ApiOperation("加载画布左侧列表(标准图元)接口")
@PostMapping(value = "/archi-list")
@OperLog(value = LogOperTypeEnum.QUERY, logTypeValue = LogTypeEnum.BUSI_LOG, operDes = "加载画布左侧列表(标准图元)接口",moduleName = "元模型管理")
public Result getArchiList() {
Integer type = 1;
return Result.success(archiMetaModelService.getEleListLeft(type));
}
@ApiOperation("加载画布左侧列表(常规图元)接口")
@PostMapping(value = "/archi-list2")
@OperLog(value = LogOperTypeEnum.QUERY, logTypeValue = LogTypeEnum.BUSI_LOG, operDes = "加载画布左侧列表(常规图元)接口",moduleName = "元模型管理")
public Result getArchiList2() {
Integer type = 2;
return Result.success(archiMetaModelService.getEleListLeft(type));
}
}
package org.arch.overall.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.arch.base.Result;
import org.arch.common.modules.archoverall.dto.BatchRemoveDTO;
import org.arch.log.annotation.OperLog;
import org.arch.log.entity.DescContent;
import org.arch.log.logenum.LogOperTypeEnum;
import org.arch.log.logenum.LogTypeEnum;
import org.arch.common.modules.archoverall.dto.ArchiViewDTO;
import org.arch.common.modules.archoverall.entity.ArchiView;
import org.arch.overall.service.ArchiViewService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 架构视图
*
* @author lizhen
* @date 2024/05/22
*/
@Api(value = "/archi-vw", tags = {"架构视图"})
@RestController
@RequestMapping("archi-vw")
@RequiredArgsConstructor
public class ArchiViewController {
private final ArchiViewService archiViewService;
@PostMapping(value = "/")
@ApiOperation(DescContent.QUERY_LIST_VIEWS)
@OperLog(value = LogOperTypeEnum.QUERY, logTypeValue = LogTypeEnum.BUSI_LOG, moduleName = "架构视图设计", operDes = "架构视图设计查询")
public Result gtArchiView(@RequestBody ArchiViewDTO dto) {
return Result.success(archiViewService.gtArchiView(dto, PageDTO.of(dto.getCurrent(), dto.getPageSize())));
}
@PostMapping("/ad-archi-vw")
@ApiOperation(value = "新增架构视图")
@OperLog(value = LogOperTypeEnum.ADD, logTypeValue = LogTypeEnum.BUSI_LOG,moduleName = "架构视图设计", operDes = "新增架构视图")
public Result adArchiView(@RequestBody ArchiView vwDiss) {
return Result.success(archiViewService.insert(vwDiss));
}
@PostMapping(value = "/upd-archi-vw")
@ApiOperation(value = "修改视图配置")
@OperLog(value = LogOperTypeEnum.UPDATE, logTypeValue = LogTypeEnum.BUSI_LOG,moduleName = "架构视图设计", operDes = "修改视图配置")
public Result updArchiView(@RequestBody ArchiView vwDiss) {
return Result.success(archiViewService.update(vwDiss));
}
@PostMapping(value = "/del-vw")
@ApiOperation("根据Id删除视图")
@OperLog(value = LogOperTypeEnum.DELETE, logTypeValue = LogTypeEnum.BUSI_LOG,moduleName = "架构视图设计", operDes = "根据Id删除视图")
public Result delArchiView(@RequestBody ArchiView vwDis) {
return archiViewService.delArchiView(vwDis) ? Result.success("删除成功") : Result.error("删除失败");
}
@PostMapping(value = "/batchupd-vw")
@ApiOperation(value = "批量发布版本", notes = "批量发布版本")
@OperLog(value = LogOperTypeEnum.OTHER, logTypeValue = LogTypeEnum.BUSI_LOG,moduleName = "架构视图设计", operDes = "架构视图设计批量发布")
public Result updateVwDisBatch(@RequestBody @Validated BatchRemoveDTO requestMap) {
return Result.success(archiViewService.updEleBatch(requestMap));
}
}
package org.arch.overall.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.arch.common.modules.archoverall.dto.ability.ArchiAbilityInventoryDataDTO;
import org.arch.common.modules.archoverall.dto.asset.ArchiAssetsRelationQueryDTO;
import org.arch.common.modules.archoverall.vo.ArchiAbilityAssetsRelationQueryVO;
import org.arch.common.modules.archoverall.entity.ArchiAbilityAssetsRelation;
import java.util.List;
/**
* 中台服务清单关联资产(资产关联,中台架构服务,其他四大架构资产)(ArchiAbilityAssetsRelation)表数据库访问层
*
* @author makejava
* @since 2024-04-29 14:27:33
*/
public interface ArchiAbilityAssetsRelationMapper extends BaseMapper<ArchiAbilityAssetsRelation> {
void addBach(@Param("entities") List<ArchiAbilityAssetsRelation> assetsList);
/**
* 批量删除
*
* @param assetsList 资产清单
* @return {@link Boolean }
*/
Boolean removeBatchIds(@Param("list") List<Long> assetsList);
IPage<ArchiAbilityAssetsRelation> qryDataListPage(@Param("dto") ArchiAbilityInventoryDataDTO params, Page<ArchiAbilityAssetsRelation> page);
/**
* 查询资产关系
*
* @param params 参数
* @return {@link IPage }<{@link ArchiAbilityAssetsRelationQueryVO }>
*/
IPage<ArchiAbilityAssetsRelationQueryVO> queryAssetRelation(@Param("params") ArchiAssetsRelationQueryDTO params, Page<ArchiAssetsRelationQueryDTO> page);
/**
* 查询资产关系
*
* @param params 参数
* @return {@link IPage }<{@link ArchiAbilityAssetsRelationQueryVO }>
*/
ArchiAbilityAssetsRelationQueryVO queryAssetRelation(@Param("params") ArchiAssetsRelationQueryDTO params);
/**
* 资产关系数量
*
* @param assetRelaId 资产关系ID
* @return {@link Long }
*/
Long queryAssetRelationCountByTypeId(long assetRelaId);
}
package org.arch.overall.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.arch.common.modules.archoverall.dto.asset.ArchiAssetInfoDTO;
import org.arch.common.modules.archoverall.dto.NeedInfoDTO;
import org.arch.common.modules.archoverall.dto.OnlineReviewCountQueryDTO;
import org.arch.common.modules.archoverall.dto.OnlineReviewWriteDTO;
import org.arch.common.modules.archoverall.vo.NeedReviewVo;
import org.arch.common.modules.archoverall.vo.OnlineReviewCountVO;
import org.arch.common.modules.archoverall.entity.AssetInfo;
import org.arch.common.modules.archoverall.entity.OnlineReviewWrite;
import java.util.List;
public interface ArchiAssertMapper extends BaseMapper<AssetInfo> {
List<AssetInfo> maxVer(ArchiAssetInfoDTO params);
IPage<NeedReviewVo> qyNeedReview(@Param("page") Page<Object> page, @Param("nigr") NeedInfoDTO nigr);
IPage<OnlineReviewWrite> qyOnlineReview(@Param("onl") OnlineReviewWriteDTO params, @Param("page") Page<OnlineReviewWrite> page);
List<OnlineReviewWrite> qyOnlineReview(@Param("onl") OnlineReviewWriteDTO params);
/**
* 概设关联业务管理-概设统计分析-各单位概设统计
*/
IPage<OnlineReviewCountVO> qyneedCount(@Param("orcy") OnlineReviewCountQueryDTO params, @Param("page") Page<OnlineReviewCountVO> page);
List<OnlineReviewCountVO> qyreviewPassCount(@Param("orcy") OnlineReviewCountQueryDTO params);
IPage<OnlineReviewCountVO> qybatNeedCount(@Param("orqy") OnlineReviewCountQueryDTO params, @Param("page") Page<OnlineReviewCountVO> page);
List<OnlineReviewCountVO> qybatReviewPassCount(@Param("orqy") OnlineReviewCountQueryDTO params);
}
\ No newline at end of file
package org.arch.overall.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.arch.common.modules.archoverall.entity.ArchiAssetAppPrj;
/**
* <p>
* 系统项目资产关联表 Mapper 接口
* </p>
*
* @author java
* @since 2024-02-28
*/
public interface ArchiAssetAppPrjMapper extends BaseMapper<ArchiAssetAppPrj> {
}
package org.arch.overall.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.base.MPJBaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.arch.common.modules.archoverall.dto.asset.ArchiAssetInfoDTO;
import org.arch.common.modules.archoverall.entity.AssetInfo;
import org.arch.common.modules.archoverall.dto.WordContentDTO;
import java.util.List;
import java.util.Map;
/**
* <p>
* 业务架构 Mapper 接口
* </p>
*
* @author author
* @since 2024-01-09
*/
@Mapper
public interface ArchiAssetInfoMapper extends MPJBaseMapper<AssetInfo> {
@Select("select (SELECT CONCAT((SELECT REPLACE((select date_format(now(), '%Y-%m-%d')),CHAR(45),'')),'-V',(SELECT (select date_format(now(), '%Y')) - 2023 +1),'.',(select date_format(now(), '%m')),'.','1'))\r\n" +
" as version")
String selectVer();
/**
* 分页列表查询
*
* @param params 参数
* @param page 页
* @return {@link IPage}<{@link AssetInfo}>
*/
IPage<AssetInfo> query(@Param("params") ArchiAssetInfoDTO params, Page<AssetInfo> page);
/**
* 列表查询
*
* @param params 参数
* @return {@link List }<{@link AssetInfo }>
*/
List<AssetInfo> query(@Param("params") ArchiAssetInfoDTO params);
/**
* 架构资产信息详情
*
* @param assetId 资产 ID
* @return {@link AssetInfo}
*/
AssetInfo info(Long assetId);
/**
* 自动生成编号
* @param superiorAssetCode 上级编码
* @param rchiType 架构类型
* @param num 级别层次
* @return
*/
Integer getArchiAssetMaxNum(@Param("rchiType")String rchiType,
@Param("superiorAssetCode")String superiorAssetCode,
@Param("num")int num,
@Param("archiStage") String archiStage);
/**
* @param params 查询
* @return
*/
Map<String,String> searhByKeyword(@Param("params") WordContentDTO params);
}
package org.arch.overall.mapper;
import com.github.yulichang.base.MPJBaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.arch.common.modules.archoverall.entity.ArchiAssetSystem;
/**
* <p>
* 架构版本 Mapper 接口
* </p>
*
* @author author
* @since 2024-01-16
*/
@Mapper
public interface ArchiAssetSystemMapper extends MPJBaseMapper<ArchiAssetSystem> {
}
package org.arch.overall.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.arch.common.modules.archoverall.entity.ArchiEleProperty;
import java.util.List;
public interface ArchiElePropertyMapper extends BaseMapper<ArchiEleProperty> {
List<ArchiEleProperty> gtArchiElePropertyList(@Param("yp") ArchiEleProperty ynMolProyls);
}
package org.arch.overall.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.arch.common.modules.archoverall.vo.ArchiEleRelaVO;
import org.arch.common.modules.archoverall.entity.ArchiEleRelaConstrain;
import java.util.List;
public interface ArchiEleRelaConstrainMapper extends BaseMapper<ArchiEleRelaConstrain> {
/**
* 批量添加
*/
void batchInsert(List<ArchiEleRelaConstrain> list);
/**
* 根据元素关系,删除元素关系
*
* @param eleRelaId 元素关系 ID
*/
void delByRelaId(Long eleRelaId);
/**
* 根据元素关系编码查询约束条件
*
* @param eleRelaId 元素关系ID
* @return {@link List}<{@link ArchiEleRelaConstrain}>
*/
List<ArchiEleRelaConstrain> getArchiEleRelaConstraint(Long eleRelaId);
/**
* 根据元素关系ID查询元素关系
* 元素带属性
*
* @param constrainId 约束 ID
* @return {@link List}<{@link ArchiEleRelaVO}>
*/
List<ArchiEleRelaVO> findEleRelaConstrainList(Long constrainId);
}
\ No newline at end of file
package org.arch.overall.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.arch.common.modules.archoverall.dto.ele.ArchiEleRelaDTO;
import org.arch.common.modules.archoverall.vo.ArchiEleRelaNameVO;
import org.arch.common.modules.archoverall.entity.ArchiEleRela;
import java.util.List;
public interface ArchiEleRelaMapper extends BaseMapper<ArchiEleRela> {
/**
* 分页
*
* @param dto 参数
* @param page 页
* @return {@link IPage }<{@link ArchiEleRela }>
*/
IPage<ArchiEleRela> gtArchiEleRela(@Param("dto") ArchiEleRelaDTO dto, Page<Object> page);
/**
* 列表
*
* @param dto DTO
* @return {@link List }<{@link ArchiEleRela }>
*/
List<ArchiEleRela> gtEleRelList(@Param("dto") ArchiEleRelaDTO dto);
/**
* 查询资产关系
*
*/
List<ArchiEleRelaNameVO> findEleRelaList();
/**
* 获取版本
*
* @param eleRelaId 元素关系 ID
* @return {@link String }
*/
String getVersion(@Param("eleRelaId") Long eleRelaId);
}
package org.arch.overall.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.base.MPJBaseMapper;
import org.apache.ibatis.annotations.Param;
import org.arch.common.modules.archoverall.dto.ele.ArchiElementDTO;
import org.arch.common.modules.archoverall.entity.ArchiElement;
import java.util.List;
public interface ArchiElementMapper extends MPJBaseMapper<ArchiElement> {
/**
* 初始化版本
*
* @return {@link List }<{@link ArchiElement }>
*/
List<ArchiElement> initVersion();
/**
* 获取版本
*
* @return {@link List }<{@link ArchiElement }>
*/
String getVersion(@Param("elementId") Long elementId);
/**
* 元素列表
*
* @param dto DTO
* @param page 页
* @return {@link IPage }<{@link ArchiElement }>
*/
IPage<ArchiElement> gtArchiElement(@Param("dto") ArchiElementDTO dto, Page<Object> page);
/**
* 根据元素名称查询元素
*
* @param archiElements Archi 元素
* @return {@link List }<{@link ArchiElement }>
*/
List<ArchiElement> gtArcEleByName(@Param("do") ArchiElement archiElements);
/**
* 获取元素列表
*
* @param dto DTO
* @return {@link List }<{@link ArchiElement }>
*/
List<ArchiElement> gtEleList(@Param("dto") ArchiElementDTO dto);
List<ArchiElement> maxVer(ArchiElement archiElement);
/**
* 根据视图配置查询架构元素
*
* @return {@link List }<{@link ArchiElement }>
*/
List<ArchiElement> queryEleByAssertView(Long viewId);
}
package org.arch.overall.mapper;
import com.github.yulichang.base.MPJBaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.arch.common.modules.archoverall.entity.ArchiElementNestRelation;
/**
* <p>
* 需求管理信息 Mapper 接口
* </p>
*
* @author java
* @since 2024-03-05
*/
@Mapper
public interface ArchiElementNestRelationMapper extends MPJBaseMapper<ArchiElementNestRelation> {
}
package org.arch.overall.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.base.MPJBaseMapper;
import org.apache.ibatis.annotations.Param;
import org.arch.common.modules.archoverall.dto.ele.ArchiMetaModelDTO;
import org.arch.common.modules.archoverall.entity.ArchiMetaModel;
import java.util.List;
public interface ArchiMetaModelMapper extends MPJBaseMapper<ArchiMetaModel> {
List<ArchiMetaModel> selectVer();
/**
* 元模型列表
*
* @param dto DTO
* @param page 页
* @return {@link IPage }<{@link ArchiMetaModel }>
*/
IPage<ArchiMetaModel> getYnMol(@Param("dto") ArchiMetaModelDTO dto, Page<Object> page);
/**
* 更新 MX 图形模型
*
* @param metaModelId 元模型 ID
* @param graphId 图形 ID
* @return {@link Boolean}
*/
Boolean updateMxGraphModel(@Param("metaModelId") Long metaModelId, @Param("graphId") Long graphId);
/**
* 根据元模型id获取mxCell
*
* @param metaModelId 元模型id
* @return {@link String}
*/
String getMxCellByMetaModelId(Long metaModelId);
/**
* 查询架构原模型
*
* @param id 同上
* @return {@link ArchiMetaModel}
*/
ArchiMetaModel findMetaModelById(Long id);
}
package org.arch.overall.mapper;
import com.github.yulichang.base.MPJBaseMapper;
import org.arch.common.modules.archoverall.entity.ArchiModelDictDetail;
/**
* <p>
* 元模型数据字典详情 Mapper 接口
* </p>
*
* @author
* @since 2024-02-22
*/
public interface ArchiModelDictDetailMapper extends MPJBaseMapper<ArchiModelDictDetail> {
}
package org.arch.overall.mapper;
import com.github.yulichang.base.MPJBaseMapper;
import org.arch.common.modules.archoverall.entity.ArchiModelDict;
/**
* <p>
* 元模型数据字典 Mapper 接口
* </p>
*
* @author
* @since 2024-02-22
*/
public interface ArchiModelDictMapper extends MPJBaseMapper<ArchiModelDict> {
}
package org.arch.overall.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.arch.common.modules.archoverall.dto.asset.ArchiAssetDTO;
import org.arch.common.modules.archoverall.dto.design.ArchiViewDTO;
import org.arch.common.modules.archoverall.vo.ArchiAssetVO;
import org.arch.common.modules.archoverall.vo.ArchiVersionVO;
import org.arch.common.modules.archoverall.vo.ArchiViewVO;
import java.util.List;
@Mapper
public interface ArchiTotalAssetMapper extends BaseMapper {
/**
* 总体架构资产自动图形化
*
* @param model 参数
* @return {@link List}<{@link ArchiAssetVO}>
*/
List<ArchiAssetVO> automaticGraphing(ArchiAssetDTO model);
/**
* 总体架构资产智能搜索
*
* @param model 参数
* @return {@link List}<{@link ArchiAssetVO}>
*/
List<ArchiAssetVO> treeList(ArchiAssetDTO model);
/**
* 总体架构可视化展示
*
* @param model 参数
* @return {@link List}<{@link ArchiAssetVO}>
*/
List<ArchiAssetVO> treeListView(ArchiAssetDTO model);
/**
* 查询视图
*
* @param params 参数
* @return {@link List}<{@link ArchiViewVO}>
*/
List<ArchiViewVO> queryView(ArchiViewDTO params);
/**
* 查询架构版本
*
* @param params 参数
* @return {@link List}<{@link ArchiVersionVO}>
*/
List<ArchiVersionVO> queryArchiVersion(ArchiVersionVO params);
/**
* 根据元素查询对应的资产
*
* @param elementId 元素 ID
* @return {@link List }<{@link ArchiAssetVO }>
*/
List<ArchiAssetVO> findAssertByElementId(@Param("elementId") Long elementId);
}
\ No newline at end of file
package org.arch.overall.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.arch.common.modules.archoverall.entity.ArchiViewEle;
public interface ArchiViewEleMapper extends BaseMapper<ArchiViewEle> {
}
package org.arch.overall.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.arch.common.modules.archoverall.entity.ArchiView;
import java.util.List;
public interface ArchiViewMapper extends BaseMapper<ArchiView> {
@Select("select (SELECT CONCAT((SELECT REPLACE((select date_format(now(), '%Y-%m-%d')),CHAR(45),'')),'-V',(SELECT (select date_format(now(), '%Y')) - 2023 +1),'.',(select date_format(now(), '%m')),'.','1')) as version")
List<ArchiView> selectVer();
List<ArchiView> maxVer(ArchiView vwDiss);
/**
* 获取版本
*
* @param id id
* @return {@link List }<{@link ArchiElement }>
*/
String getVersion(@Param("id") Long id);
}
package org.arch.overall.mapper;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.arch.base.utils.Constant;
import org.arch.common.modules.archoverall.entity.GraphRepository;
public interface GraphRepositoryMapper extends BaseMapper<GraphRepository> {
/**
* 初始化架构视图
*
* @return {@link Long }
*/
default Long initArchiView() {
GraphRepository repository = new GraphRepository();
repository.setGraphCode(IdUtil.fastUUID());
repository.setContent(Constant.MX_MODEL_GRAPH);
repository.setGraphType(Constant.ARCHI_VIEW_DATA);
insert(repository);
return repository.getGraphId();
}
/**
* 初始化原模型
*
* @return {@link Long }
*/
default Long initArchiModel() {
GraphRepository repository = new GraphRepository();
repository.setGraphCode(IdUtil.fastUUID());
repository.setContent(Constant.MX_MODEL_GRAPH);
repository.setGraphType(Constant.META_MODEL_DATA);
insert(repository);
return repository.getGraphId();
}
}
\ No newline at end of file
package org.arch.overall.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.arch.common.modules.archoverall.dto.asset.ArchiAssetInfoDTO;
import org.arch.common.modules.archoverall.dto.asset.ArchiAssetVisalDTO;
import org.arch.common.modules.archoverall.dto.DelDTO;
import org.arch.common.modules.archoverall.vo.ArchVisualVO;
import org.arch.common.modules.archoverall.dto.ArchiDto;
import org.arch.common.modules.archoverall.entity.ArchiElementNestRelation;
import org.arch.common.modules.archoverall.entity.AssetInfo;
import java.util.List;
import java.util.Map;
/**
* <p>
* 资产架构 服务类
* </p>
*
* @author author
* @since 2024-01-09
*/
public interface ArchiAssetInfoService extends IService<AssetInfo> {
/**
* 资产分页
*
* @param params 参数
* @return {@link IPage }<{@link AssetInfo }>
*/
IPage<AssetInfo> iPage(ArchiAssetInfoDTO params);
/**
* 资产列表
*
* @param params 参数
* @return {@link List }<{@link AssetInfo }>
*/
List<AssetInfo> assetList(ArchiAssetInfoDTO params);
Boolean inster(ArchiAssetInfoDTO params);
/**
* 架构资产信息详情
*
* @param assetId 资产 ID
* @return {@link AssetInfo}
*/
AssetInfo info(Long assetId);
Boolean update(ArchiAssetInfoDTO params);
/**
* 批量删除
*
* @param requestMap 参数
* @return {@link Boolean }
*/
Boolean delBatch(DelDTO requestMap);
String selectVer();
List<AssetInfo> qryTree(ArchiDto frameworkDto);
List<ArchiElementNestRelation> qyLastEle(ArchiAssetInfoDTO params);
Map<ArchiAssetInfoDTO, List<ArchiAssetInfoDTO>> getArchVisual(ArchVisualVO archVisualVO);
List<Map<String, Object>> getAssetVisalFirst(ArchiAssetVisalDTO archiAssetVisalDTO);
}
package org.arch.overall.service;
import cn.hutool.core.lang.tree.Tree;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.arch.common.modules.archoverall.dto.*;
import org.arch.common.modules.archoverall.dto.asset.ArchiAssetDTO;
import org.arch.common.modules.archoverall.dto.asset.ArchiAssetInfoDTO;
import org.arch.common.modules.archoverall.dto.asset.ArchiAssetsRelationDTO;
import org.arch.common.modules.archoverall.dto.asset.ArchiAssetsRelationQueryDTO;
import org.arch.common.modules.archoverall.vo.ArchiAbilityAssetsRelationQueryVO;
import org.arch.common.modules.archoverall.vo.ArchiAssetVO;
import org.arch.common.modules.archoverall.vo.ArchiVersionVO;
import org.arch.common.modules.archoverall.vo.MxCellVO;
import org.arch.common.modules.archoverall.entity.AssetInfo;
import java.util.List;
/**
* 资产服务
*
* @author admin
* @date 2024/01/24
*/
public interface ArchiAssetService {
/**
* 总体架构资产自动图形化
*
* @param model 参数
* @return {@link List}<{@link ArchiAssetVO}>
*/
List<Tree<String>> automaticGraphing(ArchiAssetDTO model);
/**
* 总体架构资产智能搜索
*
* @param model 参数
* @return {@link List}<{@link ArchiAssetVO}>
*/
List<ArchiAssetVO> treeList(ArchiAssetDTO model);
/**
* 根据元素查询对应的资产
*
* @param elementId 元素 ID
* @return {@link List }<{@link ArchiAssetVO }>
*/
List<ArchiAssetVO> findAssertByElementId(Long elementId);
/**
* 总体架构可视化展示
*
* @param model 参数
* @return {@link List}<{@link ArchiAssetVO}>
*/
List<ArchiAssetVO> treeListView(ArchiAssetDTO model);
/**
* 根据元模型id获取mxCell
*
* @param metaModelId 元模型id
*/
List<MxCellVO> getMxCellByMetaModelId(Long metaModelId);
/**
* 架构资产版本
*
* @param params 参数
* @return {@link List}<{@link ArchiVersionVO}>
*/
List<ArchiVersionVO> queryArchiVersion(ArchiVersionVO params);
//------------------------------------资产关系------------------------------------
/**
* 添加资产关系
*
* @param params 参数
* @return {@link Boolean }
*/
Boolean addAssetRelation(ArchiAssetsRelationDTO params);
/**
* 修改资产
*
* @param params 参数
* @return {@link Boolean }
*/
Boolean updateAssetRelation(ArchiAssetsRelationDTO params);
/**
* 删除资产关系
*
* @param dto DTO
* @return {@link Boolean }
*/
Boolean del(BatchRemoveDTO dto);
/**
* 发布/停用
*
* @param dto DTO
* @return {@link Boolean }
*/
Boolean post(ArchiRelaSatePostDTO dto);
/**
* 查询资产关系
*
* @param params 参数
* @return {@link IPage }<{@link ArchiAbilityAssetsRelationQueryVO }>
*/
IPage<ArchiAbilityAssetsRelationQueryVO> queryAssetRelation(ArchiAssetsRelationQueryDTO params);
/**
* 查询资产关系详情
*
* @param params 参数
* @return {@link List}<{@link ArchiAbilityAssetsRelationQueryVO}>
*/
ArchiAbilityAssetsRelationQueryVO queryAssetRelationDetail(ArchiAssetsRelationQueryDTO params);
/**
* 最大版本
*
* @param params 参数
* @return {@link List }<{@link AssetInfo }>
*/
List<AssetInfo> maxVer(ArchiAssetInfoDTO params);
}
package org.arch.overall.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.arch.common.modules.archoverall.dto.asset.ArchiAssetInfoDTO;
import org.arch.common.modules.archoverall.dto.DelDTO;
import org.arch.common.modules.archoverall.entity.AssetInfo;
import org.arch.common.modules.archoverall.vo.AssetInfoLevelVO;
import java.util.List;
/**
* <p>
* 资产架构 服务类
* </p>
*
* @author author
* @since 2024-01-09
*/
public interface ArchiAssetSysService extends IService<AssetInfo> {
/**
* 分页查询
*
* @param params 参数
* @return {@link IPage }<{@link AssetInfo }>
*/
IPage<AssetInfo> iPage(ArchiAssetInfoDTO params);
/**
* 列表查询
*
* @param params 参数
* @return {@link List }<{@link AssetInfo }>
*/
List<AssetInfo> assetList(ArchiAssetInfoDTO params);
Boolean inster(ArchiAssetInfoDTO params);
Boolean update(ArchiAssetInfoDTO params);
/**
* 批量删除
*
* @param params 参数
*/
Boolean delBatch(DelDTO params);
Boolean extend(ArchiAssetInfoDTO params);
List<AssetInfoLevelVO> assetInfoLevel(ArchiAssetInfoDTO params);
/**
* 停用
*
* @param params 参数
* @return {@link Boolean }
*/
Boolean stop(ArchiAssetInfoDTO params);
}
package org.arch.overall.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.arch.common.modules.archoverall.entity.ArchiEleProperty;
import java.util.List;
import java.util.Map;
public interface ArchiElePropertyService extends IService<ArchiEleProperty>{
List<ArchiEleProperty> gtArchiElePropertyList(ArchiEleProperty ynMolProyls);
/**
* 批量修改属性
*
* @param requestList 请求列表
* @return {@link Boolean }
*/
Boolean updateEleRelBatch(List<Map<String, Object>> requestList);
}
package org.arch.overall.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.arch.common.modules.archoverall.dto.ele.ArchiEleRelaConstrainDTO;
import org.arch.common.modules.archoverall.dto.ele.ArchiEleRelaDTO;
import org.arch.common.modules.archoverall.dto.BatchUpdateRelaDTO;
import org.arch.common.modules.archoverall.vo.ArchiEleRelaNameVO;
import org.arch.common.modules.archoverall.vo.ArchiEleRelaVO;
import org.arch.common.modules.archoverall.entity.ArchiEleRela;
import java.util.List;
public interface ArchiEleRelaService extends IService<ArchiEleRela> {
/**
* 分页查询元素关系
*
* @param dto DTO
* @return {@link IPage }<{@link ArchiEleRela }>
*/
IPage<ArchiEleRela> gtArchiEleRela(ArchiEleRelaDTO dto);
/**
* 列表
*
* @param dto DTO
* @return {@link List }<{@link ArchiEleRela }>
*/
List<ArchiEleRela> gtEleRelList(ArchiEleRelaDTO dto);
/**
* 根据元素关系编码查询约束条件
*
* @param eleRelaId 元素关系ID
*/
List<ArchiEleRelaConstrainDTO> getArchiEleRelaConstraint(Long eleRelaId);
/**
* 根据元素关系ID查询元素关系
* 元素带属性
*
* @param constrainId 约束 ID
* @return {@link List}<{@link ArchiEleRelaVO}>
*/
List<ArchiEleRelaVO> findEleRelaConstrainList(Long constrainId);
/**
* 查询资产关系
*
* @return {@link List}<{@link ArchiEleRelaVO}>
*/
List<ArchiEleRelaNameVO> findEleRelaList();
/**
* 批量发布
*
* @param requestMap 参数
* @return {@link Boolean }
*/
Boolean updBatch(BatchUpdateRelaDTO requestMap);
/**
* 删除
*
* @param params 参数
* @return {@link Boolean }
*/
Boolean del(ArchiEleRela params);
/**
* 插入
*
* @param params 参数
* @return {@link Boolean }
*/
Boolean insert(ArchiEleRela params);
/**
* 更新
*
* @param params 参数
* @return {@link Boolean }
*/
Boolean update(ArchiEleRela params);
/**
* 批量新增元素和元素关系
*
* @param archiEleRelas 对象
*/
void addArchiEleRelaConstraint(ArchiEleRela archiEleRelas);
}
package org.arch.overall.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.arch.common.modules.archoverall.dto.ele.ArchiElementDTO;
import org.arch.common.modules.archoverall.dto.BatchUpdateDTO;
import org.arch.common.modules.archoverall.entity.ArchiEleProperty;
import org.arch.common.modules.archoverall.entity.ArchiElement;
import java.util.List;
public interface ArchiElementService extends IService<ArchiElement> {
/**
* 元素列表
*
* @param dto DTO
* @return {@link IPage }<{@link ArchiElement }>
*/
IPage<ArchiElement> gtArchiElement(ArchiElementDTO dto);
/**
* 新增元素
*
* @param params 参数
* @return {@link Boolean }
*/
Boolean insert(ArchiElement params);
/**
* 更新
*
* @param archiElement Archi 元素
* @return {@link Boolean }
*/
Boolean update(ArchiElement archiElement);
/**
* 删除
*
* @param archiElement Archi 元素
* @return {@link Boolean }
*/
Boolean delete(ArchiElement archiElement);
/**
* 批量发布
*
* @param requestMap 参数
* @return {@link Boolean }
*/
Boolean updEleBatch(BatchUpdateDTO requestMap);
/**
* 元素列表
*
* @param dto DTO
* @return {@link List }<{@link ArchiElement }>
*/
List<ArchiElement> gtEleList(ArchiElementDTO dto);
/**
* 查找元模型属性
*
* @param type 类型
* @param idList ID 列表
* @return {@link List }<{@link ArchiEleProperty }>
*/
List<ArchiEleProperty> findMetaModelProperties(int type, List<Long> idList);
/**
* 查询元素列表
*
* @param params 参数
* @return {@link List }<{@link ArchiElement }>
*/
List<ArchiElement> gtEle(ArchiElement params);
}
package org.arch.overall.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.arch.common.modules.archoverall.dto.asset.ArchiAssetInfoDTO;
import org.arch.common.modules.archoverall.dto.ArchiListResultDTO;
import org.arch.common.modules.archoverall.dto.ele.ArchiMetaModelDTO;
import org.arch.common.modules.archoverall.entity.ArchiMetaModel;
import java.util.List;
public interface ArchiMetaModelService extends IService<ArchiMetaModel> {
/**
* 删除
*
* @param archiMetaModels Archi 元模型
* @return {@link Boolean }
*/
Boolean del(ArchiMetaModel archiMetaModels);
List<ArchiMetaModel> selectVer();
/**
* 插入
*
* @param dto DTO
* @return {@link Boolean }
*/
Long insert(ArchiMetaModel dto);
/**
* 更新
*
* @return {@link Boolean }
*/
Boolean update(ArchiMetaModel dto);
/**
* 更新 MX 图形模型
*
* @param dto DTO
* @return int
*/
Boolean updateMxGraphModel(ArchiMetaModelDTO dto);
/**
* 查询架构原模型
*
* @param id 同上
* @return {@link ArchiMetaModel}
*/
ArchiMetaModel findMetaModelById(Long id);
/**
* 获取画布左侧资产列表
*
* @param params 参数
* @return {@link ArchiListResultDTO }
*/
ArchiListResultDTO getArchiAssetList(ArchiAssetInfoDTO params);
/**
* 分页列表
*
* @param dto DTO
* @return {@link IPage }<{@link ArchiMetaModel }>
*/
IPage<ArchiMetaModel> gtArchiMetaModel(ArchiMetaModelDTO dto);
/**
* 获取画布左侧资产列表
*
* @param params 参数
* @return {@link ArchiListResultDTO }
*/
ArchiListResultDTO getArchiAssetList1(ArchiAssetInfoDTO params);
/**
* 获取画布左侧标准元素列表
*
* @param type 类型 1:常规图元 2:标准图元
* @return {@link ArchiListResultDTO }
*/
ArchiListResultDTO getEleListLeft(Integer type);
}
package org.arch.overall.service;
import org.arch.common.modules.archoverall.vo.ArchiModelDictVO;
import org.arch.common.modules.archoverall.entity.ArchiModelDict;
import org.mapstruct.Mapper;
/**
* <p>
*
* </p>
*
* @author makejava
* @since 2023-12-25
*/
@Mapper(componentModel = "spring")
public interface ArchiModelDictCovert {
ArchiModelDictVO convertToVO(ArchiModelDict archiModelDict);
}
package org.arch.overall.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.arch.common.modules.archoverall.dto.ele.ArchiModelDictDetailDTO;
import org.arch.common.modules.archoverall.vo.ArchiModelDictDetailVO;
import org.arch.common.modules.base.dto.BathRemoveDTO;
import org.arch.common.modules.archoverall.entity.ArchiModelDict;
import org.arch.common.modules.archoverall.entity.ArchiModelDictDetail;
import java.util.List;
/**
* <p>
* 元模型数据字典详情 服务类
* </p>
*
* @author
* @since 2024-02-22
*/
public interface ArchiModelDictDetailService extends IService<ArchiModelDictDetail> {
Boolean insert(List<ArchiModelDictDetailDTO> dto);
Boolean update(ArchiModelDictDetailDTO dto);
Boolean del(BathRemoveDTO dto);
List<ArchiModelDictDetailVO> getDictDetails(String key);
List<ArchiModelDict> getAllDict();
}
package org.arch.overall.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.arch.common.modules.archoverall.dto.ele.ArchiModelDictDTO;
import org.arch.common.modules.archoverall.vo.ArchiModelDictDetailVO;
import org.arch.common.modules.archoverall.vo.ArchiModelDictVO;
import org.arch.common.modules.base.dto.BathRemoveDTO;
import org.arch.common.modules.archoverall.entity.ArchiModelDict;
import java.util.List;
/**
* <p>
* 元模型数据字典 服务类
* </p>
*
* @author
* @since 2024-02-22
*/
public interface ArchiModelDictService extends IService<ArchiModelDict> {
IPage<ArchiModelDictVO> page(ArchiModelDictDTO dto);
Boolean insert(ArchiModelDictDTO dto);
Boolean update(ArchiModelDictDTO dto);
ArchiModelDictVO detail(ArchiModelDictDTO dto);
Boolean post(ArchiModelDictDTO dto);
Boolean del(BathRemoveDTO dto);
/**
* 获取元模型字典详情
*
* @param value 字典值
* @return {@link List }<{@link ArchiModelDictDetailVO }>
*/
List<ArchiModelDictDetailVO> getDictDetails(String value);
}
package org.arch.overall.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.arch.common.modules.archoverall.entity.ArchiView;
import org.arch.common.modules.archoverall.entity.ArchiViewEle;
import org.jetbrains.annotations.NotNull;
import org.springframework.transaction.annotation.Transactional;
public interface ArchiViewEleService extends IService<ArchiViewEle> {
@Transactional(rollbackFor = Exception.class)
default Boolean createArchiViewEle(@NotNull ArchiView params) {
ArchiViewEle archiViewEles = new ArchiViewEle();
archiViewEles.setArchiViewId(params.getViewId());
archiViewEles.setArchiEleId(params.getArchiEleId());
archiViewEles.setEleName(params.getEleName());
archiViewEles.setArchiEleRelId(params.getArchiEleRelId());
archiViewEles.setRelName(params.getRelName());
archiViewEles.setType(params.getType());
return save(archiViewEles);
}
}
package org.arch.overall.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.arch.common.modules.archoverall.dto.ArchiViewDTO;
import org.arch.common.modules.archoverall.dto.BatchRemoveDTO;
import org.arch.common.modules.archoverall.entity.ArchiView;
public interface ArchiViewService extends IService<ArchiView> {
IPage<ArchiView> gtArchiView(ArchiViewDTO dto, Page<ArchiView> page);
Boolean insert(ArchiView vwDiss);
Boolean update(ArchiView vwDiss);
Boolean updEleBatch(BatchRemoveDTO requestMap);
Boolean delArchiView(ArchiView vwDis);
}
package org.arch.overall.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.arch.common.modules.archoverall.entity.ArchiEleProperty;
import org.arch.overall.mapper.ArchiElePropertyMapper;
import org.arch.overall.service.ArchiElePropertyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Service
public class ArchiElePropertyImpl extends ServiceImpl<ArchiElePropertyMapper, ArchiEleProperty> implements ArchiElePropertyService {
@Autowired
private ArchiElePropertyMapper archiElePropertyMapper;
@Override
public List<ArchiEleProperty> gtArchiElePropertyList(ArchiEleProperty ynMolProyls) {
List<ArchiEleProperty> YnMolProyList = archiElePropertyMapper.gtArchiElePropertyList(ynMolProyls);
return YnMolProyList;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateEleRelBatch(List<Map<String, Object>> requestList) {
List<ArchiEleProperty> updatedDataList = new ArrayList<>();
for (Map<String, Object> requestData : requestList) {
Integer propertyId = (Integer) requestData.get("propertyId");
String propertyValue = (String) requestData.get("propertyValue");
QueryWrapper<ArchiEleProperty> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("property_id", propertyId);
ArchiEleProperty archiEleProperty = getOne(queryWrapper);
if (archiEleProperty != null) {
archiEleProperty.setPropertyValue(propertyValue);
updatedDataList.add(archiEleProperty);
}
}
return updateBatchById(updatedDataList);
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!