feat:所有页面重做优化

This commit is contained in:
liulong 2026-05-24 10:55:36 +08:00
parent 48f89684ed
commit 6f174c20e7
27 changed files with 5188 additions and 1924 deletions

View File

@ -0,0 +1,479 @@
{
"name": "碳信网-正式设计稿",
"lastModified": "2026-05-23T10:49:08Z",
"thumbnailUrl": "https://s3-alpha.figma.com/thumbnails/61f20188-408f-4871-98c7-92cf0c72d7d6?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Credential=AKIAQ4GOSFWCUPUXLFMB%2F20260521%2Fus-west-2%2Fs3%2Faws4_request\u0026X-Amz-Date=20260521T000000Z\u0026X-Amz-Expires=604800\u0026X-Amz-SignedHeaders=host\u0026X-Amz-Signature=b67e1be98b6a995b838bd4659abe85ac296d99ccc5ebb6f9bec5dec64cdd8d34",
"version": "2356712417208056783",
"role": "editor",
"editorType": "figma",
"linkAccess": "view",
"nodes": {
"150622:19115": {
"document": {
"id": "150622:19115",
"name": "banner-bg",
"type": "FRAME",
"scrollBehavior": "SCROLLS",
"children": [
{
"id": "150622:19116",
"name": "轮播背景",
"visible": false,
"type": "GROUP",
"scrollBehavior": "SCROLLS",
"children": [
{
"id": "150622:19117",
"name": "轮播图",
"visible": false,
"type": "RECTANGLE",
"scrollBehavior": "SCROLLS",
"blendMode": "PASS_THROUGH",
"fills": [
"@{blendMode=NORMAL; type=IMAGE; scaleMode=FILL; imageRef=58751fea63b49a07308d7b2b993b5637578504f1}",
"@{blendMode=NORMAL; visible=False; type=GRADIENT_LINEAR; gradientHandlePositions=System.Object[]; gradientStops=System.Object[]}"
],
"strokes": [
],
"strokeWeight": 1.0,
"strokeAlign": "INSIDE",
"absoluteBoundingBox": {
"x": -5750.6093750,
"y": 2851.3713378906250,
"width": 725.21246337890625,
"height": 237.960449218750
},
"absoluteRenderBounds": null,
"preserveRatio": true,
"targetAspectRatio": {
"x": 1920.0,
"y": 630.0
},
"constraints": {
"vertical": "CENTER",
"horizontal": "CENTER"
},
"effects": [
],
"interactions": [
],
"complexStrokeProperties": {
"strokeType": "BASIC"
}
},
{
"id": "150622:19118",
"name": "图层 1 1",
"type": "RECTANGLE",
"scrollBehavior": "SCROLLS",
"blendMode": "PASS_THROUGH",
"fills": [
"@{blendMode=NORMAL; type=IMAGE; scaleMode=FIT; imageRef=1846bf7c8552900a6aa81501b26c6bd000a6b090}"
],
"strokes": [
],
"strokeWeight": 1.0,
"strokeAlign": "INSIDE",
"absoluteBoundingBox": {
"x": -5783.0,
"y": 2828.0,
"width": 1440.0,
"height": 617.0
},
"absoluteRenderBounds": null,
"preserveRatio": true,
"targetAspectRatio": {
"x": 4096.0,
"y": 1755.0
},
"constraints": {
"vertical": "TOP",
"horizontal": "LEFT"
},
"effects": [
],
"interactions": [
],
"complexStrokeProperties": {
"strokeType": "BASIC"
}
},
{
"id": "150622:19119",
"name": "image 68",
"type": "RECTANGLE",
"scrollBehavior": "SCROLLS",
"blendMode": "PASS_THROUGH",
"fills": [
"@{blendMode=NORMAL; type=IMAGE; scaleMode=FILL; imageRef=f93f77317801ca8cd07e66f0aee7b2c6966f4e79}"
],
"strokes": [
],
"strokeWeight": 1.0,
"strokeAlign": "INSIDE",
"absoluteBoundingBox": {
"x": -5783.0,
"y": 2837.0,
"width": 1440.0,
"height": 450.0
},
"absoluteRenderBounds": null,
"preserveRatio": true,
"targetAspectRatio": {
"x": 1200.0,
"y": 375.0
},
"constraints": {
"vertical": "TOP",
"horizontal": "LEFT"
},
"effects": [
],
"interactions": [
],
"complexStrokeProperties": {
"strokeType": "BASIC"
}
}
],
"blendMode": "PASS_THROUGH",
"clipsContent": false,
"background": [
],
"fills": [
],
"strokes": [
],
"strokeWeight": 1.0,
"strokeAlign": "INSIDE",
"backgroundColor": {
"r": 0.0,
"g": 0.0,
"b": 0.0,
"a": 0.0
},
"absoluteBoundingBox": {
"x": -5783.0,
"y": 2828.0,
"width": 1440.0,
"height": 617.0
},
"absoluteRenderBounds": null,
"targetAspectRatio": {
"x": 1440.0,
"y": 617.0
},
"constraints": {
"vertical": "TOP",
"horizontal": "CENTER"
},
"layoutAlign": "INHERIT",
"layoutGrow": 0.0,
"layoutPositioning": "ABSOLUTE",
"layoutSizingHorizontal": "FIXED",
"layoutSizingVertical": "FIXED",
"exportSettings": [
{
"suffix": "",
"format": "PNG",
"constraint": {
"type": "SCALE",
"value": 1.0
}
},
{
"suffix": "@2x",
"format": "PNG",
"constraint": {
"type": "SCALE",
"value": 2.0
}
}
],
"effects": [
],
"interactions": [
],
"complexStrokeProperties": {
"strokeType": "BASIC"
}
},
{
"id": "150622:19144",
"name": "Frame 299",
"type": "FRAME",
"scrollBehavior": "SCROLLS",
"children": [
{
"id": "150622:19151",
"name": "Frame 300",
"type": "FRAME",
"scrollBehavior": "SCROLLS",
"children": [
"@{id=150660:3096; name=Frame 330; type=FRAME; scrollBehavior=SCROLLS; children=System.Object[]; blendMode=PASS_THROUGH; clipsContent=False; background=System.Object[]; fills=System.Object[]; strokes=System.Object[]; strokeWeight=1.0; strokeAlign=INSIDE; backgroundColor=; layoutMode=HORIZONTAL; counterAxisAlignItems=CENTER; primaryAxisAlignItems=CENTER; layoutWrap=NO_WRAP; absoluteBoundingBox=; absoluteRenderBounds=; constraints=; layoutAlign=INHERIT; layoutGrow=0.0; layoutSizingHorizontal=HUG; layoutSizingVertical=HUG; effects=System.Object[]; interactions=System.Object[]; complexStrokeProperties=}"
],
"blendMode": "PASS_THROUGH",
"clipsContent": false,
"background": [
],
"fills": [
],
"strokes": [
],
"strokeWeight": 1.0,
"strokeAlign": "INSIDE",
"backgroundColor": {
"r": 0.0,
"g": 0.0,
"b": 0.0,
"a": 0.0
},
"layoutMode": "HORIZONTAL",
"primaryAxisSizingMode": "FIXED",
"counterAxisAlignItems": "CENTER",
"itemSpacing": 10.0,
"layoutWrap": "NO_WRAP",
"absoluteBoundingBox": {
"x": -5663.0,
"y": 2887.0,
"width": 1200.0,
"height": 18.0
},
"absoluteRenderBounds": {
"x": -5663.0,
"y": 2887.0,
"width": 1200.0,
"height": 18.0
},
"constraints": {
"vertical": "TOP",
"horizontal": "LEFT"
},
"layoutAlign": "STRETCH",
"layoutGrow": 0.0,
"layoutSizingHorizontal": "FILL",
"layoutSizingVertical": "HUG",
"effects": [
],
"interactions": [
],
"complexStrokeProperties": {
"strokeType": "BASIC"
}
},
{
"id": "150622:19120",
"name": "title",
"type": "FRAME",
"scrollBehavior": "SCROLLS",
"children": [
"@{id=150622:19121; name=Frame 289; type=FRAME; scrollBehavior=SCROLLS; children=System.Object[]; blendMode=PASS_THROUGH; clipsContent=False; background=System.Object[]; fills=System.Object[]; strokes=System.Object[]; strokeWeight=1.0; individualStrokeWeights=; strokeAlign=INSIDE; backgroundColor=; layoutMode=HORIZONTAL; counterAxisAlignItems=CENTER; primaryAxisAlignItems=CENTER; paddingBottom=20.0; layoutWrap=NO_WRAP; absoluteBoundingBox=; absoluteRenderBounds=; constraints=; layoutAlign=INHERIT; layoutGrow=0.0; layoutSizingHorizontal=HUG; layoutSizingVertical=HUG; effects=System.Object[]; interactions=System.Object[]; complexStrokeProperties=}",
"@{id=150622:19123; name=动态; type=TEXT; scrollBehavior=SCROLLS; blendMode=PASS_THROUGH; fills=System.Object[]; strokes=System.Object[]; strokeWeight=2.0; strokeAlign=OUTSIDE; absoluteBoundingBox=; absoluteRenderBounds=; constraints=; layoutAlign=INHERIT; layoutGrow=0.0; layoutSizingHorizontal=HUG; layoutSizingVertical=HUG; characters=动态; characterStyleOverrides=System.Object[]; styleOverrideTable=; lineTypes=System.Object[]; lineIndentations=System.Object[]; style=; layoutVersion=5; effects=System.Object[]; interactions=System.Object[]; complexStrokeProperties=}"
],
"blendMode": "PASS_THROUGH",
"clipsContent": false,
"background": [
],
"fills": [
],
"strokes": [
],
"strokeWeight": 1.0,
"strokeAlign": "INSIDE",
"backgroundColor": {
"r": 0.0,
"g": 0.0,
"b": 0.0,
"a": 0.0
},
"layoutMode": "HORIZONTAL",
"primaryAxisSizingMode": "FIXED",
"paddingTop": 20.0,
"paddingBottom": 20.0,
"layoutWrap": "NO_WRAP",
"absoluteBoundingBox": {
"x": -5663.0,
"y": 2971.0,
"width": 1300.0,
"height": 128.0
},
"absoluteRenderBounds": {
"x": -5663.0,
"y": 2971.0,
"width": 1300.0,
"height": 128.0
},
"constraints": {
"vertical": "TOP",
"horizontal": "LEFT"
},
"layoutAlign": "INHERIT",
"layoutGrow": 0.0,
"layoutSizingHorizontal": "FIXED",
"layoutSizingVertical": "HUG",
"effects": [
],
"interactions": [
],
"complexStrokeProperties": {
"strokeType": "BASIC"
}
}
],
"blendMode": "PASS_THROUGH",
"clipsContent": false,
"background": [
],
"fills": [
],
"strokes": [
],
"strokeWeight": 1.0,
"strokeAlign": "INSIDE",
"backgroundColor": {
"r": 0.0,
"g": 0.0,
"b": 0.0,
"a": 0.0
},
"layoutMode": "VERTICAL",
"counterAxisSizingMode": "FIXED",
"itemSpacing": 66.0,
"layoutWrap": "NO_WRAP",
"absoluteBoundingBox": {
"x": -5663.0,
"y": 2887.0,
"width": 1200.0,
"height": 212.0
},
"absoluteRenderBounds": {
"x": -5663.0,
"y": 2887.0,
"width": 1300.0,
"height": 212.0
},
"constraints": {
"vertical": "TOP",
"horizontal": "LEFT"
},
"layoutAlign": "INHERIT",
"layoutGrow": 0.0,
"layoutSizingHorizontal": "FIXED",
"layoutSizingVertical": "HUG",
"effects": [
],
"interactions": [
],
"complexStrokeProperties": {
"strokeType": "BASIC"
}
}
],
"blendMode": "PASS_THROUGH",
"clipsContent": true,
"background": [
{
"blendMode": "NORMAL",
"type": "IMAGE",
"scaleMode": "FILL",
"imageRef": "ec2e3dd7712a18b5bc9453353f13d8202930c6bd"
}
],
"fills": [
{
"blendMode": "NORMAL",
"type": "IMAGE",
"scaleMode": "FILL",
"imageRef": "ec2e3dd7712a18b5bc9453353f13d8202930c6bd"
}
],
"strokes": [
],
"strokeWeight": 1.0,
"strokeAlign": "INSIDE",
"backgroundColor": {
"r": 0.0,
"g": 0.0,
"b": 0.0,
"a": 0.0
},
"layoutMode": "VERTICAL",
"counterAxisSizingMode": "FIXED",
"primaryAxisSizingMode": "FIXED",
"counterAxisAlignItems": "CENTER",
"paddingLeft": 286.0,
"paddingRight": 286.0,
"paddingTop": 24.0,
"paddingBottom": 75.0,
"itemSpacing": 10.0,
"layoutWrap": "NO_WRAP",
"absoluteBoundingBox": {
"x": -5783.0,
"y": 2863.0,
"width": 1440.0,
"height": 350.0
},
"absoluteRenderBounds": {
"x": -5783.0,
"y": 2863.0,
"width": 1440.0,
"height": 350.0
},
"constraints": {
"vertical": "TOP",
"horizontal": "LEFT"
},
"layoutSizingHorizontal": "FIXED",
"layoutSizingVertical": "FIXED",
"effects": [
],
"interactions": [
],
"complexStrokeProperties": {
"strokeType": "BASIC"
}
},
"components": {
},
"componentSets": {
},
"schemaVersion": 0,
"styles": {
}
}
}
}

View File

View File

@ -0,0 +1,7 @@
C:\nvm4w\nodejs\npx.cmd : Invalid URL
C:\Users\23721\AppData\Local\Temp\ps-script-5862c083-c1f6-43bc-823a-aa3dea431e6c.ps1:114 : 143
+ ... I_KEY=',''; C:\nvm4w\nodejs\npx.cmd -y figma-developer-mcp fetch --en ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (Invalid URL:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

View File

