context, String key) {
+ if (context == null || key == null) {
+ return "";
+ }
+ Object value = context.get(key);
+ return value == null ? "" : value.toString();
+ }
+
/**
* 构造 entry 路径;遇到重名时加 _1 / _2 ...
*/
diff --git a/src/main/java/com/softdev/system/generator/util/HeritageUtil.java b/src/main/java/com/softdev/system/generator/util/HeritageUtil.java
new file mode 100644
index 0000000..0c515f5
--- /dev/null
+++ b/src/main/java/com/softdev/system/generator/util/HeritageUtil.java
@@ -0,0 +1,131 @@
+package com.softdev.system.generator.util;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 🏺 非遗传承工具:为生成的代码加盖手作印章,并生成手工代码认证书
+ *
+ * 在 AI vibe coding 的时代,每一行模板都坚持手搓,致敬古法编程非遗传承者。
+ *
+ * @author zhengkai.blog.csdn.net
+ */
+public final class HeritageUtil {
+
+ private static final String LINE_1 = "🏺 古法编程·非遗传承 | Traditional Code Craft since 2018";
+ private static final String LINE_2 = "本代码由手作模板工艺生成,非 AI vibe coding 之作 | Handcrafted, not AI-generated.";
+
+ private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+ private HeritageUtil() {
+ }
+
+ /**
+ * isHeritage 是否启用;未显式关闭(false)时默认开启
+ */
+ public static boolean isEnabled(Map params) {
+ Object flag = params == null ? null : params.get("isHeritage");
+ return flag == null || Boolean.TRUE.equals(flag) || "true".equalsIgnoreCase(String.valueOf(flag));
+ }
+
+ /**
+ * 在文件头部盖手作印章;JSON 等不支持注释的文件类型原样返回
+ *
+ * @param fileName 模板配置中的目标文件名(用于推断注释语法,可能不准,仅作兜底)
+ * @param content 生成的代码文本
+ */
+ public static String stamp(String fileName, String content) {
+ if (content == null || content.isEmpty()) {
+ return content;
+ }
+ // 内容嗅探优先:模板配置的 fileName 可能与实际内容类型不符(如 mapper 标为 .java 实为 XML)
+ String trimmed = content.trim();
+ if (trimmed.startsWith("<")) {
+ return stampAsXmlComment(content);
+ }
+ if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
+ return content;
+ }
+ switch (extensionOf(fileName)) {
+ case "java":
+ case "jjs":
+ case "js":
+ case "qvs":
+ return "// " + LINE_1 + "\n// " + LINE_2 + "\n" + content;
+ case "sql":
+ return "-- " + LINE_1 + "\n-- " + LINE_2 + "\n" + content;
+ case "yml":
+ case "yaml":
+ case "properties":
+ case "txt":
+ return "# " + LINE_1 + "\n# " + LINE_2 + "\n" + content;
+ case "xml":
+ case "html":
+ case "vue":
+ case "md":
+ return stampAsXmlComment(content);
+ default:
+ return content;
+ }
+ }
+
+ /**
+ * 手工代码认证书(ZIP 彩蛋)
+ */
+ public static String buildCertificate(String className, String tableName, String author, List templateNames) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("🏺 手工代码认证书\n");
+ sb.append("CERTIFICATE OF HANDCRAFTED CODE\n");
+ sb.append("================================================================\n\n");
+ sb.append("兹证明\n\n");
+ sb.append(" ").append(safe(className)).append("(表 ").append(safe(tableName)).append(")的 ")
+ .append(templateNames == null ? 0 : templateNames.size()).append(" 份代码\n");
+ sb.append(" 均由「古法编程·非遗传承」工艺生成。\n\n");
+ sb.append("模板清单:\n");
+ if (templateNames != null) {
+ for (String name : templateNames) {
+ sb.append(" · ").append(name).append('\n');
+ }
+ }
+ sb.append('\n');
+ sb.append("工匠:").append(author == null || author.trim().isEmpty() ? "Anonymous" : author.trim()).append('\n');
+ sb.append("时间:").append(LocalDateTime.now().format(TIME_FORMATTER)).append('\n');
+ sb.append("工艺:Freemarker 手作模板 + 自研/JSqlParser 双解析引擎\n\n");
+ sb.append("在 AI vibe coding 的时代,\n");
+ sb.append("每一行模板都坚持手搓。\n");
+ sb.append("—— 致敬所有古法编程非遗传承者 🙏\n\n");
+ sb.append("Powered by SpringBootCodeGenerator (2018 - 至今)\n");
+ sb.append("https://github.com/moshowgame/SpringBootCodeGenerator/\n");
+ return sb.toString();
+ }
+
+ /**
+ * XML 声明必须位于文档最前,印章插在声明之后
+ */
+ private static String stampAsXmlComment(String content) {
+ if (content.startsWith("");
+ if (end > 0) {
+ String prolog = content.substring(0, end + 2) + "\n";
+ return prolog + "\n" + content.substring(end + 2);
+ }
+ }
+ return "\n" + content;
+ }
+
+ private static String extensionOf(String fileName) {
+ if (fileName == null) {
+ return "";
+ }
+ String lower = fileName.toLowerCase();
+ int dot = lower.lastIndexOf('.');
+ return dot < 0 ? "" : lower.substring(dot + 1);
+ }
+
+ private static String safe(String value) {
+ return value == null ? "" : value;
+ }
+
+}
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index fdcf712..3a34549 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -51,11 +51,11 @@ OEM:
header: SQL转Java JPA、MYBATIS实现类代码生成平台
keywords: sql转实体类,sql转DAO,SQL转service,SQL转JPA实现,SQL转MYBATIS实现
title: 大狼狗代码生成器
- slogan: 👐 Free your hands from boring CRUD—let the code write itself! ⚡
+ slogan: 🏺 古法编程·非遗传承 | Free your hands from boring CRUD! ⚡
description: 💻 SpringBootCodeGenerator,又名 `大狼狗代码生成器`🐺🐶,支持 SQL 一键转 JAVA/JPA/Mybatis/MybatisPlus 等多种模板,轻松搞定 CRUD,彻底解放双手 ✋!只需提供 DDL、SELECT SQL 或简单 JSON 👉 即可生成 生成JPA/JdbcTemplate/Mybatis/MybatisPlus/BeetlSQL/CommonMapper 等代码模板。
🔥🔥🔥 全新 JSqlParser 引擎上线,强力支持 DDL CREATE SQL与 SELECT SQL 解析!欢迎体验 & 反馈 💬!
👨💻 面向开发者的高效利器,已服务数万工程师,欢迎 Star ⭐、Fork 🍴、提 Issue 💬,一起打造更强大的代码生成平台!
author: zhengkai.blog.csdn.net
packageName: com.software.system
- copyright: ✨ Powered by Moshow郑锴 — may the holy light guide your code, your coffee, and your commits! ⚡🧙♂️💻
+ copyright: 🏺 Powered by Moshow郑锴 — 愿你在 AI 时代,既有工具的效率,也有匠人的定力 🙏
returnUtilSuccess: ResponseUtil.success
returnUtilFailure: ResponseUtil.error
outputStr: http://zhengkai.blog.csdn.net
diff --git a/src/main/resources/template.json b/src/main/resources/template.json
index 7667f83..8770e99 100644
--- a/src/main/resources/template.json
+++ b/src/main/resources/template.json
@@ -3,9 +3,9 @@
"tier": "main",
"templates": [{
"id": "10",
- "name": "swagger-ui",
- "description": "swagger-ui",
- "fileName": "swagger-ui.json"
+ "name": "swagger-ui",
+ "description": "swagger-ui",
+ "fileName": "swagger-ui.java"
},
{
"id": "11",
@@ -183,7 +183,7 @@
"id": "70",
"name": "beanutil",
"description": "beanutil",
- "fileName": "${className}BeanUtil.txt"
+ "fileName": "${className}BeanUtil.java"
},
{
"id": "71",
@@ -313,7 +313,7 @@
"id": "201",
"name": "qliksense",
"description": "qlik sense",
- "fileName": "qliksense.txt"
+ "fileName": "qliksense.qvs"
}]
},
{