diff --git a/kernel-d-mongodb/README.md b/kernel-d-mongodb/README.md
new file mode 100644
index 000000000..4cc40b983
--- /dev/null
+++ b/kernel-d-mongodb/README.md
@@ -0,0 +1,65 @@
+# Mongodb模块
+
+## GridFS文件管理
+
+### 部署的sql,并为角色配置菜单
+
+```sql
+INSERT INTO guns.sys_menu (menu_id, menu_parent_id, menu_pids, menu_name, menu_code, app_code, visible, menu_sort, status_flag, remark, layui_path, layui_icon, antdv_router, antdv_icon, antdv_component, antdv_link_open_type, antdv_link_url, del_flag, create_time, create_user, update_time, update_user) VALUES(1377141796257218561, 1339550467939639317, '[-1],[1339550467939639317],', 'Mongodb 文件存储', 'mongo_file', 'system', 'Y', 1000.00, 1, NULL, '/view/mongodb/file', 'layui-icon-star-fill', NULL, 'icon-default', NULL, 0, NULL, 'N', '2021-03-31 14:12:45', 1339550467939639299, NULL, NULL);
+```
+
+### application.yml添加mongodb配置
+
+```yml
+spring:
+ data:
+ mongodb:
+ uri: mongodb://localhost:8002
+ database: test
+```
+
+### SpringBoot启动类上添加配置
+
+```java
+@EnableMongoRepositories(basePackages = {"cn.stylefeng.roses.kernel.mongodb.file.mapper"})
+```
+
+### 添加GridFSBucket配置类
+
+```java
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoDatabase;
+import com.mongodb.client.gridfs.GridFSBucket;
+import com.mongodb.client.gridfs.GridFSBuckets;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author huziyang
+ * @create 2021-03-26 17:28
+ */
+@Configuration
+public class MongodbConfig {
+ @Value("${spring.data.mongodb.database}")
+ String db;
+
+ @Bean
+ public GridFSBucket getGridFSBucket(MongoClient mongoClient){
+ MongoDatabase mongoDatabase = mongoClient.getDatabase(db);
+ return GridFSBuckets.create(mongoDatabase);
+ }
+}
+```
+
+### pom中引用工作流的依赖
+
+```xml
+
+
+ cn.stylefeng.roses
+ mongodb-integration-beetl
+ 7.0.2
+
+```
+
diff --git a/kernel-d-mongodb/mongodb-api/pom.xml b/kernel-d-mongodb/mongodb-api/pom.xml
new file mode 100644
index 000000000..0bfac98fd
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-api/pom.xml
@@ -0,0 +1,34 @@
+
+
+
+ kernel-d-mongodb
+ cn.stylefeng.roses
+ 7.0.2
+
+ 4.0.0
+
+ mongodb-api
+
+
+ 8
+ 8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ cn.stylefeng.roses
+ db-api
+ 7.0.2
+
+
+
+
\ No newline at end of file
diff --git a/kernel-d-mongodb/mongodb-api/src/main/java/cn/stylefeng/roses/kernel/mongodb/api/MongoFileApi.java b/kernel-d-mongodb/mongodb-api/src/main/java/cn/stylefeng/roses/kernel/mongodb/api/MongoFileApi.java
new file mode 100644
index 000000000..028f45a50
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-api/src/main/java/cn/stylefeng/roses/kernel/mongodb/api/MongoFileApi.java
@@ -0,0 +1,43 @@
+package cn.stylefeng.roses.kernel.mongodb.api;
+
+import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
+import org.springframework.web.multipart.MultipartFile;
+import java.util.Optional;
+
+/**
+ * @author huziyang
+ * @create 2021-03-30 11:06
+ */
+public interface MongoFileApi {
+
+ /**
+ * 保存文件
+ * @param file
+ * @return
+ */
+ T saveFile(MultipartFile file);
+
+
+ /**
+ * 删除文件
+ * @param id
+ */
+ void removeFile(ID id);
+
+ /**
+ * 根据id获取文件
+ * @param id
+ * @return
+ */
+ Optional getFileById(ID id);
+
+
+ /**
+ * 分页获取文件
+ * @param fileDocument 查询条件
+ * @return
+ */
+ PageResult getFilesByPage(T fileDocument);
+
+
+}
diff --git a/kernel-d-mongodb/mongodb-api/src/main/java/cn/stylefeng/roses/kernel/mongodb/api/MongodbApi.java b/kernel-d-mongodb/mongodb-api/src/main/java/cn/stylefeng/roses/kernel/mongodb/api/MongodbApi.java
new file mode 100644
index 000000000..0e7ccf858
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-api/src/main/java/cn/stylefeng/roses/kernel/mongodb/api/MongodbApi.java
@@ -0,0 +1,46 @@
+package cn.stylefeng.roses.kernel.mongodb.api;
+
+
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @author huziyang
+ * @create 2021-03-20 16:24
+ */
+public interface MongodbApi {
+
+ /**
+ * 新增操作
+ * @param gunsMapEntity
+ * @return
+ */
+ T insert(T gunsMapEntity);
+
+ /**
+ * 修改
+ * @param gunsMapEntity
+ * @return
+ */
+ T update(T gunsMapEntity);
+
+ /**
+ * 根据id删除
+ * @param id
+ */
+ void deleteById(ID id);
+
+ /**
+ * 根据id查询
+ * @param id
+ * @return
+ */
+ Optional findById(ID id);
+
+ /**
+ * 查询所有
+ * @return
+ */
+ List findAll();
+}
diff --git a/kernel-d-mongodb/mongodb-api/src/main/java/cn/stylefeng/roses/kernel/mongodb/api/constants/MongodbConstants.java b/kernel-d-mongodb/mongodb-api/src/main/java/cn/stylefeng/roses/kernel/mongodb/api/constants/MongodbConstants.java
new file mode 100644
index 000000000..0938ce64f
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-api/src/main/java/cn/stylefeng/roses/kernel/mongodb/api/constants/MongodbConstants.java
@@ -0,0 +1,19 @@
+package cn.stylefeng.roses.kernel.mongodb.api.constants;
+
+/**
+ * @author huziyang
+ * @create 2021-03-20 16:24
+ */
+public interface MongodbConstants {
+
+
+ /**
+ * mongodb模块的名称
+ */
+ String MONGODB_MODULE_NAME = "kernel-d-mongodb";
+
+ /**
+ * 异常枚举的步进值
+ */
+ String MONGODB_EXCEPTION_STEP_CODE = "70";
+}
diff --git a/kernel-d-mongodb/mongodb-api/src/main/java/cn/stylefeng/roses/kernel/mongodb/api/exception/MongodbException.java b/kernel-d-mongodb/mongodb-api/src/main/java/cn/stylefeng/roses/kernel/mongodb/api/exception/MongodbException.java
new file mode 100644
index 000000000..d8b13dac5
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-api/src/main/java/cn/stylefeng/roses/kernel/mongodb/api/exception/MongodbException.java
@@ -0,0 +1,19 @@
+package cn.stylefeng.roses.kernel.mongodb.api.exception;
+
+import cn.stylefeng.roses.kernel.mongodb.api.constants.MongodbConstants;
+import cn.stylefeng.roses.kernel.rule.exception.AbstractExceptionEnum;
+import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
+
+/**
+ * 系统配置表的异常
+ *
+ * @author fengshuonan
+ * @date 2021/13/17 23:59
+ */
+public class MongodbException extends ServiceException {
+
+ public MongodbException(AbstractExceptionEnum exception) {
+ super(MongodbConstants.MONGODB_MODULE_NAME, exception);
+ }
+
+}
diff --git a/kernel-d-mongodb/mongodb-integration-beetl/pom.xml b/kernel-d-mongodb/mongodb-integration-beetl/pom.xml
new file mode 100644
index 000000000..1c0d67366
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-integration-beetl/pom.xml
@@ -0,0 +1,36 @@
+
+
+
+ kernel-d-mongodb
+ cn.stylefeng.roses
+ 7.0.2
+
+ 4.0.0
+
+ mongodb-integration-beetl
+
+
+ 8
+ 8
+
+
+
+
+
+
+ cn.stylefeng.roses
+ scanner-api
+ 7.0.2
+
+
+
+
+ cn.stylefeng.roses
+ mongodb-spring-boot-starter
+ 7.0.2
+
+
+
+
\ No newline at end of file
diff --git a/kernel-d-mongodb/mongodb-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/mongodb/integration/controller/ModelViewController.java b/kernel-d-mongodb/mongodb-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/mongodb/integration/controller/ModelViewController.java
new file mode 100644
index 000000000..331a0fbb5
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/mongodb/integration/controller/ModelViewController.java
@@ -0,0 +1,21 @@
+package cn.stylefeng.roses.kernel.mongodb.integration.controller;
+
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import org.springframework.stereotype.Controller;
+
+/**
+ * @author huziyang
+ * @create 2021-03-30 15:21
+ */
+@Controller
+@ApiResource(name = "MongoDB文件管理界面渲染控制器")
+public class ModelViewController {
+
+
+ @GetResource(name = "Mongodb文件列表视图", path = "/view/mongodb/file")
+ public String mongodbFile() {
+ return "/modular/mongodb/fileList.html";
+ }
+
+}
diff --git a/kernel-d-mongodb/mongodb-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/mongodb/integration/controller/MongoFileController.java b/kernel-d-mongodb/mongodb-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/mongodb/integration/controller/MongoFileController.java
new file mode 100644
index 000000000..d25a15efa
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-integration-beetl/src/main/java/cn/stylefeng/roses/kernel/mongodb/integration/controller/MongoFileController.java
@@ -0,0 +1,63 @@
+package cn.stylefeng.roses.kernel.mongodb.integration.controller;
+
+import cn.stylefeng.roses.kernel.mongodb.api.MongoFileApi;
+import cn.stylefeng.roses.kernel.mongodb.file.entity.MongoFileEntity;
+import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
+import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.PostResource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Optional;
+
+/**
+ * @author huziyang
+ * @create 2021-03-31 17:28
+ */
+@RestController
+@ApiResource(name = "Mongodb文件接口控制器")
+public class MongoFileController {
+
+ @Resource
+ private MongoFileApi mongoFileApi;
+
+ @PostResource(name = "Mongodb文件新增", path = "/view/mongodb/file/add")
+ public ResponseData mongodbFileAdd(@RequestPart("file") MultipartFile file) {
+ return new SuccessResponseData(mongoFileApi.saveFile(file));
+ }
+
+ @PostResource(name = "Mongodb文件删除", path = "/view/mongodb/file/del")
+ public ResponseData mongodbFileDel(@RequestParam String id) {
+ mongoFileApi.removeFile(id);
+ return new SuccessResponseData();
+ }
+
+ @GetResource(name = "Mongodb文件列表", path = "/view/mongodb/file/list")
+ public ResponseData mongodbFileList(MongoFileEntity mongoFileEntity) {
+ return new SuccessResponseData(mongoFileApi.getFilesByPage(mongoFileEntity));
+ }
+
+ @GetResource(name = "Mongodb文件下载", path = "/view/mongodb/file/down")
+ public ResponseEntity mongodbFileDown(@RequestParam String id) throws UnsupportedEncodingException {
+ Optional file = mongoFileApi.getFileById(id);
+ if(file.isPresent()){
+ return ResponseEntity.ok()
+ .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; fileName=" + URLEncoder.encode(file.get().getName() , "utf-8"))
+ .header(HttpHeaders.CONTENT_TYPE, "application/octet-stream")
+ .body(file.get().getContent());
+ }else {
+ return ResponseEntity.status(HttpStatus.NOT_FOUND).body("not found");
+ }
+ }
+
+}
diff --git a/kernel-d-mongodb/mongodb-integration-beetl/src/main/resources/assets/modular/mongodb/fileList.js b/kernel-d-mongodb/mongodb-integration-beetl/src/main/resources/assets/modular/mongodb/fileList.js
new file mode 100644
index 000000000..ab7f05e78
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-integration-beetl/src/main/resources/assets/modular/mongodb/fileList.js
@@ -0,0 +1,99 @@
+layui.use(['table', 'form', 'func', 'HttpRequest', 'util', 'upload'], function () {
+
+ var $ = layui.$;
+ var table = layui.table;
+ var form = layui.form;
+ var func = layui.func;
+ var HttpRequest = layui.HttpRequest;
+ var util = layui.util;
+ var upload = layui.upload;
+
+ // 模型设计管理
+ var MongoFile = {
+ tableId: "fileList"
+ };
+
+ // 初始化表格的列
+ MongoFile.initColumn = function () {
+ return [[
+ {type: 'checkbox'},
+ {field: 'id', title: '文件编号', width: 200},
+ {field: 'name', title: '文件名称', width: 200},
+ {field: 'uploadUserId', title: '创建人编号'},
+ {field: 'uploadDate', title: '创建日期'},
+ {align: 'center', toolbar: '#tableBar', title: '操作', width: 250}
+ ]];
+ };
+
+ // 点击查询按钮
+ MongoFile.search = function () {
+ var queryData = {};
+ queryData['name'] = $("#fileName").val();
+ table.reload(MongoFile.tableId, {
+ where: queryData,
+ page: {curr: 1}
+ });
+ };
+
+ // 点击删除
+ MongoFile.delete = function (data) {
+ var operation = function () {
+ var httpRequest = new HttpRequest(Feng.ctxPath + "/view/mongodb/file/del?id="+data.id, 'post', function (data) {
+ Feng.success("删除成功!");
+ table.reload(MongoFile.tableId);
+ }, function (data) {
+ Feng.error("删除失败!" + data.message + "!");
+ });
+ httpRequest.set(data);
+ httpRequest.start(true);
+ };
+ Feng.confirm("是否删除文件" + data.name + "?", operation);
+ };
+
+
+ // 渲染表格
+ var tableResult = table.render({
+ elem: '#' + MongoFile.tableId,
+ url: Feng.ctxPath + '/view/mongodb/file/list',
+ page: true,
+ request: {pageName: 'pageNo', limitName: 'pageSize'},
+ height: "full-158",
+ cellMinWidth: 100,
+ cols: MongoFile.initColumn(),
+ parseData: Feng.parseData
+ });
+
+ // 搜索按钮点击事件
+ $('#btnSearch').click(function () {
+ MongoFile.search();
+ });
+
+
+ // 上传文件的点击事件
+ upload.render({
+ elem: '#modelUpload',
+ url: Feng.ctxPath + '/view/mongodb/file/add',
+ accept: 'file',
+ size: 10000, // 单位kb
+ done: function (res) {
+ Feng.success("上传文件成功!");
+ MongoFile.search();
+ },
+ error: function (err) {
+ Feng.error("上传文件失败!" + err.message);
+ }
+ });
+
+ // 工具条点击事件
+ table.on('tool(' + MongoFile.tableId + ')', function (obj) {
+ var data = obj.data;
+ var event = obj.event;
+
+ if (event === 'down') {
+ window.open(Feng.ctxPath + '/view/mongodb/file/down?id=' + data.id);
+ } else if (event === 'delete') {
+ MongoFile.delete(data);
+ }
+ });
+
+});
diff --git a/kernel-d-mongodb/mongodb-integration-beetl/src/main/resources/pages/modular/mongodb/fileList.html b/kernel-d-mongodb/mongodb-integration-beetl/src/main/resources/pages/modular/mongodb/fileList.html
new file mode 100644
index 000000000..a8beb387a
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-integration-beetl/src/main/resources/pages/modular/mongodb/fileList.html
@@ -0,0 +1,35 @@
+@layout("/layout/_container.html",{js:["/assets/modular/mongodb/fileList.js"]}){
+
+
+ Mongodb文件存储
+
+
+
+
+
+
+@}
diff --git a/kernel-d-mongodb/mongodb-sdk-file/pom.xml b/kernel-d-mongodb/mongodb-sdk-file/pom.xml
new file mode 100644
index 000000000..040ea9c86
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-sdk-file/pom.xml
@@ -0,0 +1,45 @@
+
+
+
+ kernel-d-mongodb
+ cn.stylefeng.roses
+ 7.0.2
+
+ 4.0.0
+
+ mongodb-sdk-file
+
+
+ 8
+ 8
+
+
+
+
+
+
+
+
+ cn.stylefeng.roses
+ auth-api
+ 7.0.2
+ true
+
+
+
+
+
+ cn.stylefeng.roses
+ mongodb-api
+ 7.0.2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-mongodb
+
+
+
\ No newline at end of file
diff --git a/kernel-d-mongodb/mongodb-sdk-file/src/main/java/cn/stylefeng/roses/kernel/mongodb/file/entity/MongoFileEntity.java b/kernel-d-mongodb/mongodb-sdk-file/src/main/java/cn/stylefeng/roses/kernel/mongodb/file/entity/MongoFileEntity.java
new file mode 100644
index 000000000..419f2d9e0
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-sdk-file/src/main/java/cn/stylefeng/roses/kernel/mongodb/file/entity/MongoFileEntity.java
@@ -0,0 +1,36 @@
+package cn.stylefeng.roses.kernel.mongodb.file.entity;
+
+import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.util.Date;
+
+/**
+ * @author huziyang
+ * @create 2021-03-26 17:23
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@Document("mongo_file")
+public class MongoFileEntity extends BaseRequest {
+ @Id
+ private String id;
+ private String name;
+ private Date uploadDate;
+ private Long uploadUserId;
+ private String suffix;
+ private String description;
+ private String gridfsId;
+
+ /**
+ * 分页 响应字段
+ */
+ private byte[] content;
+}
diff --git a/kernel-d-mongodb/mongodb-sdk-file/src/main/java/cn/stylefeng/roses/kernel/mongodb/file/mapper/MongoFileMapper.java b/kernel-d-mongodb/mongodb-sdk-file/src/main/java/cn/stylefeng/roses/kernel/mongodb/file/mapper/MongoFileMapper.java
new file mode 100644
index 000000000..cf97ad1cb
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-sdk-file/src/main/java/cn/stylefeng/roses/kernel/mongodb/file/mapper/MongoFileMapper.java
@@ -0,0 +1,13 @@
+package cn.stylefeng.roses.kernel.mongodb.file.mapper;
+
+import cn.stylefeng.roses.kernel.mongodb.file.entity.MongoFileEntity;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.mongodb.repository.MongoRepository;
+
+/**
+ * @author huziyang
+ * @create 2021-03-26 17:27
+ */
+@Configuration
+public interface MongoFileMapper extends MongoRepository {
+}
diff --git a/kernel-d-mongodb/mongodb-sdk-file/src/main/java/cn/stylefeng/roses/kernel/mongodb/file/service/MongoFileService.java b/kernel-d-mongodb/mongodb-sdk-file/src/main/java/cn/stylefeng/roses/kernel/mongodb/file/service/MongoFileService.java
new file mode 100644
index 000000000..e9443ccf0
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-sdk-file/src/main/java/cn/stylefeng/roses/kernel/mongodb/file/service/MongoFileService.java
@@ -0,0 +1,44 @@
+package cn.stylefeng.roses.kernel.mongodb.file.service;
+
+import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
+import cn.stylefeng.roses.kernel.mongodb.file.entity.MongoFileEntity;
+import org.springframework.web.multipart.MultipartFile;
+import java.util.Optional;
+
+/**
+ * @author huziyang
+ * @create 2021-03-26 17:28
+ */
+public interface MongoFileService {
+
+ /**
+ * 保存文件
+ * @param file
+ * @return
+ */
+ MongoFileEntity saveFile(MultipartFile file);
+
+
+ /**
+ * 删除文件
+ * @param id
+ */
+ void removeFile(String id);
+
+ /**
+ * 根据id获取文件
+ * @param id
+ * @return
+ */
+ Optional getFileById(String id);
+
+
+ /**
+ * 分页获取文件
+ * @param fileDocument 查询条件
+ * @return
+ */
+ PageResult getFilesByPage(MongoFileEntity fileDocument);
+
+
+}
diff --git a/kernel-d-mongodb/mongodb-sdk-file/src/main/java/cn/stylefeng/roses/kernel/mongodb/file/service/impl/MongoFileServiceImpl.java b/kernel-d-mongodb/mongodb-sdk-file/src/main/java/cn/stylefeng/roses/kernel/mongodb/file/service/impl/MongoFileServiceImpl.java
new file mode 100644
index 000000000..1cc1d7241
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-sdk-file/src/main/java/cn/stylefeng/roses/kernel/mongodb/file/service/impl/MongoFileServiceImpl.java
@@ -0,0 +1,114 @@
+package cn.stylefeng.roses.kernel.mongodb.file.service.impl;
+
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
+import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
+import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
+import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
+import cn.stylefeng.roses.kernel.mongodb.api.MongoFileApi;
+import cn.stylefeng.roses.kernel.mongodb.file.entity.MongoFileEntity;
+import cn.stylefeng.roses.kernel.mongodb.file.mapper.MongoFileMapper;
+import cn.stylefeng.roses.kernel.mongodb.file.service.MongoFileService;
+import com.mongodb.client.gridfs.GridFSBucket;
+import com.mongodb.client.gridfs.GridFSDownloadStream;
+import com.mongodb.client.gridfs.model.GridFSFile;
+import lombok.extern.slf4j.Slf4j;
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.*;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.mongodb.gridfs.GridFsResource;
+import org.springframework.data.mongodb.gridfs.GridFsTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+import java.io.IOException;
+import java.util.Date;
+import java.util.Optional;
+
+/**
+ * @author huziyang
+ * @create 2021-03-26 17:29
+ */
+@Slf4j
+@Service
+public class MongoFileServiceImpl implements MongoFileService, MongoFileApi {
+ @Autowired
+ private MongoFileMapper mongoFileMapper;
+ @Autowired
+ private GridFsTemplate gridFsTemplate;
+ @Autowired
+ private GridFSBucket gridFSBucket;
+
+
+ @Override
+ public MongoFileEntity saveFile(MultipartFile file) {
+ MongoFileEntity fileDocument = new MongoFileEntity();
+ fileDocument.setName(file.getOriginalFilename());
+ fileDocument.setUploadDate(new Date());
+ try {
+ // 填充登录用户的userId
+ LoginUser loginUser = LoginContext.me().getLoginUser();
+ fileDocument.setUploadUserId(loginUser.getUserId());
+ }catch (Exception e){
+ // 获取不到用户登录信息,就不填充
+ }
+ fileDocument.setSuffix(file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")));
+ try {
+ ObjectId store = gridFsTemplate.store(file.getInputStream(), IdUtil.simpleUUID(), file.getContentType());
+ fileDocument.setGridfsId(String.valueOf(store));
+ return mongoFileMapper.save(fileDocument);
+ }catch (IOException ex){
+ log.error(ex.getMessage());
+ }
+ return fileDocument;
+ }
+
+ @Override
+ public void removeFile(String id) {
+ Optional fileDocumentOptional = mongoFileMapper.findById(id);
+ if(fileDocumentOptional.isPresent()){
+ mongoFileMapper.deleteById(id);
+ gridFsTemplate.delete(new Query().addCriteria(Criteria.where("_id").is(fileDocumentOptional.get().getGridfsId())));
+ }
+ }
+
+ @Override
+ public Optional getFileById(String id) {
+ Optional fileDocumentOptional = mongoFileMapper.findById(id);
+ if(fileDocumentOptional.isPresent()){
+ MongoFileEntity fileDocument = fileDocumentOptional.get();
+ Query gridQuery = new Query().addCriteria(Criteria.where("_id").is(fileDocument.getGridfsId()));
+ GridFSFile fsFile = gridFsTemplate.findOne(gridQuery);
+ GridFSDownloadStream in = gridFSBucket.openDownloadStream(fsFile.getObjectId());
+ try {
+ if(in.getGridFSFile().getLength() > 0){
+ GridFsResource resource = new GridFsResource(fsFile, in);
+ fileDocument.setContent(IoUtil.readBytes(resource.getInputStream()));
+ return Optional.of(fileDocument);
+ }else {
+ return Optional.empty();
+ }
+ }catch (IOException e){
+ log.error(e.getMessage());
+ }
+ }
+ return Optional.empty();
+ }
+
+ @Override
+ public PageResult getFilesByPage(MongoFileEntity fileDocument) {
+ Integer pageIndex = fileDocument.getPageNo();
+ Integer pageSize = fileDocument.getPageSize();
+ Sort sort = Sort.by(Sort.Direction.DESC, "uploadDate");
+ PageRequest pageRequest = PageRequest.of(pageIndex-1, pageSize, sort);
+ Example example = Example.of(fileDocument, ExampleMatcher.matching()
+ .withIgnoreCase(true)
+ .withIgnorePaths("_class","pageSize","pageNo","content")
+ );
+ Page all = mongoFileMapper.findAll(example, pageRequest);
+ return PageResultFactory.createPageResult(all.getContent(), mongoFileMapper.count(example), pageSize, pageIndex);
+ }
+
+}
diff --git a/kernel-d-mongodb/mongodb-sdk-springboot/pom.xml b/kernel-d-mongodb/mongodb-sdk-springboot/pom.xml
new file mode 100644
index 000000000..bceb6a9aa
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-sdk-springboot/pom.xml
@@ -0,0 +1,36 @@
+
+
+
+ kernel-d-mongodb
+ cn.stylefeng.roses
+ 7.0.2
+
+ 4.0.0
+
+ mongodb-sdk-springboot
+
+
+ 8
+ 8
+
+
+
+
+
+
+ cn.stylefeng.roses
+ mongodb-api
+ 7.0.2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-mongodb
+
+
+
+
+
\ No newline at end of file
diff --git a/kernel-d-mongodb/mongodb-sdk-springboot/src/main/java/cn/stylefeng/roses/kernel/mongodb/entity/GunsMapEntity.java b/kernel-d-mongodb/mongodb-sdk-springboot/src/main/java/cn/stylefeng/roses/kernel/mongodb/entity/GunsMapEntity.java
new file mode 100644
index 000000000..574cf59b4
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-sdk-springboot/src/main/java/cn/stylefeng/roses/kernel/mongodb/entity/GunsMapEntity.java
@@ -0,0 +1,27 @@
+package cn.stylefeng.roses.kernel.mongodb.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author huziyang
+ * @create 2021-03-20 16:24
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Document(collection = "guns_map")
+public class GunsMapEntity {
+
+ @Id
+ private String _id;
+
+ private Map data = new HashMap<>();
+
+
+}
diff --git a/kernel-d-mongodb/mongodb-sdk-springboot/src/main/java/cn/stylefeng/roses/kernel/mongodb/mapper/GunsMapRepository.java b/kernel-d-mongodb/mongodb-sdk-springboot/src/main/java/cn/stylefeng/roses/kernel/mongodb/mapper/GunsMapRepository.java
new file mode 100644
index 000000000..14301698b
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-sdk-springboot/src/main/java/cn/stylefeng/roses/kernel/mongodb/mapper/GunsMapRepository.java
@@ -0,0 +1,13 @@
+package cn.stylefeng.roses.kernel.mongodb.mapper;
+
+import cn.stylefeng.roses.kernel.mongodb.entity.GunsMapEntity;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.mongodb.repository.MongoRepository;
+
+/**
+ * @author huziyang
+ * @create 2021-03-20 16:24
+ */
+@Configuration
+public interface GunsMapRepository extends MongoRepository {
+}
\ No newline at end of file
diff --git a/kernel-d-mongodb/mongodb-sdk-springboot/src/main/java/cn/stylefeng/roses/kernel/mongodb/service/GunsMapService.java b/kernel-d-mongodb/mongodb-sdk-springboot/src/main/java/cn/stylefeng/roses/kernel/mongodb/service/GunsMapService.java
new file mode 100644
index 000000000..d183252e4
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-sdk-springboot/src/main/java/cn/stylefeng/roses/kernel/mongodb/service/GunsMapService.java
@@ -0,0 +1,47 @@
+package cn.stylefeng.roses.kernel.mongodb.service;
+
+import cn.stylefeng.roses.kernel.mongodb.entity.GunsMapEntity;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @author huziyang
+ * @create 2021-03-20 16:24
+ */
+public interface GunsMapService {
+
+ /**
+ * 新增操作
+ * @param gunsMapEntity
+ * @return
+ */
+ GunsMapEntity insert(GunsMapEntity gunsMapEntity);
+
+ /**
+ * 修改
+ * @param gunsMapEntity
+ * @return
+ */
+ GunsMapEntity update(GunsMapEntity gunsMapEntity);
+
+ /**
+ * 根据id删除
+ * @param id
+ */
+ void deleteById(String id);
+
+ /**
+ * 根据id查询
+ * @param id
+ * @return
+ */
+ Optional findById(String id);
+
+ /**
+ * 查询所有
+ * @return
+ */
+ List findAll();
+
+}
\ No newline at end of file
diff --git a/kernel-d-mongodb/mongodb-sdk-springboot/src/main/java/cn/stylefeng/roses/kernel/mongodb/service/impl/GunsMapServiceImpl.java b/kernel-d-mongodb/mongodb-sdk-springboot/src/main/java/cn/stylefeng/roses/kernel/mongodb/service/impl/GunsMapServiceImpl.java
new file mode 100644
index 000000000..398e3ffea
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-sdk-springboot/src/main/java/cn/stylefeng/roses/kernel/mongodb/service/impl/GunsMapServiceImpl.java
@@ -0,0 +1,49 @@
+package cn.stylefeng.roses.kernel.mongodb.service.impl;
+
+import cn.stylefeng.roses.kernel.mongodb.api.MongodbApi;
+import cn.stylefeng.roses.kernel.mongodb.entity.GunsMapEntity;
+import cn.stylefeng.roses.kernel.mongodb.mapper.GunsMapRepository;
+import cn.stylefeng.roses.kernel.mongodb.service.GunsMapService;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @author huziyang
+ * @create 2021-03-20 16:24
+ */
+@Service
+public class GunsMapServiceImpl implements GunsMapService, MongodbApi {
+
+
+ @Resource
+ private GunsMapRepository gunsMapRepository;
+
+
+ @Override
+ public GunsMapEntity insert(GunsMapEntity gunsMapEntity){
+ return gunsMapRepository.insert(gunsMapEntity);
+ }
+
+ @Override
+ public GunsMapEntity update(GunsMapEntity gunsMapEntity){
+ return gunsMapRepository.save(gunsMapEntity);
+ }
+
+ @Override
+ public void deleteById(String id){
+ gunsMapRepository.deleteById(id);
+ }
+
+ @Override
+ public Optional findById(String id){
+ return gunsMapRepository.findById(id);
+ }
+
+ @Override
+ public List findAll(){
+ return gunsMapRepository.findAll();
+ }
+
+}
diff --git a/kernel-d-mongodb/mongodb-spring-boot-starter/pom.xml b/kernel-d-mongodb/mongodb-spring-boot-starter/pom.xml
new file mode 100644
index 000000000..8d0b006b4
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-spring-boot-starter/pom.xml
@@ -0,0 +1,35 @@
+
+
+
+ kernel-d-mongodb
+ cn.stylefeng.roses
+ 7.0.2
+
+ 4.0.0
+
+ mongodb-spring-boot-starter
+
+
+ 8
+ 8
+
+
+
+
+
+ cn.stylefeng.roses
+ mongodb-sdk-springboot
+ 7.0.2
+
+
+
+
+ cn.stylefeng.roses
+ mongodb-sdk-file
+ 7.0.2
+
+
+
+
\ No newline at end of file
diff --git a/kernel-d-mongodb/mongodb-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/mongodb/starter/GunsMongodbAutoConfiguration.java b/kernel-d-mongodb/mongodb-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/mongodb/starter/GunsMongodbAutoConfiguration.java
new file mode 100644
index 000000000..48613d92c
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/mongodb/starter/GunsMongodbAutoConfiguration.java
@@ -0,0 +1,31 @@
+package cn.stylefeng.roses.kernel.mongodb.starter;
+
+import cn.stylefeng.roses.kernel.mongodb.api.MongoFileApi;
+import cn.stylefeng.roses.kernel.mongodb.api.MongodbApi;
+import cn.stylefeng.roses.kernel.mongodb.file.service.impl.MongoFileServiceImpl;
+import cn.stylefeng.roses.kernel.mongodb.service.impl.GunsMapServiceImpl;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author huziyang
+ * @create 2021-03-20 16:24
+ */
+@Configuration
+public class GunsMongodbAutoConfiguration {
+
+
+
+ @Bean
+ public MongodbApi mongodbApi() {
+ return new GunsMapServiceImpl();
+ }
+
+ @Bean
+ public MongoFileApi mongoFileApi() {
+ return new MongoFileServiceImpl();
+ }
+
+
+}
+
diff --git a/kernel-d-mongodb/mongodb-spring-boot-starter/src/main/resources/META-INF/spring.factories b/kernel-d-mongodb/mongodb-spring-boot-starter/src/main/resources/META-INF/spring.factories
new file mode 100644
index 000000000..df858df4d
--- /dev/null
+++ b/kernel-d-mongodb/mongodb-spring-boot-starter/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+ cn.stylefeng.roses.kernel.mongodb.starter.GunsMongodbAutoConfiguration
\ No newline at end of file
diff --git a/kernel-d-mongodb/pom.xml b/kernel-d-mongodb/pom.xml
new file mode 100644
index 000000000..ce25670ed
--- /dev/null
+++ b/kernel-d-mongodb/pom.xml
@@ -0,0 +1,38 @@
+
+
+
+ roses-kernel
+ cn.stylefeng.roses
+ 7.0.2
+
+ 4.0.0
+
+ kernel-d-mongodb
+ pom
+
+ mongodb-api
+ mongodb-sdk-springboot
+ mongodb-spring-boot-starter
+ mongodb-sdk-file
+ mongodb-integration-beetl
+
+
+
+ 8
+ 8
+
+
+
+
+
+
+ cn.stylefeng.roses
+ kernel-a-rule
+ 7.0.2
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index a63332a33..6e16f984c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -91,6 +91,9 @@
kernel-s-message
+
+ kernel-d-mongodb
+
kernel-s-system