@ -1,280 +0,0 @@
# gxzx 服务迁移至 mhzc - 完整执行方案
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
**Goal:** 将 `txw-gxzx` 微服务(供需大厅/绿色金融/绿色交易/企业入驻)的全部代码和数据库迁移到 `txw-mhzc` 服务
**Architecture:** 代码迁移采用"整体迁移+批量修改包名"的策略先迁移文件再统一修改import数据库采用"目标库创建表+数据同步"的方案
**Tech Stack:** Java/Spring Boot, MyBatis, MySQL/达梦数据库, Maven多模块
---
## 一、文件迁移清单共62个文件
### 1.1 Controller层4个
| # | 源文件 | 目标路径 |
|---|--------|----------|
| 1 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/controller/GxdtController.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/controller/gxzx/GxdtController.java` |
| 2 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/controller/LsjrController.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/controller/gxzx/LsjrController.java` |
| 3 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/controller/LsjyController.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/controller/gxzx/LsjyController.java` |
| 4 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/controller/QyRzController.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/controller/gxzx/QyRzController.java` |
### 1.2 Service接口层10个
| # | 源文件 | 目标路径 |
|---|--------|----------|
| 5 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/service/TxwGxzxGxbqbService.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/TxwGxzxGxbqbService.java` |
| 6 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/service/TxwGxzxGxscbService.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/TxwGxzxGxscbService.java` |
| 7 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/service/TxwGxzxGxxxbService.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/TxwGxzxGxxxbService.java` |
| 8 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/service/TxwGxzxQybqbService.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/TxwGxzxQybqbService.java` |
| 9 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/service/TxwGxzxRzsqjlbService.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/TxwGxzxRzsqjlbService.java` |
| 10 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/service/TxwGxzxShqkbService.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/TxwGxzxShqkbService.java` |
| 11 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/service/lsjr/GxzxDkbxsqxxService.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/lsjr/GxzxDkbxsqxxService.java` |
| 12 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/service/lsjr/GxzxLsjrService.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/lsjr/GxzxLsjrService.java` |
| 13 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/service/lsjr/GxzxLsjrcpxxService.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/lsjr/GxzxLsjrcpxxService.java` |
| 14 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/service/lsjy/GxzxLsjyZcxxService.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/lsjy/GxzxLsjyZcxxService.java` |
### 1.3 Service实现层10个
| # | 源文件 | 目标路径 |
|---|--------|----------|
| 15 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/service/impl/TxwGxzxGxbqbServiceImpl.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/impl/TxwGxzxGxbqbServiceImpl.java` |
| 16 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/service/impl/TxwGxzxGxscbServiceImpl.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/impl/TxwGxzxGxscbServiceImpl.java` |
| 17 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/service/impl/TxwGxzxGxxxbServiceImpl.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/impl/TxwGxzxGxxxbServiceImpl.java` |
| 18 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/service/impl/TxwGxzxQybqbServiceImpl.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/impl/TxwGxzxQybqbServiceImpl.java` |
| 19 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/service/impl/TxwGxzxRzsqjlbServiceImpl.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/impl/TxwGxzxRzsqjlbServiceImpl.java` |
| 20 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/service/impl/TxwGxzxShqkbServiceImpl.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/impl/TxwGxzxShqkbServiceImpl.java` |
| 21 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/service/lsjr/impl/GxzxDkbxsqxxServiceImpl.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/lsjr/impl/GxzxDkbxsqxxServiceImpl.java` |
| 22 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/service/lsjr/impl/GxzxLsjrcpxxServiceImpl.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/lsjr/impl/GxzxLsjrcpxxServiceImpl.java` |
| 23 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/service/lsjr/impl/GxzxLsjrServiceImpl.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/lsjr/impl/GxzxLsjrServiceImpl.java` |
| 24 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/service/lsjy/impl/GxzxLsjyZcxxServiceImpl.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/lsjy/impl/GxzxLsjyZcxxServiceImpl.java` |
### 1.4 Mapper接口层9个
| # | 源文件 | 目标路径 |
|---|--------|----------|
| 25 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/mapper/TxwGxzxGxbqbMapper.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/mapper/gxzx/TxwGxzxGxbqbMapper.java` |
| 26 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/mapper/TxwGxzxGxscbMapper.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/mapper/gxzx/TxwGxzxGxscbMapper.java` |
| 27 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/mapper/TxwGxzxGxxxbMapper.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/mapper/gxzx/TxwGxzxGxxxbMapper.java` |
| 28 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/mapper/TxwGxzxQybqbMapper.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/mapper/gxzx/TxwGxzxQybqbMapper.java` |
| 29 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/mapper/TxwGxzxRzsqjlbMapper.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/mapper/gxzx/TxwGxzxRzsqjlbMapper.java` |
| 30 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/mapper/TxwGxzxShqkbMapper.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/mapper/gxzx/TxwGxzxShqkbMapper.java` |
| 31 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/mapper/lsjr/GxzxDkbxsqxxMapper.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/mapper/gxzx/lsjr/GxzxDkbxsqxxMapper.java` |
| 32 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/mapper/lsjr/GxzxLsjrcpxxMapper.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/mapper/gxzx/lsjr/GxzxLsjrcpxxMapper.java` |
| 33 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/mapper/lsjy/GxzxLsjyZcxxMapper.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/mapper/gxzx/lsjy/GxzxLsjyZcxxMapper.java` |
### 1.5 Domain层6个
| # | 源文件 | 目标路径 |
|---|--------|----------|
| 34 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/pojo/domain/TxwGxzxGxbqbDO.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/domain/gxzx/TxwGxzxGxbqbDO.java` |
| 35 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/pojo/domain/TxwGxzxGxscbDO.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/domain/gxzx/TxwGxzxGxscbDO.java` |
| 36 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/pojo/domain/TxwGxzxGxxxbDO.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/domain/gxzx/TxwGxzxGxxxbDO.java` |
| 37 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/pojo/domain/TxwGxzxQybqbDO.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/domain/gxzx/TxwGxzxQybqbDO.java` |
| 38 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/pojo/domain/TxwGxzxRzsqjlbDO.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/domain/gxzx/TxwGxzxRzsqjlbDO.java` |
| 39 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/pojo/domain/TxwGxzxShqkbDO.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/domain/gxzx/TxwGxzxShqkbDO.java` |
### 1.6 VO层13个
| # | 源文件 | 目标路径 |
|---|--------|----------|
| 40 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/pojo/vo/GetGxSqListReqVO.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/vo/gxzx/GetGxSqListReqVO.java` |
| 41 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/pojo/vo/GxfbReqVO.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/vo/gxzx/GxfbReqVO.java` |
| 42 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/pojo/vo/GxscReqVO.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/vo/gxzx/GxscReqVO.java` |
| 43 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/pojo/vo/GxsjReqVO.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/vo/gxzx/GxsjReqVO.java` |
| 44 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/pojo/vo/GxspReqVO.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/vo/gxzx/GxspReqVO.java` |
| 45 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/pojo/vo/GxsqResVO.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/vo/gxzx/GxsqResVO.java` |
| 46 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/pojo/vo/GxxxReqVO.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/vo/gxzx/GxxxReqVO.java` |
| 47 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/pojo/vo/GxxxVO.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/vo/gxzx/GxxxVO.java` |
| 48 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/pojo/vo/QyrzListReqVO.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/vo/gxzx/QyrzListReqVO.java` |
| 49 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/pojo/vo/QyRzSpReqVO.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/vo/gxzx/QyRzSpReqVO.java` |
| 50 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/pojo/vo/QyRzSqReqVO.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/vo/gxzx/QyRzSqReqVO.java` |
| 51 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/pojo/vo/QyRzSqxxVO.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/vo/gxzx/QyRzSqxxVO.java` |
| 52 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/pojo/vo/ShqkxxVO.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/vo/gxzx/ShqkxxVO.java` |
### 1.7 Dto层1个
| # | 源文件 | 目标路径 |
|---|--------|----------|
| 53 | `txw-gxzx-service-biz/src/main/java/com/css/txw/gxzx/pojo/dto/GxzxLsjrcpImportDto.java` | `txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/dto/gxzx/GxzxLsjrcpImportDto.java` |
### 1.8 Mapper XML层9个
| # | 源文件 | 目标路径 |
|---|--------|----------|
| 54 | `txw-gxzx-service-biz/src/main/resources/mapper/TxwGxzxGxbqbMapper.xml` | `txw-mhzc-service-biz/src/main/resources/mapper/gxzx/TxwGxzxGxbqbMapper.xml` |
| 55 | `txw-gxzx-service-biz/src/main/resources/mapper/TxwGxzxGxscbMapper.xml` | `txw-mhzc-service-biz/src/main/resources/mapper/gxzx/TxwGxzxGxscbMapper.xml` |
| 56 | `txw-gxzx-service-biz/src/main/resources/mapper/TxwGxzxGxxxbMapper.xml` | `txw-mhzc-service-biz/src/main/resources/mapper/gxzx/TxwGxzxGxxxbMapper.xml` |
| 57 | `txw-gxzx-service-biz/src/main/resources/mapper/TxwGxzxQybqbMapper.xml` | `txw-mhzc-service-biz/src/main/resources/mapper/gxzx/TxwGxzxQybqbMapper.xml` |
| 58 | `txw-gxzx-service-biz/src/main/resources/mapper/TxwGxzxRzsqjlbMapper.xml` | `txw-mhzc-service-biz/src/main/resources/mapper/gxzx/TxwGxzxRzsqjlbMapper.xml` |
| 59 | `txw-gxzx-service-biz/src/main/resources/mapper/TxwGxzxShqkbMapper.xml` | `txw-mhzc-service-biz/src/main/resources/mapper/gxzx/TxwGxzxShqkbMapper.xml` |
| 60 | `txw-gxzx-service-biz/src/main/resources/mapper/lsjr/GxzxDkbxsqxxMapper.xml` | `txw-mhzc-service-biz/src/main/resources/mapper/gxzx/lsjr/GxzxDkbxsqxxMapper.xml` |
| 61 | `txw-gxzx-service-biz/src/main/resources/mapper/lsjr/GxzxLsjrcpxxMapper.xml` | `txw-mhzc-service-biz/src/main/resources/mapper/gxzx/lsjr/GxzxLsjrcpxxMapper.xml` |
| 62 | `txw-gxzx-service-biz/src/main/resources/mapper/lsjy/GxzxLsjyZcxxMapper.xml` | `txw-mhzc-service-biz/src/main/resources/mapper/gxzx/lsjy/GxzxLsjyZcxxMapper.xml` |
---
## 二、数据库表9张
| # | 表名 | 说明 |
|---|------|------|
| 1 | `txw_gxzx_gxxxb` | 供需信息表 |
| 2 | `txw_gxzx_shqkb` | 审核情况表 |
| 3 | `txw_gxzx_gxscb` | 供需收藏表 |
| 4 | `txw_gxzx_gxbqb` | 供需标签表 |
| 5 | `txw_gxzx_qybqb` | 企业标签表 |
| 6 | `txw_gxzx_rzsqjlb` | 入驻申请记录表 |
| 7 | `txw_gxzx_lsjrcpxx` | 绿色金融产品信息表 |
| 8 | `txw_gxzx_dkbxsqxx` | 贷款保险申请信息表 |
| 9 | `txw_gxzx_lsjy_zcxx` | 绿色交易资产信息表 |
---
## 三、执行步骤
### Phase 1: 数据库迁移(生产环境执行)
- [ ] 3.1 备份原库 gxzx 相关9张表
- [ ] 3.2 在 mhzc 库创建目标表
- [ ] 3.3 迁移数据
- [ ] 3.4 验证数据完整性
### Phase 2: 代码迁移(开发环境执行)
#### 目录创建
- [ ] 3.5 创建目标目录结构
#### 文件迁移(按层级)
- [ ] 3.6 迁移 Domain 层6个文件
- [ ] 3.7 迁移 VO/Req 层14个文件
- [ ] 3.8 迁移 Mapper 接口层9个文件
- [ ] 3.9 迁移 Mapper XML 层9个文件
- [ ] 3.10 迁移 Service 接口层10个文件
- [ ] 3.11 迁移 Service 实现层10个文件
- [ ] 3.12 迁移 Controller 层4个文件
#### 包名修改
- [ ] 3.13 修改所有文件的 package 声明
- [ ] 3.14 修改所有文件的 import 语句
### Phase 3: 配置更新
- [ ] 3.15 更新 MapperScan 配置
- [ ] 3.16 检查 pom.xml 依赖
### Phase 4: 编译验证
- [ ] 3.17 编译验证
- [ ] 3.18 启动测试
---
## 四、生产环境升级步骤(详细)
### 4.1 升级前准备
```bash
# 1. 备份数据库
mysqldump -h host -u user -p gxzx_db txw_gxzx_gxxxb txw_gxzx_shqkb txw_gxzx_gxscb txw_gxzx_gxbqb txw_gxzx_qybqb txw_gxzx_rzsqjlb txw_gxzx_lsjrcpxx txw_gxzx_dkbxsqxx txw_gxzx_lsjy_zcxx > gxzx_backup_$(date +%Y%m%d).sql
# 2. 确认 mhzc 服务最新代码已部署
# 3. 通知相关团队停机维护时间窗口
```
### 4.2 数据迁移
```sql
-- 在 mhzc 数据库执行
-- 1. 创建表DDL 从 gxzx 库导出)
CREATE TABLE txw_gxzx_gxxxb LIKE gxzx_db.txw_gxzx_gxxxb;
CREATE TABLE txw_gxzx_shqkb LIKE gxzx_db.txw_gxzx_shqkb;
-- ... 其他7张表同理
-- 2. 数据迁移
INSERT INTO mhzc_db.txw_gxzx_gxxxb SELECT * FROM gxzx_db.txw_gxzx_gxxxb;
INSERT INTO mhzc_db.txw_gxzx_shqkb SELECT * FROM gxzx_db.txw_gxzx_shqkb;
-- ... 其他7张表同理
-- 3. 验证
SELECT COUNT(*) FROM txw_gxzx_gxxxb; -- 源库和目标库应该一致
SELECT COUNT(*) FROM txw_gxzx_shqkb;
-- ... 其他表验证
```
### 4.3 应用部署
```bash
# 1. 停止 gxzx 服务
# 2. 部署新 mhzc 服务(包含 gxzx 代码)
# 3. 启动 mhzc 服务
# 4. 验证接口
```
---
## 五、回滚方案
如果迁移失败,执行以下回滚:
```sql
-- 恢复原状
-- 1. 停止 mhzc 服务
-- 2. 恢复 gxzx 服务
-- 3. 如果需要,回滚数据库
DROP TABLE IF EXISTS mhzc_db.txw_gxzx_gxxxb;
-- 使用备份恢复
```
---
## 六、验证清单
| # | 验证项 | 验证方法 |
|---|--------|----------|
| 1 | 数据库表记录数一致 | `SELECT COUNT(*) FROM txw_gxzx_gxxxb` 对比 |
| 2 | Controller 注入正常 | 启动应用无报错 |
| 3 | 接口路径可访问 | `curl http://mhzc:9002/gxdt/gxxxList` |
| 4 | 供需发布功能正常 | 实际测试发布流程 |
| 5 | 绿色金融功能正常 | 测试信贷/保险产品查询 |
| 6 | 企业入驻功能正常 | 测试入驻申请流程 |
| 7 | 搜索服务聚合供需 | 调用搜索接口验证 |
---
## 七、文件变更汇总
### 新增目录
```
txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/controller/gxzx/
txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/impl/
txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/lsjr/impl/
txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/service/gxzx/lsjy/impl/
txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/mapper/gxzx/lsjr/
txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/mapper/gxzx/lsjy/
txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/domain/gxzx/
txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/vo/gxzx/
txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/pojo/dto/gxzx/
txw-mhzc-service-biz/src/main/resources/mapper/gxzx/lsjr/
txw-mhzc-service-biz/src/main/resources/mapper/gxzx/lsjy/
```
### 修改文件
```
txw-mhzc/pom.xml可能需要新增依赖
txw-mhzc/.../MhzcServiceConfiguration.javaMapperScan 更新)
```
### 包名映射规则
```
com.css.txw.gxzx.controller → com.css.txw.mhzc.controller.gxzx
com.css.txw.gxzx.service → com.css.txw.mhzc.service.gxzx
com.css.txw.gxzx.service.impl → com.css.txw.mhzc.service.gxzx.impl
com.css.txw.gxzx.service.lsjr.impl → com.css.txw.mhzc.service.gxzx.lsjr.impl
com.css.txw.gxzx.service.lsjy.impl → com.css.txw.mhzc.service.gxzx.lsjy.impl
com.css.txw.gxzx.mapper → com.css.txw.mhzc.mapper.gxzx
com.css.txw.gxzx.mapper.lsjr → com.css.txw.mhzc.mapper.gxzx.lsjr
com.css.txw.gxzx.mapper.lsjy → com.css.txw.mhzc.mapper.gxzx.lsjy
com.css.txw.gxzx.pojo.domain → com.css.txw.mhzc.pojo.domain.gxzx
com.css.txw.gxzx.pojo.vo → com.css.txw.mhzc.pojo.vo.gxzx
com.css.txw.gxzx.pojo.dto → com.css.txw.mhzc.pojo.dto.gxzx
```

View File

@ -0,0 +1,15 @@
{
"Framelink MCP for Figma": {
"command": "cmd",
"args": [
"/c",
"npx",
"-y",
"figma-developer-mcp",
"--stdio"
],
"env": {
"FIGMA_API_KEY": ""
}
}
}

View File

