暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DataEase-V1.18版本源码通过Docker镜像部署与静态资源通过阿里云OSS存储实现看这一篇就够了

修改DataEase实现静态资源阿里云OSS存储

后端源码文件读取配置类配置

1.阿里云OSS配置类

  1. /**

  2. * ClassName AliyunConfig.java

  3. * author shuyixiao

  4. * version 1.0.0

  5. * Description 阿里云OSS配置

  6. * createTime 2024年04月03日 10:03:00

  7. */

  8. @Data

  9. @Configuration

  10. 解释

    public class AliyunConfig {



  11. // 地域节点

  12. 解释

    @Value("${aliyun.oss.endpoint}")


  13. 解释

    private String endpoint;


  14. 解释

    @Value("${aliyun.accessKeyId}")


  15. 解释

    private String accessKeyId;


  16. 解释

    @Value("${aliyun.accessKeySecret}")


  17. 解释

    private String accessKeySecret;



  18. 解释

    @Value("${aliyun.oss.bucketName}")


  19. 解释

    private String bucketName;


  20. 解释

    @Value("${aliyun.oss.urlPrefix}")


  21. 解释

    private String urlPrefix;



  22. }

2.图片文件上传base64转MultipartFile工具类

  1. 解释

    public class Base64DecodedMultipartFile implements MultipartFile {


  2. 解释

    private final byte[] imgContent;


  3. 解释

    private final String header;



  4. 解释

    public Base64DecodedMultipartFile(byte[] imgContent, String header) {


  5. 解释

    this.imgContent = imgContent;


  6. 解释

    this.header = header;


  7. }

  8. @Override

  9. 解释

    public String getName() {


  10. 解释

    return System.currentTimeMillis() + Math.random() + "." + header.split("/")[1].split(";")[0];


  11. }


  12. @Override

  13. 解释

    public String getOriginalFilename() {


  14. 解释

    return getName();


  15. }


  16. @Override

  17. 解释

    public String getContentType() {


  18. 解释

    return header.split(":")[1].split(";")[0];


  19. }


  20. @Override

  21. 解释

    public boolean isEmpty() {


  22. 解释

    return imgContent == null || imgContent.length == 0;


  23. }


  24. @Override

  25. 解释

    public long getSize() {


  26. 解释

    return imgContent.length;


  27. }


  28. @Override

  29. 解释

    public byte[] getBytes() {


  30. 解释

    return imgContent;


  31. }


  32. @Override

  33. 解释

    public InputStream getInputStream() {


  34. 解释

    return new ByteArrayInputStream(imgContent);


  35. }


  36. @Override

  37. 解释

    public void transferTo(File dest) throws IOException, IllegalStateException {


  38. 解释

    try (FileOutputStream fos = new FileOutputStream(dest)) {


  39. 解释

    fos.write(imgContent);


  40. }

  41. }


  42. }

3.图片静态文件解析工具类

  1. 解释

    public class Base64DecodedStaticFile implements MultipartFile {


  2. 解释

    private byte[] imgContent;



  3. 解释

    public Base64DecodedStaticFile(byte[] imgContent) {


  4. 解释

    this.imgContent = imgContent;


  5. }


  6. @Override

  7. 解释

    public String getName() {


  8. 解释

    return "filename";


  9. }


  10. @Override

  11. 解释

    public String getOriginalFilename() {


  12. 解释

    return "originalFilename.jpg";


  13. }


  14. @Override

  15. 解释

    public String getContentType() {


  16. 解释

    return "image/jpeg";


  17. }


  18. @Override

  19. 解释

    public boolean isEmpty() {


  20. 解释

    return imgContent == null || imgContent.length == 0;


  21. }


  22. @Override

  23. 解释

    public long getSize() {


  24. 解释

    return imgContent.length;


  25. }


  26. @Override

  27. 解释

    public byte[] getBytes() throws IOException {


  28. 解释

    return imgContent;


  29. }


  30. @Override

  31. 解释

    public InputStream getInputStream() throws IOException {


  32. 解释

    return new ByteArrayInputStream(imgContent);


  33. }


  34. @Override

  35. 解释

    public void transferTo(java.io.File dest) throws IOException, IllegalStateException {


  36. // 这里根据你的需求实现文件传输的逻辑

  37. }


  38. }

