Compare commits

...

10 Commits

Author SHA1 Message Date
904f9b37f7 feat: 样式调整 2026-07-05 13:44:49 +08:00
3908bc2226 fix: header渐变恢复180deg,卡片保持0deg
Header: 180deg 顶部有色→底部白色(标题栏效果,不与白底融合)
Card:  0deg   底部有色→顶部淡色(文字区干净,色彩沉底)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-05 01:20:50 +08:00
c0fbae9d52 refactor: 航运燃料配色调整为海绿色(海洋物流主题)
旧:纯绿 #d2e9d5 偏陆地
新:海绿 #cde6de 带蓝调,更贴合航运/海洋主题
三色对比更清晰:蓝(电池)↔青(CBAM)↔海绿(航运)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-05 00:58:22 +08:00
c4263813dc refactor: qych 卡片渐变方向反转 180deg→0deg
0deg=底部有色→顶部淡色,标题区更干净,黑/灰字更清晰

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-05 00:56:44 +08:00
a7903c299d fix: qych 卡片改用明亮浅色底,黑字可读不再土
旧:中色调渐变(#b8cfe8→#e3edf7)黑字压暗底=沉闷
新:亮色调渐变(#d9e7f6→#edf3fa)黑字压亮底=干净通透
三色差保持:蓝(d9e7f6)/青(d6efed)/绿(d5ead7)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-05 00:55:28 +08:00
01215a98e7 fix: qych 卡片渐变反转——有色→淡色,解决白底稀释问题
根因: text-section(白)+service-section(白)两层白底上叠card渐变,
旧方案淡→稍深方向导致色浓度被稀释到几乎看不见。
新方案: 深→淡方向,顶部有明确色彩,底部自然过渡到白

电池: #b8cfe8→#e3edf7  CBAM: #9ecfcb→#ddf0ee  航运: #a3ccaa→#dcecdd

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-05 00:37:15 +08:00
4f84d39665 refactor: qych 提高色相对比+饱和度,去灰蒙蒙感
电池法案 蓝: #dce6f7→#b8c9e8 / CBAM 青: #ceeaea→#a3d4d4 / 航运 绿: #d4ead7→#acd4b1
三轮对比明显(蓝↔青↔绿),卡片渐变从粉彩升级到有色彩浓度的干净渐变

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-05 00:33:04 +08:00
c0c8534fc6 refactor: qych 三专题配色重设计——按内容调性区分蓝/青/绿
电池法案→蓝色系(工业/技术/精密): #e9f0fe header, #e4edfb→#c8d6f0 card
CBAM→青色系(金融/贸易/国际): #e6f5f2 header, #dfeee9→#c0ddd2 card
航运燃料→蓝绿系(海洋/物流/可持续): #e6f4f0 header, #dff0ea→#c0e0d7 card
section 背景各行极淡底色 (#f7f9fc/#f6faf9/#f5faf8)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-05 00:30:29 +08:00
7ea4a9ae38 refactor: qych 配色统一为绿-青冷色系
① 电池法案: 紫色→绿色系 (edf4e9/dce9d8/e3f0e6)
② CBAM: 橙色→青色系 (edf6f2/d8ebe3) 去掉突兀的暖橙色
③ 航运燃料: 蓝色→蓝绿系 (eef7f2/dbece2/e2f0ec)
④ Section 背景统一 #f6f7fa (全平台一致)
⑤ open-page 按钮 蓝色→品牌绿渐变

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-05 00:27:45 +08:00
a399a483f0 fix: qych 内部滚动面板与整页翻屏不再冲突
新增 _isInsideScrollablePanel: wheel事件源在content-item1内时,
检查面板自身是否还能滚动。能滚→交给浏览器,不能→触发整页翻屏。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-05 00:19:36 +08:00
13 changed files with 433 additions and 567 deletions

View File

@ -15,7 +15,9 @@ VUE_APP_CDN_PATH=/view/mhzc
VUE_APP_ROUTER_BASE=/view/mhzc
VUE_APP_API_BASE_URL=
VUE_APP_DEV_SERVER_PORT=9002
VUE_APP_MHZC_PROXY=http://localhost:9300
VUE_APP_MHZC_PROXY=https://carbon.liantu.tech
# VUE_APP_MHZC_PROXY=https://www.cciw.com.cn
# VUE_APP_MHZC_PROXY=http://localhost:9300
VUE_APP_MOCK=true
VUE_APP_AUTO_ROUTER=false
VUE_APP_USE_NEW_BACKEND=false

View File

@ -40,4 +40,13 @@ export default {
data: JSON.stringify(params),
});
},
/** 分类列表 */
flList() {
return fetchSso({
url: `${basurl}/fl/list`,
method: 'post',
__silent401: true,
});
},
};

View File

