huangxiao 3 هفته پیش
والد
کامیت
34313f01e8

+ 12 - 2
src/test/java/mingsoft/Main.java

@@ -4,6 +4,7 @@ import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.ZipUtil;
 import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.core.LoggerContext;
@@ -23,6 +24,7 @@ import java.util.stream.Stream;
  * @author hosea
  * @date 2025-12-24
  */
+@Slf4j
 public class Main {
     private static final File doc;
     private static final MingsoftService service;
@@ -55,7 +57,10 @@ public class Main {
         File unzip = new File(doc, "unzip");
         FileUtil.del(zip);
         FileUtil.del(unzip);
-        service.saveDownloadCode(zip).ifPresent(file -> ZipUtil.unzip(file, unzip));
+        service.saveDownloadCode(zip).ifPresent(file -> {
+            ZipUtil.unzip(file, unzip);
+            log.info("解压到:{}", unzip);
+        });
         copyToSrc(unzip);
         FileUtil.del(zip);
         FileUtil.del(unzip);
@@ -67,7 +72,10 @@ public class Main {
         File localSrc = new File(doc, "../src/main").getCanonicalFile();
         FileUtil.loopFiles(codeSrc, pathname -> {
             if (StrUtil.endWithAnyIgnoreCase(pathname.getName(), "BaseAction.java", "Const.java", "Biz.java", "BizImpl.java", "Dao.java")) {
-                return !new File(localSrc, pathname.toString().replace(codeSrc.toString(), "")).exists();
+                if (new File(localSrc, pathname.toString().replace(codeSrc.toString(), "")).exists()) {
+                    log.info("忽略:{}", pathname);
+                    return false;
+                }
             }
             return true;
         }).forEach(codeFile -> {
@@ -78,8 +86,10 @@ public class Main {
                                 FileUtil.readLines(localFile, StandardCharsets.ISO_8859_1).stream())
                         .distinct()
                         .collect(Collectors.toList()), localFile, StandardCharsets.ISO_8859_1, false);
+                log.info("合并:{} -> {} ", codeFile, localFile);
             } else {
                 FileUtil.copyFile(codeFile, localFile, StandardCopyOption.REPLACE_EXISTING);
+                log.info("覆盖:{} -> {} ", codeFile, localFile);
             }
         });
     }

+ 23 - 26
src/test/java/mingsoft/MingsoftService.java

@@ -10,10 +10,7 @@ import cn.hutool.db.ds.pooled.DbConfig;
 import cn.hutool.db.ds.pooled.PooledDataSource;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
-import mingsoft.client.Info;
-import mingsoft.client.MingsoftClient;
-import mingsoft.client.MingsoftData;
-import mingsoft.client.MingsoftPreView;
+import mingsoft.client.*;
 
 import java.io.File;
 import java.util.Comparator;
@@ -31,7 +28,7 @@ import java.util.stream.Collectors;
  * @date 2025-12-24
  */
 @Slf4j(topic = "Service")