4.阿里云oos响应配置类

  1. @Getter

  2. @Setter

  3. 解释

    public class PicUploadResult {


  4. 解释

    private String uid;



  5. 解释

    private String name;



  6. 解释

    private String status;



  7. 解释

    private String response;



  8. 解释

    private String linkProps;



  9. }

5.文件上传工具类

  1. @Component

  2. 解释

    public class FileUtil {


  3. @Autowired

  4. 解释

    private AliyunConfig aliyunConfig;




  5. // 允许上传的格式

  6. 解释

    private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg", ".jpeg", ".gif", ".png"};


  7. 解释

    public PicUploadResult upload(MultipartFile multipartFile) {


  8. // 1. 对上传的图片进行校验: 这里简单校验后缀名

  9. // 另外可通过ImageIO读取图片的长宽来判断是否是图片,校验图片的大小等。

  10. // TODO 图片校验

  11. 解释

    boolean isLegal = false;


  12. 解释

    for (String type : IMAGE_TYPE) {


  13. 解释

    if (StringUtils.endsWithIgnoreCase(multipartFile.getOriginalFilename(), type)) {


  14. 解释

    isLegal = true;


  15. 解释

    break; // 只要与允许上传格式其中一个匹配就可以


  16. }

  17. }

  18. 解释

    PicUploadResult picUploadResult = new PicUploadResult();


  19. // 格式错误, 返回与前端约定的error

  20. 解释

    if (!isLegal) {


  21. 解释

    picUploadResult.setStatus("error");


  22. 解释

    return picUploadResult;


  23. }


  24. // 生成唯一的文件名

  25. 解释

    String originalFileName = multipartFile.getOriginalFilename();


  26. 解释

    String fileExtension = originalFileName.substring(originalFileName.lastIndexOf("."));


  27. 解释

    String uniqueFileName = UUID.randomUUID().toString() + fileExtension; // 包含UUID的文件名




  28. // 3. 上传至阿里OSS

  29. 解释

    try {


  30. // 初始化OSSClient

  31. 解释

    OSS ossClient = new OSSClientBuilder().build(aliyunConfig.getEndpoint(), aliyunConfig.getAccessKeyId(), aliyunConfig.getAccessKeySecret());



  32. 解释

    ossClient.putObject(aliyunConfig.getBucketName(), uniqueFileName, new ByteArrayInputStream(multipartFile.getBytes()));


  33. 解释

    } catch (IOException e) {


  34. 解释

    e.printStackTrace();


  35. // 上传失败

  36. 解释

    picUploadResult.setStatus("error");


  37. 解释

    return picUploadResult;


  38. }


  39. // 上传成功

  40. 解释

    picUploadResult.setStatus("done");


  41. // 文件名(即直接访问的完整路径)

  42. 解释

    picUploadResult.setName(aliyunConfig.getUrlPrefix() + uniqueFileName);


  43. // uid

  44. 解释

    picUploadResult.setUid(String.valueOf(System.currentTimeMillis()));


  45. 解释

    return picUploadResult;


  46. }


  47. }

6.DataEase源码部分适配OSS修改