@ -97,19 +97,19 @@
// 渐变(字符串,直接用于 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-search-btn: linear-gradient(0deg, @home-color-primary-green 0%, @home-color-primary-green-dark 100%);
@home-gradient-hero-fade: linear-gradient(0deg, @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-export-btn: linear-gradient(0deg, @home-color-btn-blue-from 0%, @home-color-btn-blue-to 100%);
@home-gradient-card-blue: linear-gradient(0deg, rgba(127, 210, 255, 0.35) 0%, rgba(232, 247, 255, 0.15) 100%);
@home-gradient-card-blue-header: linear-gradient(0deg, rgba(127, 210, 255, 0.55) 0%, rgba(232, 247, 255, 0.35) 100%);
@home-gradient-card-chain-header: linear-gradient(0deg, rgba(255, 255, 255, 0.55) 0%, rgba(255, 255, 255, 0.25) 100%);
@home-gradient-card-green: linear-gradient(0deg, rgba(156, 255, 221, 0.45) 0%, rgba(156, 255, 221, 0.2) 100%);
@home-gradient-card-green-header: linear-gradient(0deg, 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-section-title-bar: linear-gradient(0deg, #00b42a, #00d468);
@home-gradient-nav-active: linear-gradient(0deg, 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,
@ -1173,15 +1173,20 @@ html.portal-figma-scale-active.portal-market-figma-scale-active {
@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-header-gradient-battery: linear-gradient(180deg, #d6e6f8 0%, #ecf3fc 52.885%, #fff 100%);
@qych-policy-card-gradient-battery-1: linear-gradient(0deg, #d9e7f6 0%, #edf3fa 100%);
@qych-policy-card-gradient-battery-2: linear-gradient(0deg, #e0ecf8 0%, #f1f6fb 100%);
// ── CBAM明亮青色系 ──
@qych-policy-header-gradient-cbam: linear-gradient(180deg, #d4eeec 0%, #eaf7f6 52.885%, #fff 100%);
@qych-policy-card-gradient-cbam-1: linear-gradient(0deg, #d6efed 0%, #ebf7f5 100%);
@qych-policy-card-gradient-cbam-2: linear-gradient(0deg, #ddf2f0 0%, #eff9f8 100%);
// ── 航运燃料:海绿色系(海洋物流 / 航运可持续)──
@qych-policy-header-gradient-shipping: linear-gradient(180deg, #cde6de 0%, #e8f4f0 52.885%, #fff 100%);
@qych-policy-card-gradient-shipping-1: linear-gradient(0deg, #d0e8e0 0%, #e9f4ef 100%);
@qych-policy-card-gradient-shipping-2: linear-gradient(0deg, #d9ece5 0%, #eef6f2 100%);
@qych-policy-card-min-height: 164px;
@qych-policy-card-icon-right: 30px;
@qych-policy-card-icon-opacity: 0.3;

View File

@ -113,6 +113,136 @@
@market-pagination-total-color: #666;
@market-pagination-total-font-size: 16px;
// 分页共享样式(桌面端)
.market-pagination() {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
padding-top: @market-pagination-padding-top;
gap: 16px;
width: 100%;
box-sizing: border-box;
::v-deep .t-pagination {
display: flex !important;
flex-wrap: wrap;
align-items: center;
justify-content: center;
width: auto;
max-width: 100%;
gap: 12px 16px;
.t-pagination__number,
.t-pagination__btn {
border-radius: @market-nav-tab-radius;
transition: all 0.2s ease;
}
// 当前页:品牌绿色
.t-pagination__number.t-is-current {
background: #009a29;
border-color: #009a29;
color: #fff;
}
// 页码 hover绿色浅底
.t-pagination__number:not(.t-is-current):hover {
background: rgba(0, 154, 41, 0.08);
border-color: #009a29;
color: #009a29;
}
// 箭头按钮 hover
.t-pagination__btn:hover {
background: rgba(0, 154, 41, 0.06);
border-color: #009a29;
color: #009a29;
}
.t-input.t-is-readonly {
width: 110px;
}
.t-pagination__select {
margin-right: 0;
}
}
}
// 分页共享样式(移动端)
.market-pagination-mobile(@h: 36px) {
flex-direction: column;
align-items: stretch;
gap: 12px;
padding: 16px 12px 28px;
::v-deep .t-pagination {
display: flex !important;
flex-wrap: wrap !important;
align-items: center;
justify-content: center !important;
width: 100% !important;
max-width: 100%;
row-gap: 12px;
column-gap: 8px;
}
::v-deep .t-pagination__total {
display: none;
}
::v-deep .t-pagination__btn-prev { order: 1; }
::v-deep .t-pagination__pager { order: 2; display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 6px; max-width: 100%; }
::v-deep .t-pagination__btn-next { order: 3; }
::v-deep .t-pagination__select { order: 4; flex: 0 0 auto; width: auto; max-width: none; margin: 0 0 0 8px !important; display: flex; justify-content: center; }
::v-deep .t-pagination__jump { display: none !important; }
::v-deep .t-pagination__number {
min-width: @h;
height: @h;
line-height: @h;
margin: 0;
box-sizing: border-box;
}
::v-deep .t-pagination__btn {
min-width: @h;
width: @h;
height: @h;
line-height: @h;
}
::v-deep .t-pagination__select {
height: @h;
align-items: center;
}
::v-deep .t-pagination__select .t-select__wrap,
::v-deep .t-pagination__select .t-input__wrap,
::v-deep .t-pagination__select .t-input {
height: @h !important;
min-height: @h !important;
box-sizing: border-box;
}
::v-deep .t-pagination__select .t-input__inner {
height: @h !important;
min-height: @h !important;
line-height: @h;
padding-top: 0;
padding-bottom: 0;
font-size: 13px;
box-sizing: border-box;
}
::v-deep .t-input.t-is-readonly {
width: auto;
min-width: 96px;
max-width: none;
}
}
// -----------------------------------------------------------------------------
// 卡片分类色标(左侧 3px 彩条)
// -----------------------------------------------------------------------------

View File

@ -732,6 +732,22 @@ export default {
&.enterprise-options {
max-height: 200px;
overflow-y: auto;
&::-webkit-scrollbar {
width: 5px;
}
&::-webkit-scrollbar-track {
background: transparent;
}
&::-webkit-scrollbar-thumb {
background: #c1c9c4;
border-radius: 4px;
&:hover {
background: #a0aba4;
}
}
scrollbar-width: thin;
scrollbar-color: #c1c9c4 transparent;
}
}
@ -973,43 +989,12 @@ export default {
//
.pagination-total {
font-size: 16px;
color: #666;
font-size: @market-pagination-total-font-size;
color: @market-pagination-total-color;
}
.pagination-box {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
padding-top: 32px;
gap: 16px;
width: 100%;
box-sizing: border-box;
::v-deep .t-pagination {
display: flex !important;
flex-wrap: wrap;
align-items: center;
justify-content: center;
width: auto;
max-width: 100%;
gap: 12px 16px;
.t-input.t-is-readonly {
width: 110px;
}
.t-pagination__select {
margin-right: 0;
}
/* 优化需求:分页按钮线框统一为长方形+圆角 */
.t-pagination__number,
.t-pagination__btn {
border-radius: 6px;
}
}
.market-pagination();
}
//
@ -1173,11 +1158,9 @@ export default {
}
.pagination-box {
flex-direction: column;
align-items: stretch;
.market-pagination-mobile(32px);
padding-top: 16px;
padding-bottom: 32px;
gap: 12px;
}
.pagination-total {
@ -1187,108 +1170,6 @@ export default {
text-align: center;
white-space: nowrap;
}
.pagination-box ::v-deep .t-pagination {
display: flex !important;
flex-wrap: wrap !important;
align-items: center;
justify-content: center !important;
width: 100% !important;
max-width: 100%;
white-space: normal !important;
row-gap: 12px;
column-gap: 8px;
}
.pagination-box ::v-deep .t-pagination__total {
display: none;
}
.pagination-box ::v-deep .t-pagination__btn-prev {
order: 1;
}
.pagination-box ::v-deep .t-pagination__pager {
order: 2;
}
.pagination-box ::v-deep .t-pagination__btn-next {
order: 3;
}
.pagination-box ::v-deep .t-pagination__select {
order: 4;
flex: 0 0 auto;
width: auto;
max-width: none;
margin: 0 0 0 8px !important;
display: flex;
justify-content: center;
}
.pagination-box ::v-deep .t-pagination__select .t-select__wrap {
width: auto;
max-width: none;
}
.pagination-box ::v-deep .t-pagination__pager {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
gap: 6px;
max-width: 100%;
}
@mob-pagination-h: 32px;
.pagination-box ::v-deep .t-pagination__number {
min-width: @mob-pagination-h;
height: @mob-pagination-h;
line-height: @mob-pagination-h;
margin: 0;
box-sizing: border-box;
}
.pagination-box ::v-deep .t-pagination__btn {
min-width: @mob-pagination-h;
width: @mob-pagination-h;
height: @mob-pagination-h;
line-height: @mob-pagination-h;
}
.pagination-box ::v-deep .t-pagination__select {
height: @mob-pagination-h;
align-items: center;
}
.pagination-box ::v-deep .t-pagination__select .t-select__wrap,
.pagination-box ::v-deep .t-pagination__select .t-input__wrap,
.pagination-box ::v-deep .t-pagination__select .t-input {
height: @mob-pagination-h !important;
min-height: @mob-pagination-h !important;
box-sizing: border-box;
}
.pagination-box ::v-deep .t-pagination__select .t-input__inner {
height: @mob-pagination-h !important;
min-height: @mob-pagination-h !important;
line-height: @mob-pagination-h;
padding-top: 0;
padding-bottom: 0;
font-size: 13px;
box-sizing: border-box;
}
.pagination-box ::v-deep .t-pagination__jump {
display: none !important;
}
.pagination-box ::v-deep .t-input.t-is-readonly {
width: auto;
min-width: 96px;
max-width: none;
}
}
@media (max-width: 480px) {
@ -1334,32 +1215,7 @@ export default {
.pagination-box {
padding-bottom: 40px;
}
@mob-pagination-h-sm: 28px;
.pagination-box ::v-deep .t-pagination__number {
min-width: @mob-pagination-h-sm;
height: @mob-pagination-h-sm;
line-height: @mob-pagination-h-sm;
font-size: 13px;
}
.pagination-box ::v-deep .t-pagination__btn {
min-width: @mob-pagination-h-sm;
width: @mob-pagination-h-sm;
height: @mob-pagination-h-sm;
line-height: @mob-pagination-h-sm;
}
.pagination-box ::v-deep .t-pagination__select,
.pagination-box ::v-deep .t-pagination__select .t-select__wrap,
.pagination-box ::v-deep .t-pagination__select .t-input__wrap,
.pagination-box ::v-deep .t-pagination__select .t-input,
.pagination-box ::v-deep .t-pagination__select .t-input__inner {
height: @mob-pagination-h-sm !important;
min-height: @mob-pagination-h-sm !important;
line-height: @mob-pagination-h-sm;
.market-pagination-mobile(28px);
}
}

View File

@ -1286,9 +1286,7 @@ export default {
//
.pagination-box {
display: flex;
justify-content: center;
padding-top: 32px;
.market-pagination();
}
//

View File

@ -3,33 +3,24 @@
<div class="portal-figma-scale-viewport">
<div class="portal-figma-scale-stage" ref="figmaStage">
<!-- 面包屑导航 -->
<div class="breadcrumb-box">
<span class="breadcrumb-link" @click="$router.push('/view/mhzc/home')">首页</span>
<span class="breadcrumb-separator">/</span>
<span class="breadcrumb-link" @click="$router.push('/fwsc')">服务中心</span>
<span class="breadcrumb-separator">/</span>
<span class="breadcrumb-link" @click="$router.push('/tsjsc')">碳数据市场</span>
<span class="breadcrumb-separator">/</span>
<span class="breadcrumb-current">{{ sjscInfo && sjscInfo.sjmc || '数据列表' }}</span>
</div>
<!-- 数据市场信息卡片 -->
<div class="sjsc-info-card" v-if="sjscInfo">
<div class="sjsc-info-main">
<h2 class="sjsc-name">{{ sjscInfo.sjmc || '数据市场' }}</h2>
<p class="sjsc-desc">{{ sjscInfo.sjms || '暂无描述' }}</p>
</div>
<div class="sjsc-info-stats" v-if="sjscInfo.llcs">
<!-- <div class="stat-item" v-if="sjscInfo.llcs">
<span class="stat-value">{{ sjscInfo.llcs }}</span>
<span class="stat-label">浏览次数</span>
</div> -->
</div>
</div>
<BreadcrumbNav
:currentPage="sjscInfo && sjscInfo.sjmc || '数据列表'"
secondPage="碳数据市场"
secondLink="/tsjsc"
/>
<!-- 主内容区 -->
<div class="content-wrapper">
<!-- 右侧数据列表 -->
<!-- 数据库信息卡片 -->
<div class="info-card" v-if="sjscInfo">
<div class="info-card__accent"></div>
<div class="info-card__body">
<h2 class="info-card__name">{{ sjscInfo.sjmc || '数据市场' }}</h2>
<p class="info-card__desc">{{ sjscInfo.sjms || '暂无描述' }}</p>
</div>
</div>
<!-- 数据列表 -->
<div class="data-list">
<SkeletonCard v-if="loading" :count="4" />
<EmptyState
@ -326,120 +317,48 @@ export default {
<style lang="less" scoped>
@import '../../styles/home-figma-variables.less';
@import '../../styles/market-list-variables.less';
.sjlbc-page {
background: #f5f5f5;
background: @market-page-bg;
.portal-figma-scale-page();
}
//
.breadcrumb-box {
//
.info-card {
display: flex;
align-items: center;
width: 83%;
max-width: 1400px;
padding: 20px 20px 0;
margin: 0 auto;
box-sizing: border-box;
margin-bottom: 20px;
background: #fff;
border-radius: @market-card-radius;
box-shadow: @market-card-shadow;
overflow: hidden;
}
.breadcrumb-link {
font-size: 14px;
color: #009a29;
cursor: pointer;
transition: color 0.3s;
&:hover {
color: #007a1f;
}
.info-card__accent {
width: 4px;
flex-shrink: 0;
background: linear-gradient(180deg, #009a29, #48C666);
border-radius: 4px 0 0 4px;
}
.breadcrumb-separator {
margin: 0 8px;
font-size: 14px;
color: #999;
}
.breadcrumb-current {
font-size: 14px;
color: #333;
}
//
.sjsc-info-card {
display: flex;
align-items: flex-start;
justify-content: space-between;
width: 81%;
max-width: 1400px;
padding: 24px;
margin: 16px auto 0;
background: linear-gradient(135deg, #009a29 0%, #00c853 100%);
border-radius: 6px;
box-shadow: 0 4px 12px rgba(0, 154, 41, 0.15);
color: #fff;
box-sizing: border-box;
}
.sjsc-info-main {
.info-card__body {
flex: 1;
padding: 20px 24px;
}
.sjsc-name {
.info-card__name {
margin: 0 0 8px;
font-size: 22px;
font-size: 18px;
font-weight: 600;
color: #fff;
line-height: 1.3;
color: #003B1A;
}
.sjsc-desc {
.info-card__desc {
margin: 0;
font-size: 14px;
line-height: 1.6;
opacity: 0.9;
}
.sjsc-info-stats {
display: flex;
gap: 32px;
flex-shrink: 0;
}
.stat-item {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
}
.stat-value {
font-size: 24px;
font-weight: 700;
color: #fff;
}
.stat-label {
margin-top: 4px;
font-size: 12px;
opacity: 0.8;
}
@media (max-width: 768px) {
.sjsc-info-card {
flex-direction: column;
gap: 16px;
padding: 20px;
}
.sjsc-info-stats {
gap: 24px;
width: 100%;
justify-content: flex-start;
}
.stat-value {
font-size: 20px;
}
line-height: 1.7;
color: #666;
}
//
@ -455,7 +374,7 @@ export default {
.data-list {
overflow: hidden;
background: #fff;
border-radius: 8px;
border-radius: @market-card-radius;
box-sizing: border-box;
}
@ -510,8 +429,12 @@ export default {
}
@media (max-width: 768px) {
.breadcrumb-box {
padding: 12px 12px 0;
.info-card__body {
padding: 16px 18px;
}
.info-card__name {
font-size: 16px;
}
.content-wrapper {
@ -547,6 +470,30 @@ export default {
.sjlbc-pagination ::v-deep .t-pagination {
flex: 1 1 auto;
justify-content: flex-end;
.t-pagination__number,
.t-pagination__btn {
border-radius: @market-nav-tab-radius;
transition: all 0.2s ease;
}
.t-pagination__number.t-is-current {
background: #009a29;
border-color: #009a29;
color: #fff;
}
.t-pagination__number:not(.t-is-current):hover {
background: rgba(0, 154, 41, 0.08);
border-color: #009a29;
color: #009a29;
}
.t-pagination__btn:hover {
background: rgba(0, 154, 41, 0.06);
border-color: #009a29;
color: #009a29;
}
}
@media (max-width: 768px) {

View File

@ -247,9 +247,8 @@ export default {
statsItems() {
return [
{ label: '数据总量', value: this.page.total || 0 },
{ label: '公共数据', value: '—' },
{ label: '因子库', value: '—' },
{ label: '社会性数据', value: '—' },
{ label: '数据类型', value: this.sjlxOptions.length || '—' },
{ label: '覆盖行业', value: this.sshyDmOptions.length || '—' },
];
},
},
@ -661,6 +660,22 @@ export default {
&.enterprise-options {
max-height: 200px;
overflow-y: auto;
&::-webkit-scrollbar {
width: 5px;
}
&::-webkit-scrollbar-track {
background: transparent;
}
&::-webkit-scrollbar-thumb {
background: #c1c9c4;
border-radius: 4px;
&:hover {
background: #a0aba4;
}
}
scrollbar-width: thin;
scrollbar-color: #c1c9c4 transparent;
}
}
@ -918,37 +933,12 @@ export default {
//
.pagination-total {
font-size: 16px;
color: #666;
font-size: @market-pagination-total-font-size;
color: @market-pagination-total-color;
}
.pagination-box {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
padding-top: 32px;
gap: 16px;
width: 100%;
box-sizing: border-box;
::v-deep .t-pagination {
display: flex !important;
flex-wrap: wrap;
align-items: center;
justify-content: center;
width: auto;
max-width: 100%;
gap: 12px 16px;
.t-input.t-is-readonly {
width: 110px;
}
.t-pagination__select {
margin-right: 0;
}
}
.market-pagination();
}
//

View File

@ -287,9 +287,8 @@ export default {
statsItems() {
return [
{ label: '需求总数', value: this.page.total || 0 },
{ label: '进行中', value: '—' },
{ label: '已匹配', value: '—' },
{ label: '本周新增', value: '—' },
{ label: '需求类型', value: this.xqlxOptions.length || '—' },
{ label: '覆盖地区', value: this.fwfwOptions.length || '—' },
];
},
},
@ -893,7 +892,7 @@ export default {
.budget-value {
font-size: 20px;
font-weight: 600;
color: #FF4D4F;
color: #2e7d32;
}
.card-actions {
@ -956,43 +955,12 @@ export default {
//
.pagination-total {
font-size: 16px;
color: #666;
font-size: @market-pagination-total-font-size;
color: @market-pagination-total-color;
}
.pagination-box {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
padding-top: 32px;
gap: 16px;
width: 100%;
box-sizing: border-box;
::v-deep .t-pagination {
display: flex !important;
flex-wrap: wrap;
align-items: center;
justify-content: center;
width: auto;
max-width: 100%;
gap: 12px 16px;
.t-input.t-is-readonly {
width: 110px;
}
.t-pagination__select {
margin-right: 0;
}
/* 优化需求:分页按钮线框统一为长方形+圆角 */
.t-pagination__number,
.t-pagination__btn {
border-radius: 6px;
}
}
.market-pagination();
}
//
@ -1150,11 +1118,9 @@ export default {
}
.pagination-box {
flex-direction: column;
align-items: stretch;
.market-pagination-mobile(32px);
padding-top: 16px;
padding-bottom: 32px;
gap: 12px;
}
.pagination-total {
@ -1164,108 +1130,6 @@ export default {
text-align: center;
white-space: nowrap;
}
.pagination-box ::v-deep .t-pagination {
display: flex !important;
flex-wrap: wrap !important;
align-items: center;
justify-content: center !important;
width: 100% !important;
max-width: 100%;
white-space: normal !important;
row-gap: 12px;
column-gap: 8px;
}
.pagination-box ::v-deep .t-pagination__total {
display: none;
}
.pagination-box ::v-deep .t-pagination__btn-prev {
order: 1;
}
.pagination-box ::v-deep .t-pagination__pager {
order: 2;
}
.pagination-box ::v-deep .t-pagination__btn-next {
order: 3;
}
.pagination-box ::v-deep .t-pagination__select {
order: 4;
flex: 0 0 auto;
width: auto;
max-width: none;
margin: 0 0 0 8px !important;
display: flex;
justify-content: center;
}
.pagination-box ::v-deep .t-pagination__select .t-select__wrap {
width: auto;
max-width: none;
}
.pagination-box ::v-deep .t-pagination__pager {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
gap: 6px;
max-width: 100%;
}
@mob-pagination-h: 32px;
.pagination-box ::v-deep .t-pagination__number {
min-width: @mob-pagination-h;
height: @mob-pagination-h;
line-height: @mob-pagination-h;
margin: 0;
box-sizing: border-box;
}
.pagination-box ::v-deep .t-pagination__btn {
min-width: @mob-pagination-h;
width: @mob-pagination-h;
height: @mob-pagination-h;
line-height: @mob-pagination-h;
}
.pagination-box ::v-deep .t-pagination__select {
height: @mob-pagination-h;
align-items: center;
}
.pagination-box ::v-deep .t-pagination__select .t-select__wrap,
.pagination-box ::v-deep .t-pagination__select .t-input__wrap,
.pagination-box ::v-deep .t-pagination__select .t-input {
height: @mob-pagination-h !important;
min-height: @mob-pagination-h !important;
box-sizing: border-box;
}
.pagination-box ::v-deep .t-pagination__select .t-input__inner {
height: @mob-pagination-h !important;
min-height: @mob-pagination-h !important;
line-height: @mob-pagination-h;
padding-top: 0;
padding-bottom: 0;
font-size: 13px;
box-sizing: border-box;
}
.pagination-box ::v-deep .t-pagination__jump {
display: none !important;
}
.pagination-box ::v-deep .t-input.t-is-readonly {
width: auto;
min-width: 96px;
max-width: none;
}
}
@media (max-width: 480px) {
@ -1307,32 +1171,7 @@ export default {
.pagination-box {
padding-bottom: 40px;
}
@mob-pagination-h-sm: 28px;
.pagination-box ::v-deep .t-pagination__number {
min-width: @mob-pagination-h-sm;
height: @mob-pagination-h-sm;
line-height: @mob-pagination-h-sm;
font-size: 13px;
}
.pagination-box ::v-deep .t-pagination__btn {
min-width: @mob-pagination-h-sm;
width: @mob-pagination-h-sm;
height: @mob-pagination-h-sm;
line-height: @mob-pagination-h-sm;
}
.pagination-box ::v-deep .t-pagination__select,
.pagination-box ::v-deep .t-pagination__select .t-select__wrap,
.pagination-box ::v-deep .t-pagination__select .t-input__wrap,
.pagination-box ::v-deep .t-pagination__select .t-input,
.pagination-box ::v-deep .t-pagination__select .t-input__inner {
height: @mob-pagination-h-sm !important;
min-height: @mob-pagination-h-sm !important;
line-height: @mob-pagination-h-sm;
.market-pagination-mobile(28px);
}
}

View File

@ -689,8 +689,9 @@ const CATEGORY_META = [
{ id: 'content-15', title: '咨询机构', flDm: '15', icon: 'tjszx.svg', keywords: ['咨询', '服务', '股份', '智能'] },
];
function buildCategoryList() {
return CATEGORY_META.map((meta) => ({
function buildCategoryList(metaList) {
const source = metaList || CATEGORY_META;
return source.map((meta) => ({
...meta,
cardList: [],
displayList: [],
@ -780,21 +781,18 @@ export default {
return groups.filter((g) => g.list.length > 0);
},
favoriteCards() {
if (this.favoriteList && this.favoriteList.length) {
return this.favoriteList;
}
const list = [];
this.categoryList.forEach((cat) => {
cat.cardList.forEach((card) => {
if (card.scbz === 'Y') {
list.push(card);
}
});
});
return list;
return this.favoriteList;
},
statsItems() {
const totalLinks = this.categoryList.reduce((s, c) => s + c.cardList.length, 0);
// cardList.length
const seen = new Set();
this.categoryList.forEach((c) => {
c.cardList.forEach((card) => {
const id = card.gxUuid || card.wzUuid || card._demoId;
if (id) seen.add(id);
});
});
const totalLinks = seen.size;
const totalCats = this.categoryList.filter((c) => c.cardList.length > 0).length;
const totalFavs = this.favoriteCards.length;
return [
@ -860,12 +858,19 @@ export default {
return false;
},
async bootstrap() {
this.pageLoading = true;
// 1. 沿
await this.loadCategoryList();
// 2.
try {
await this.loadAllSections();
} catch (e) {
console.error('共性能力页加载失败', e);
this.applyDemoFallback();
}
// scbz
await this.loadFavorites({ silent: true });
this.pageLoading = false;
this.$nextTick(() => {
if (this.navigateToRouteAnchor()) return;
this.initScrollSpy();
@ -1101,29 +1106,53 @@ export default {
card.tagList = inferred;
card.fwlxbqList = inferred;
},
matchCategory(record, category) {
// gxnlFlDm: 01~05
if (record.gxnlFlDm && category.flDm && record.gxnlFlDm === category.flDm) {
return true;
}
//
/** 按关键词匹配(仅用于数据兜底,优先走 gxnlFlDm */
_matchByKeywords(record, category) {
const text = `${record.bt1 || ''}${record.jj || ''}${record.fwlxjh || ''}${record.qymc || ''}`;
return category.keywords.some((kw) => text.includes(kw));
},
/** 按 FL 代码匹配 */
_matchByFlDm(record, category) {
return record.gxnlFlDm && category.flDm && record.gxnlFlDm === category.flDm;
},
assignCategoryCards(allRecords) {
//
const assigned = new Set();
this.categoryList.forEach((cat) => {
const list = allRecords
.filter((r) => this.matchCategory(r, cat))
.map((r) => {
const list = [];
allRecords.forEach((r) => {
const id = r.wzUuid || r.gxUuid;
if (!id || assigned.has(id)) return;
// FL
if (this._matchByFlDm(r, cat) || (!r.gxnlFlDm && this._matchByKeywords(r, cat))) {
const card = this.normalizeRecord(r);
this.ensureCardTags(card, cat);
return card;
});
list.push(card);
assigned.add(id);
}
});
cat.cardList = list;
cat.total = list.length;
cat.visibleCount = cat.previewSize;
this.refreshDisplayList(cat);
});
// gxnlFlDm
allRecords.forEach((r) => {
const id = r.wzUuid || r.gxUuid;
if (!id || assigned.has(id)) return;
for (const cat of this.categoryList) {
if (this._matchByKeywords(r, cat)) {
const card = this.normalizeRecord(r);
this.ensureCardTags(card, cat);
cat.cardList.push(card);
cat.total = cat.cardList.length;
cat.visibleCount = cat.previewSize;
this.refreshDisplayList(cat);
assigned.add(id);
break;
}
}
});
},
applyDemoFallback() {
this.useDemoData = true;
@ -1177,12 +1206,28 @@ export default {
this.refreshDisplayList(category);
}
},
/** 从接口获取分类列表,失败时沿用前端硬编码 CATEGORY_META */
async loadCategoryList() {
try {
const res = await api.flList();
const flList = (res && res.data) || [];
if (!flList.length) return;
// flDm icon / keywords
const apiMap = new Map(flList.map((item) => [item.flDm, item.flMc]));
const merged = CATEGORY_META
.filter((meta) => apiMap.has(meta.flDm))
.map((meta) => ({ ...meta, title: apiMap.get(meta.flDm) }));
if (merged.length) {
this.categoryList = buildCategoryList(merged);
}
} catch (e) {
// 使 data() CATEGORY_META
}
},
async loadAllSections() {
this.pageLoading = true;
this.useDemoData = false;
if (FORCE_DEMO_PREVIEW) {
this.applyDemoFallback();
this.pageLoading = false;
return;
}
try {
@ -1201,8 +1246,6 @@ export default {
} catch (e) {
console.error('共性能力列表加载失败', e);
this.applyDemoFallback();
} finally {
this.pageLoading = false;
}
},
getScrollRoot() {
@ -1349,8 +1392,9 @@ export default {
if (scrollRoot.scrollTop === 0) return;
scrollRoot.scrollTo({ top: 0, behavior: 'auto' });
},
async loadFavorites() {
this.favoritesLoading = true;
async loadFavorites(opts = {}) {
const { silent = false } = opts;
if (!silent) this.favoritesLoading = true;
try {
const res = await api.myFavoriteList({ pageNo: 1, pageSize: 200 });
const data = res && res.data;
@ -1359,16 +1403,34 @@ export default {
card.scbz = 'Y';
return card;
});
//
this.syncFavoriteStatusToCards();
} catch (e) {
if (isUnauthorizedError(e)) {
showLoginGuide({ actionText: '查看我的收藏' });
if (!silent) showLoginGuide({ actionText: '查看我的收藏' });
return;
}
this.$message.warning('我的收藏加载失败');
if (!silent) this.$message.warning('我的收藏加载失败');
} finally {
this.favoritesLoading = false;
if (!silent) this.favoritesLoading = false;
}
},
/** 根据 favoriteList 同步 categoryList 中所有卡片的 scbz 状态 */
syncFavoriteStatusToCards() {
const favIds = new Set((this.favoriteList || []).map((c) => c.gxUuid || c.wzUuid).filter(Boolean));
this.categoryList.forEach((cat) => {
cat.cardList.forEach((card) => {
const id = card.gxUuid || card.wzUuid;
if (!id) return;
const next = favIds.has(id) ? 'Y' : 'N';
if (card.scbz !== next) {
this.$set(card, 'scbz', next);
}
});
// displayList Vue 2
cat.displayList = cat.cardList.slice(0, cat.visibleCount);
});
},
resetSubmitForm() {
this.submitForm = SUBMIT_FORM_EMPTY();
this.submitTouched = {};

View File

@ -471,6 +471,21 @@ export default {
this.setNavActive(sectionIndex - 1);
}
},
/** 检查事件源是否在可滚动面板内,且面板仍有滚动空间 */
_isInsideScrollablePanel(e, direction) {
let el = e.target;
while (el) {
if (el.classList && el.classList.contains('content-item1')) {
const atTop = el.scrollTop <= 1;
const atBottom = el.scrollTop + el.clientHeight >= el.scrollHeight - 1;
if (direction > 0 && !atBottom) return true; //
if (direction < 0 && !atTop) return true; //
return false;
}
el = el.parentElement;
}
return false;
},
handleWheel(e) {
if (this.isScrolling) return;
const delta = Math.abs(e.deltaY);
@ -480,6 +495,12 @@ export default {
if (!scrollRoot) return;
const direction = e.deltaY > 0 ? 1 : -1;
//
if (this._isInsideScrollablePanel(e, direction)) {
return;
}
const currentIndex = this.getCurrentSectionIndex(scrollRoot);
const currentEl = document.getElementById(this.sectionIds[currentIndex]);
@ -1138,30 +1159,19 @@ body {
padding-top: 24px;
}
.banner1.qych-snap-section {
--qych-section-bg: #f7faf8;
}
.banner2.qych-snap-section {
--qych-section-bg: #f5f5f5;
}
.banner3.qych-snap-section {
--qych-section-bg: #f0faf2;
}
.banner1.qych-snap-section { --qych-section-bg: #f5f8fc; }
.banner2.qych-snap-section { --qych-section-bg: #f4fafa; }
.banner3.qych-snap-section { --qych-section-bg: #f3f9f7; }
.banner1 {
--qych-section-bg: #f7faf8;
background: url(../../assets/qych/banner3.png);
background-size: cover;
background-position: center top;
}
.banner2 {
--qych-section-bg: #f5f5f5;
background: #f5f5f5;
background: #f4fafa;
}
.banner3 {
--qych-section-bg: #f0faf2;
background: url(../../assets/qych/banner1.png);
background-size: cover;
}
@ -1181,7 +1191,7 @@ body {
line-height: normal;
color: @home-color-white;
white-space: nowrap;
background: @home-gradient-export-btn;
background: linear-gradient(135deg, #009a29 0%, #00b96b 100%);
border-radius: @qych-policy-btn-radius;
cursor: pointer;
}

View File

@ -326,24 +326,26 @@ module.exports = {
},
'^/sso': {
// 老栈 target 走 cciw.com.cn 生产 (历史行为保留)。
target: 'https://www.cciw.com.cn',
target: 'http://carbon.liantu.tech',
// target: 'https://www.cciw.com.cn',
changeOrigin: true,
},
'^/mhzc': {
target: process.env.VUE_APP_MHZC_PROXY || 'https://www.cciw.com.cn',
target: 'http://carbon.liantu.tech',
// target: 'https://www.cciw.com.cn',
changeOrigin: true,
},
'^/gxzx': {
// target: 'http://localhost:9300',
// target: 'http://carbon.liantu.tech',
target: 'https://www.cciw.com.cn',
target: 'http://carbon.liantu.tech',
// target: 'https://www.cciw.com.cn',
// target: 'http://10.23.20.13:94/',
changeOrigin: true,
},
'^/yygl': {
// target: 'http://localhost:20010',
// target: 'http://carbon.liantu.tech',
target: 'https://www.cciw.com.cn',
target: 'http://carbon.liantu.tech',
// target: 'https://www.cciw.com.cn',
// target: 'http://10.23.20.13:94/',
changeOrigin: true,
},

View File

@ -6,6 +6,7 @@ import com.css.txw.mhzc.pojo.vo.GxnlGxscToggleReqVO;
import com.css.txw.mhzc.pojo.vo.GxnlSlxxAuditReqVO;
import com.css.txw.mhzc.pojo.vo.GxnlSlxxSubmitReqVO;
import com.css.txw.mhzc.pojo.vo.GxnlWzxxListReqVO;
import com.css.txw.mhzc.constants.gxnl.GxnlFlConstants;
import com.css.txw.mhzc.pojo.vo.GxnlWzxxVO;
import com.css.txw.mhzc.service.TxwMhzcGxnlService;
import io.swagger.v3.oas.annotations.Operation;
@ -17,7 +18,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@ -68,4 +71,17 @@ public class GxnlController {
data.put("total", page.getTotal());
return CommonResult.success(data);
}
@PostMapping("/fl/list")
@Operation(summary = "共性能力分类列表")
public CommonResult<List<Map<String, String>>> flList() {
List<Map<String, String>> list = new ArrayList<>();
GxnlFlConstants.FL_DM_TO_MC.forEach((dm, mc) -> {
Map<String, String> item = new HashMap<>();
item.put("flDm", dm);
item.put("flMc", mc);
list.add(item);
});
return CommonResult.success(list);
}
}