diff --git a/addons/official/view/web/official_home/index.html b/addons/official/view/web/official_home/index.html
index abe6a66..ffcd6be 100644
--- a/addons/official/view/web/official_home/index.html
+++ b/addons/official/view/web/official_home/index.html
@@ -852,7 +852,16 @@
{if !empty($art['image'])}
{else/}
-
diff --git a/public/assets/addons/official/images/articles/article_ai_agent.svg b/public/assets/addons/official/images/articles/article_ai_agent.svg
index e087b6e..7d977da 100644
--- a/public/assets/addons/official/images/articles/article_ai_agent.svg
+++ b/public/assets/addons/official/images/articles/article_ai_agent.svg
@@ -18,8 +18,8 @@
-
-
+
+
@@ -28,7 +28,7 @@
-
+
@@ -48,15 +48,17 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/articles/article_cache.svg b/public/assets/addons/official/images/articles/article_cache.svg
new file mode 100644
index 0000000..50c7f9a
--- /dev/null
+++ b/public/assets/addons/official/images/articles/article_cache.svg
@@ -0,0 +1,63 @@
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/articles/article_cross_app.svg b/public/assets/addons/official/images/articles/article_cross_app.svg
index 496d118..90ab9c5 100644
--- a/public/assets/addons/official/images/articles/article_cross_app.svg
+++ b/public/assets/addons/official/images/articles/article_cross_app.svg
@@ -18,8 +18,8 @@
-
-
+
+
@@ -28,7 +28,7 @@
-
+
@@ -54,13 +54,12 @@
-
-
-
-
+
+
+
-
-
+
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/articles/article_erp_bom.svg b/public/assets/addons/official/images/articles/article_erp_bom.svg
index d572647..b214136 100644
--- a/public/assets/addons/official/images/articles/article_erp_bom.svg
+++ b/public/assets/addons/official/images/articles/article_erp_bom.svg
@@ -18,8 +18,8 @@
-
-
+
+
@@ -28,7 +28,7 @@
-
+
@@ -42,29 +42,24 @@
- 准
+ 构
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/articles/article_microservice.svg b/public/assets/addons/official/images/articles/article_microservice.svg
index d0b6f48..facd4de 100644
--- a/public/assets/addons/official/images/articles/article_microservice.svg
+++ b/public/assets/addons/official/images/articles/article_microservice.svg
@@ -18,8 +18,8 @@
-
-
+
+
@@ -28,7 +28,7 @@
-
+
diff --git a/public/assets/addons/official/images/articles/article_mysql_page.svg b/public/assets/addons/official/images/articles/article_mysql_page.svg
new file mode 100644
index 0000000..8013ec7
--- /dev/null
+++ b/public/assets/addons/official/images/articles/article_mysql_page.svg
@@ -0,0 +1,71 @@
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/articles/article_pos_offline.svg b/public/assets/addons/official/images/articles/article_pos_offline.svg
index 9654322..9f43dae 100644
--- a/public/assets/addons/official/images/articles/article_pos_offline.svg
+++ b/public/assets/addons/official/images/articles/article_pos_offline.svg
@@ -18,8 +18,8 @@
-
-
+
+
@@ -28,7 +28,7 @@
-
+
@@ -42,21 +42,21 @@
- 笃
+ 核
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/articles/article_redis_split.svg b/public/assets/addons/official/images/articles/article_redis_split.svg
new file mode 100644
index 0000000..7779d3e
--- /dev/null
+++ b/public/assets/addons/official/images/articles/article_redis_split.svg
@@ -0,0 +1,71 @@
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/articles/article_security_whitepaper.svg b/public/assets/addons/official/images/articles/article_security_whitepaper.svg
index a410898..e4d7d76 100644
--- a/public/assets/addons/official/images/articles/article_security_whitepaper.svg
+++ b/public/assets/addons/official/images/articles/article_security_whitepaper.svg
@@ -18,8 +18,8 @@
-
-
+
+
@@ -28,7 +28,7 @@
-
+
@@ -42,23 +42,16 @@
- 安
+ 固
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/articles/article_southwest_digital.svg b/public/assets/addons/official/images/articles/article_southwest_digital.svg
index 7e9fa35..5dc1ef9 100644
--- a/public/assets/addons/official/images/articles/article_southwest_digital.svg
+++ b/public/assets/addons/official/images/articles/article_southwest_digital.svg
@@ -18,8 +18,8 @@
-
-
+
+
@@ -28,7 +28,7 @@
-
+
@@ -48,26 +48,11 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/articles/article_tdd_standards.svg b/public/assets/addons/official/images/articles/article_tdd_standards.svg
index fc018d2..dc3b49d 100644
--- a/public/assets/addons/official/images/articles/article_tdd_standards.svg
+++ b/public/assets/addons/official/images/articles/article_tdd_standards.svg
@@ -18,8 +18,8 @@
-
-
+
+
@@ -28,7 +28,7 @@
-
+
@@ -42,27 +42,17 @@
- 律
+ 规
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/articles/article_xxl_job.svg b/public/assets/addons/official/images/articles/article_xxl_job.svg
new file mode 100644
index 0000000..4a9cf47
--- /dev/null
+++ b/public/assets/addons/official/images/articles/article_xxl_job.svg
@@ -0,0 +1,69 @@
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/showcases/case_catering.svg b/public/assets/addons/official/images/showcases/case_catering.svg
index 9d29f62..56eba9f 100644
--- a/public/assets/addons/official/images/showcases/case_catering.svg
+++ b/public/assets/addons/official/images/showcases/case_catering.svg
@@ -18,18 +18,23 @@
-
-
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
@@ -47,30 +52,34 @@
-
-
+
+
+
-
-
-
-
+
+
+
+
+
-
-
-
-
+
+
+
+
+
-
-
+
+
+
-
-
+
+
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/showcases/case_distrib.svg b/public/assets/addons/official/images/showcases/case_distrib.svg
index 424dd0e..05c8d6b 100644
--- a/public/assets/addons/official/images/showcases/case_distrib.svg
+++ b/public/assets/addons/official/images/showcases/case_distrib.svg
@@ -18,18 +18,23 @@
-
-
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
@@ -47,37 +52,43 @@
-
+
+
-
-
-
-
+
+
+
+
+
-
-
-
-
+
+
+
+
+
-
-
-
-
+
+
+
+
+
-
-
-
-
+
+
+
+
+
-
-
-
-
+
+
+
+
-
+
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/showcases/case_gov_agent.svg b/public/assets/addons/official/images/showcases/case_gov_agent.svg
index 31e8648..c557e8e 100644
--- a/public/assets/addons/official/images/showcases/case_gov_agent.svg
+++ b/public/assets/addons/official/images/showcases/case_gov_agent.svg
@@ -18,18 +18,23 @@
-
-
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
@@ -47,23 +52,27 @@
-
-
+
+
+
-
-
+
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/showcases/case_manufacture.svg b/public/assets/addons/official/images/showcases/case_manufacture.svg
index 2ba6453..411b3e7 100644
--- a/public/assets/addons/official/images/showcases/case_manufacture.svg
+++ b/public/assets/addons/official/images/showcases/case_manufacture.svg
@@ -18,18 +18,23 @@
-
-
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
@@ -47,25 +52,29 @@
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/showcases/product_erp.svg b/public/assets/addons/official/images/showcases/product_erp.svg
index ea8e29a..23ac037 100644
--- a/public/assets/addons/official/images/showcases/product_erp.svg
+++ b/public/assets/addons/official/images/showcases/product_erp.svg
@@ -18,18 +18,23 @@
-
-
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
@@ -47,34 +52,38 @@
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
+
-
-
+
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/showcases/product_mall.svg b/public/assets/addons/official/images/showcases/product_mall.svg
index 64958d6..5223fc7 100644
--- a/public/assets/addons/official/images/showcases/product_mall.svg
+++ b/public/assets/addons/official/images/showcases/product_mall.svg
@@ -18,18 +18,23 @@
-
-
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
@@ -47,42 +52,49 @@
-
+
+
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
+
-
-
-
-
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
-
-
-
+
+
+
+
-
-
+
+
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/showcases/product_pos.svg b/public/assets/addons/official/images/showcases/product_pos.svg
index 8096d4b..753d388 100644
--- a/public/assets/addons/official/images/showcases/product_pos.svg
+++ b/public/assets/addons/official/images/showcases/product_pos.svg
@@ -18,18 +18,23 @@
-
-
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
@@ -47,26 +52,30 @@
-
-
-
+
+
+
+
-
-
+
+
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
-
-
+
+
+
-
-
+
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/showcases/product_saas.svg b/public/assets/addons/official/images/showcases/product_saas.svg
index 2093590..a73200b 100644
--- a/public/assets/addons/official/images/showcases/product_saas.svg
+++ b/public/assets/addons/official/images/showcases/product_saas.svg
@@ -18,18 +18,23 @@
-
-
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
@@ -47,35 +52,40 @@
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
-
-
-
+
+
+
+
-
-
+
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/showcases/service_agent.svg b/public/assets/addons/official/images/showcases/service_agent.svg
index c4670ed..ea01d9a 100644
--- a/public/assets/addons/official/images/showcases/service_agent.svg
+++ b/public/assets/addons/official/images/showcases/service_agent.svg
@@ -18,18 +18,23 @@
-
-
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
@@ -47,37 +52,36 @@
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/showcases/service_app.svg b/public/assets/addons/official/images/showcases/service_app.svg
index e9617af..3402613 100644
--- a/public/assets/addons/official/images/showcases/service_app.svg
+++ b/public/assets/addons/official/images/showcases/service_app.svg
@@ -18,18 +18,23 @@
-
-
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
@@ -47,35 +52,37 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/assets/addons/official/images/showcases/service_middle.svg b/public/assets/addons/official/images/showcases/service_middle.svg
index 7eede68..67b4c43 100644
--- a/public/assets/addons/official/images/showcases/service_middle.svg
+++ b/public/assets/addons/official/images/showcases/service_middle.svg
@@ -18,18 +18,23 @@
-
-
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
@@ -47,49 +52,60 @@
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/generate_article_covers.py b/tests/generate_article_covers.py
index ae5379c..0ca1e98 100644
--- a/tests/generate_article_covers.py
+++ b/tests/generate_article_covers.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
"""
-生成文章资讯专属现代中式极简矢量封面图 (Concise Article Covers Generator)
+生成文章资讯专属现代中式极简矢量封面图 (Concise & Advanced Article Covers Generator)
彻底杜绝文字介绍类图片,纯粹以现代中式浅色专业风空间几何、流光、细线窗棂与单字印章呈现。
尺寸 600x380,浅色专业底色 #FFFFFF / #F8FAFC,主色 #2563EB,辅色 #06B6D4 / #7C3AED。
"""
@@ -28,8 +28,8 @@ COMMON_DEFS = '''
-
-
+
+
@@ -38,7 +38,7 @@ COMMON_DEFS = '''
-
+
'''
@@ -70,7 +70,86 @@ def create_base_svg(seal_char, visual_elements):
'''
articles = {
- # 1. 微服务分布式事务
+ # 首页 4 篇技术深度文章专属抽象封面
+ # 1. 缓存穿透、击穿与雪崩《三阶重滤与抗压漏斗》
+ 'article_cache.svg': ('盾', '''
+
+
+
+
+
+
+
+
+
+
+ '''),
+
+ # 2. MySQL LIMIT 深度分页《B+Tree 跳跃指针与延迟关联》
+ 'article_mysql_page.svg': ('跃', '''
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ '''),
+
+ # 3. XXL-JOB 分布式分片广播《全域广播与等距波纹》
+ 'article_xxl_job.svg': ('播', '''
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ '''),
+
+ # 4. Redis 集群脑裂防御《双子星隔离与法定仲裁》
+ 'article_redis_split.svg': ('防', '''
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ '''),
+
+ # 既有文章 8 篇
'article_microservice.svg': ('枢', '''
@@ -91,7 +170,6 @@ articles = {
'''),
- # 2. 跨端APP与小程序
'article_cross_app.svg': ('端', '''
@@ -99,128 +177,86 @@ articles = {
-
-
-
-
+
+
+
-
-
+
+
'''),
- # 3. 私域AI智能体落地
'article_ai_agent.svg': ('智', '''
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
'''),
- # 4. 断网离线收银
- 'article_pos_offline.svg': ('笃', '''
-
-
-
-
-
-
-
-
-
+ 'article_pos_offline.svg': ('核', '''
+
+
+
+
+
+
+
+
+
'''),
- # 5. 进销存BOM物料匹配
- 'article_erp_bom.svg': ('准', '''
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- '''),
-
- # 6. 安全合规白皮书
- 'article_security_whitepaper.svg': ('安', '''
-
-
-
-
-
-
-
-
-
-
-
- '''),
-
- # 7. 数字化转型路径
- 'article_southwest_digital.svg': ('融', '''
-
+ 'article_erp_bom.svg': ('构', '''
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
'''),
- # 8. TDD 工程规范
- 'article_tdd_standards.svg': ('律', '''
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ''')
+ 'article_security_whitepaper.svg': ('固', '''
+
+
+
+
+ '''),
+
+ 'article_southwest_digital.svg': ('融', '''
+
+
+
+
+
+ '''),
+
+ 'article_tdd_standards.svg': ('规', '''
+
+
+
+
+
+ '''),
}
-def generate_all_articles():
- for fname, (seal, vis) in articles.items():
- content = create_base_svg(seal, vis)
- path = os.path.join(TARGET_DIR, fname)
- with open(path, 'w', encoding='utf-8') as f:
- f.write(content.strip())
- print(f"Generated concise article cover: {fname} ({len(content)} bytes)")
+def generate_all():
+ for filename, (seal_char, elements) in articles.items():
+ svg_content = create_base_svg(seal_char, elements)
+ filepath = os.path.join(TARGET_DIR, filename)
+ with open(filepath, 'w', encoding='utf-8') as f:
+ f.write(svg_content.strip())
+ print(f"Generated concise article cover: {filename} ({len(svg_content)} bytes)")
if __name__ == '__main__':
- generate_all_articles()
+ generate_all()
diff --git a/tests/generate_showcases.py b/tests/generate_showcases.py
index 7912c3b..3e780f2 100644
--- a/tests/generate_showcases.py
+++ b/tests/generate_showcases.py
@@ -1,14 +1,14 @@
# -*- coding: utf-8 -*-
"""
-企业级现代中式浅色专业风矢量配图生成引擎 (Concise Visual Showcases Generator)
+企业级现代中式浅色专业风矢量配图生成引擎 (Advanced Modern Sino-Tech Abstract Visuals Generator)
设计准则:
-1. 视觉简洁纯粹:彻底摒弃“文字介绍类图片”模式,不包含任何长篇功能描述、业务参数、假数据表格或架构长文。
+1. 纯粹高级抽象设计:彻底摒弃生成的虚假后台/假大屏界面,杜绝纯文字介绍类图片,纯粹以现代中式工程美学几何、拓扑、流光与留白呈现。
2. 现代中式浅色专业风:
- - 背景:#FFFFFF 至 #F8FAFC 极净浅色底,点缀 0.75px 雅致东方窗棂微网格
- - 主色:#2563EB 科技蓝
+ - 背景:#FFFFFF 至 #F8FAFC 浅色专业底基,融入 0.75px 雅致东方窗棂微网格
+ - 主色:#2563EB 科技蓝(含 #1D4ED8, #3B82F6 渐变)
- 辅色:#06B6D4 沉静青、#7C3AED 优雅紫
- - 东方意境:大留白、细线构图、多维空间微几何体、纯粹光影层次
- - 印章点缀:仅在右上角保留一枚精致小巧的朱砂印章微标(仅 1 个单字),作为东方文化印记,无任何冗余文字。
+ - 材质与光影:半透明磨砂亚克力几何切片、微透视等轴测空间(Isometric)、柔和阴影与高亮流光节点
+ - 东方印记:右上角保留一枚极简精致小巧的朱砂印章微标(仅 1 个单字),作为东方文化印记,无任何冗余文字。
"""
import os
@@ -34,18 +34,23 @@ COMMON_DEFS = '''
-
-
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
'''
@@ -58,7 +63,7 @@ def make_seal(x, y, char):
'''
-# 1. 软件开发
+# 1. 服务:软件开发《榫卯解耦 · 微服务立方拓扑》
def build_service_middle():
return f''''''
-# 2. APP与小程序
+# 2. 服务:APP与小程序定制《多轨天体 · 动量同频》
def build_service_app():
return f''''''
-# 3. 智能体开发
+# 3. 服务:智能体开发《方圆之镜 · 多维向量星云》
def build_service_agent():
return f''''''
-# 4. 商城系统
+# 4. 产品:全场景商城《脉络分发 · 裂变星芒》
def build_product_mall():
return f''''''
-# 5. 收银系统
+# 5. 产品:智能商业收银《双核咬合 · 确定性时钟》
def build_product_pos():
return f''''''
-# 6. 进销存系统
+# 6. 产品:全链路进销存《晶格仓位 · 动态流向轴》
def build_product_erp():
return f''''''
-# 7. SaaS版本
+# 7. 产品:云原生 SaaS《多层平行切片 · 悬浮架构》
def build_product_saas():
return f''''''
-# 8. 案例 1
+# 8. 案例:大型快消供应链《经纬枢纽 · 吞吐波峰》
def build_case_distrib():
return f''''''
-# 9. 案例 2
+# 9. 案例:知名连锁餐饮《双态对称 · 永续无阻》
def build_case_catering():
return f''''''
-# 10. 案例 3
+# 10. 案例:高端装备制造《分形树状晶体 · 精密咬合》
def build_case_manufacture():
return f''''''
-# 11. 案例 4
+# 11. 案例:政务智能体《密闭结界 · 智慧光芒》
def build_case_gov_agent():
return f''''''
@@ -582,7 +637,7 @@ def generate_all():
filepath = os.path.join(TARGET_DIR, filename)
with open(filepath, 'w', encoding='utf-8') as f:
f.write(content.strip())
- print(f"Generated concise showcase: {filename} ({len(content)} bytes)")
+ print(f"Generated advanced abstract showcase: {filename} ({len(content)} bytes)")
if __name__ == '__main__':
generate_all()
diff --git a/tests/test_advanced_abstract_visuals.py b/tests/test_advanced_abstract_visuals.py
new file mode 100644
index 0000000..26babfb
--- /dev/null
+++ b/tests/test_advanced_abstract_visuals.py
@@ -0,0 +1,135 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+现代中式科技高级抽象配图自动化测试 (TDD - Test-Driven Development)
+测试验证重点:
+1. 纯粹高级抽象设计:杜绝伪造的假界面截图,杜绝纯文字介绍类图片,必须为严谨抽象的工程美学图形。
+2. 艺术质感与层次:具备空间结构(渐变、阴影、微透视、细线窗棂纹理等),杜绝单薄空洞的简陋圆圈。
+3. 现代中式浅色规范:背景为 #FFFFFF / #F8FAFC / #EFF6FF 浅色基调,主色 #2563EB 科技蓝,辅以 #06B6D4 青、#7C3AED 紫,克制朱砂印章。
+4. 全站展示图集与技术文章封面完整性与 SVG 语法闭合。
+5. 首页模板技术文章包含抽象封面的优雅 Fallback 机制。
+"""
+
+import os
+import re
+import unittest
+
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+
+class AdvancedAbstractVisualsTest(unittest.TestCase):
+ def setUp(self):
+ self.showcases_dir = os.path.join(BASE_DIR, 'public', 'assets', 'addons', 'official', 'images', 'showcases')
+ self.articles_dir = os.path.join(BASE_DIR, 'public', 'assets', 'addons', 'official', 'images', 'articles')
+ self.home_tpl_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_home', 'index.html')
+
+ # 4大产品抽象图
+ self.product_files = [
+ 'product_mall.svg',
+ 'product_pos.svg',
+ 'product_erp.svg',
+ 'product_saas.svg'
+ ]
+
+ # 4大标杆案例抽象图
+ self.case_files = [
+ 'case_distrib.svg',
+ 'case_catering.svg',
+ 'case_manufacture.svg',
+ 'case_gov_agent.svg'
+ ]
+
+ # 3大核心服务抽象图
+ self.service_files = [
+ 'service_middle.svg',
+ 'service_app.svg',
+ 'service_agent.svg'
+ ]
+
+ # 4篇核心技术文章抽象封面
+ self.article_files = [
+ 'article_microservice.svg',
+ 'article_tdd_standards.svg',
+ 'article_cross_app.svg',
+ 'article_security_whitepaper.svg'
+ ]
+
+ def test_01_all_files_exist_and_valid_svg(self):
+ """所有抽象视觉文件必须完整存在且具备合法的 SVG 闭合标签与 viewBox"""
+ all_files = self.product_files + self.case_files + self.service_files
+ for fname in all_files:
+ fpath = os.path.join(self.showcases_dir, fname)
+ self.assertTrue(os.path.isfile(fpath), f"抽象视觉图必须存在: {fname}")
+ with open(fpath, 'r', encoding='utf-8') as f:
+ content = f.read().strip()
+ self.assertTrue(content.startswith(' 闭合")
+ self.assertIn('viewBox', content, f"{fname} 必须指定 viewBox 属性")
+
+ def test_02_abstract_visual_richness_and_depth(self):
+ """抽象图必须具有空间深度与现代科技美感,不应是单薄粗糙的几个圆圈"""
+ all_files = self.product_files + self.case_files + self.service_files
+ for fname in all_files:
+ fpath = os.path.join(self.showcases_dir, fname)
+ with open(fpath, 'r', encoding='utf-8') as f:
+ content = f.read()
+
+ # 必须具有渐变或滤镜定义以实现高质感光影与空间层次
+ has_depth = ('linearGradient' in content or 'radialGradient' in content) and \
+ ('feDropShadow' in content or 'feGaussianBlur' in content or 'filter' in content)
+ self.assertTrue(has_depth, f"{fname} 必须具备光影渐变或阴影滤镜,体现空间深度与高级感")
+
+ # 必须具有现代中式窗棂细线背景图案
+ self.assertIn('lattice', content, f"{fname} 必须融入现代中式窗棂几何微网格底纹")
+
+ # 代码大小合理(高质量矢量图通常在 3KB ~ 15KB,兼顾精细度与加载性能)
+ size_kb = len(content) / 1024
+ self.assertTrue(2.0 <= size_kb <= 25.0, f"{fname} 大小需适中 ({size_kb:.2f}KB),兼顾丰富度与性能")
+
+ def test_03_color_and_seal_constraints(self):
+ """抽象图形必须遵循配色规范(科技蓝主色,浅色底,克制印章)"""
+ all_files = self.product_files + self.case_files + self.service_files
+ text_regex = re.compile(r']*>(.*?)', re.DOTALL | re.IGNORECASE)
+ for fname in all_files:
+ fpath = os.path.join(self.showcases_dir, fname)
+ with open(fpath, 'r', encoding='utf-8') as f:
+ content = f.read()
+
+ # 主色必须包含品牌科技蓝 #2563EB / #1D4ED8
+ self.assertTrue(
+ '#2563EB' in content or '#1D4ED8' in content,
+ f"{fname} 必须包含科技蓝规范主色"
+ )
+
+ # 浅色底基
+ self.assertTrue(
+ '#FFFFFF' in content or '#F8FAFC' in content or '#EFF6FF' in content,
+ f"{fname} 必须使用浅色专业风底基"
+ )
+
+ # 文字数量约束:≤ 1 个字符(仅允许一个单字印章或完全无字纯抽象图形)
+ matches = text_regex.findall(content)
+ clean_texts = [re.sub(r'<[^>]+>', '', m).strip() for m in matches if m.strip()]
+ self.assertLessEqual(len(clean_texts), 1, f"{fname} 文字不可超过1个字符(杜绝伪造假界面,保持纯粹抽象): {clean_texts}")
+
+ def test_04_articles_abstract_covers_exist(self):
+ """核心技术文章必须具备专属抽象科技线稿封面"""
+ self.assertTrue(os.path.isdir(self.articles_dir), "articles 目录必须存在")
+ for fname in self.article_files:
+ fpath = os.path.join(self.articles_dir, fname)
+ self.assertTrue(os.path.isfile(fpath), f"文章封面抽象图必须存在: {fname}")
+ with open(fpath, 'r', encoding='utf-8') as f:
+ content = f.read().strip()
+ self.assertTrue(content.startswith(' ', content, "首页模板不应直接显示带有灰色背景的纯文字方块,应替换为优雅抽象封面")
+
+if __name__ == '__main__':
+ unittest.main()