1.修改应用管理功能逻辑(PanelAppTemplateService类)
  • 注入文件上传工具类

  1. @Autowired

  2. 解释

    private FileUtil fileUtil;


  • 修改原有代码逻辑

  1. //Store static resource into the server

  2. // 缩略图处理

  3. 解释

    String snapshotName = "app-template-" + request.getId() + ".jpeg";


  4. 解释

    String base64Image = request.getSnapshot().split(",")[1];


  5. 解释

    String imageType = request.getSnapshot().split(";")[0].split(":")[1];


  6. 解释

    byte[] imageBytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(base64Image);


  7. 解释

    MultipartFile multipartFile = new Base64DecodedMultipartFile(imageBytes, imageType);


  8. // 调用上传方法

  9. 解释

    PicUploadResult uploadResult = fileUtil.upload(multipartFile);


  10. 解释

    staticResourceService.saveSingleFileToServe(snapshotName, request.getSnapshot().replace("data:image/jpeg;base64,", "").replace("data:image/png;base64,", ""));


  11. 解释

    requestTemplate.setSnapshot("/" + UPLOAD_URL_PREFIX + '/' + snapshotName);


  12. // requestTemplate.setSnapshot("/" + UPLOAD_URL_PREFIX + '/' + snapshotName);

  13. 解释

    requestTemplate.setSnapshot(uploadResult.getName());


  14. // 静态资源小图处理

  15. 解释

    Gson gson = new Gson();


  16. 解释

    PanelGroupRequest panelGroupRequest = gson.fromJson(request.getPanelInfo(), PanelGroupRequest.class);


  17. // panelGroupRequest.setPanelData(JSON.toJSONString(jsonArray));

  18. 解释

    Map<String, String> resource = gson.fromJson(panelGroupRequest.getStaticResource(), Map.class);


  19. 解释

    Map<String, String> imageUrl = new HashMap<>();


  20. 解释

    for (String s : resource.keySet()) {


  21. 解释

    String imageCode = resource.get(s);


  22. 解释

    byte[] bytes = DatatypeConverter.parseBase64Binary(imageCode);


  23. 解释

    PicUploadResult picUploadResult = fileUtil.upload(new Base64DecodedStaticFile(bytes));


  24. 解释

    imageUrl.put(s, picUploadResult.getName());


  25. }

  26. // 数据库缩略图存储处理

  27. 解释

    String staticResource = panelGroupRequest.getStaticResource();


  28. 解释

    Map<String,String> staticResourceMap= gson.fromJson(staticResource, Map.class);


  29. 解释

    for (String s : staticResourceMap.keySet()) {


  30. 解释

    String s1 = staticResourceMap.get(s);


  31. 解释

    if (s.contains("static-resource")) {


  32. // 找到匹配项,修改为阿里云oos存储地址

  33. 解释

    for (String string : imageUrl.keySet()) {


  34. 解释

    if (string.equals(s)){


  35. 解释

    staticResourceMap.remove(s);


  36. 解释

    staticResourceMap.put(imageUrl.get(s), s1);


  37. }

  38. }

  39. }

  40. }

  41. 解释

    String panelData = panelGroupRequest.getPanelData();


  42. 解释

    JSONArray jsonArray = JSON.parseArray(panelData);


  43. // 遍历数组,寻找特定的 propValue 值

  44. 解释

    for (int i = 0; i < jsonArray.size(); i++) {


  45. 解释

    JSONObject obj = jsonArray.getJSONObject(i);


  46. 解释

    if (obj.containsKey("propValue") && obj.getString("propValue").contains("/static-resource/")) {


  47. // 找到匹配项,添加前缀

  48. 解释

    obj.put("propValue", imageUrl.get(obj.get("propValue")));


  49. }

  50. }

  51. 解释

    panelGroupRequest.setPanelData(JSON.toJSONString(jsonArray));


  52. 解释

    panelGroupRequest.setStaticResource(gson.toJson(staticResourceMap));


  53. 解释

    requestTemplate.setPanelInfo(gson.toJson(panelGroupRequest));


2.修改模板管理功能逻辑(PanelTemplateService类)
  • 注入文件上传工具类

  1. @Autowired

  2. 解释

    private FileUtil fileUtil;


  • 修改原有逻辑代码

  1. //Store static resource into the server

  2. 解释

    staticResourceService.saveFilesToServe(request.getStaticResource());


  3. // 缩略大图处理

  4. 解释

    String snapshotName = "template-" + request.getId() + ".jpeg";


  5. 解释

    String base64Image = request.getSnapshot().split(",")[1];


  6. 解释

    String imageType = request.getSnapshot().split(";")[0].split(":")[1];


  7. 解释

    byte[] imageBytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(base64Image);


  8. 解释

    MultipartFile multipartFile = new Base64DecodedMultipartFile(imageBytes, imageType);


  9. // 调用上传方法

  10. 解释

    PicUploadResult uploadResult = fileUtil.upload(multipartFile);


  11. 解释

    staticResourceService.saveSingleFileToServe(snapshotName, request.getSnapshot().replace("data:image/jpeg;base64,", "").replace("data:image/png;base64,", ""));


  12. 解释

    request.setSnapshot("/" + UPLOAD_URL_PREFIX + '/' + snapshotName);


  13. // 文件中静态资源小图处理

  14. 解释

    String staticResource = request.getStaticResource();


  15. 解释

    Gson gson = new Gson();


  16. 解释

    Map<String, String> resource = gson.fromJson(staticResource, Map.class);


  17. 解释

    Map<String, String> imageCode = new HashMap<>();


  18. 解释

    for (String s : resource.keySet()) {


  19. 解释

    String base64Picture = resource.get(s);


  20. 解释

    byte[] bytes = DatatypeConverter.parseBase64Binary(base64Picture);


  21. 解释

    PicUploadResult picUploadResult = fileUtil.upload(new Base64DecodedStaticFile(bytes));


  22. 解释

    imageCode.put(s, picUploadResult.getName());


  23. }

  24. 解释

    String templateData = request.getTemplateData();


  25. 解释

    JSONArray jsonArray = JSON.parseArray(templateData);


  26. 解释

    for (int i = 0; i < jsonArray.size(); i++) {


  27. 解释

    JSONObject obj = jsonArray.getJSONObject(i);


  28. 解释

    if (obj.containsKey("propValue") && obj.getString("propValue").contains("/static-resource/")) {


  29. // 找到匹配项,添加前缀

  30. 解释

    obj.put("propValue", imageCode.get(obj.get("propValue")));


  31. }

  32. }

  33. 解释

    request.setTemplateData(JSON.toJSONString(jsonArray));


  34. // request.setSnapshot("/" + UPLOAD_URL_PREFIX + '/' + snapshotName);

  35. 解释

    request.setSnapshot(uploadResult.getName());