-public record MingsoftService(MingsoftClient client, Map<Info, MingsoftData> codes) {
+public record MingsoftService(MingsoftClient client, Map<MingsoftDataType, MingsoftData> codes) {
     public MingsoftService {
         Assert.notNull(client, "客户端不能为空");
     }
@@ -64,7 +61,7 @@ public record MingsoftService(MingsoftClient client, Map<Info, MingsoftData> cod
      *
      * @param dbFile 备份代码的SQLite文件
      */
-    public static Optional<Map<Info, MingsoftData>> loadLocalCodeBackup(String dbFile) throws Exception {
+    public static Optional<Map<MingsoftDataType, MingsoftData>> loadLocalCodeBackup(String dbFile) throws Exception {
         DbConfig config = new DbConfig();
         config.setUrl("jdbc:sqlite:" + dbFile);
         config.setMaxActive(2);
@@ -89,7 +86,7 @@ public record MingsoftService(MingsoftClient client, Map<Info, MingsoftData> cod
     /**
      * 查服务器上的代码
      */
-    public Optional<Map<Info, MingsoftData>> queryCodes() {
+    public Optional<Map<MingsoftDataType, MingsoftData>> queryCodes() {
         return Optional.of(client.list()
                         .map(json -> json.toBean(MingsoftData.class))
                         .collect(Collectors.toMap(MingsoftData::toInfo, v -> v)))
@@ -100,15 +97,15 @@ public record MingsoftService(MingsoftClient client, Map<Info, MingsoftData> cod
     }
 
     /**
-     * 复制代码,永远还原到{@link Info#FORM_ID}这个表单ID
+     * 复制代码,永远还原到{@link Constant#FORM_ID}这个表单ID
      * <p>
-     * {@link #copy(Info, Info, String)}
+     * {@link #copy(MingsoftDataType, MingsoftDataType, String)}
      *
      * @param old  旧的
      * @param news 新的
      */
-    public boolean copy(Info old, Info news) {
-        return copy(old, news, Info.FORM_ID);
+    public boolean copy(MingsoftDataType old, MingsoftDataType news) {
+        return copy(old, news, Constant.FORM_ID);
     }
 
     /**
@@ -124,19 +121,19 @@ public record MingsoftService(MingsoftClient client, Map<Info, MingsoftData> cod
      * @param news 新的
      * @param id   表单ID
      */
-    public boolean copy(Info old, Info news, String id) {
+    public boolean copy(MingsoftDataType old, MingsoftDataType news, String id) {
         return update(id, codes.get(old).clone().info(news));
     }
 
     /**
-     * 还原代码,永远还原到{@link Info#FORM_ID}这个表单ID
+     * 还原代码,永远还原到{@link Constant#FORM_ID}这个表单ID
      * <p>
-     * {@link #restore(Info, String)}
+     * {@link #restore(MingsoftDataType, String)}
      *
      * @param old 旧的
      */
-    public boolean restore(Info old) {
-        return restore(old, Info.FORM_ID);
+    public boolean restore(MingsoftDataType old) {
+        return restore(old, Constant.FORM_ID);
     }
 
     /**
@@ -149,7 +146,7 @@ public record MingsoftService(MingsoftClient client, Map<Info, MingsoftData> cod
      * @param old 旧的
      * @param id  表单ID
      */
-    public boolean restore(Info old, String id) {
+    public boolean restore(MingsoftDataType old, String id) {
         return update(id, codes.get(old));
     }
 
@@ -165,10 +162,10 @@ public record MingsoftService(MingsoftClient client, Map<Info, MingsoftData> cod
     }
 
     /**
-     * 下载{@link Info#FORM_ID}代码
+     * 下载{@link Constant#FORM_ID}代码
      */
     public Optional<byte[]> downloadCode() {
-        return downloadCode(Info.FORM_ID);
+        return downloadCode(Constant.FORM_ID);
     }
 
     /**
@@ -187,12 +184,12 @@ public record MingsoftService(MingsoftClient client, Map<Info, MingsoftData> cod
     }
 
     /**
-     * 保存下载{@link Info#FORM_ID}代码
+     * 保存下载{@link Constant#FORM_ID}代码
      *
      * @param saveFile 保存的文件,如果已经存在,则不会保存
      */
     public Optional<File> saveDownloadCode(File saveFile) {
-        return saveDownloadCode(saveFile, Info.FORM_ID);
+        return saveDownloadCode(saveFile, Constant.FORM_ID);
     }
 
     /**
@@ -217,10 +214,10 @@ public record MingsoftService(MingsoftClient client, Map<Info, MingsoftData> cod
     }
 
     /**
-     * 预览{@link Info#FORM_ID}代码
+     * 预览{@link Constant#FORM_ID}代码
      */
-    public Optional<Map<String, MingsoftPreView>> previewCode() {
-        return previewCode(Info.FORM_ID);
+    public Optional<Map<MingsoftPreViewType, String>> previewCode() {
+        return previewCode(Constant.FORM_ID);
     }
 
     /**
@@ -228,10 +225,10 @@ public record MingsoftService(MingsoftClient client, Map<Info, MingsoftData> cod
      *
      * @param id 表单ID
      */
-    public Optional<Map<String, MingsoftPreView>> previewCode(String id) {
+    public Optional<Map<MingsoftPreViewType, String>> previewCode(String id) {
         return Optional.of(client.preview(id)
                         .map(item -> item.toBean(MingsoftPreView.class))
-                        .collect(Collectors.toMap(MingsoftPreView::getCode, v -> v)))
+                        .collect(Collectors.toMap(MingsoftPreView::toType, MingsoftPreView::getCode)))
                 .map(map -> {
                     log.info("预览代码 Size:{}", map.size());
                     return map;

+ 34 - 0
src/test/java/mingsoft/client/Constant.java

@@ -0,0 +1,34 @@
+package mingsoft.client;
+
+import org.aspectj.weaver.loadtime.Agent;
+
+/**
+ * 常量
+ *
+ * @author hosea
+ * @date 2025-12-24
+ */
+public final class Constant {
+    /**
+     * 固定表单ID
+     */
+    public final static String FORM_ID = "16094";
+    /**
+     * 项目
+     */
+    public final static String PROJECT_ID = "1980198434053410817";
+    /**
+     * 用户
+     */
+    public final static String PEOPLE_ID = "1980170321679396866";
+    /**
+     * 框架ID
+     */
+    public final static String CTG_ID = "1783050531725975553";
+    public final static String HOST = "https://code.mingsoft.net/";
+    public final static String USER_AGENT_WINDOWS_CHROME = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36";
+    public final static String MS_LIST = HOST + "code-proxy/people/mcode/projectModelObject/list.do?projectId=" + PROJECT_ID;
+    public final static String MS_UPDATE = HOST + "code-proxy/people/mcode/projectModelObject/update.do";
+    public final static String MS_DOWNLOAD = HOST + "code-proxy/people/download.do";
+    public final static String MS_PRE_VIEW = HOST + "code-proxy/people/mcode/project/view.do";
+}

+ 0 - 63
src/test/java/mingsoft/client/Info.java

@@ -1,63 +0,0 @@
-package mingsoft.client;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * 业务信息
- *
- * @author hosea
- * @date 2025-12-24
- */
-@Getter
-@AllArgsConstructor
-public enum Info {
-    BOOTH("展位", "BOOTH", "15957"),
-    EXHIBITION("展会", "EXHIBITION", "15958"),
-    EXHIBITOR("展商", "EXHIBITOR", "15959"),
-    PEOPLE_INFO("扩展会员信息", "PEOPLE_INFO", "15962"),
-    ENTERPRISE("企业管理", "ENTERPRISE"),
-    ANNOUNCEMENT("公告管理", "ANNOUNCEMENT"),
-    INVESTMENT_PROMOTION("招商管理", "INVESTMENT_PROMOTION"),
-    RECRUITMENT("人才招聘", "RECRUITMENT"),
-    RECRUITMENT_SUBMISSION("招聘投递", "RECRUITMENT_SUBMISSION"),
-    MESSAGE("留言", "MESSAGE"),
-    ENTERPRISE_PRODUCTS("企业产品", "ENTERPRISE_PRODUCTS"),
-    DESIGN("设计谷", "DESIGN"),
-    BUSINESS_OPPORTUNITY("商机对接", "BUSINESS_OPPORTUNITY"),
-    BROWSE("浏览量", "BROWSE"),
-    BROWSE_RECORDS("浏览记录", "BROWSE_RECORDS");
-
-    Info(String name, String table) {
-        this(name, table, null);
-    }
-
-    /**
-     * 固定表单ID
-     */
-    public final static String FORM_ID = "16094";
-    /**
-     * 项目
-     */
-    public final static String PROJECT_ID = "1980198434053410817";
-    /**
-     * 用户
-     */
-    public final static String PEOPLE_ID = "1980170321679396866";
-    /**
-     * 框架ID
-     */
-    public final static String CTG_ID = "1783050531725975553";
-    /**
-     * 名称
-     */
-    private final String name;
-    /**
-     * 表名
-     */
-    private final String table;
-    /**
-     * 表单ID
-     */
-    private final String id;
-}

+ 12 - 16
src/test/java/mingsoft/client/MingsoftClient.java

@@ -46,8 +46,7 @@ public record MingsoftClient(String token) {
      * 查列表
      */
     public Stream<JSONObject> list() {
-        String url = "https://code.mingsoft.net/code-proxy/people/mcode/projectModelObject/list.do?projectId=" + Info.PROJECT_ID;
-        try (HttpResponse response = HttpUtil.createRequest(Method.GET, url).addHeaders(createHeaders()).execute()) {
+        try (HttpResponse response = HttpUtil.createRequest(Method.GET, Constant.MS_LIST).addHeaders(createHeaders()).execute()) {
             return getResponseData(response);
         }
     }
@@ -55,18 +54,17 @@ public record MingsoftClient(String token) {
     /**
      * 修改
      */
-    public Optional<ResultData> update(MingsoftData data) {
-        String url = "https://code.mingsoft.net/code-proxy/people/mcode/projectModelObject/update.do";
+    public Optional<Boolean> update(MingsoftData data) {
         Map<String, Object> param = new HashMap<>();
         data.setPmoDatetime(null);
         BeanUtil.beanToMap(data, param, false, true);
         Map<String, String> headers = createHeaders();
         headers.put("Content-Type", "application/x-www-form-urlencoded");
-        try (HttpResponse response = HttpUtil.createRequest(Method.POST, url)
+        try (HttpResponse response = HttpUtil.createRequest(Method.POST, Constant.MS_UPDATE)
                 .addHeaders(headers)
                 .form(param)
                 .execute()) {
-            return checkResponse(response);
+            return checkResponse(response).map(obj -> true);
         }
     }
 
@@ -74,12 +72,11 @@ public record MingsoftClient(String token) {
      * 下载
      */
     public Optional<byte[]> download(String... ids) {
-        String url = "https://code.mingsoft.net/code-proxy/people/download.do";
         Map<String, Object> param = new HashMap<>();
         param.put("projectModelIds", String.join(",", ids));
-        param.put("id", Info.PROJECT_ID);
-        param.put("ctgId", Info.CTG_ID);
-        try (HttpResponse response = HttpUtil.createRequest(Method.GET, url)
+        param.put("id", Constant.PROJECT_ID);
+        param.put("ctgId", Constant.CTG_ID);
+        try (HttpResponse response = HttpUtil.createRequest(Method.GET, Constant.MS_DOWNLOAD)
                 .addHeaders(createHeaders())
                 .form(param)
                 .execute()) {
@@ -94,12 +91,11 @@ public record MingsoftClient(String token) {
      * 预览
      */
     public Stream<JSONObject> preview(String id) {
-        String url = "https://code.mingsoft.net/code-proxy/people/mcode/project/view.do";
         Map<String, Object> param = new HashMap<>();
         param.put("projectModelObjectId", id);
-        param.put("id", Info.PROJECT_ID);
-        param.put("ctgId", Info.CTG_ID);
-        try (HttpResponse response = HttpUtil.createRequest(Method.POST, url)
+        param.put("id", Constant.PROJECT_ID);
+        param.put("ctgId", Constant.CTG_ID);
+        try (HttpResponse response = HttpUtil.createRequest(Method.POST, Constant.MS_PRE_VIEW)
                 .addHeaders(createHeaders())
                 .form(param)
                 .execute()) {
@@ -146,11 +142,11 @@ public record MingsoftClient(String token) {
         headers.put("Connection", "keep-alive");
         headers.put("Cookie", "token=" + token);
         headers.put("Pragma", "no-cache");
-        headers.put("Referer", "https://code.mingsoft.net/");
+        headers.put("Referer", Constant.HOST);
         headers.put("Sec-Fetch-Dest", "empty");
         headers.put("Sec-Fetch-Mode", "cors");
         headers.put("Sec-Fetch-Site", "same-origin");
-        headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36");
+        headers.put("User-Agent", Constant.USER_AGENT_WINDOWS_CHROME);
         headers.put("X-Requested-With", "XMLHttpRequest");
         headers.put("sec-ch-ua", "\"Chromium\";v=\"142\", \"Google Chrome\";v=\"142\", \"Not_A Brand\";v=\"99\"");
         headers.put("sec-ch-ua-mobile", "?0");

+ 7 - 7
src/test/java/mingsoft/client/MingsoftData.java

@@ -1,12 +1,11 @@
 package mingsoft.client;
 
-import cn.hutool.core.util.EnumUtil;
 import lombok.Data;
 import lombok.SneakyThrows;
 import lombok.experimental.Accessors;
 
 /**
- * 实体
+ * 业务实体
  *
  * @author hosea
  * @date 2025-12-24
@@ -15,8 +14,8 @@ import lombok.experimental.Accessors;
 @Accessors(chain = true)
 public class MingsoftData implements Cloneable {
     private String id;
-    private String projectId = Info.PROJECT_ID;
-    private String peopleId = Info.PEOPLE_ID;
+    private String projectId = Constant.PROJECT_ID;
+    private String peopleId = Constant.PEOPLE_ID;
     private String pmoName;
     private String pmoObjectName;
     private String pmoTableName;
@@ -52,7 +51,7 @@ public class MingsoftData implements Cloneable {
      * <p>
      * 不会设置ID
      */
-    public MingsoftData info(Info info) {
+    public MingsoftData info(MingsoftDataType info) {
         if (info == null) {
             return this;
         }
@@ -66,7 +65,8 @@ public class MingsoftData implements Cloneable {
     /**
      * 得到类型
      */
-    public Info toInfo() {
-        return EnumUtil.fromStringQuietly(Info.class, getPmoTableName().toUpperCase());
+    public MingsoftDataType toInfo() {
+        return MingsoftDataType.from(getPmoTableName())
+                .orElseThrow(() -> new RuntimeException("不支持业务表:" + getPmoTableName()));
     }
 }

+ 61 - 0
src/test/java/mingsoft/client/MingsoftDataType.java

@@ -0,0 +1,61 @@
+package mingsoft.client;
+
+import cn.hutool.core.util.StrUtil;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+/**
+ * 业务实体类型
+ *
+ * @author hosea
+ * @date 2025-12-24
+ */
+@Getter
+@AllArgsConstructor
+public enum MingsoftDataType {
+    Booth("展位", "BOOTH", "15957"),
+    Exhibition("展会", "EXHIBITION", "15958"),
+    Exhibitor("展商", "EXHIBITOR", "15959"),
+    PeopleInfo("扩展会员信息", "PEOPLE_INFO", "15962"),
+    Enterprise("企业管理", "ENTERPRISE"),
+    Announcement("公告管理", "ANNOUNCEMENT"),
+    InvestmentPromotion("招商管理", "INVESTMENT_PROMOTION"),
+    Recruitment("人才招聘", "RECRUITMENT"),
+    RecruitmentSubmission("招聘投递", "RECRUITMENT_SUBMISSION"),
+    Message("留言", "MESSAGE"),
+    EnterpriseProducts("企业产品", "ENTERPRISE_PRODUCTS"),
+    Design("设计谷", "DESIGN"),
+    BusinessOpportunity("商机对接", "BUSINESS_OPPORTUNITY"),
+    Browse("浏览量", "BROWSE"),
+    BrowseRecords("浏览记录", "BROWSE_RECORDS"),
+    ;
+
+    MingsoftDataType(String name, String table) {
+        this(name, table, null);
+    }
+
+    /**
+     * 名称
+     */
+    private final String name;
+    /**
+     * 表名
+     */
+    private final String table;
+    /**
+     * 表单ID
+     */
+    private final String id;
+
+    /**
+     * 根据表名转换
+     */
+    public static Optional<MingsoftDataType> from(String table) {
+        return Arrays.stream(MingsoftDataType.values())
+                .filter(value -> StrUtil.equalsIgnoreCase(table, value.getTable()))
+                .findFirst();
+    }
+}

+ 10 - 4
src/test/java/mingsoft/client/MingsoftPreView.java

@@ -5,7 +5,7 @@ import lombok.ToString;
 import lombok.experimental.Accessors;
 
 /**
- * 实体类
+ * 预览实体类
  *
  * @author hosea
  * @date 2025-12-24
@@ -13,9 +13,15 @@ import lombok.experimental.Accessors;
 @Data
 @Accessors(chain = true)
 public class MingsoftPreView {
+    private String name;
     @ToString.Exclude
     private String code;
-    private String ctMode;
-    private String name;
-    private Integer sort;
+
+    /**
+     * 得到类型
+     */
+    public MingsoftPreViewType toType() {
+        return MingsoftPreViewType.from(getName())
+                .orElseThrow(() -> new RuntimeException("不支持类型:" + getName()));
+    }
 }

+ 24 - 0
src/test/java/mingsoft/client/MingsoftPreViewMode.java

@@ -0,0 +1,24 @@
+package mingsoft.client;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 预览模式
+ *
+ * @author hosea
+ * @date 2025-12-24
+ */
+@Getter
+@AllArgsConstructor
+public enum MingsoftPreViewMode {
+    Java("text/x-java"),
+    Json("text/x-json"),
+    Vue("text/x-vue"),
+    Xml("text/x-xml"),
+    Js("text/x-js"),
+    SQL("text/sql"),
+    ;
+
+    private final String name;
+}

+ 48 - 0
src/test/java/mingsoft/client/MingsoftPreViewType.java

@@ -0,0 +1,48 @@
+package mingsoft.client;
+
+import cn.hutool.core.util.StrUtil;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+/**
+ * 预览类型
+ *
+ * @author hosea
+ * @date 2025-12-24
+ */
+@Getter
+@AllArgsConstructor
+public enum MingsoftPreViewType {
+    Main("自定义模型", MingsoftPreViewMode.Json),
+    VueList("前端列表", MingsoftPreViewMode.Vue),
+    VueForm("前端表单", MingsoftPreViewMode.Vue),
+    VueZhCN("中文", MingsoftPreViewMode.Js),
+    VueEnUS("英文", MingsoftPreViewMode.Js),
+    Entity("实体类", MingsoftPreViewMode.Java),
+    Action("控制层", MingsoftPreViewMode.Java),
+    Biz("业务层接口", MingsoftPreViewMode.Java),
+    BizImpl("业务层实现", MingsoftPreViewMode.Java),
+    Dao("持久化层", MingsoftPreViewMode.Java),
+    DaoMapper("持久化层xml", MingsoftPreViewMode.Xml),
+    SQL("SQL", MingsoftPreViewMode.SQL),
+    Const("常量类", MingsoftPreViewMode.Java),
+    ResourcesZhCN("resources_zh_CN", MingsoftPreViewMode.Java),
+    ResourcesEnUS("resources_en_US", MingsoftPreViewMode.Java),
+    BaseAction("基础控制层", MingsoftPreViewMode.Java),
+    ;
+
+    private final String name;
+    private final MingsoftPreViewMode mode;
+
+    /**
+     * 根据字符串转换
+     */
+    public static Optional<MingsoftPreViewType> from(String str) {
+        return Arrays.stream(MingsoftPreViewType.values())
+                .filter(value -> StrUtil.equalsIgnoreCase(str, value.getName()))
+                .findFirst();
+    }
+}