@ -0,0 +1,146 @@
import fs from 'fs';
const path = 'e:/develop/code/txw/txw-mhzc-web/src/pages/index/views/home2/index.vue';
let s = fs.readFileSync(path, 'utf8');
const start = s.indexOf('<style lang="less" scoped>');
const end = s.indexOf('</style>', start);
if (start < 0 || end < 0) throw new Error('style block not found');
let css = s.slice(start, end);
const reps = [
[/#f5f7fa\b/g, '@home-color-page-bg'],
[/#003b1a\b/gi, '@home-color-primary-dark'],
[/#556659\b/gi, '@home-color-text-body'],
[/#1a1a2e\b/gi, '@home-color-text-title'],
[/#999999\b/g, '@home-color-text-muted'],
[/\b#999\b/g, '@home-color-text-muted'],
[/#333333\b/g, '@home-color-text-dark'],
[/\b#333\b/g, '@home-color-text-dark'],
[/#666666\b/g, '@home-color-text-secondary'],
[/\b#666\b/g, '@home-color-text-secondary'],
[/#222222\b/g, '@home-color-text-partner'],
[/\b#222\b/g, '@home-color-text-partner'],
[/#000000\b/g, '@home-color-black'],
[/\b#000\b/g, '@home-color-black'],
[/#ffffff\b/gi, '@home-color-white'],
[/\b#fff\b/gi, '@home-color-white'],
[/#00b96b\b/gi, '@home-color-primary-green'],
[/#00a25d\b/gi, '@home-color-primary-green-dark'],
[/#2e7d32\b/gi, '@home-color-secondary-green'],
[/#e6efe6\b/gi, '@home-color-tab-bg'],
[/#008cff\b/gi, '@home-color-accent-blue'],
[/#2196f3\b/gi, '@home-color-btn-blue-to'],
[/#99d2fe\b/gi, '@home-color-btn-blue-from'],
[/#007242\b/gi, '@home-color-cta-btn-from'],
[/#00d87d\b/gi, '@home-color-cta-btn-to'],
[/#f0f7f2\b/gi, '@home-color-footer-bg'],
[/'PingFang SC', 'Microsoft YaHei', sans-serif/g, '@home-font-family'],
[/'PingFang SC', sans-serif/g, '@home-font-family'],
[/font-family: PingFang SC;/g, 'font-family: @home-font-family;'],
[/font-family: 'PingFang SC';/g, 'font-family: @home-font-family;'],
[/linear-gradient\(180deg, #00b96b 0%, #00a25d 100%\)/g, '@home-gradient-search-btn'],
[/linear-gradient\(180deg, rgba\(245, 247, 250, 0\) 0%, rgba\(245, 247, 250\) 100%\)/g, '@home-gradient-hero-fade'],
[/linear-gradient\(180deg, rgba\(245, 247, 250, 0\) 0%, rgba\(245, 247, 250, 1\) 100%\)/g, '@home-gradient-hero-fade'],
[/linear-gradient\(90deg, #ffffff 0%, #e6efff 36\.06%, #e6efff 62\.5%, #ffffff 100%\)/g, '@home-gradient-core-tag'],
[/linear-gradient\(0deg, rgba\(255, 255, 255, 0\.9\) 0%, rgba\(255, 255, 255, 0\.4\) 100%\)/g, '@home-gradient-ability-card'],
[/linear-gradient\(180deg, #99d2fe 0%, #2196f3 100%\)/g, '@home-gradient-export-btn'],
[/linear-gradient\(90deg, #007242 0%, #00d87d 100%\)/g, '@home-gradient-cta-btn'],
[/0 8px 12px rgba\(0, 0, 0, 0\.08\)/g, '@home-shadow-search'],
[/0 8px 12px rgba\(127, 179, 213, 0\.2\)/g, '@home-shadow-card-blue'],
[/0 8px 12px rgba\(0, 185, 107, 0\.1\)/g, '@home-shadow-card-green'],
[/0 8px 20px rgba\(0, 209, 121, 0\.3\)/g, '@home-shadow-card-green-strong'],
[/0 2px 5px rgba\(0, 0, 0, 0\.1\)/g, '@home-shadow-news-item'],
[/0 2px 10px rgba\(0, 0, 0, 0\.1\)/g, '@home-shadow-news-item'],
[/0px 4px 8px 0px rgba\(0, 185, 107, 0\.06\)/g, '@home-shadow-partner-logo'],
[/0 4px 12px rgba\(255, 255, 255, 1\)/g, '@home-shadow-title-sub'],
[/0 0 8px rgba\(255, 255, 255, 1\)/g, '@home-shadow-card-title'],
[/0 0 8px #ffffff/g, '@home-shadow-card-title'],
[/0 4px 12px #ffffff/g, '@home-shadow-title-sub'],
[/rgba\(255, 255, 255, 0\.7\)/g, '@home-color-white-70'],
[/rgba\(255, 255, 255, 0\.6\)/g, '@home-color-white-60'],
[/background: rgba\(245, 247, 250, 1\)/g, 'background: @home-color-page-bg'],
[/background: rgba\(222, 243, 255, 0\.75\)/g, '@home-color-card-blue-btn-primary-bg'],
[/background: rgba\(222, 243, 255, 0\.95\)/g, 'fade(@home-color-card-blue-btn-primary-bg, 95%)'],
[/background: rgba\(222, 243, 255, 0\.5\)/g, '@home-color-card-blue-btn-secondary-bg'],
[/border: 1px solid rgba\(0, 141, 213, 0\.4\)/g, 'border: 1px solid @home-color-card-blue-btn-secondary-border'],
[/background: rgba\(255, 255, 255, 0\.35\)/g, '@home-color-card-chain-bg'],
[/background: rgba\(255, 255, 255, 0\.4\)/g, '@home-color-card-chain-btn-secondary-bg'],
[/border: 1px solid rgba\(0, 0, 0, 0\.2\)/g, 'border: 1px solid @home-color-card-chain-btn-secondary-border'],
[/background: rgba\(232, 255, 234, 0\.5\)/g, '@home-color-card-green-btn-secondary-bg'],
[/border: 1px solid rgba\(0, 180, 42, 0\.4\)/g, 'border: 1px solid @home-color-card-green-btn-secondary-border'],
];
for (const [re, rep] of reps) css = css.replace(re, rep);
const numReps = [
['max-width: 867px', 'max-width: @home-hero-title-width'],
['max-width: 600px', 'max-width: @home-search-box-width'],
['width: 92px', 'width: @home-search-btn-width'],
['height: 300px', 'height: @home-hero-fade-height'],
['padding: 8px 8px 8px 16px', 'padding: @home-search-box-padding'],
['padding: 2px 8px', 'padding: @home-search-tag-padding'],
['padding: 0 0 24px', 'padding: 0 0 @home-space-24'],
['gap: 36px', 'gap: @home-feature-cards-gap'],
['gap: 32px', 'gap: @home-space-32'],
['gap: 16px', 'gap: @home-space-16'],
['gap: 12px', 'gap: @home-search-tag-gap'],
['gap: 28px', 'gap: @home-export-card-gap'],
['gap: 14px', 'gap: @home-core-col-gap'],
['gap: 42px', 'gap: @home-section-gap'],
['gap: 52px', 'gap: @home-space-52'],
['gap: 56px', 'gap: @home-space-56'],
['font-size: 56px', 'font-size: @home-font-size-56'],
['font-size: 40px', 'font-size: @home-font-size-40'],
['font-size: 32px', 'font-size: @home-font-size-32'],
['font-size: 28px', 'font-size: @home-font-size-28'],
['font-size: 24px', 'font-size: @home-font-size-24'],
['font-size: 22px', 'font-size: @home-font-size-22'],
['font-size: 20px', 'font-size: @home-font-size-20'],
['font-size: 16px', 'font-size: @home-font-size-16'],
['font-size: 14px', 'font-size: @home-font-size-14'],
['font-size: 12px', 'font-size: @home-font-size-12'],
['line-height: 38px', 'line-height: @home-line-height-38'],
['line-height: 28px', 'line-height: @home-line-height-28'],
['line-height: 26px', 'line-height: @home-line-height-26'],
['line-height: 22px', 'line-height: @home-line-height-22'],
['line-height: 20px', 'line-height: @home-line-height-20'],
['font-weight: 600', 'font-weight: @home-font-weight-semibold'],
['font-weight: 500', 'font-weight: @home-font-weight-medium'],
['font-weight: 400', 'font-weight: @home-font-weight-regular'],
['border-radius: 16px', 'border-radius: @home-radius-xl'],
['border-radius: 12px', 'border-radius: @home-radius-lg'],
['border-radius: 10px', 'border-radius: @home-radius-md'],
['border-radius: 8px', 'border-radius: @home-radius-sm'],
['border-radius: 4px', 'border-radius: @home-radius-xs'],
['border-radius: 24px', 'border-radius: @home-radius-pill'],
['backdrop-filter: blur(20px)', 'backdrop-filter: blur(@home-blur-tag)'],
['backdrop-filter: blur(10px)', 'backdrop-filter: blur(@home-blur-md)'],
['backdrop-filter: blur(8px)', 'backdrop-filter: blur(@home-blur-sm)'],
['backdrop-filter: blur(4px)', 'backdrop-filter: blur(@home-blur-ability)'],
['width: 145px', 'width: @home-news-thumb-width'],
['width: 282px', 'width: @home-partner-logo-card-width'],
['height: 89px', 'height: @home-partner-logo-card-height'],
['height: 66px', 'height: @home-cta-btn-height'],
['width: 360px', 'width: @home-cta-btn-width'],
['width: 77px', 'width: @home-export-btn-size'],
['height: 77px', 'height: @home-export-btn-size'],
['min-height: 119px', 'min-height: @home-export-card-height'],
['max-width: 628px', 'max-width: @home-export-list-width'],
['padding: 0 30px', 'padding: 0 @home-core-grid-padding-x'],
['column-gap: 13px', 'column-gap: @home-ability-grid-col-gap'],
['row-gap: 70px', 'row-gap: @home-ability-grid-row-gap'],
['min-height: 330px', 'min-height: @home-ability-grid-min-height'],
['padding: 16px 16px 16px 32px', 'padding: @home-ability-card-padding'],
];
for (const [from, to] of numReps) css = css.replaceAll(from, to);
// Fix double-replaced height on search btn line-height
css = css.replace(
/line-height: @home-search-btn-height;\s*\n\s*font-family: @home-font-family;/g,
'line-height: @home-search-btn-height;\n font-family: @home-font-family;'
);
s = s.slice(0, start) + css + s.slice(end);
fs.writeFileSync(path, s);
console.log('migration complete');

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 684 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

View File

@ -1,7 +1,7 @@
<template>
<footer class="site-footer">
<div class="footer-main">
<div class="footer-main-inner page-content-wrap">
<div class="footer-main-inner">
<div class="footer-columns">
<div class="footer-column footer-column--guide">
<h3 class="footer-title">指导单位</h3>
@ -67,7 +67,7 @@
</div>
<div class="footer-bar">
<div class="footer-bar-inner page-content-wrap">
<div class="footer-bar-inner">
<p class="footer-bar-line">© 2025 可信碳信息网 版权所有</p>
<p class="footer-bar-line">技术支持上海市宝山区大数据中心</p>
<p class="footer-bar-line">基础设施国家区块链网络基础底座</p>
@ -88,6 +88,7 @@ export default {
</script>
<style lang="less" scoped>
/* Figma 底部信息块:主区 #f0f7f2 padding 40/20/20版权条 #e2ede5 高 64px */
.site-footer {
display: block;
margin-top: 0;
@ -95,58 +96,39 @@ export default {
}
.footer-main {
background: var(--page-footer-bg);
background: #f0f7f2;
}
.footer-main-inner {
box-sizing: border-box;
padding-top: var(--page-footer-padding-y);
padding-bottom: var(--page-footer-padding-y);
width: 100%;
max-width: var(--page-content-max-width, 1200px);
margin: 0 auto;
padding: 40px 20px 20px;
}
/* Figma五列在 1300 版心内两端对齐,列宽随内容 */
.footer-columns {
display: flex;
align-items: flex-start;
justify-content: space-between;
width: 100%;
gap: 32px;
gap: 24px;
}
.footer-column {
flex: 0 0 auto;
flex: 0 1 auto;
min-width: 0;
}
.footer-column--guide {
width: 120px;
}
.footer-column--ops {
width: 200px;
}
.footer-column--support {
width: 280px;
}
.footer-column--links {
width: 260px;
}
.footer-column--contact {
width: 296px;
flex-shrink: 0;
}
.footer-title {
position: relative;
margin: 0 0 var(--page-footer-title-gap);
margin: 0 0 12px;
padding-left: 12px;
font-size: 16px;
font-weight: 600;
line-height: 24px;
color: var(--page-footer-title-color);
color: #003b1a;
white-space: nowrap;
&::before {
position: absolute;
@ -164,7 +146,7 @@ export default {
.footer-list {
display: flex;
flex-direction: column;
gap: var(--page-footer-link-gap);
gap: 8px;
margin: 0;
padding: 0;
list-style: none;
@ -175,7 +157,7 @@ export default {
font-size: 14px;
font-weight: 400;
line-height: 22px;
color: var(--page-footer-text-color);
color: #556659;
}
.footer-link {
@ -204,8 +186,8 @@ export default {
align-items: center;
justify-content: center;
width: 16px;
height: 22px;
color: var(--page-footer-text-color);
min-height: 22px;
color: #556659;
}
.footer-text--address {
@ -213,7 +195,8 @@ export default {
}
.footer-bar {
background: var(--page-footer-bar-bg);
background: #e2ede5;
border-top: 1px dashed rgba(0, 154, 41, 0.25);
}
.footer-bar-inner {
@ -221,9 +204,11 @@ export default {
flex-wrap: wrap;
align-items: center;
justify-content: center;
gap: 6px 32px;
padding: var(--page-footer-bar-padding-y) 0;
gap: 10px 20px;
box-sizing: border-box;
width: 100%;
min-height: 64px;
padding: 10px 20px;
}
.footer-bar-line {
@ -231,7 +216,7 @@ export default {
font-size: 12px;
font-weight: 400;
line-height: 20px;
color: var(--page-footer-text-color);
color: #556659;
white-space: nowrap;
}
@ -239,17 +224,12 @@ export default {
.footer-columns {
flex-wrap: wrap;
justify-content: flex-start;
gap: 28px 48px;
gap: 28px 40px;
}
.footer-column--guide,
.footer-column--ops,
.footer-column--support,
.footer-column--links,
.footer-column--contact {
width: auto;
max-width: calc(50% - 24px);
.footer-column {
flex: 1 1 220px;
max-width: calc(50% - 20px);
}
.footer-column--contact {
@ -260,8 +240,7 @@ export default {
@media screen and (max-width: 767px) {
.footer-main-inner {
padding-top: 32px;
padding-bottom: 28px;
padding: 32px 16px 20px;
}
.footer-columns {
@ -269,20 +248,16 @@ export default {
gap: 24px;
}
.footer-column--guide,
.footer-column--ops,
.footer-column--support,
.footer-column--links,
.footer-column--contact {
width: 100%;
max-width: none;
.footer-column {
flex: none;
max-width: none;
}
.footer-bar-inner {
flex-direction: column;
gap: 4px;
padding: 10px 0 12px;
min-height: auto;
padding: 12px 16px;
}
.footer-bar-line {

View File

@ -524,6 +524,9 @@ export default {
color: var(--page-nav-color);
background: #fff;
border-top: 1px solid var(--page-nav-color);
border-bottom: 1px solid rgba(0, 0, 0, 0.05);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
backdrop-filter: blur(20px);
box-sizing: border-box;
}
@ -538,7 +541,7 @@ export default {
.logo-box {
display: flex;
align-items: center;
gap: 12px;
gap: var(--page-nav-logo-gap, 12px);
cursor: pointer;
flex-shrink: 0;
}
@ -548,9 +551,12 @@ export default {
flex-shrink: 0;
align-items: center;
justify-content: center;
width: var(--page-nav-logo-icon-box, 34px);
height: var(--page-nav-logo-icon-box, 34px);
padding: 1px;
background: #fff;
border-radius: 100px;
box-sizing: border-box;
}
.logo-icon {

View File

@ -29,6 +29,10 @@ function hyzt() {
return import(/* webpackChunkName: "lsxd" */ '@/pages/index/views/hyzt/index.vue');
}
function hydt() {
return import(/* webpackChunkName: "hydt" */ '@/pages/index/views/hydt/index.vue');
}
function gxnlpt() {
return import(/* webpackChunkName: "sbfdemo" */ '@/pages/index/views/gxnlpt/index.vue');
}
@ -237,6 +241,19 @@ export default [
path: '/hyzt',
component: hyzt,
},
{
name: 'hydt',
path: '/hydt',
component: hydt,
meta: {
title: '行业动态',
isShowSideBar: false,
hasHome: true,
breadCrumbs: [{ title: '首页', to: '/home' }, { title: '行业动态', to: '/hydt' }],
disableBack: true,
needLogin: false,
},
},
{
name: 'tfwsc',
path: '/tfwsc',

View File

@ -0,0 +1,750 @@
// =============================================================================
// 首页 Figma 设计 Token审核版本 · 首页1920/1440 · node 150645:1018
// 用法:@import './home-figma-variables.less';
// =============================================================================
// -----------------------------------------------------------------------------
// 画布与版心
// -----------------------------------------------------------------------------
@home-design-width: 1440px;
@home-design-height: 5079px;
@home-content-width: 1200px;
@home-content-gutter: 120px; // (1440 - 1200) / 2
@home-nav-inner-width: 1300px;
@home-nav-gutter: 70px; // (1440 - 1300) / 2
// -----------------------------------------------------------------------------
// 色彩 · 品牌与文字
// -----------------------------------------------------------------------------
@home-color-primary-dark: #003b1a;
@home-color-primary-green: #00b96b;
@home-color-primary-green-dark: #00a25d;
@home-color-secondary-green: #2e7d32;
@home-color-tab-bg: #e6efe6;
@home-color-page-bg: #f5f7fa;
@home-color-white: #ffffff;
@home-color-black: #000000;
@home-color-text-title: #1a1a2e;
@home-color-text-body: #556659;
@home-color-text-muted: #999999;
@home-color-text-dark: #333333;
@home-color-text-secondary: #666666;
@home-color-text-partner: #222222;
@home-color-accent-blue: #008cff;
@home-color-accent-blue-light: #9dc0ff;
@home-color-btn-blue-from: #99d2fe;
@home-color-btn-blue-to: #2196f3;
@home-color-footer-bg: #f0f7f2;
@home-color-footer-bar-bg: #e2ede5;
// 半透明
@home-color-white-90: rgba(255, 255, 255, 0.9);
@home-color-white-70: rgba(255, 255, 255, 0.7);
@home-color-white-60: rgba(255, 255, 255, 0.6);
@home-color-white-40: rgba(255, 255, 255, 0.4);
@home-color-white-30: rgba(255, 255, 255, 0.3);
@home-color-page-bg-transparent: rgba(245, 247, 250, 0);
// Hero 三卡 · 碳数字身份证(蓝)
@home-color-card-blue-from: rgba(127, 210, 255, 0.3);
@home-color-card-blue-to: rgba(232, 247, 255, 0.15);
@home-color-card-blue-header-from: rgba(232, 247, 255, 0.4);
@home-color-card-blue-header-to: rgba(232, 247, 255, 0.2);
@home-color-card-blue-btn-primary-bg: rgba(222, 243, 255, 0.7);
@home-color-card-blue-btn-primary-border: #008ed7;
@home-color-card-blue-btn-secondary-bg: rgba(222, 243, 255, 0.5);
@home-color-card-blue-btn-secondary-border: rgba(0, 141, 213, 0.4);
// Hero 三卡 · 国家可信碳链(白)
@home-color-card-chain-bg: rgba(255, 255, 255, 0.3);
@home-color-card-chain-header-from: rgba(255, 255, 255, 0.4);
@home-color-card-chain-header-to: rgba(255, 255, 255, 0.2);
@home-color-card-chain-btn-primary-bg: rgba(255, 255, 255, 0.6);
@home-color-card-chain-btn-primary-border: rgba(0, 0, 0, 0.4);
@home-color-card-chain-btn-secondary-bg: rgba(255, 255, 255, 0.4);
@home-color-card-chain-btn-secondary-border: rgba(0, 0, 0, 0.2);
// Hero 三卡 · 绿色服务
@home-color-card-green-from: rgba(156, 255, 221, 0.3);
@home-color-card-green-to: rgba(156, 255, 221, 0.15);
@home-color-card-green-header-from: rgba(107, 255, 204, 0.4);
@home-color-card-green-header-to: rgba(107, 255, 204, 0.2);
@home-color-card-green-btn-primary-bg: rgba(232, 255, 234, 0.7);
@home-color-card-green-btn-primary-border: rgba(0, 180, 42, 0.8);
@home-color-card-green-btn-secondary-bg: rgba(232, 255, 234, 0.5);
@home-color-card-green-btn-secondary-border: rgba(0, 180, 42, 0.4);
// CTA 按钮
@home-color-cta-btn-from: #007242;
@home-color-cta-btn-to: #00d87d;
// 遗留 / 辅助色
@home-color-nav-legacy-bg: #009a29;
@home-color-banner-placeholder: #e8eef0;
@home-color-core-hover-bg: #f8fff8;
@home-color-tab-hover: #d8e8d8;
@home-color-news-more-hover: #1b6d24;
@home-color-cta-section-bg: #c8e8d4;
@home-color-overseas-overlay: rgba(0, 30, 60, 0.85);
@home-color-overseas-desc: rgba(255, 255, 255, 0.8);
@home-color-overseas-card-bg: rgba(255, 255, 255, 0.95);
@home-color-overseas-btn-hover: #1976d2;
// -----------------------------------------------------------------------------
// 渐变(字符串,直接用于 background / background-image
// -----------------------------------------------------------------------------
@home-gradient-title: linear-gradient(90deg, #008dff 0%, #00e0d3 50.48%, #00c858 100%);
@home-gradient-search-btn: linear-gradient(180deg, @home-color-primary-green 0%, @home-color-primary-green-dark 100%);
@home-gradient-hero-fade: linear-gradient(180deg, @home-color-page-bg-transparent 0%, @home-color-page-bg 100%);
@home-gradient-core-tag: linear-gradient(90deg, #ffffff 0%, #e6efff 36.06%, #e6efff 62.5%, #ffffff 100%);
@home-gradient-ability-card: linear-gradient(0deg, rgba(255, 255, 255, 0.4) 0%, rgba(255, 255, 255, 0.9) 100%);
@home-gradient-export-btn: linear-gradient(180deg, @home-color-btn-blue-from 0%, @home-color-btn-blue-to 100%);
@home-gradient-card-blue: linear-gradient(180deg, rgba(127, 210, 255, 0.35) 0%, rgba(232, 247, 255, 0.15) 100%);
@home-gradient-card-blue-header: linear-gradient(180deg, rgba(127, 210, 255, 0.55) 0%, rgba(232, 247, 255, 0.35) 100%);
@home-gradient-card-chain-header: linear-gradient(180deg, rgba(255, 255, 255, 0.55) 0%, rgba(255, 255, 255, 0.25) 100%);
@home-gradient-card-green: linear-gradient(180deg, rgba(156, 255, 221, 0.45) 0%, rgba(156, 255, 221, 0.2) 100%);
@home-gradient-card-green-header: linear-gradient(180deg, rgba(107, 255, 204, 0.55) 0%, rgba(107, 255, 204, 0.25) 100%);
@home-gradient-cta-btn: linear-gradient(90deg, @home-color-cta-btn-from 0%, @home-color-cta-btn-to 100%);
@home-gradient-section-title-bar: linear-gradient(180deg, #00b42a, #00d468);
@home-gradient-nav-active: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.15) 100%);
@home-gradient-skeleton: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
@home-gradient-ability-section-bg: linear-gradient(
180deg,
@home-color-page-bg 0%,
rgba(255, 255, 255, 0.8) 50%,
@home-color-page-bg 100%
);
@home-gradient-export-overlay: linear-gradient(
180deg,
rgba(255, 255, 255, 0.85) 0%,
rgba(255, 255, 255, 0.4) 77.4%,
rgba(255, 255, 255, 0) 100%
);
// -----------------------------------------------------------------------------
// 字体
// -----------------------------------------------------------------------------
@home-font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
@home-font-weight-regular: 400;
@home-font-weight-medium: 500;
@home-font-weight-semibold: 600;
@home-font-size-12: 12px;
@home-font-size-14: 14px;
@home-font-size-16: 16px;
@home-font-size-20: 20px;
@home-font-size-22: 22px;
@home-font-size-24: 24px;
@home-font-size-28: 28px;
@home-font-size-32: 32px;
@home-font-size-40: 40px;
@home-font-size-56: 56px;
@home-line-height-18: 18px;
@home-line-height-20: 20px;
@home-line-height-22: 22px;
@home-line-height-26: 26px;
@home-line-height-28: 28px;
@home-line-height-38: 38px;
@home-letter-spacing: 0;
// -----------------------------------------------------------------------------
// 间距
// -----------------------------------------------------------------------------
@home-space-2: 2px;
@home-space-4: 4px;
@home-space-8: 8px;
@home-space-10: 10px;
@home-space-12: 12px;
@home-space-14: 14px;
@home-space-16: 16px;
@home-space-20: 20px;
@home-space-24: 24px;
@home-space-28: 28px;
@home-space-30: 30px;
@home-space-32: 32px;
@home-space-34: 34px;
@home-space-36: 36px;
@home-space-42: 42px;
@home-space-45: 45px;
@home-space-52: 52px;
@home-space-56: 56px;
@home-space-62: 62px;
@home-space-64: 64px;
@home-space-72: 72px;
@home-space-100: 100px;
@home-section-padding-top: 52px;
@home-section-padding-bottom: 72px;
@home-section-gap: 42px;
@home-section-title-to-content: 52px;
// -----------------------------------------------------------------------------
// 圆角
// -----------------------------------------------------------------------------
@home-radius-xs: 4px;
@home-radius-sm: 8px;
@home-radius-md: 10px;
@home-radius-lg: 12px;
@home-radius-xl: 16px;
@home-radius-pill: 24px;
@home-radius-full: 100px;
// -----------------------------------------------------------------------------
// 阴影
// -----------------------------------------------------------------------------
@home-shadow-nav: 0 2px 2px rgba(0, 0, 0, 0.05);
@home-shadow-search: 0 8px 12px rgba(0, 0, 0, 0.08);
@home-shadow-card-blue: 0 8px 12px rgba(127, 179, 213, 0.2);
@home-shadow-card-blue-hover: 0 16px 24px rgba(127, 179, 213, 0.3);
@home-shadow-card-btn-blue: 0 4px 12px rgba(127, 210, 255, 0.5);
@home-shadow-card-btn-blue-strong: 0 4px 16px rgba(127, 210, 255, 0.6);
@home-shadow-card-btn-chain: 0 4px 16px rgba(255, 255, 255, 0.5);
@home-shadow-card-btn-green: 0 4px 16px rgba(107, 255, 204, 0.6);
@home-shadow-card-green: 0 8px 12px rgba(0, 185, 107, 0.1);
@home-shadow-card-green-strong: 0 8px 20px rgba(0, 209, 121, 0.3);
@home-shadow-ability-hover: 0 12px 28px rgba(0, 209, 121, 0.4);
@home-shadow-core-selected: 0 4px 8px rgba(157, 192, 255, 0.35);
@home-shadow-export-card: 0 4px 8px rgba(70, 162, 214, 0.2);
@home-shadow-export-card-hover: 0 8px 16px rgba(70, 162, 214, 0.35);
@home-shadow-export-btn-hover: 0 4px 12px rgba(33, 150, 243, 0.4);
@home-shadow-export-icon: 0 4px 8px rgba(129, 185, 247, 0.6);
@home-shadow-news-item: 0 2px 5px rgba(0, 0, 0, 0.1);
@home-shadow-news-item-hover: 0 4px 16px rgba(0, 0, 0, 0.14);
@home-shadow-overseas-card-hover: 0 12px 32px rgba(0, 0, 0, 0.2);
@home-shadow-partner-logo: 0 4px 4px rgba(0, 185, 107, 0.06);
@home-shadow-cta-bg: 0 8px 12px rgba(0, 185, 107, 0.2);
@home-shadow-cta-btn-hover: 0 8px 20px rgba(0, 114, 66, 0.28);
@home-shadow-cta-card-1: 0 4px 20px rgba(1, 134, 78, 0.8);
@home-shadow-cta-card-2: 0 8px 20px rgba(1, 134, 78, 0.7);
@home-shadow-title-sub: 0 4px 12px rgba(255, 255, 255, 1);
@home-shadow-card-title: 0 0 8px rgba(255, 255, 255, 1);
// -----------------------------------------------------------------------------
// 模糊
// -----------------------------------------------------------------------------
@home-blur-nav: 10px;
@home-blur-sm: 4px;
@home-blur-md: 5px;
@home-blur-tag: 10px;
@home-blur-ability: 2px;
// -----------------------------------------------------------------------------
// 区块尺寸Figma 绝对 Y / height
// -----------------------------------------------------------------------------
@home-nav-height: 64px;
@home-hero-top: 64px;
@home-hero-height: 686px;
@home-core-top: 750px;
@home-core-height: 686px;
@home-ability-top: 1436px;
@home-ability-height: 686px;
@home-export-top: 2122px;
@home-export-height: 686px;
@home-news-top: 2808px;
@home-news-height: 684px;
@home-news-content-bottom-gap: 72px; // Figma hydt_center 682 Frame274 底 610
@home-partner-top: 3492px;
@home-partner-height: 689px;
@home-cta-top: 4181px;
/* 底部 CTA 单独占满一屏 */
@home-cta-height: 100vh;
@home-cta-content-offset-top: 0;
@home-cta-head-gap: 14px;
@home-cta-head-to-btn-gap: 47px;
@home-footer-top: 4867px;
@home-footer-height: 212px;
@home-footer-info-height: 148px;
@home-footer-bar-height: 64px;
// -----------------------------------------------------------------------------
// 导航栏 150645:1333
// -----------------------------------------------------------------------------
@home-nav-logo-size: 34px;
@home-nav-logo-icon-size: 32px;
@home-nav-logo-text-size: 28px;
@home-nav-logo-gap: 12px;
@home-nav-item-gap: 16px;
@home-nav-item-padding-x: 8px;
@home-nav-item-font-size: 16px;
@home-nav-active-width: 96px;
@home-nav-active-border-height: 3px;
// -----------------------------------------------------------------------------
// Hero Banner 150645:1073
// -----------------------------------------------------------------------------
@home-hero-banner-bg-width: 1548px;
@home-hero-banner-bg-height: 750px;
@home-hero-banner-bg-offset-x: -54px;
@home-hero-fade-height: 300px;
@home-hero-fade-top: 450px;
@home-hero-title-width: 867px;
@home-hero-head-gap: 16px;
@home-hero-content-gap: 56px;
@home-hero-content-padding-top: 64px;
@home-search-box-width: 600px;
@home-search-box-height: 56px;
@home-search-box-padding: 8px 8px 8px 16px;
@home-search-btn-width: 92px;
@home-search-btn-height: 40px;
@home-search-btn-padding: 15px 30px 14px;
@home-search-tag-gap: 12px;
@home-search-tag-padding: 2px 8px;
@home-search-tag-bg: rgba(255, 255, 255, 0.6);
@home-search-tag-bg-hover: rgba(255, 255, 255, 0.85);
@home-search-tag-line-height: 26px;
@home-feature-cards-gap: 36px;
@home-feature-card-width: 376px;
@home-feature-card-height: 219px;
@home-feature-card-header-height: 63px;
@home-feature-card-header-padding-y: 12px;
@home-feature-card-body-padding-x: 24px;
@home-feature-card-body-gap: 16px;
@home-feature-card-btn-height: 46px;
@home-feature-card-btn-padding: 10px;
@home-feature-card-title-size: 28px;
@home-feature-card-btn-font-size: 20px;
// -----------------------------------------------------------------------------
// 核心驱动 150645:1297
// -----------------------------------------------------------------------------
@home-core-grid-gap: 32px;
@home-core-grid-padding-x: 30px;
@home-core-col-width: 261px;
@home-core-col-padding-x: 24px;
@home-core-col-gap: 14px;
@home-core-content-width: 213px; // 261 - 24*2Figma 描述/标题内容区宽
@home-core-visual-min-height: 219px; // 插图 183 + 标签条 36
@home-core-title-min-height: 31px; // Figma 22px Semibold 文本框高
@home-core-illustration-height: 183px;
@home-core-tag-height: 36px;
@home-core-tag-padding: 4px 8px;
@home-core-tag-font-size: 16px;
@home-core-tag-font-weight: @home-font-weight-medium;
@home-core-tag-line-height: normal;
@home-core-tag-color: #333333;
@home-core-title-size: 22px;
@home-core-title-line-height: normal;
@home-core-title-color: @home-color-text-title;
@home-core-title-color-selected: @home-color-accent-blue;
@home-core-desc-size: 16px;
@home-core-desc-line-height: 28px;
@home-core-desc-color: @home-color-text-body;
@home-core-selected-bg: @home-color-white;
@home-core-selected-border: 1px solid @home-color-accent-blue-light;
@home-core-selected-shadow: @home-shadow-core-selected;
@home-core-selected-radius: @home-radius-sm;
@home-core-selected-padding-bottom: 20px;
// -----------------------------------------------------------------------------
// 共性能力 150645:1230
// -----------------------------------------------------------------------------
@home-ability-grid-cols: 3;
@home-ability-grid-col-width: 377.33px;
@home-ability-grid-min-height: 330px;
@home-ability-grid-row-height: 144px;
@home-ability-grid-col-gap: 34px;
@home-ability-grid-row-gap: 42px;
@home-ability-card-padding: 16px 16px 16px 32px;
@home-ability-card-border-width: 2px;
@home-ability-icon-size: 56px;
@home-ability-title-size: 24px;
@home-ability-arrow-size: 24px;
@home-ability-title-to-grid-gap: 100px;
// -----------------------------------------------------------------------------
// 企业出海 150645:1501
// -----------------------------------------------------------------------------
@home-export-list-width: 628px;
@home-export-list-offset-x: 286px;
@home-export-title-to-list-gap: 42px;
@home-export-card-height: 119px;
@home-export-card-padding: 24px;
@home-export-card-gap: 28px;
@home-export-card-inner-gap: 37px;
@home-export-icon-width: 64px;
@home-export-icon-height: 68px;
@home-export-icon-text-gap: 17px;
@home-export-icon-text-gap-lg: 20px;
@home-export-text-gap: 6px;
@home-export-title-size: 22px;
@home-export-title-color: @home-color-primary-dark;
@home-export-desc-size: 14px;
@home-export-desc-line-height: 22px;
@home-export-desc-color: @home-color-text-dark;
@home-export-btn-size: 77px;
@home-export-btn-padding-x: 12px;
@home-export-btn-padding-y: 8px;
@home-export-btn-font-size: 14px;
@home-export-btn-line-height: 22px;
@home-export-btn-line-height-multiline: 18px;
// -----------------------------------------------------------------------------
// 行业动态 150645:1143
// -----------------------------------------------------------------------------
@home-news-tab-gap: 32px;
@home-news-tab-padding: 4px 16px;
@home-news-tab-radius: 24px;
@home-news-tab-font-size: 16px;
@home-news-list-gap: 16px;
@home-news-tabs-to-list-gap: 24px;
@home-news-title-block-height: 58px;
@home-news-panel-height: 458px; // Figma Frame 274tab 30 + gap 24 + list 404
@home-news-item-height: 104px;
@home-news-item-padding: 12px 16px;
@home-news-item-gap: 24px;
@home-news-thumb-width: 120px;
@home-news-thumb-height: 68px;
@home-news-thumb-radius: 10px;
@home-news-title-size: 20px;
@home-news-title-line-height: 22px;
@home-news-meta-gap: 8px;
@home-news-meta-icon-size: 16px;
@home-news-meta-font-size: 12px;
@home-news-meta-line-height: 20px;
@home-news-summary-size: 14px;
@home-news-summary-line-height: 22px;
@home-news-content-gap: 6px;
// -----------------------------------------------------------------------------
// 行业动态列表页 150622:18863首页_行业动态_查看更多
// -----------------------------------------------------------------------------
@hydt-banner-height: 350px;
@hydt-banner-pad-top: 24px;
@hydt-banner-pad-bottom: 75px;
@hydt-banner-breadcrumb-title-gap: 66px;
@hydt-banner-breadcrumb-size: 13px;
@hydt-banner-title-size: 48px;
@hydt-banner-title-line-height: 68px;
@hydt-banner-title-accent: @home-color-secondary-green;
@hydt-banner-title-main: @home-color-primary-dark;
@hydt-banner-title-border: 4px solid @home-color-secondary-green;
@hydt-body-bg: @home-color-white;
@hydt-body-pad-top: 52px;
@hydt-body-pad-bottom: 42px;
@hydt-panel-width: 1100px;
@hydt-tabs-to-list-gap: 24px;
@hydt-list-gap: 16px;
@hydt-list-card-padding: 20px;
@hydt-list-card-gap: 32px;
@hydt-list-card-radius: 16px;
@hydt-list-thumb-width: 145px;
@hydt-list-thumb-height: 84px;
@hydt-list-thumb-radius: 10px;
@hydt-list-title-size: 20px;
@hydt-list-title-line-height: 22px;
@hydt-list-content-gap: 10px;
@hydt-pagination-active-bg: #e6f8f0;
// -----------------------------------------------------------------------------
// 合作伙伴 150645:1368
// -----------------------------------------------------------------------------
@home-partner-section-width: 1812px;
@home-partner-section-offset-x: -189px;
@home-partner-section-padding-y: 62px;
@home-partner-title-size: 32px;
@home-partner-subtitle-highlight-size: 24px;
@home-partner-logo-card-width: 282px;
@home-partner-logo-card-height: 89px;
@home-partner-logo-card-radius: 8px;
@home-partner-row-gap: 24px;
@home-partner-row-offset-x: 153px;
@home-partner-wreath-width: 99px;
@home-partner-wreath-height: 20px;
// -----------------------------------------------------------------------------
// CTA 碳身份证 150645:1019
// -----------------------------------------------------------------------------
@home-cta-copy-width: 484px;
@home-cta-copy-gap: 14px;
@home-cta-title-size: 40px;
@home-cta-title-line-height: 66px;
@home-cta-subtitle-size: 22px;
@home-cta-subtitle-line-height: 36px;
@home-cta-btn-width: 360px;
@home-cta-btn-height: 66px;
@home-cta-btn-padding: 8px 12px;
@home-cta-btn-font-size: 20px;
@home-cta-card-1-width: 369px;
@home-cta-card-1-height: 207px;
@home-cta-card-2-width: 354px;
@home-cta-card-2-height: 198px;
// -----------------------------------------------------------------------------
// 底部信息 150645:1426
// -----------------------------------------------------------------------------
@home-footer-padding-y: 40px;
@home-footer-padding-x: 20px;
@home-footer-padding-bottom: 20px;
@home-footer-column-gap: 12px;
@home-footer-title-size: 16px;
@home-footer-text-size: 14px;
@home-footer-link-gap: 10px;
@home-footer-bar-padding-y: 10px;
@home-footer-copyright-size: 12px;
@home-footer-copyright-line-height: 20px;
@home-footer-copyright-gap: 179px;
// -----------------------------------------------------------------------------
// 区块标题装饰Group 46
// -----------------------------------------------------------------------------
@home-section-title-size: 32px;
@home-section-title-deco-width: 158px;
@home-section-title-deco-height: 50px;
@home-section-title-deco-offset-x: 13px;
@home-section-title-deco-offset-y: 8px;
// -----------------------------------------------------------------------------
// 首页 portal-page 局部 CSS 变量(供 scoped 组件内 var() 引用)
// -----------------------------------------------------------------------------
.home-portal-page-vars() {
--home-content-max: @home-content-width;
--home-section-px: var(--page-content-align-x, 46px);
--home-section-pt: @home-section-padding-top;
--home-section-pb: @home-section-padding-bottom;
--home-news-section-min-h: @home-news-height;
--home-news-section-pb: @home-news-content-bottom-gap;
--home-cta-section-min-h: @home-cta-height;
--home-section-min-h: 741px;
--home-section-pad-top: calc(var(--page-nav-height, @home-nav-height) + var(--home-section-pt));
--home-hero-pad-top: calc(var(--page-nav-height, @home-nav-height) + @home-hero-content-padding-top);
--home-hero-pad-bottom: @home-space-64;
--home-title-color: @home-color-primary-dark;
--home-body-color: @home-color-text-body;
--home-heading-color: @home-color-text-title;
--home-title-size: @home-section-title-size;
--home-title-weight: @home-font-weight-semibold;
--home-title-bar-top: @home-section-title-deco-offset-y;
--home-title-bar-left: @home-section-title-deco-offset-x;
--home-title-bar-width: @home-section-title-deco-width;
--home-title-bar-height: @home-section-title-deco-height;
}
// -----------------------------------------------------------------------------
// 共性能力页 150605:2210 / 150605:2534
// -----------------------------------------------------------------------------
@gxnlpt-page-bg: #f6f7fa;
@gxnlpt-shell-padding-top: 42px;
@gxnlpt-shell-padding-bottom: 48px;
@gxnlpt-layout-gap: 24px;
@gxnlpt-sidebar-width: 280px;
@gxnlpt-sidebar-padding: 20px;
@gxnlpt-sidebar-radius: 16px;
@gxnlpt-side-nav-gap: 10px;
@gxnlpt-side-item-height: 48px;
@gxnlpt-side-item-radius-active: 10px;
@gxnlpt-side-item-radius: 16px;
@gxnlpt-side-label-size: 20px;
@gxnlpt-side-action-border: #d1d9d5;
@gxnlpt-side-action-bg: #e6f8f0;
@gxnlpt-side-action-color: @home-color-primary-green;
@gxnlpt-side-action-size: 16px;
@gxnlpt-content-padding: 20px;
@gxnlpt-content-min-height: 602px;
@gxnlpt-block-gap: 16px;
@gxnlpt-section-gap: 20px;
@gxnlpt-card-min-height: 114px;
@gxnlpt-card-padding-y: 16px;
@gxnlpt-card-padding-x: 20px;
@gxnlpt-card-grid-gap: 16px;
@gxnlpt-card-radius: 10px;
@gxnlpt-card-radius-hover: 12px;
@gxnlpt-more-color: #909399;
@gxnlpt-form-error: #f53f3f;
@gxnlpt-sidebar-sticky-top: 24px;
// -----------------------------------------------------------------------------
// 行业专题页首屏Figma 150581:4100 / banner-bg 4101 / hyzt_banner 150679:365 / hyzt_content 4199
// -----------------------------------------------------------------------------
@hyzt-landing-banner-height: 350px;
@hyzt-landing-bg-design-width: 1280px;
@hyzt-landing-bg-height: 548px;
@hyzt-landing-bg-offset-top: -34px;
@hyzt-landing-content-width: 1100px;
/* 标题水平位置由 banner 的 page-content-wrap--page-gutter-x控制与导航「可」对齐 */
@hyzt-landing-title-size: 48px;
@hyzt-landing-title-line-height: 68px;
@hyzt-landing-title-letter-spacing: 0.96px;
@hyzt-landing-title-padding-y: 20px;
@hyzt-landing-title-underline-pb: 20px;
@hyzt-landing-title-accent: @home-color-secondary-green;
@hyzt-landing-title-sub: @home-color-primary-dark;
@hyzt-landing-title-border: 4px solid @home-color-secondary-green;
@hyzt-landing-cards-overlap: 93px;
@hyzt-landing-cards-pt: 60px;
@hyzt-landing-cards-px: 30px;
@hyzt-landing-cards-pb: 80px;
@hyzt-landing-cards-gap: 24px;
@hyzt-landing-card-radius: 16px;
@hyzt-landing-card-padding: 28px;
@hyzt-landing-card-col-gap: 20px;
@hyzt-landing-card-title-size: 22px;
@hyzt-landing-card-desc-size: 16px;
@hyzt-landing-card-desc-min-h: 63px;
@hyzt-landing-card-desc-color: @home-color-text-secondary;
@hyzt-landing-card-desc-pt: 14px;
@hyzt-landing-card-header-pb: 20px;
@hyzt-landing-card-btn-h: 40px;
@hyzt-landing-card-btn-px: 15px;
@hyzt-landing-card-btn-py: 8px;
@hyzt-landing-card-btn-radius: 3px;
@hyzt-landing-card-btn-font: 14px;
@hyzt-landing-card-btn-bg-steel: #1d5e20;
@hyzt-landing-card-btn-bg-default: #1b6d24;
@hyzt-landing-card-border-blue: rgba(33, 150, 243, 0.2);
@hyzt-landing-card-border-green: rgba(0, 180, 42, 0.2);
@hyzt-landing-card-border-purple: rgba(114, 46, 209, 0.2);
// -----------------------------------------------------------------------------
// 企业出海页首屏Figma 150581:2666 / banner 2709 / qych_content 2808
// -----------------------------------------------------------------------------
@qych-landing-banner-height: @hyzt-landing-banner-height;
@qych-landing-content-width: @hyzt-landing-content-width;
@qych-landing-title-size: @hyzt-landing-title-size;
@qych-landing-title-line-height: @hyzt-landing-title-line-height;
@qych-landing-title-letter-spacing: @hyzt-landing-title-letter-spacing;
@qych-landing-title-padding-y: @hyzt-landing-title-padding-y;
@qych-landing-title-underline-pb: @hyzt-landing-title-underline-pb;
@qych-landing-title-accent: @hyzt-landing-title-accent;
@qych-landing-title-sub: @hyzt-landing-title-sub;
@qych-landing-title-border: @hyzt-landing-title-border;
@qych-landing-cards-overlap: @hyzt-landing-cards-overlap;
@qych-landing-cards-pt: @hyzt-landing-cards-pt;
@qych-landing-cards-px: @hyzt-landing-cards-px;
@qych-landing-cards-pb: @hyzt-landing-cards-pb;
@qych-landing-cards-gap: @hyzt-landing-cards-gap;
@qych-landing-card-radius: @hyzt-landing-card-radius;
@qych-landing-card-padding: @hyzt-landing-card-padding;
@qych-landing-card-col-gap: @hyzt-landing-card-col-gap;
@qych-landing-card-title-size: @hyzt-landing-card-title-size;
@qych-landing-card-desc-size: @hyzt-landing-card-desc-size;
@qych-landing-card-desc-min-h: @hyzt-landing-card-desc-min-h;
@qych-landing-card-desc-color: @hyzt-landing-card-desc-color;
@qych-landing-card-desc-pt: @hyzt-landing-card-desc-pt;
@qych-landing-card-header-pb: @hyzt-landing-card-header-pb;
@qych-landing-card-btn-h: @hyzt-landing-card-btn-h;
@qych-landing-card-btn-px: @hyzt-landing-card-btn-px;
@qych-landing-card-btn-py: @hyzt-landing-card-btn-py;
@qych-landing-card-btn-radius: @hyzt-landing-card-btn-radius;
@qych-landing-card-btn-font: @hyzt-landing-card-btn-font;
@qych-landing-card-btn-bg-steel: @hyzt-landing-card-btn-bg-steel;
@qych-landing-card-btn-bg-default: @hyzt-landing-card-btn-bg-default;
@qych-landing-card-border-blue: @hyzt-landing-card-border-blue;
@qych-landing-card-border-green: @hyzt-landing-card-border-green;
@qych-landing-card-border-purple: @hyzt-landing-card-border-purple;
// -----------------------------------------------------------------------------
// 企业出海 · 政策文案屏Figma 150660:2899 / 2945 / 2995
// -----------------------------------------------------------------------------
@qych-policy-content-width: 1200px;
@qych-policy-title-size: 32px;
@qych-policy-title-weight: 600;
@qych-policy-title-color: @home-color-black;
@qych-policy-subtitle-size: 16px;
@qych-policy-subtitle-weight: 400;
@qych-policy-subtitle-color: @home-color-text-dark;
@qych-policy-header-gap: 10px;
@qych-policy-block-gap: 30px;
@qych-policy-module-py: 42px;
@qych-policy-card-height: 490px;
@qych-policy-card-inner-gap: 10px;
@qych-policy-card-inner-gap-battery: 24px;
@qych-policy-card-radius: 10px;
@qych-policy-section-title-size: 24px;
@qych-policy-section-title-weight: 600;
@qych-policy-section-title-py: 16px;
@qych-policy-section-title-px: 20px;
@qych-policy-section-title-pb: 10px;
@qych-policy-body-size: 14px;
@qych-policy-body-line: 20px;
@qych-policy-body-color: @home-color-text-secondary;
@qych-policy-label-weight: 600;
@qych-policy-label-color: @home-color-black;
@qych-policy-bullet-color: #4caf50;
@qych-policy-panel-bg: #f7f8fa;
@qych-policy-panel-height: 376px;
@qych-policy-panel-padding: 24px;
@qych-policy-panel-gap: 16px;
@qych-policy-content-gap: 24px;
@qych-policy-content-px: 23px;
@qych-policy-sidebar-width: 300px;
@qych-policy-sidebar-title-size: 20px;
@qych-policy-card-title-size: 16px;
@qych-policy-card-title-color: @home-color-text-dark;
@qych-policy-card-desc-size: 14px;
@qych-policy-card-desc-color: @home-color-text-secondary;
@qych-policy-card-padding-y: 32px;
@qych-policy-card-padding-x: 20px;
@qych-policy-card-padding-bottom: 20px;
@qych-policy-card-gap: 16px;
@qych-policy-card-radius-inner: 10px;
@qych-policy-btn-size: 14px;
@qych-policy-btn-height: 32px;
@qych-policy-btn-radius: 3px;
@qych-policy-header-gradient-battery: linear-gradient(180deg, #f1efff 0%, #f0efff 52.885%, #fff 100%);
@qych-policy-header-gradient-cbam: linear-gradient(180deg, #effdfe 0%, #fff 100%);
@qych-policy-header-gradient-shipping: linear-gradient(180deg, #e0f2e1 0%, #fff 100%);
@qych-policy-card-gradient-battery-1: linear-gradient(180deg, #f5f4ff 0%, #ebe8ff 100%);
@qych-policy-card-gradient-battery-2: linear-gradient(180deg, #f0f9ff 0%, #e0efff 100%);
@qych-policy-card-gradient-cbam-1: linear-gradient(180deg, #fffaf6 0%, #fff0e3 100%);
@qych-policy-card-gradient-cbam-2: linear-gradient(180deg, #ebfcff 0%, #daf9fc 100%);
@qych-policy-card-gradient-shipping-1: linear-gradient(180deg, #f0f9ff 0%, #e0efff 100%);
@qych-policy-card-gradient-shipping-2: linear-gradient(180deg, #ebfcff 0%, #daf9fc 100%);
@qych-policy-card-min-height: 164px;
@qych-policy-card-icon-right: 30px;
@qych-policy-card-icon-opacity: 0.3;
@qych-policy-card-icon-opacity-soft: 0.2;
@qych-policy-card-icon-sm: 50px;
@qych-policy-card-icon-sm-max-h: 52px;
@qych-policy-card-icon-md: 60px;
@qych-policy-card-icon-md-max-h: 62px;
@qych-policy-card-icon-lg: 80px;
@qych-policy-card-icon-lg-max-h: 82px;
@qych-policy-block-head-gap: 10px;
@qych-policy-card-icon-top-cbam-1: 82px;
@qych-policy-card-icon-top-cbam-2: 84px;
// -----------------------------------------------------------------------------
// 导出为 CSS 变量(可选,与 page-layout.less 并存)
// -----------------------------------------------------------------------------
.home-figma-css-vars() {
:root {
--home-color-primary-dark: @home-color-primary-dark;
--home-color-primary-green: @home-color-primary-green;
--home-color-primary-green-dark: @home-color-primary-green-dark;
--home-color-secondary-green: @home-color-secondary-green;
--home-color-page-bg: @home-color-page-bg;
--home-color-text-body: @home-color-text-body;
--home-color-text-muted: @home-color-text-muted;
--home-color-text-title: @home-color-text-title;
--home-color-accent-blue: @home-color-accent-blue;
--home-content-width: @home-content-width;
--home-nav-height: @home-nav-height;
--home-section-padding-top: @home-section-padding-top;
--home-section-padding-bottom: @home-section-padding-bottom;
--home-section-gap: @home-section-gap;
--home-radius-sm: @home-radius-sm;
--home-radius-lg: @home-radius-lg;
--home-radius-pill: @home-radius-pill;
--home-shadow-search: @home-shadow-search;
--home-shadow-card-green: @home-shadow-card-green;
--home-shadow-news-item: @home-shadow-news-item;
--home-font-family: @home-font-family;
}
}

View File

@ -1,12 +1,17 @@
// 门户页边距:对标政务站(约 1200px 版心 + 自适应留白)
// 企业出海「电池法案」模块已按 1300px 落地,全站导航与内容左缘与之对齐
// 门户页边距Figma 1440 画布 · 1200 版心 · 左右各 120px 自适应留白
:root {
--page-content-max-width: 1300px;
--page-gutter-x: 25px;
/* 导航 Logomodule 25px + 标题 padding-left 20px */
--page-nav-padding-left: 22px;
/* 首页区块大标题:比 Logo 再内缩一档 */
--page-section-title-padding-left: 60px;
--page-content-max-width: 1200px;
/* Figma 导航 logo图标区 34px + 与字间距 12px → 「可」字左缘距版心左 46px */
--page-nav-logo-icon-box: 34px;
--page-nav-logo-gap: 12px;
--page-content-align-x: calc(
var(--page-nav-padding-left) + var(--page-nav-logo-icon-box) + var(--page-nav-logo-gap)
);
/* 区块标题 / Tab / 列表与导航「可」字左缘对齐 */
--page-gutter-x: var(--page-content-align-x);
--page-section-title-padding-left: var(--page-content-align-x);
/* 导航 logo 图标左缘贴版心左(「可」字由上方 align-x 统一定位) */
--page-nav-padding-left: 0px;
/* 大标题与下方 UI 间距(与共性能力屏一致) */
--page-block-title-to-content-gap: 45px;
/* 版心内标题相对 gutter 的额外内缩 */
@ -32,7 +37,7 @@
--page-footer-link-gap: 8px;
/* 与首屏 .top-title 距顶一致,各屏区块大标题上方留白 */
--page-hero-title-offset-top: 128px;
--page-section-title-top: 128px;
--page-section-title-top: 100px;
/* 服务中心四宫格单卡尺寸(与版心同宽) */
--portal-services-grid-max: var(--page-content-max-width);
@ -49,9 +54,7 @@
@media screen and (max-width: 1279px) {
:root {
--page-gutter-x: 20px;
--page-nav-padding-left: 40px;
--page-section-title-padding-left: 52px;
--page-section-padding-y: 48px;
--page-nav-height: 64px;
--page-nav-logo-menu-gap: 80px;
@ -64,9 +67,7 @@
@media screen and (max-width: 767px) {
:root {
--page-gutter-x: 16px;
--page-nav-padding-left: 36px;
--page-section-title-padding-left: 44px;
--page-section-padding-y: 40px;
--page-nav-height: 56px;
--page-hero-title-offset-top: 72px;
@ -91,5 +92,13 @@
margin-left: auto;
margin-right: auto;
padding-left: var(--page-nav-padding-left);
padding-right: var(--page-gutter-x);
padding-right: var(--page-nav-padding-left);
}
/* 首页全宽背景区块:突破 .container 80% 限制 */
.home-section-bleed() {
width: 100vw;
max-width: none;
margin-left: calc(50% - 50vw);
margin-right: calc(50% - 50vw);
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

View File

@ -0,0 +1,546 @@
<template>
<div class="hydt-page portal-page">
<!-- Figma banner-bg 150622:19115背景 imageRef ec2e3dd -->
<section class="hydt-banner" aria-label="行业动态">
<div class="hydt-banner-bg" aria-hidden="true"></div>
<div class="hydt-banner-inner page-content-wrap">
<p class="hydt-breadcrumb">
当前位置
<span class="hydt-breadcrumb-link" role="link" tabindex="0" @click="goHomeToNews" @keydown.enter="goHomeToNews"
>首页</span
>
/
<span class="hydt-breadcrumb-current">行业动态</span>
</p>
<h1 class="hydt-banner-title">
<span class="hydt-banner-title-accent">行业</span>
<span class="hydt-banner-title-main">动态</span>
</h1>
</div>
</section>
<!-- Figma hydt_content 150622:18905 -->
<section class="hydt-body">
<div class="hydt-body-inner page-content-wrap">
<div class="hydt-panel">
<div class="hydt-tabs" role="tablist" aria-label="动态分类">
<button
v-for="(tab, index) in newsTabs"
:key="tab.type"
type="button"
role="tab"
class="hydt-tab"
:class="{ 'hydt-tab-active': activeTab === index }"
:aria-selected="activeTab === index"
@click="switchTab(index)"
>
{{ tab.name }}
</button>
</div>
<div v-if="pageLoading" class="hydt-state">加载中...</div>
<div v-else-if="!filteredList.length" class="hydt-state">暂无相关动态</div>
<template v-else>
<div class="hydt-list">
<article
v-for="(item, index) in paginatedList"
:key="item.id || item.uuid || item.bt || index"
class="hydt-item"
@click="handleNewsClick(item)"
>
<img
:src="item.tp || getDefaultPic(currentType)"
alt=""
class="hydt-pic"
/>
<div class="hydt-content">
<h2 class="hydt-item-title">{{ item.bt }}</h2>
<div class="hydt-meta">
<img src="@/pages/index/assets/alarm.png" class="hydt-alarm-icon" alt="" />
<time class="hydt-date">{{ item.fbsj }}</time>
<span v-if="item.lxr" class="hydt-remark">转载自 {{ item.lxr }}</span>
</div>
<p v-if="item.nr" class="hydt-summary">{{ item.nr }}</p>
</div>
</article>
</div>
<div v-if="filteredList.length > 0" class="hydt-pagination">
<span class="hydt-pagination-total"> {{ filteredList.length }} 项数据</span>
<t-pagination
v-model="page.pageNo"
:total="filteredList.length"
:page-size.sync="page.pageSize"
:page-size-options="[5, 10, 20, 50]"
:total-content="false"
@change="onPageChange"
/>
</div>
</template>
</div>
</div>
</section>
<Footer />
</div>
</template>
<script>
import Footer from '@/pages/index/components/footer/index.vue';
import hydtApi from '@/pages/index/api/hydt/index.js';
const NEWS_TABS = [
{ name: '国家政策', type: 'gjzc' },
{ name: '行业资讯', type: 'hyzx' },
{ name: '平台公告', type: 'ptgg' },
];
export default {
name: 'HydtIndex',
components: { Footer },
data() {
return {
newsTabs: NEWS_TABS,
activeTab: 0,
pageLoading: false,
newsListByType: {
gjzc: [],
hyzx: [],
ptgg: [],
},
page: {
pageNo: 1,
pageSize: 5,
},
};
},
computed: {
currentType() {
return this.newsTabs[this.activeTab]?.type || 'gjzc';
},
currentList() {
return this.newsListByType[this.currentType] || [];
},
filteredList() {
return this.currentList;
},
paginatedList() {
const start = (this.page.pageNo - 1) * this.page.pageSize;
return this.filteredList.slice(start, start + this.page.pageSize);
},
},
watch: {
'$route.query.type'(type) {
this.syncTabFromRoute(type);
},
activeTab() {
this.page.pageNo = 1;
},
},
mounted() {
this.syncTabFromRoute(this.$route.query.type);
this.fetchNewsData();
},
methods: {
goHomeToNews() {
this.$router.push({ path: '/home', query: { section: 'section-news', type: this.currentType } });
},
syncTabFromRoute(type) {
if (!type) return;
const index = this.newsTabs.findIndex((tab) => tab.type === type);
if (index >= 0) this.activeTab = index;
},
switchTab(index) {
this.activeTab = index;
const type = this.newsTabs[index]?.type;
if (this.$route.query.type !== type) {
this.$router.replace({ path: '/hydt', query: { type } });
}
},
onPageChange() {
window.scrollTo({ top: 0, behavior: 'smooth' });
},
handleNewsClick(item) {
const link = item.yyLj || item.lj;
if (link) {
window.open(link, '_blank');
} else {
this.$message.info(item.bt || '暂无详情链接');
}
},
async fetchNewsData() {
this.pageLoading = true;
try {
const [hydtRes, ptggRes] = await Promise.all([
hydtApi.getHydtGroupedList(),
hydtApi.getPtggList(),
]);
if (hydtRes.data) {
this.newsListByType.gjzc = hydtRes.data.gjzc || [];
this.newsListByType.hyzx = hydtRes.data.hyzx || [];
}
if (ptggRes.data) {
this.newsListByType.ptgg = ptggRes.data || [];
}
} catch (e) {
console.error('获取行业动态失败', e);
this.$message.warning('加载失败,请稍后重试');
} finally {
this.pageLoading = false;
}
},
getDefaultPic(type) {
const defaultPics = {
gjzc: 'static_res/images/news/default-news.png',
hyzx: 'static_res/images/news/default-hyzx.png',
ptgg: 'static_res/images/news/default-ptgg.png',
};
return defaultPics[type] || defaultPics.hyzx;
},
},
};
</script>
<style lang="less" scoped>
@import '../../styles/home-figma-variables.less';
.hydt-page {
min-height: 100%;
background: @home-color-page-bg;
font-family: @home-font-family;
box-sizing: border-box;
}
/* ---------- Banner ---------- */
.hydt-banner {
position: relative;
height: @hydt-banner-height;
overflow: hidden;
background: @home-color-page-bg;
box-sizing: border-box;
}
/* Figma 150622:19115 画框背景 FILL1440×350 */
.hydt-banner-bg {
position: absolute;
inset: 0;
z-index: 0;
pointer-events: none;
background: url('./assets/hydt-banner-bg.png') no-repeat center;
background-size: cover;
}
.hydt-banner-inner {
position: relative;
z-index: 1;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: @hydt-banner-breadcrumb-title-gap;
height: 100%;
/* 勿写 padding 简写左右为 0否则会冲掉 page-content-wrap 与导航「可」字对齐 */
padding-top: @hydt-banner-pad-top;
padding-bottom: @hydt-banner-pad-bottom;
box-sizing: border-box;
}
.hydt-breadcrumb {
margin: 0;
font-size: @hydt-banner-breadcrumb-size;
font-weight: @home-font-weight-regular;
line-height: normal;
color: @home-color-primary-dark;
letter-spacing: 0.26px;
}
.hydt-breadcrumb-link {
color: @home-color-primary-dark;
cursor: pointer;
}
.hydt-breadcrumb-link:hover {
color: @home-color-primary-green-dark;
}
.hydt-breadcrumb-current {
color: @home-color-text-secondary;
}
.hydt-banner-title {
display: flex;
flex-wrap: nowrap;
align-items: baseline;
margin: 0;
padding: 20px 0;
font-size: @hydt-banner-title-size;
font-weight: @home-font-weight-semibold;
line-height: @hydt-banner-title-line-height;
letter-spacing: 0.96px;
white-space: nowrap;
}
.hydt-banner-title-accent {
display: inline-block;
flex-shrink: 0;
padding-bottom: 20px;
color: @hydt-banner-title-accent;
border-bottom: @hydt-banner-title-border;
vertical-align: baseline;
}
.hydt-banner-title-main {
display: inline-block;
flex-shrink: 0;
color: @hydt-banner-title-main;
vertical-align: baseline;
}
/* ---------- 列表区 ---------- */
.hydt-body {
background: @hydt-body-bg;
}
.hydt-body-inner {
padding: @hydt-body-pad-top 0 @hydt-body-pad-bottom;
box-sizing: border-box;
}
.hydt-panel {
width: 100%;
max-width: @hydt-panel-width;
margin: 0 auto;
box-sizing: border-box;
}
.hydt-tabs {
display: flex;
flex-wrap: wrap;
align-items: flex-end;
gap: @home-news-tab-gap;
margin-bottom: @hydt-tabs-to-list-gap;
}
.hydt-tab {
padding: @home-news-tab-padding;
font-family: @home-font-family;
font-size: @home-news-tab-font-size;
font-weight: @home-font-weight-regular;
line-height: normal;
color: @home-color-secondary-green;
cursor: pointer;
background: @home-color-tab-bg;
border: none;
border-radius: @home-news-tab-radius;
transition: background 0.2s ease, color 0.2s ease;
&:hover {
background: @home-color-tab-hover;
}
}
.hydt-tab-active {
font-weight: @home-font-weight-medium;
color: @home-color-white;
background: @home-color-secondary-green;
&:hover {
background: @home-color-secondary-green;
color: @home-color-white;
}
}
.hydt-state {
padding: 64px 0;
font-size: @home-font-size-16;
color: @home-color-text-muted;
text-align: center;
}
.hydt-list {
display: flex;
flex-direction: column;
gap: @hydt-list-gap;
}
.hydt-item {
display: flex;
align-items: center;
gap: @hydt-list-card-gap;
width: 100%;
min-height: calc(@hydt-list-card-padding * 2 + @hydt-list-thumb-height);
padding: @hydt-list-card-padding;
cursor: pointer;
background: @home-color-white;
border: none;
border-radius: @hydt-list-card-radius;
box-shadow: @home-shadow-news-item;
box-sizing: border-box;
transition: box-shadow 0.25s ease;
&:hover {
box-shadow: @home-shadow-news-item-hover;
}
}
.hydt-pic {
flex: 0 0 @hydt-list-thumb-width;
width: @hydt-list-thumb-width;
height: @hydt-list-thumb-height;
object-fit: cover;
border-radius: @hydt-list-thumb-radius;
flex-shrink: 0;
}
.hydt-content {
display: flex;
flex: 1;
flex-direction: column;
gap: @hydt-list-content-gap;
justify-content: center;
min-width: 0;
}
.hydt-item-title {
margin: 0;
overflow: hidden;
font-size: @hydt-list-title-size;
font-weight: @home-font-weight-semibold;
line-height: @hydt-list-title-line-height;
color: @home-color-black;
text-overflow: ellipsis;
white-space: nowrap;
}
.hydt-meta {
display: flex;
flex-wrap: nowrap;
gap: @home-news-meta-gap;
align-items: center;
min-height: @home-news-meta-line-height;
overflow: hidden;
}
.hydt-alarm-icon {
flex-shrink: 0;
width: @home-news-meta-icon-size;
height: @home-news-meta-icon-size;
}
.hydt-date {
flex-shrink: 0;
font-size: @home-news-meta-font-size;
line-height: @home-news-meta-line-height;
color: @home-color-text-muted;
}
.hydt-remark {
overflow: hidden;
font-size: @home-news-meta-font-size;
line-height: @home-news-meta-line-height;
color: @home-color-secondary-green;
text-overflow: ellipsis;
white-space: nowrap;
min-width: 0;
}
.hydt-summary {
margin: 0;
overflow: hidden;
font-size: @home-news-summary-size;
font-weight: @home-font-weight-regular;
line-height: @home-news-summary-line-height;
color: @home-color-text-body;
text-overflow: ellipsis;
white-space: nowrap;
}
/* ---------- 分页 ---------- */
.hydt-pagination {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: flex-end;
gap: 16px;
padding-top: 16px;
padding-bottom: 16px;
}
.hydt-pagination-total {
font-size: @home-font-size-14;
line-height: @home-line-height-22;
color: rgba(0, 0, 0, 0.6);
white-space: nowrap;
}
.hydt-pagination ::v-deep .t-pagination {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: flex-end;
gap: 16px;
}
.hydt-pagination ::v-deep .t-pagination__select {
margin-right: 0;
}
.hydt-pagination ::v-deep .t-input.t-is-readonly {
width: 96px;
border-radius: 3px;
}
.hydt-pagination ::v-deep .t-pagination__number.t-is-current {
background: @hydt-pagination-active-bg;
border-color: transparent;
}
@media screen and (max-width: 767px) {
.hydt-banner-inner {
gap: 32px;
padding-top: 16px;
padding-bottom: 40px;
}
.hydt-banner-title {
font-size: 32px;
line-height: 1.2;
}
.hydt-banner-title-accent {
padding-bottom: 12px;
}
.hydt-body-inner {
padding-top: 32px;
padding-bottom: 32px;
}
.hydt-item {
flex-direction: column;
align-items: stretch;
}
.hydt-pic {
width: 100%;
height: auto;
max-height: 160px;
}
.hydt-item-title,
.hydt-summary {
white-space: normal;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.hydt-pagination {
flex-direction: column;
align-items: stretch;
}
.hydt-pagination ::v-deep .t-pagination {
justify-content: center;
}
}
</style>

View File

@ -1,14 +1,15 @@
<template>
<div class="hyzt-wrap">
<div class="banner-section">
<div class="banner-visual" aria-hidden="true"></div>
<div class="banner-inner hyzt-page-inner">
<!-- Figma 150581:4101 banner-bg / 150679:365 hyzt_banner 1 -->
<section class="banner-section" aria-label="行业专题">
<div class="banner-bg" aria-hidden="true"></div>
<div class="banner-inner page-content-wrap">
<h1 class="banner-title">
<span class="banner-title-main">行业</span>
<span class="banner-title-sub">专题</span>
<span class="banner-title-accent">行业</span>
<span class="banner-title-main">专题</span>
</h1>
</div>
</div>
</section>
<div class="services-section hyzt-page-inner">
<div class="services-grid">
@ -70,54 +71,52 @@ export default {
</script>
<style lang="less" scoped>
@import '../../styles/home-figma-variables.less';
.hyzt-wrap {
min-height: 100%;
background: #f6f7fa;
}
/* Figma 1440版心 1300 居中(左右各 70px */
/* Figma 1440版心 1300 居中(x:70 */
.hyzt-page-inner {
width: 100%;
max-width: 1300px;
max-width: @hyzt-landing-content-width;
margin-left: auto;
margin-right: auto;
box-sizing: border-box;
}
/*
* BannerFigma 150581:2545
* - 画框 1440×350clipsContent
* - 轮播背景 150581:25461440×617absolute top -35px比例 -35/1440
* - 分界色线在导出插图内 overflow:hidden 裁切呈现勿另加 CSS 色带
*/
/* Figma 150581:4101 banner-bg — 1280×350背景 hyzt_banner 1280×548、top:-34 */
.banner-section {
position: relative;
height: 350px;
z-index: 1;
height: @hyzt-landing-banner-height;
box-sizing: border-box;
overflow: hidden;
background: #f6f7fa;
background: #fff;
}
.banner-visual {
.banner-bg {
position: absolute;
top: @hyzt-landing-bg-offset-top;
left: 0;
z-index: 0;
width: 100%;
height: calc(617 / 1440 * 100vw);
top: calc(-35 / 1440 * 100vw);
background: url(../../assets/hyzt/banner-figma.png) no-repeat center top;
background-size: 100% 100%;
height: calc(@hyzt-landing-bg-height / @hyzt-landing-bg-design-width * 100vw);
min-height: @hyzt-landing-bg-height;
pointer-events: none;
background: url(../../assets/hyzt/banner-bg.png) no-repeat center top;
background-size: cover;
}
/* 与导航「可」字左缘对齐:使用 page-content-wrap--page-gutter-x勿用 1100 版心 + 60px */
.banner-inner {
position: relative;
z-index: 2;
z-index: 1;
display: flex;
align-items: center;
height: 100%;
/* Figma title 150581:2550padding 20px 0 20px 60px */
padding: 20px 30px 20px 60px;
box-sizing: border-box;
}
@ -125,52 +124,51 @@ export default {
display: flex;
flex-wrap: nowrap;
align-items: baseline;
gap: 0;
margin: 0;
font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
font-size: 48px;
font-weight: 600;
line-height: 1;
letter-spacing: 0;
-webkit-font-smoothing: antialiased;
padding: @hyzt-landing-title-padding-y 0;
font-size: @hyzt-landing-title-size;
font-weight: @home-font-weight-semibold;
line-height: @hyzt-landing-title-line-height;
letter-spacing: @hyzt-landing-title-letter-spacing;
white-space: nowrap;
}
.banner-title-accent {
display: inline-block;
flex-shrink: 0;
padding-bottom: @hyzt-landing-title-underline-pb;
color: @hyzt-landing-title-accent;
border-bottom: @hyzt-landing-title-border;
vertical-align: baseline;
}
/* Figma下划线仅在「行业」下方「专题」与「行业」同一基线 */
.banner-title-main {
display: inline-block;
padding-bottom: 20px;
color: #2e7d32;
border-bottom: 4px solid #2e7d32;
flex-shrink: 0;
color: @hyzt-landing-title-sub;
vertical-align: baseline;
}
.banner-title-sub {
display: inline-block;
color: #003b1a;
vertical-align: baseline;
}
/* 卡片区Figma 150581:2644 hyzt_content — x:70 y:3211300×428 */
/* Figma hyzt_content 150581:4199 — 1100×428padding 60/30/80与 Banner 重叠 93px */
.services-section {
position: relative;
z-index: 2;
margin-top: -93px;
padding: 60px 30px 80px;
margin-top: -@hyzt-landing-cards-overlap;
padding: @hyzt-landing-cards-pt @hyzt-landing-cards-px @hyzt-landing-cards-pb;
box-sizing: border-box;
.services-grid {
display: grid;
width: 100%;
gap: 24px;
gap: @hyzt-landing-cards-gap;
grid-template-columns: repeat(3, minmax(0, 1fr));
align-items: stretch;
}
.service-card {
width: 100%;
min-height: 288px;
cursor: pointer;
border-radius: 16px;
border-radius: @hyzt-landing-card-radius;
overflow: hidden;
background: #fff;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.06);
@ -188,13 +186,14 @@ export default {
flex-direction: column;
height: 100%;
min-height: 288px;
padding: 28px;
padding: @hyzt-landing-card-padding;
gap: @hyzt-landing-card-col-gap;
box-sizing: border-box;
}
.service-card-header {
flex-shrink: 0;
padding-bottom: 20px;
padding-bottom: @hyzt-landing-card-header-pb;
margin-bottom: 0;
border-bottom-width: 1px;
border-bottom-style: solid;
@ -203,57 +202,58 @@ export default {
.service-card-title {
margin: 0;
font-size: 22px;
font-weight: 600;
font-size: @hyzt-landing-card-title-size;
font-weight: @home-font-weight-semibold;
line-height: 1.4;
color: #000;
color: @home-color-black;
text-align: center;
}
.service-card-desc {
flex: 1;
margin: 0;
min-height: 63px;
padding-top: 14px;
font-size: 16px;
font-weight: 400;
min-height: @hyzt-landing-card-desc-min-h;
padding-top: 0;
font-size: @hyzt-landing-card-desc-size;
font-weight: @home-font-weight-regular;
line-height: 1.6;
color: #666;
color: @hyzt-landing-card-desc-color;
text-align: center;
}
.service-card-buttons {
flex-shrink: 0;
display: flex;
flex-direction: column;
gap: 10px;
margin-top: auto;
/deep/ .t-button {
width: 100%;
border-radius: 3px;
height: @hyzt-landing-card-btn-h;
padding: @hyzt-landing-card-btn-py @hyzt-landing-card-btn-px;
font-size: @hyzt-landing-card-btn-font;
border-radius: @hyzt-landing-card-btn-radius;
}
/deep/ .t-button--theme-primary {
background: #1b6d24;
border-color: #1b6d24;
background: @hyzt-landing-card-btn-bg-default;
border-color: @hyzt-landing-card-btn-bg-default;
}
}
.service-card-inner:has(.blue-header) /deep/ .t-button--theme-primary {
background: #1d5e20;
border-color: #1d5e20;
background: @hyzt-landing-card-btn-bg-steel;
border-color: @hyzt-landing-card-btn-bg-steel;
}
.blue-header {
border-bottom-color: rgba(33, 150, 243, 0.2);
border-bottom-color: @hyzt-landing-card-border-blue;
}
.green-header {
border-bottom-color: rgba(0, 180, 42, 0.2);
border-bottom-color: @hyzt-landing-card-border-green;
}
.purple-header {
border-bottom-color: rgba(114, 46, 209, 0.2);
border-bottom-color: @hyzt-landing-card-border-purple;
}
}
@ -263,41 +263,20 @@ export default {
}
.services-section {
padding: 40px var(--page-gutter-x, 20px) 60px;
padding-top: 40px;
padding-bottom: 60px;
}
}
@media (max-width: 900px) {
.banner-section {
height: 280px;
&::after {
height: 80px;
}
}
.banner-visual {
height: calc(617 / 1440 * 100vw);
top: calc(-35 / 1440 * 100vw);
}
.banner-title {
font-size: 36px;
line-height: 1.3;
}
.banner-title-main {
padding-bottom: 12px;
border-bottom-width: 3px;
}
.banner-inner {
padding: 20px var(--page-gutter-x, 20px);
}
.services-section {
margin-top: -60px;
padding: 40px var(--page-gutter-x, 20px) 60px;
padding-top: 40px;
padding-bottom: 60px;
}
.services-section .services-grid {
@ -305,17 +284,12 @@ export default {
gap: 16px;
}
.services-section .service-card,
.services-section .service-card-inner {
min-height: auto;
}
}
@media (max-width: 768px) {
.banner-inner {
padding: 16px var(--page-gutter-x, 16px);
}
.services-section .service-card-inner {
padding: 20px;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,606 @@
# 共性能力平台 — 收藏与收录 数据库设计说明
| 属性 | 内容 |
|------|------|
| **文档版本** | v2.0 |
| **编写日期** | 2026-05-23 |
| **修订日期** | 2026-05-23 |
| **编写人** | (待填写) |
| **审核人** | (待填写) |
| **适用系统** | `txw-mhzc` 门户 — 共性能力页 `/gxnlpt` |
| **适用数据库** | **MySQL 8.0+**InnoDB`utf8mb4`);本文 DDL/索引以 MySQL 为准,不承诺 Oracle 等库可直接复用 |
| **关联前端** | `txw-mhzc-web/src/pages/index/views/gxnlpt/index.vue` |
| **DDL 脚本** | `txw-mhzc/sql/txw_mhzc_gxnl_slxxb_gxscb.sql` |
---
## 修订记录
| 版本 | 日期 | 修订人 | 审核人 | 说明 |
|------|------|--------|--------|------|
| v1.0 | 2026-05-23 | — | — | 初稿双表、ER、基础字段与状态 |
| v2.0 | 2026-05-23 | — | — | 参照评审意见补充字段校验、命名规范、乐观锁、索引与唯一约束、状态矩阵、API 规范、一致性/异常/迁移/性能 |
---
## 1. 设计背景与目标
### 1.1 业务场景
| 能力 | 前端入口 | 业务特征 |
|------|----------|----------|
| 分类浏览 | 左侧 5 类导航 + 卡片 | 展示已上架网站条目 |
| **收录** | 「收录」表单 | 提交名称/链接/简介/分类/标签/联系人;审核后展示 |
| **收藏** | 星标 +「我的收藏」 | 登录用户对已上架条目收藏/取消 |
### 1.2 设计目标
- 与供需体系(`txw_gxzx_*`)解耦,新建 `txw_mhzc_gxnl_*` 域表。
- 字段、状态、索引、API 具备**可落地校验规则**,减少脏数据与并发覆盖。
- 首期双表交付;审核流水、操作日志表列为**可选扩展**,并给出过渡期方案。
### 1.3 表清单
| 序号 | 物理表名 | 中文名 | 职责 |
|------|----------|--------|------|
| 1 | `txw_mhzc_gxnl_slxxb` | 共性能力收录信息表 | 主数据 + 收录申请 + 审核/上架 |
| 2 | `txw_mhzc_gxnl_gxscb` | 共性能力收藏表 | 用户收藏关系 |
| (扩展) | `txw_mhzc_gxnl_slshb` | 收录审核流水表 | 多轮审核留痕(二期建议建表) |
| (扩展) | 平台操作日志 | 复用现有审计/日志组件 | 关联 `wz_uuid` 追溯操作链路 |
---
## 2. 命名与缩写规范
### 2.1 后缀约定(全库统一)
| 后缀 | 含义 | 示例 |
|------|------|------|
| `_dm` | 代码(字典值、枚举) | `gxnl_fl_dm`、`lyqd_dm` |
| `_mc` | 名称(展示冗余) | `gxnl_fl_mc`、`qymc` |
| `_uuid` | 业务主键/外键 UUID | `wz_uuid`、`yh_uuid` |
| `_bz` | 标志Y/N | `yxbz`、`sjzt`(上架标志,历史命名保留) |
| `_jh` | 集合(逗号分隔) | `bqjh` |
| `_rq` / `_sj` | 日期/时间 | `lrrq`、`shsj` |
| `lrr` / `xgr` / `shr` | 录入人/修改人/审核人 | `lrruuid`、`xgruuid` |
| `tjr_` | 提交人(门户侧填写) | `tjr_nc`、`tjr_lxdh` |
### 2.2 未使用后缀的字段说明
| 字段 | 说明 |
|------|------|
| `zt` | 业务状态(历史习惯,与 `sjzt` 成对使用,不改为 `zt_dm` 以降低迁移成本) |
| `sjzt` | 上架状态(`s`=上架,`j`=见,与项目内 `sjzt` 一致) |
| `bt` | 标题 title 缩写 |
### 2.3 易混字段语义(收录表)
| 字段 | 语义 | 赋值规则 |
|------|------|----------|
| `yh_uuid` | **门户提交账号** | 用户登录提交时 = 当前 `Session.yh_uuid`;游客提交 = `NULL` |
| `lrruuid` | **数据录入操作人** | 门户提交:登录用户 = `yh_uuid`,游客 = `NULL`;运营后台录入/导入 = 操作员 `yh_uuid` |
| `tjr_nc` / `tjr_lxdh` | **表单展示用联系人** | 用户填写;可与账号信息不一致 |
| `xgruuid` | **最后修改人** | 审核、编辑、下架等写操作更新 |
| `shruuid` | **最后审核人** | 仅审核通过/驳回时写入 |
> **结论**`yh_uuid` 表示「谁提交的」;`lrruuid` 表示「谁执行了入库动作」。多数登录场景二者相同;运营代录时 `lrruuid`=运营员,`yh_uuid` 可空。
### 2.4 已删除/弱化的字段
| 原字段 | v2.0 处理 |
|--------|-----------|
| `sjzt_bz` | **删除**。运营备注统一走管理端备注或扩展表,避免与 `shyj` 混用 |
---
## 3. ER 图(与字段清单一致)
### 3.1 完整实体关系Mermaid
```mermaid
erDiagram
TXW_MHZC_YHXXB ||--o{ TXW_MHZC_GXNL_GXSCB : "收藏"
TXW_MHZC_GXNL_SLXXB ||--o{ TXW_MHZC_GXNL_GXSCB : "被收藏"
TXW_MHZC_YHXXB ||--o{ TXW_MHZC_GXNL_SLXXB : "提交账号"
TXW_MHZC_QYXXB ||--o{ TXW_MHZC_GXNL_SLXXB : "关联企业"
TXW_MHZC_GXNL_SLXXB ||--o{ TXW_MHZC_GXNL_SLSHB : "审核流水(二期)"
TXW_MHZC_GXNL_SLXXB {
varchar wz_uuid PK
varchar bt
varchar wz_lj
varchar jj
char gxnl_fl_dm
varchar gxnl_fl_mc
varchar bqjh
char zt
char sjzt
varchar lyqd_dm
varchar tjr_nc
varchar tjr_lxdh
varchar yh_uuid
varchar qyuuid
varchar qymc
varchar shyj
varchar shruuid
datetime shsj
int shcs
text shls_j
int pxh
int llcs
int sccs
int bbh
varchar lrruuid
datetime lrrq
varchar xgruuid
datetime xgrq
char yxbz
}
TXW_MHZC_GXNL_GXSCB {
varchar uuid PK
varchar wz_uuid FK
varchar yh_uuid FK
datetime lrrq
datetime qxrq
char yxbz
}
TXW_MHZC_YHXXB {
varchar yh_uuid PK
}
TXW_MHZC_QYXXB {
varchar qyuuid PK
}
```
### 3.2 关系与一致性(应用层)
| 关系 | 基数 | 一致性策略 |
|------|------|------------|
| 用户 → 收藏 | 1:N | 用户注销:异步任务将 `gxscb.yxbz='N'``sccs` 重算;失败入补偿队列 |
| 收录 → 收藏 | 1:N | 条目 `yxbz='N'` 或下架不删收藏行「我的收藏」JOIN 时标 `yxzt=invalid` |
| 用户 → 收录 | 1:N | 用户注销:不删 `slxxb``yh_uuid` 保留用于审计 |
| 企业 → 收录 | 1:N | 企业注销:`qyuuid` 置空或保留历史,不级联删条目 |
**不建数据库外键**:与 `txw_gxzx_gxscb` 等项目表一致;所有引用在 Service 层校验存在性。
---
## 4. 字段校验规则(入库前必校验)
### 4.1 通用约定
| 项 | 规范 |
|----|------|
| 时区 | 服务端统一 **Asia/Shanghai** |
| 时间格式 | `DATETIME`,入库 `YYYY-MM-DD HH:mm:ss`;接口 ISO8601 可选,入库前转换 |
| UUID | `[a-zA-Z0-9_-]{1,50}`,系统生成优先 |
| 字符串 | 入库前 `trim()`;全角空格转半角(可选) |
### 4.2 `txw_mhzc_gxnl_slxxb` 字段校验
| 字段 | 类型/长度 | 必填 | 校验规则 |
|------|-----------|------|----------|
| `wz_uuid` | VARCHAR(50) | Y | 系统生成,唯一 |
| `bt` | VARCHAR(200) | Y | 1~200 字符;禁止纯空格;禁止 `<script` 等 XSS 片段(输出编码为主,入库可做长度+危险字符拦截) |
| `wz_lj` | VARCHAR(500) | Y | 必须 `http://``https://` 开头;总长 ≤500域名合法禁止 `javascript:`;入库前 `URI` 规范化 |
| `jj` | VARCHAR(40) | Y* | 用户收录必填,运营导入可空;**1~40 字符**(与前端 maxlength 一致) |
| `gxnl_fl_dm` | CHAR(2) | Y | 枚举 `01`~`05`,否则拒绝 |
| `gxnl_fl_mc` | VARCHAR(50) | N | 由服务端根据 `gxnl_fl_dm` 填充,不信任前端 |
| `bqjh` | VARCHAR(500) | N | 最多 **10** 个标签;单标签 1~20 字符;仅中英文数字及 `-_`;英文逗号分隔;去重 |
| `zt` | CHAR(1) | Y | 枚举 `0`~`4` |
| `sjzt` | CHAR(1) | Y | 仅 `Y`/`N`;仅当 `zt=2` 时允许 `sjzt=Y` |
| `lyqd_dm` | VARCHAR(20) | Y | 枚举 `admin`/`user`/`import` |
| `tjr_nc` | VARCHAR(50) | N | ≤50 字符 |
| `tjr_lxdh` | VARCHAR(20) | N* | 发验证码时必填;手机号 `^1[3-9]\d{9}$` 或座机 `^0\d{2,3}-?\d{7,8}$` |
| `yh_uuid` | VARCHAR(50) | N | 存在则校验 `yhxxb` 有效 |
| `qyuuid` | VARCHAR(50) | N | 存在则校验 `qyxxb` |
| `qymc` | VARCHAR(200) | N | 由企业表冗余,不信任前端随意改 |
| `shyj` | VARCHAR(500) | N | 驳回时必填≤500 字符 |
| `shruuid` | VARCHAR(50) | N | 审核时必填 |
| `shsj` | DATETIME | N | 审核时必填 |
| `shcs` | INT | Y | ≥0每次驳回/通过 +1 |
| `shls_j` | TEXT | N | JSON 数组,见 §8.3;单条 ≤2000 字符建议 |
| `pxh` | INT | Y | 0~999999 |
| `llcs` | INT | Y | ≥0 |
| `sccs` | INT | Y | ≥0**冗余字段**,规则见 §7.2 |
| `bbh` | INT | Y | ≥0乐观锁更新时 `WHERE bbh=?` |
| `lrruuid`/`xgruuid` | VARCHAR(50) | N | 写操作写入 |
| `lrrq`/`xgrq` | DATETIME | N | 首次/更新自动 |
| `yxbz` | CHAR(1) | Y | `Y`/`N` |
### 4.3 `txw_mhzc_gxnl_gxscb` 字段校验
| 字段 | 类型/长度 | 必填 | 校验规则 |
|------|-----------|------|----------|
| `uuid` | VARCHAR(50) | Y | 系统生成 |
| `wz_uuid` | VARCHAR(50) | Y | 须存在且 `slxxb.yxbz=Y``zt=2``sjzt=Y` |
| `yh_uuid` | VARCHAR(50) | Y | 当前登录用户 |
| `lrrq` | DATETIME | Y | 收藏时写入 |
| `qxrq` | DATETIME | N | 取消收藏时写入 |
| `yxbz` | CHAR(1) | Y | `Y`/`N` |
---
## 5. 表结构明细
### 5.1 `txw_mhzc_gxnl_slxxb` — 共性能力收录信息表
| 字段名 | 类型 | 空 | 默认 | 注释 |
|--------|------|----|------|------|
| `wz_uuid` | VARCHAR(50) | N | — | 网站信息 UUID主键 |
| `bt` | VARCHAR(200) | N | — | 名称 |
| `wz_lj` | VARCHAR(500) | N | — | 网站链接http/https |
| `jj` | VARCHAR(40) | Y | NULL | 简介≤40 字 |
| `gxnl_fl_dm` | CHAR(2) | N | — | 分类代码 01~05 |
| `gxnl_fl_mc` | VARCHAR(50) | Y | NULL | 分类名称冗余 |
| `bqjh` | VARCHAR(500) | Y | NULL | 标签合集,逗号分隔,最多 10 个 |
| `zt` | CHAR(1) | N | `1` | 业务状态§6 |
| `sjzt` | CHAR(1) | N | `N` | 上架状态 Y/N |
| `lyqd_dm` | VARCHAR(20) | N | `user` | 来源admin/user/import |
| `tjr_nc` | VARCHAR(50) | Y | NULL | 提交人昵称 |
| `tjr_lxdh` | VARCHAR(20) | Y | NULL | 提交人联系方式 |
| `yh_uuid` | VARCHAR(50) | Y | NULL | 提交账号 UUID |
| `qyuuid` | VARCHAR(50) | Y | NULL | 关联企业 UUID |
| `qymc` | VARCHAR(200) | Y | NULL | 企业名称冗余 |
| `shyj` | VARCHAR(500) | Y | NULL | **当前轮次**审核意见 |
| `shruuid` | VARCHAR(50) | Y | NULL | 最后审核人 |
| `shsj` | DATETIME | Y | NULL | 最后审核时间 |
| `shcs` | INT | N | `0` | 审核轮次(提交/重提/审核累计) |
| `shls_j` | TEXT | Y | NULL | 审核历史 JSON过渡期多轮审核 |
| `pxh` | INT | N | `0` | 排序号 |
| `llcs` | INT | N | `0` | 浏览次数 |
| `sccs` | INT | N | `0` | 有效收藏数冗余 |
| `bbh` | INT | N | `0` | 版本号(乐观锁) |
| `lrruuid` | VARCHAR(50) | Y | NULL | 录入人 UUID |
| `lrrq` | DATETIME | Y | NULL | 录入时间 |
| `xgruuid` | VARCHAR(50) | Y | NULL | 修改人 UUID |
| `xgrq` | DATETIME | Y | NULL | 修改时间 |
| `yxbz` | CHAR(1) | N | `Y` | 有效标志 Y/N |
**分类代码 `gxnl_fl_dm`**
| 代码 | 名称 | 前端 anchor |
|------|------|-------------|
| `01` | 碳核算平台 | content-1 |
| `02` | 碳认证机构 | content-2 |
| `03` | 碳交易平台 | content-3 |
| `04` | 碳金融服务 | content-4 |
| `05` | 碳技术咨询 | content-5 |
### 5.2 `txw_mhzc_gxnl_gxscb` — 共性能力收藏表
| 字段名 | 类型 | 空 | 默认 | 注释 |
|--------|------|----|------|------|
| `uuid` | VARCHAR(50) | N | — | 收藏记录 UUID |
| `wz_uuid` | VARCHAR(50) | N | — | 关联网站信息 |
| `yh_uuid` | VARCHAR(50) | N | — | 收藏用户 |
| `lrrq` | DATETIME | N | — | 收藏时间 |
| `qxrq` | DATETIME | Y | NULL | 取消收藏时间 |
| `yxbz` | CHAR(1) | N | `Y` | Y=有效收藏 N=已取消 |
**收藏写入策略(解决唯一约束与软删冲突)**
- 表级唯一约束:`UNIQUE (yh_uuid, wz_uuid)` **不变**
- **取消收藏**`UPDATE SET yxbz='N', qxrq=NOW()`,不删行。
- **再次收藏**:若存在该行则 `UPDATE SET yxbz='Y', lrrq=NOW(), qxrq=NULL`;否则 `INSERT`
- **禁止**对同一 `(yh_uuid, wz_uuid)` 重复 `INSERT`
---
## 6. 状态流转矩阵
### 6.1 状态枚举
**`zt` 业务状态**
| 值 | 含义 | 门户列表 | 可收藏 |
|----|------|----------|--------|
| `0` | 草稿 | 否 | 否 |
| `1` | 待审核 | 否 | 否 |
| `2` | 审核通过 | 是* | 是* |
| `3` | 审核驳回 | 否 | 否 |
| `4` | 已下架 | 否 | 否 |
\* 须同时 `sjzt=Y``yxbz=Y`
**`sjzt` 上架状态**
| 值 | 含义 |
|----|------|
| `Y` | 门户可见 |
| `N` | 不可见 |
### 6.2 状态变更矩阵(含权限)
| 当前状态 | 事件 | 目标状态 | 操作角色 | 附加条件 |
|----------|------|----------|----------|----------|
| — | 用户提交收录 | `zt=1,sjzt=N` | 游客/登录用户 | 验证码通过 |
| `1` | 用户撤回 | `zt=0,sjzt=N` | 提交人本人 | 仅 `zt=1``yh_uuid` 匹配或手机号验证 |
| `0` | 用户再次提交 | `zt=1` | 提交人 | 更新同 `wz_uuid` |
| `1` | 审核通过 | `zt=2,sjzt=Y` | 运营/管理员 | 写 `shyj` 可空;`shcs+1` |
| `1` | 审核驳回 | `zt=3,sjzt=N` | 运营/管理员 | `shyj` 必填 |
| `2,Y` | 运营下架 | `zt=4,sjzt=N` | 运营/管理员 | 可不删收藏记录 |
| `4,N` | 重新上架 | `zt=2,sjzt=Y` | 运营/管理员 | 须 `yxbz=Y` |
| `3` | 修改后重提 | `zt=1,sjzt=N` | 提交人 | `shcs+1`;历史写入 `shls_j` |
| 任意 | 逻辑删除 | `yxbz=N` | 管理员 | 门户不可见;待审单不再展示在审核队列(或单独筛) |
### 6.3 异常场景处理
| 场景 | 处理 |
|------|------|
| 待审条目被逻辑删除 | 审核接口返回「条目已失效」;不再出现在待审列表 |
| 已收藏条目下架 | 「我的收藏」仍展示,卡片标 **「已失效」**,不可跳转或灰显;`scbz` 仍 Y增加 `yxzt=N` |
| 已收藏条目逻辑删除 | 同下架,`yxzt=N` |
| 并发审核/编辑 | `UPDATE ... WHERE wz_uuid=? AND bbh=?`;失败返回「数据已被修改,请刷新」 |
| 用户注销 | 收藏批量 `yxbz=N``sccs` 按条目异步重算 |
---
## 7. 收藏业务规则
### 7.1 方案选定
| 方案 | 说明 | 本期 |
|------|------|------|
| 软删 `yxbz` | 取消置 N可统计、可复收藏 | **采用** |
| 物理删除 | 无法追溯取消行为 | 不采用 |
### 7.2 `sccs` 冗余维护规则
| 项 | 规则 |
|----|------|
| 含义 | 当前 **有效收藏** 数,等价于 `COUNT(*) FROM gxscb WHERE wz_uuid=? AND yxbz='Y'` |
| 增加 | `toggle add` 成功且由 N→Y 时 `sccs+1`(复收藏若从 N→Y 也 +1 |
| 减少 | `toggle remove` 成功且由 Y→N 时 `sccs-1`,下限 0 |
| 并发 | 与 `gxscb` 更新同一事务;`sccs` 更新 `WHERE sccs>=0` |
| 校验 | 每日凌晨 Job 全量校对,偏差 >0 则修复并告警 |
| 是否含注销用户 | **不含**;注销时已置 `yxbz=N` |
### 7.3 查询规则
- **门户列表 `scbz`**`LEFT JOIN gxscb ON wz_uuid AND yh_uuid AND yxbz='Y'`。
- **我的收藏**`gxscb.yxbz='Y'` JOIN `slxxb`;下架条目带 `yxzt` 字段返回。
---
## 8. 审核流程
### 8.1 权限
| 角色 | 权限 |
|------|------|
| 游客 | 提交收录、验证码 |
| 登录用户 | 提交、撤回自己的待审单、收藏 |
| 运营 | 审核、上下架、编辑条目 |
| 管理员 | 全部 + 逻辑删除 |
首期不按分类分审核人;二期可在 `slshb` 增加 `gxnl_fl_dm` 路由。
### 8.2 多轮审核(过渡期)
未建 `txw_mhzc_gxnl_slshb` 前:
- `shyj` / `shruuid` / `shsj`:保存 **最后一轮** 审核信息。
- `shls_j`JSON 数组,元素示例:
```json
{
"shcs": 1,
"shjg_dm": "3",
"shyj": "链接无法访问",
"shruuid": "admin-001",
"shsj": "2026-05-23 14:00:00"
}
```
`shjg_dm``2` 通过,`3` 驳回。
### 8.3 二期审核流水表(建议)
`txw_mhzc_gxnl_slshb``uuid`, `wz_uuid`, `shcs`, `shjg_dm`, `shyj`, `shruuid`, `shsj`, `lrrq`
建成后 `shls_j` 可弃用,历史数据迁移入流水表。
---
## 9. 索引设计
### 9.1 设计原则MySQL 8.0
- 组合索引字段顺序:**等值条件按区分度从高到低**,范围/排序字段放最后。
- 门户主查:`gxnl_fl_dm`5 类)+ `sjzt` + `zt` + `ORDER BY lrrq DESC`
- `%keyword%` 模糊查询 **不走 BTree**;名称搜索用 **FULLTEXT** 或 ES二期
### 9.2 `txw_mhzc_gxnl_slxxb` 索引
| 索引名 | 字段 | 说明 |
|--------|------|------|
| PRIMARY | `wz_uuid` | 主键 |
| `idx_slxx_fl_sjzt_zt_lrrq` | `gxnl_fl_dm`, `sjzt`, `zt`, `lrrq` | 门户分类列表v2 调整顺序) |
| `idx_slxx_zt_lrrq` | `zt`, `lrrq` | 管理端待审 `zt=1` |
| `idx_slxx_yh_lrrq` | `yh_uuid`, `lrrq` | 我的提交 |
| `idx_slxx_yxbz` | `yxbz` | 过滤有效数据 |
| `ft_slxx_bt_jj` | FULLTEXT(`bt`,`jj`) | 名称/简介搜索(可选,见 DDL 注释) |
**`idx_slxx_bt` BTree 说明**:仅适合 **前缀** 查询 `LIKE 'keyword%'``%keyword%` 会失效,已改用 FULLTEXT。
### 9.3 `txw_mhzc_gxnl_gxscb` 索引
| 索引名 | 字段 | 说明 |
|--------|------|------|
| PRIMARY | `uuid` | — |
| `uk_gxsc_yh_wz` | `yh_uuid`, `wz_uuid` | 唯一;配合 UPDATE 复收藏 |
| `idx_gxsc_yh_yxbz_lrrq` | `yh_uuid`, `yxbz`, `lrrq` | 我的收藏 |
| `idx_gxsc_wz_yxbz` | `wz_uuid`, `yxbz` | 统计/校对 sccs |
---
## 10. 数据清理与归档
| 数据 | 策略 |
|------|------|
| `gxscb``yxbz=N``qxrq` < 1 | 可物理删除夜间 Job |
| `slxxb``zt=3``yxbz=Y` 超过 2 年 | 归档至历史表或 `yxbz=N` |
| `slxxb``yxbz=N` | 保留 3 年后物理删除(合规待定) |
---
## 11. API 规范(概要)
**统一约定**
- Base`/mhzc/gxnl`
- MethodPOST与项目现有 `/gxdt` 一致)
- Content-Type`application/json`
- 分页:`pageNo`(从 1、`pageSize`(默认 10最大 50
- 排序:列表默认 `lrrq DESC, pxh DESC`
- 响应:`{ code, msg, data }``code=0` 成功
### 11.1 `POST /mhzc/gxnl/wzxx/list` — 分类列表
**请求**
```json
{
"pageNo": 1,
"pageSize": 10,
"gxnlFlDm": "01",
"nr": "碳足迹",
"onlySc": false
}
```
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| pageNo | int | Y | ≥1 |
| pageSize | int | N | 默认 10最大 50 |
| gxnlFlDm | string | N | 01~05 |
| nr | string | N | 关键词;有值时走 FULLTEXT 或 LIKE见实现开关 |
| onlySc | boolean | N | true 时仅返回当前用户收藏 |
**响应 data**`{ list: [{ wzUuid, bt, jj, wzLj, bqjh, gxnlFlMc, scbz, lrrq }], total }`
### 11.2 `POST /mhzc/gxnl/slxx/submit` — 收录提交
**请求**
```json
{
"bt": "某某碳核算平台",
"wzLj": "https://example.com",
"jj": "简介文案",
"gxnlFlDm": "01",
"bqjh": "碳足迹,LCA",
"tjrNc": "张三",
"tjrLxdh": "13800138000",
"captchaId": "xxx",
"captchaCode": "123456"
}
```
**异常码**
| code | 说明 |
|------|------|
| 40001 | 参数校验失败(附 fieldErrors |
| 40002 | URL 格式非法 |
| 40003 | 分类代码不存在 |
| 40004 | 验证码错误或过期 |
| 40005 | 标签数量/格式超限 |
### 11.3 `POST /mhzc/gxnl/slxx/audit` — 审核
**请求**`{ wzUuid, shjgDm: "2"|"3", shyj, bbh }`
**权限**:运营/管理员
**异常**40010 状态不允许审核40011 乐观锁冲突
### 11.4 `POST /mhzc/gxnl/slxx/withdraw` — 撤回
**请求**`{ wzUuid }`
**条件**`zt=1` 且本人提交
### 11.5 `POST /mhzc/gxnl/gxsc/toggle` — 收藏切换
**请求**`{ wzUuid, type: "add" | "remove" }`**小写**,大小写敏感)
**异常**40101 未登录40020 条目不可收藏
### 11.6 `POST /mhzc/gxnl/gxsc/myList` — 我的收藏
**请求**`{ pageNo, pageSize }`
**响应**:含 `yxzt`Y=正常 N=已下架/删除)
### 11.7 `POST /mhzc/gxnl/captcha/send`
**请求**`{ tjrLxdh, bizType: "gxnl_submit" }`
**限流**:同一手机号 1 分钟 1 次1 小时 5 次
---
## 12. 数据迁移(自供需表)
| 源 | 目标 | 规则 |
|----|------|------|
| `txw_gxzx_gxxxb`(若曾误用) | `txw_mhzc_gxnl_slxxb` | 仅迁移明确标记为共性能力的数据;`bt_1→bt`,链接从 `kzwj``fwnr` 解析 |
| `txw_gxzx_gxscb` | `txw_mhzc_gxnl_gxscb` | **不自动迁移**`gx_uuid` 与 `wz_uuid` 无稳定映射);需人工或脚本映射表 |
| 历史收藏 | — | 建议上线后用户重新收藏,或一次性脚本 + 映射表 |
**迁移步骤**:停写 → 备份 → 脚本导入 → 校对条数 → 抽测 → 开写。
**锁表**:大批量时按主键分批,避免长事务锁表。
---
## 13. 性能与容量(预估)
| 项 | 预估 | 措施 |
|----|------|------|
| 收录条目 | 5 万级/3 年 | 索引 + 归档 |
| 收藏记录 | 50 万级 | 分区(按年)二期考虑 |
| 列表 QPS | 峰值 200 | Redis 缓存分类列表 60s收藏态用户级缓存 |
| 收藏 toggle | 峰值 50 | 行级锁 + 事务 |
---
## 14. 操作日志(扩展)
写操作(提交、审核、上下架、删除)通过现有平台审计日志记录,建议扩展字段:
- `bizType=gxnl_slxx`
- `bizId=wz_uuid`
- `op=submit|audit|onShelf|offShelf|delete`
不在业务表增加 `czrz_uuid`;以日志中心为准。
---
## 15. 与现有表对比
| 维度 | 原供需表 | v2.0 新表 |
|------|----------|-----------|
| 链接 | 无 | `wz_lj` + URL 校验 |
| 分类 | 关键词 | `gxnl_fl_dm` |
| 收藏唯一 | `gx_uuid` | `wz_uuid` + upsert |
| 并发 | 无版本号 | `bbh` 乐观锁 |
| 多轮审核 | `shqkb` | `shls_j` 过渡 + 二期 `slshb` |
---
## 16. 前端字段映射
| 前端 | 表字段 |
|------|--------|
| submitForm.bt1 | bt |
| submitForm.lj | wz_lj |
| submitForm.jj | jj |
| submitForm.fl | gxnl_fl_dm |
| submitForm.bq | bqjh |
| submitForm.nc | tjr_nc |
| submitForm.lxfs | tjr_lxdh |
| card.gxUuid | **wz_uuid**(接口驼峰 `wzUuid` |
---
## 17. DDL
见:`txw-mhzc/sql/txw_mhzc_gxnl_slxxb_gxscb.sql`

View File

@ -0,0 +1,64 @@
-- ============================================================
-- 共性能力平台:收录信息表 + 收藏表
-- 数据库MySQL 8.0+ InnoDB utf8mb4
-- 设计说明txw-mhzc/docs/共性能力-收藏与收录-表设计说明.md (v2.0)
-- ============================================================
-- ----------------------------
-- 1. 共性能力收录信息表
-- ----------------------------
CREATE TABLE `txw_mhzc_gxnl_slxxb` (
`wz_uuid` VARCHAR(50) NOT NULL COMMENT '网站信息UUID',
`bt` VARCHAR(200) NOT NULL COMMENT '名称1~200字符',
`wz_lj` VARCHAR(500) NOT NULL COMMENT '网站链接URL须http或https开头',
`jj` VARCHAR(40) DEFAULT NULL COMMENT '简介最多40字符用户收录必填',
`gxnl_fl_dm` CHAR(2) NOT NULL COMMENT '共性能力分类代码01碳核算 02碳认证 03碳交易 04碳金融 05碳咨询',
`gxnl_fl_mc` VARCHAR(50) DEFAULT NULL COMMENT '共性能力分类名称(服务端填充)',
`bqjh` VARCHAR(500) DEFAULT NULL COMMENT '标签合集英文逗号分隔最多10个单标签1~20字符',
`zt` CHAR(1) NOT NULL DEFAULT '1' COMMENT '业务状态0草稿 1待审核 2审核通过 3驳回 4已下架',
`sjzt` CHAR(1) NOT NULL DEFAULT 'N' COMMENT '上架状态Y已上架 N未上架仅zt=2时可Y',
`lyqd_dm` VARCHAR(20) NOT NULL DEFAULT 'user' COMMENT '来源渠道代码admin运营 user用户收录 import导入',
`tjr_nc` VARCHAR(50) DEFAULT NULL COMMENT '提交人昵称',
`tjr_lxdh` VARCHAR(20) DEFAULT NULL COMMENT '提交人联系方式(手机或座机)',
`yh_uuid` VARCHAR(50) DEFAULT NULL COMMENT '提交账号UUID登录用户游客为空',
`qyuuid` VARCHAR(50) DEFAULT NULL COMMENT '关联企业UUID',
`qymc` VARCHAR(200) DEFAULT NULL COMMENT '关联企业名称冗余',
`shyj` VARCHAR(500) DEFAULT NULL COMMENT '当前轮次审核意见(驳回必填)',
`shruuid` VARCHAR(50) DEFAULT NULL COMMENT '最后审核人UUID',
`shsj` DATETIME DEFAULT NULL COMMENT '最后审核时间Asia/Shanghai',
`shcs` INT NOT NULL DEFAULT 0 COMMENT '审核轮次',
`shls_j` TEXT DEFAULT NULL COMMENT '审核历史JSON多轮审核过渡期见设计文档8.2',
`pxh` INT NOT NULL DEFAULT 0 COMMENT '排序号(越大越靠前)',
`llcs` INT NOT NULL DEFAULT 0 COMMENT '浏览次数',
`sccs` INT NOT NULL DEFAULT 0 COMMENT '有效收藏数冗余yxbz=Y的gxscb计数',
`bbh` INT NOT NULL DEFAULT 0 COMMENT '版本号乐观锁更新时WHERE bbh匹配',
`lrruuid` VARCHAR(50) DEFAULT NULL COMMENT '录入人UUID门户提交或运营录入',
`lrrq` DATETIME DEFAULT NULL COMMENT '录入时间',
`xgruuid` VARCHAR(50) DEFAULT NULL COMMENT '最后修改人UUID',
`xgrq` DATETIME DEFAULT NULL COMMENT '最后修改时间',
`yxbz` CHAR(1) NOT NULL DEFAULT 'Y' COMMENT '有效标志Y有效 N逻辑删除',
PRIMARY KEY (`wz_uuid`),
KEY `idx_slxx_fl_sjzt_zt_lrrq` (`gxnl_fl_dm`, `sjzt`, `zt`, `lrrq`),
KEY `idx_slxx_zt_lrrq` (`zt`, `lrrq`),
KEY `idx_slxx_yh_lrrq` (`yh_uuid`, `lrrq`),
KEY `idx_slxx_yxbz` (`yxbz`)
-- 名称/简介搜索:数据量>1万且模糊查询频繁时启用下一行
-- , FULLTEXT KEY `ft_slxx_bt_jj` (`bt`, `jj`) WITH PARSER ngram
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='共性能力收录信息表';
-- ----------------------------
-- 2. 共性能力收藏表
-- 说明uk(yh_uuid,wz_uuid) 与软删共存——取消收藏 UPDATE yxbz=N再次收藏 UPDATE yxbz=Y禁止重复 INSERT
-- ----------------------------
CREATE TABLE `txw_mhzc_gxnl_gxscb` (
`uuid` VARCHAR(50) NOT NULL COMMENT '收藏记录UUID',
`wz_uuid` VARCHAR(50) NOT NULL COMMENT '网站信息UUID',
`yh_uuid` VARCHAR(50) NOT NULL COMMENT '用户UUID',
`lrrq` DATETIME NOT NULL COMMENT '收藏时间',
`qxrq` DATETIME DEFAULT NULL COMMENT '取消收藏时间',
`yxbz` CHAR(1) NOT NULL DEFAULT 'Y' COMMENT '有效标志Y已收藏 N已取消',
PRIMARY KEY (`uuid`),
UNIQUE KEY `uk_gxsc_yh_wz` (`yh_uuid`, `wz_uuid`),
KEY `idx_gxsc_yh_yxbz_lrrq` (`yh_uuid`, `yxbz`, `lrrq`),
KEY `idx_gxsc_wz_yxbz` (`wz_uuid`, `yxbz`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='共性能力收藏表';