7.配置文件中添加阿里云OSS配置

阿里云oss配置

  1. # 阿里云oss配置

  2. # Aliyun OSS 配置

  3. # 访问密钥ID,用于标识用户

  4. 解释

    aliyun.accessKeyId=xxxxxxxxxxxxxx


  5. # 访问密钥密文,用于验证用户的身份

  6. 解释

    aliyun.accessKeySecret=xxxxxxxxxxxxxx


  7. # OSS服务的访问域名

  8. 解释

    aliyun.oss.endpoint=xxxxxxxxxxxxxx


  9. # OSS中的存储桶名称

  10. 解释

    aliyun.oss.bucketName=xxxxxxxxxxxxxx


  11. #访问OSS服务的URL前缀

  12. 解释

    aliyun.oss.urlPrefix=xxxxxxxxxxxxxx


前端源码样式修改为自己喜欢的即可

前后端不分离单体部署

1.源码获取

GitHub地址Gitee地址

2.配置源码信息

后端代码

注意事项:

注意V1.18代码的配置方式为JDK11版本 需要后端POM文件中有的资源依赖拉取不下来,可以链接:https://pan.baidu.com/s/1UYKk9R96B6dBUEqsRgjJhA 提取码:x8wr 这里获取然后直接替换即可配置启动类配置处的配置文件信息,由于是在windows的环境中,下图是Linux中的文件写法,因此偷懒一些可以直接就是在windows的项目的根路径下建立相似的路径文件信息即可,详情见下图配置配置文件中的数据库信息,数据库信息比较私密因此直接打马赛克了~

前端代码

注意事项:由于使用的是V1.18版本左右的前端代码,因此node版本不宜太高16.0.0左右即可。

查看前端项目的打包配置信息可以得到,运行需要的指令信息

3.Docker打包部署

首先在项目根文件夹下面添加数据库信息的配置文件

去除后端POM文件中移动端部分资源

##### 修改前端POM文件中node和npm版本

分别打包前后端文件资源

执行Docker打包指令得到镜像文件
  1. # 这里我需要说明一下就是版本号随着DataEase官方版本给就可以,这里我写的时候使用1.18.15就写这个了

  2. 解释

    docker build --build-arg IMAGE_TAG=1.18.15 -t your-image-name:tag .


运行镜像文件得到前端展示页面

附录一下打包和启动命令
  1. 解释

    docker build --build-arg IMAGE_TAG=1.18.15 -t core-backend-image-v1.18.15:1.18.15 .


  2. 解释

    docker run -d -p 8181:8181 core-backend-image-v1.18.15:1.18.15


前后端分离单体部署

后端代码

1.修改后端代码添加对应上下文

##### 2.修改后端短链共享代码部分

3.pom文件中去除掉前端资源打包内容

4.执行Docker打包,步骤和上述前端后不分离单体部署命令一致不赘述了

前端代码修改

前端代码修改下面两处配置信息完成接口路径上下文配置

执行前端打包后放置与nginx服务器

  1. # 打包命令:

  2. npm run build


文章转载自舒一笑的架构笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论