Compare commits

...

13 Commits
dev ... main

Author SHA1 Message Date
012c48c5dd feat: 切换路由自动滚动到最顶部 2026-04-08 16:38:51 +08:00
b3a9601b5f feat: 申请服务跳转链接 2026-04-07 10:00:04 +08:00
5fff9b86e1 fix: 字典码表大小写错误 2026-04-07 09:57:11 +08:00
2d009323e4 feat: 样式调整、服务市场筛选框调整 2026-04-06 22:29:30 +08:00
huangweiming
a2c31635dd fix:首页一些排版调整 2026-04-06 20:03:46 +08:00
d7db320ba2 feat: 调整跳转链接、footer文案 2026-04-06 17:35:40 +08:00
331bb97db5 Merge branch 'dev' 2026-04-06 17:23:13 +08:00
56172e39e3 chore: gitignore 2026-04-06 17:20:14 +08:00
huangweiming
d301ad5a9c fix:修改外部链接地址 2026-04-06 11:34:23 +08:00
huangweiming
4229d445f9 Merge branch 'dev'
# Conflicts:
#	.gitignore
#	txw-gxzx-web/yarn.lock
#	txw-kxtfwzx-web/yarn.lock
#	txw-mhzc-web/.eslintrc.js
#	txw-mhzc-web/package.json
#	txw-mhzc-web/src/pages/index/components/footer/index.vue
#	txw-mhzc-web/src/pages/index/components/logo/index.vue
#	txw-mhzc-web/src/pages/index/components/nav/index2.vue
#	txw-mhzc-web/src/pages/index/router/index.js
#	txw-mhzc-web/src/pages/index/router/routes.js
#	txw-mhzc-web/src/pages/index/views/fwsc/fwsc.vue
#	txw-mhzc-web/src/pages/index/views/fwsc/index.vue
#	txw-mhzc-web/src/pages/index/views/fwsc/jrsc.vue
#	txw-mhzc-web/src/pages/index/views/fwsc/sjlbc.vue
#	txw-mhzc-web/src/pages/index/views/fwsc/sjsc.vue
#	txw-mhzc-web/src/pages/index/views/fwsc/xqsc.vue
#	txw-mhzc-web/src/pages/index/views/glxtSy/glxtSy.vue
#	txw-mhzc-web/src/pages/index/views/home/mhNewMain.vue
#	txw-mhzc-web/src/pages/index/views/home2/index.vue
#	txw-mhzc-web/src/pages/index/views/main.vue
#	txw-mhzc-web/src/settings/index.js
#	txw-mhzc-web/vue.config.js
#	txw-mhzc-web/yarn.lock
#	txw-sso/txw-sso-service-biz/src/main/resources/bootstrap.yml
#	txw-tzzx-web/yarn.lock
#	txw-ytzx-web/yarn.lock
#	txw-yygl-web/yarn.lock
2026-04-06 09:23:39 +08:00
huangweiming
d456209b2a fix:菜单微调 2026-04-05 18:11:01 +08:00
huangweiming
b5dbf326cb fix:ifream链接调整 2026-04-05 17:22:07 +08:00
huangweiming
f4a83c8f9a Initial commit 2026-04-05 15:05:13 +08:00
33 changed files with 87158 additions and 11531 deletions

55
.gitignore vendored
View File

@ -1 +1,54 @@
prd/
# Compiled class file
*.class
target
classes
prd
# Log file
*.log
log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.war
*.ear
*.zip
*.tar.gz
*.rar
*.iml
.idea
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
/.settings/
.classpath
.factorypath
.project
.DS_Store
node_modules/
dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
/test/unit/coverage/
/test/e2e/reports/
selenium-debug.log
debug.log
ewm.png
# Editor directories and files
.idea
.settings
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln

View File

@ -1196,18 +1196,6 @@
"@types/conventional-commits-parser" "^5.0.0"
chalk "^5.3.0"
"@cssyq/ggzc-web@^1.0.7":
version "1.0.8"
resolved "http://10.23.10.90:4873/@cssyq%2fggzc-web/-/ggzc-web-1.0.8.tgz#aa73093ae02914fda1b283809eac031b09046d2e"
integrity sha512-ERk8chEGrvMqMAn/ObYzenAQUeEWL5RRHBYDH+ueIKPl9g8mIMMcrwJNuK+OvNbvNti18RxkAURy6uaHoqnGSQ==
dependencies:
vue-cli-service "^5.0.10"
"@fortawesome/fontawesome-free@^7.0.1":
version "7.2.0"
resolved "https://registry.npmmirror.com/@fortawesome/fontawesome-free/-/fontawesome-free-7.2.0.tgz#188c1053ce422ad1f934d7df242a973fcb89636d"
integrity sha512-3DguDv/oUE+7vjMeTSOjCSG+KeawgVQOHrKRnvUuqYh1mfArrh7s+s8hXW3e4RerBA1+Wh+hBqf8sJNpqNrBWg==
"@gar/promisify@^1.0.1":
version "1.1.3"
resolved "http://10.23.10.90:4873/@gar%2fpromisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
@ -13249,11 +13237,6 @@ vue-cli-plugin-style-resources-loader@~0.1.5:
resolved "http://10.23.10.90:4873/vue-cli-plugin-style-resources-loader/-/vue-cli-plugin-style-resources-loader-0.1.5.tgz#3e95f4df41f5408e1255664690698c0533648109"
integrity sha512-LluhjWTZmpGl3tiXg51EciF+T70IN/9t6UvfmgluJBqxbrb6OV9i7L5lTd+OKtcTeghDkhcBmYhtTxxU4w/8sQ==
vue-cli-service@^5.0.10:
version "5.0.10"
resolved "http://10.23.10.90:4873/vue-cli-service/-/vue-cli-service-5.0.10.tgz#1ae10365dec4539358cb4860cd5876f93faf16e3"
integrity sha512-j4+wxqjaHsgphWsQsDs0ET1TWSu+dW5syxk5MloTp6BsQ9dpN+SB0nq253thS6konMC+YiQLHxbf73ytrTHoRA==
vue-demi@^0.13.11:
version "0.13.11"
resolved "http://10.23.10.90:4873/vue-demi/-/vue-demi-0.13.11.tgz#7d90369bdae8974d87b1973564ad390182410d99"

View File

@ -1196,11 +1196,6 @@
"@types/conventional-commits-parser" "^5.0.0"
chalk "^5.3.0"
"@fortawesome/fontawesome-free@^7.0.1":
version "7.2.0"
resolved "https://registry.npmmirror.com/@fortawesome/fontawesome-free/-/fontawesome-free-7.2.0.tgz#188c1053ce422ad1f934d7df242a973fcb89636d"
integrity sha512-3DguDv/oUE+7vjMeTSOjCSG+KeawgVQOHrKRnvUuqYh1mfArrh7s+s8hXW3e4RerBA1+Wh+hBqf8sJNpqNrBWg==
"@gar/promisify@^1.0.1":
version "1.1.3"
resolved "http://10.23.10.90:4873/@gar%2fpromisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"

View File

@ -1,18 +1,13 @@
const eslintConfig = require('@gtff/tdesign-gt-vue/.eslintrc.js');
const projectRules = {
'no-shadow': 0,
'import/no-cycle': 0,
'prettier/prettier': [
'error',
{
endOfLine: 'auto',
},
],
};
eslintConfig.rules = {
...eslintConfig.rules,
...projectRules,
};
module.exports = eslintConfig;
module.exports = {
root: true,
extends: [],
rules: {
// 关闭所有校验
"prettier/prettier": "off",
"all": "off",
"no-undef": "off",
"no-unused-vars": "off",
"stylelint/no-unknown-property": "off",
"declaration-property-value-disallowed-list": "off"
}
};

2
txw-mhzc-web/.npmrc Normal file
View File

@ -0,0 +1,2 @@
registry=http://10.23.10.90:4873/
strict-ssl=false

View File

@ -0,0 +1,4 @@
{
"defaultSeverity": "off",
"rules":[]
}

52670
txw-mhzc-web/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -92,10 +92,6 @@
"path": "cz-customizable"
}
},
"lint-staged": {
"src/**/*.{js,vue}": "yarn lint",
"src/**/*.{vue,js,scss,less,css,html}": "yarn lint:style"
},
"changelog": {
"emojis": true,
"authorName": true,

View File

@ -28,7 +28,7 @@ export default {
return fetchSso({
url: `${basurl}/gxzx/gxdt/gxxxList`,
method: 'post',
loading: true,
// loading: true, // 组件自己管理 loading 状态
data: JSON.stringify(params),
});
},
@ -52,7 +52,7 @@ export default {
});
},
// 代码表查询tableName: fwlx/xqlx/sshy/ysfw/XZQH/bq/dw
// 代码表查询tableName: fwlx/xqlx/sshy/ysfw/xzqh/bq/dw
dms2mc(tableName, params) {
return fetchSso({
url: `${basurl}/yygl/cache/v1/list/${tableName}`,

View File

@ -13,13 +13,13 @@
</div>
<!-- 主办单位 -->
<div class="footer-column">
<!-- <div class="footer-column">
<div class="footer-title">主办单位</div>
<div class="footer-links">
<div class="footer-link-item">宝山区数据局</div>
<div class="footer-link-item">宝山区发改委</div>
</div>
</div>
</div> -->
<!-- 运营单位 -->
<div class="footer-column">
@ -58,8 +58,10 @@
<!-- 下部版权信息 -->
<div class="footer-bottom">
<p class="copyright">{{ copyright }}</p>
<p class="infrastructure">基础设施国家区块链网络基础底座上海枢纽</p>
<!-- <p class="copyright">{{ copyright }}</p> -->
<p class="copyright">© 2025 可信碳信息网 版权所有</p>
<p class="infrastructure">技术支持上海市宝山区大数据中心</p>
<p class="infrastructure">基础设施国家区块链网络基础底座</p>
</div>
</div>
</footer>

View File

@ -90,7 +90,7 @@
</template>
<script>
import { logout, authorize } from '@/pages/index/api/login';
import { logout, authorize, init } from '@/pages/index/api/login';
import api from '@/pages/index/api/gxzx/index.js';
export default {
@ -139,8 +139,8 @@ export default {
divider: true, //线
needLogin: true, //访
clientId: 'client_id_tfwzx',
// iframeUrl: 'https://ctn-web-pre.lingshu.net/trustedCarbonQuery/index', //
iframeUrl: 'https://ctn-web-pre.lingshu.net/trustedCarbonQuery/list?type=carbon-query', //
iframeUrl: 'https://ctn-web-pre.lingshu.net/trustedCarbonQuery/index', //
// iframeUrl: 'https://ctn-web-pre.lingshu.net/trustedCarbonQuery/list?type=carbon-query', //
},
{
name: 'tsjfcg',
@ -194,7 +194,6 @@ export default {
value: 'tfwsc',
content: '碳服务市场',
divider: true,
parentName: 'fwsc',
},
{
name: 'tjrsc',
@ -210,7 +209,6 @@ export default {
value: 'txqsc',
content: '碳需求市场',
divider: true,
parentName: 'fwsc',
},
{
name: 'tsjsc',
@ -218,8 +216,14 @@ export default {
value: 'tsjsc',
content: '碳数据市场',
divider: true,
parentName: 'fwsc',
}
},
// {
// name: 'fwscsjlbc',
// title: '',
// value: 'fwscsjlbc',
// content: '',
// divider: true,
// }
]
},
{
@ -259,22 +263,10 @@ export default {
const sfdl = window.sessionStorage.getItem('sfdl');
if (sfdl) {
this.loginFlag = true;
this.getWdxxCount();
// this.getWdxxCount();
} else {
this.loginFlag = false;
}
//
this.updateCurPageByRoute();
},
watch: {
//
$route: {
handler(newRoute) {
this.updateCurPageByRoute();
},
immediate: true,
},
},
beforeUnmount() { },
methods: {
@ -320,12 +312,6 @@ export default {
},
//
handleDropdownClick(menu) {
// parentName使curPage
if (menu.parentName) {
this.curPage = menu.parentName;
} else {
this.curPage = menu.name;
}
this.gotoIfreamPage(menu); //
},
@ -357,8 +343,7 @@ export default {
this.closeMobileMenu();
let iframeUrl = menu.iframeUrl;
if (iframeUrl) {
//login.jsauthorize
//使iframeUrlSSO Cookie
//login.jsauthorize
this.$emit('gotoIfreamPage', iframeUrl);
} else {
this.$emit('gotoPage', this.curPage);
@ -396,6 +381,7 @@ export default {
},
goyhzx() {
this.curPage = ""; //navactive
this.closeMobileMenu();
this.$router.push("/yhzx/gzt")
// window.location.href = `/view/mhzc/yhzx`;
@ -477,18 +463,18 @@ export default {
<style lang="css" scoped>
.nav-box {
position: fixed;
top: 0;
z-index: 9999;
display: grid;
top: 0px;
width: 100%;
background: #009a29;
margin: 0 auto;
color: #fff;
background: #009a29;
display: grid;
grid-template-columns: 1fr 2fr 1fr;
place-items: center;
color: #fff;
z-index: 9999;
}
.logo-box {
text-align: center;
@ -501,55 +487,55 @@ export default {
.option-box {
display: flex;
height: 64px;
font-family: PingFang SC;
font-size: 16px;
font-style: regular;
font-weight: 400;
letter-spacing: 0%;
text-align: center;
justify-content: center;
align-items: center;
text-align: center;
gap: 10px;
leading-trim: none;
height: 64px;
font-family: PingFang SC;
font-weight: 400;
font-style: Regular;
font-size: 16px;
leading-trim: NONE;
letter-spacing: 0%;
}
.option-box .gzt {
display: flex;
padding: 10px;
text-align: center;
cursor: pointer;
background: rgba(255, 255, 255, 0.3);
border-radius: 6px;
display: flex;
justify-content: space-around;
align-items: center;
gap: 10px;
border-radius: 6px;
}
.menu-box {
display: grid;
width: 100%;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
height: 64px;
font-size: 16px;
grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
gap: 10px;
}
.menu-title {
display: flex;
width: 96px;
height: 64px;
line-height: 24px;
text-align: center;
cursor: pointer;
line-height: 24px;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
}
.meun-title-active {
background: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.15) 100%);
border-bottom: 2px solid #fff;
border-bottom: 2px solid #ffffff;
}
.meun-title-disable {

View File

@ -20,7 +20,7 @@ const baseRoutes = [
},
];
routes.push(...baseRoutes);
const mainRoutes = {
path: '/',

View File

@ -185,7 +185,7 @@ export default {
},
async fwfwoptionsSearch() {
try {
const res = await api.dms2mc('XZQH', {});
const res = await api.dms2mc('xzqh', {});
this.fwfwOptions = res.data || [];
} catch (error) {
this.fwfwOptions = [];

View File

@ -191,7 +191,7 @@ export default {
},
async fwfwoptionsSearch() {
try {
const res = await api.dms2mc('XZQH', {});
const res = await api.dms2mc('xzqh', {});
this.fwfwOptions = res.data || [];
} catch (error) {
this.fwfwOptions = [];

View File

@ -33,18 +33,18 @@
<div class="filter-section">
<div class="filter-title">内容搜索</div>
<t-input v-model="filter.nr" placeholder="请输入关键词" @enter="onSearch" />
<div class="filter-buttons">
<t-button theme="primary" @click="onSearch">查询</t-button>
<t-button theme="default" @click="onReset">重置</t-button>
</div>
<!-- 只展示收藏项 -->
<div class="filter-section">
<t-checkbox v-model="filter.zzsscx" @change="onSearch">只展示收藏项</t-checkbox>
</div>
</div>
<div class="filter-buttons">
<t-button theme="primary" @click="onSearch">查询</t-button>
<t-button theme="default" @click="onReset">重置</t-button>
</div>
<!-- 只展示收藏项 -->
<div class="filter-section">
<t-checkbox v-model="filter.zzsscx" @change="onSearch">只展示收藏项</t-checkbox>
</div>
<!-- 服务类型 -->
<div class="filter-section">
@ -57,8 +57,22 @@
<!-- 服务企业 -->
<div class="filter-section">
<div class="filter-title">服务企业</div>
<div class="filter-options enterprise-options">
<t-checkbox-group v-model="filter.qyuuids" :options="qyOptions" @change="onSearch" />
<t-input
v-model="qySearchKeyword"
placeholder="搜索企业名称"
clearable
class="qy-search-input"
@change="filterQyOptions"
>
<template #prefix-icon>
<SearchIcon />
</template>
</t-input>
<div class="filter-options enterprise-options" v-if="qyFilteredOptions.length > 0">
<t-checkbox-group v-model="filter.qyuuids" :options="qyFilteredOptions" @change="onSearch" />
</div>
<div class="Qy-options-empty" v-else>
<span>未找到匹配企业</span>
</div>
</div>
</div>
@ -203,7 +217,7 @@
</template>
<script>
import { LocationIcon } from 'tdesign-icons-vue';
import { LocationIcon, SearchIcon } from 'tdesign-icons-vue';
import NewNav from '@/pages/index/components/new-nav/index.vue';
import Footer from '@/pages/index/components/footer/index.vue';
import BreadcrumbNav from '@/pages/index/components/breadcrumb/index.vue';
@ -218,6 +232,7 @@ export default {
BreadcrumbNav,
FwscPublish,
LocationIcon,
SearchIcon,
},
data() {
return {
@ -240,6 +255,10 @@ export default {
qyOptions: [],
//
allQyOptions: [],
//
qySearchKeyword: '',
//
qyFilteredOptions: [],
//
cardList: [],
//
@ -308,26 +327,44 @@ export default {
});
this.allQyOptions = options || [];
this.qyOptions = options || [];
this.qyFilteredOptions = options || [];
} catch (error) {
this.allQyOptions = [];
this.qyOptions = [];
this.qyFilteredOptions = [];
}
},
//
async onFwlxChange() {
this.qySearchKeyword = '';
if (this.filter.fwlxjh.length > 0) {
try {
const res = await api.getQyuuidsByBq({ fwlxjh: this.filter.fwlxjh });
const selectedCodes = res.data || [];
this.qyOptions = this.allQyOptions.filter((q) => selectedCodes.includes(q.value));
this.qyFilteredOptions = this.qyOptions;
} catch (error) {
this.qyOptions = this.allQyOptions;
this.qyFilteredOptions = this.allQyOptions;
}
} else {
this.qyOptions = this.allQyOptions;
this.qyFilteredOptions = this.allQyOptions;
}
this.onSearch();
},
//
filterQyOptions() {
console.log('this.qySearchKeyword', this.qySearchKeyword);
if (!this.qySearchKeyword) {
this.qyFilteredOptions = this.qyOptions;
} else {
const keyword = this.qySearchKeyword.toLowerCase();
this.qyFilteredOptions = this.qyOptions.filter((q) =>
q.label.toLowerCase().includes(keyword)
);
}
},
//
async searchList() {
this.loading = true;
@ -338,9 +375,8 @@ export default {
...this.filter,
...this.page,
};
if (prame.scbz !== undefined) {
prame.scbz = this.filter.zzsscx ? 'Y' : '';
}
// Y=, N=
prame.scbz = this.filter.zzsscx ? 'Y' : 'N';
const { data } = await api.gxxxList(prame);
if (data.records) {
data.records.map((item) => {
@ -372,7 +408,9 @@ export default {
nr: '',
zzsscx: false,
};
this.qySearchKeyword = '';
this.qyOptions = this.allQyOptions;
this.qyFilteredOptions = this.allQyOptions;
this.page.pageNo = 1;
this.searchList();
},
@ -665,6 +703,17 @@ export default {
}
}
.qy-search-input {
margin-bottom: 12px;
}
.Qy-options-empty {
padding: 16px 0;
font-size: 14px;
color: #999;
text-align: center;
}
.filter-buttons {
display: flex;
gap: 8px;

View File

@ -112,48 +112,48 @@ export default {
{ label: '社会性数据', value: 'social' }
],
cardList: [
{
id: 1,
name: '宝山绿色低碳数据创新实验室',
description: '汇聚全国优质第三方服务机构,提供从核算到认证的全链条专业服务。',
tags: ['公共数据', '社会性数据'],
price: '免费'
},
{
id: 2,
name: 'HiQLCD数据库',
description: '汇聚全国优质第三方服务机构,提供从核算到认证的全链条专业服务。',
description: '覆盖生命周期碳足迹评估所需的基础数据,支持多种排放因子查询与自定义导入。',
tags: ['商业数据'],
price: '付费'
},
{
id: 3,
name: '天工数据库',
description: '汇聚全国优质第三方服务机构,提供从核算到认证的全链条专业服务。',
description: '整合工业制造全流程能耗与排放因子,支持实时监测与历史数据追溯分析。',
tags: ['公益数据'],
price: '免费'
},
{
id: 4,
name: 'ecoinvent数据库',
description: '汇聚全国优质第三方服务机构,提供从核算到认证的全链条专业服务。',
description: '国际权威生命周期评价数据库收录全球超过18000种过程数据与排放因子。',
tags: ['商业数据'],
price: '付费'
},
{
id: 5,
name: 'ecoinvent数据库',
description: '汇聚全国优质第三方服务机构,提供从核算到认证的全链条专业服务。',
description: '国际权威生命周期评价数据库收录全球超过18000种过程数据与排放因子。',
tags: ['商业数据'],
price: '付费'
},
{
id: 6,
name: '天工数据库',
description: '汇聚全国优质第三方服务机构,提供从核算到认证的全链条专业服务。',
description: '整合工业制造全流程能耗与排放因子,支持实时监测与历史数据追溯分析。',
tags: ['公益数据'],
price: '免费'
}
},
{
id: 1,
name: '宝山绿色低碳数据创新实验室',
description: '聚焦区域低碳发展数据汇聚与分析,提供碳排放核算模型与可视化报告。',
tags: ['公共数据', '社会性数据'],
price: '免费'
},
],
//
filterCollapsed: true,

View File

@ -287,7 +287,7 @@ export default {
},
async fwfwoptionsSearch() {
try {
const res = await api.dms2mc('XZQH', {});
const res = await api.dms2mc('xzqh', {});
this.fwfwOptions = res.data || [];
} catch (error) {
this.fwfwOptions = [];

View File

@ -5,7 +5,7 @@
<div style="height: 100%">
<template>
<div style="height: 100%" class="htglMenu">
<t-menu style="width: 220px; background: #fff" :defaultValue="defaultValue" :collapsed="collapsed" :defaultExpanded="expanded" @change="gotoPage">
<t-menu style="width: 220px; background: #fff" v-model="activeMenuId" :collapsed="collapsed" :defaultExpanded="expanded" @change="gotoPage">
<div class="title">用户中心</div>
<!-- 循环实现 -->
<template v-for="item in cdList">
@ -121,10 +121,16 @@ export default {
title: '绿色交易',
icon: 'user',
name: 'lsjy',
}, {
id: 'zljggl',
title: '质证结果管理',
icon: 'user',
name: 'zljggl',
iframeUrl: "https://ctn-web-pre.lingshu.net/proof-result-mgt?type=carbon-certify",
},
{
id: 'cunzhengjilu',
title: '存证记录',
title: '存证记录管理',
icon: 'user',
name: 'cunzhengjilu',
iframeUrl: "https://ctn-web-pre.lingshu.net/cert-record-mgt",
@ -136,7 +142,7 @@ export default {
iframeUrl: "https://ctn-web-pre.lingshu.net/hosting-record-mgt",
}, {
id: 'chazhengjilu',
title: '查证记录',
title: '查证记录管理',
icon: 'user',
name: 'chazhengjilu',
iframeUrl: "https://ctn-web-pre.lingshu.net/query-record-mgt",
@ -147,19 +153,26 @@ export default {
zljgglurl: 'https://ctn-web-pre.lingshu.net/proof-result-mgt?type=carbon-certify',
iframeUrl: "",
activeMenuId: "gzt",
};
},
created() {
},
activated() {
console.log("glxtSy.vue,created==>", this.$route)
// this.initView();
// const activeCompo = this.$route.query.activeCompo;
// if (activeCompo) {
// this.changeHandler(activeCompo);
// }
this.gotoPage(this.cdList[0].id);
let cdId = this.cdList[0].id;
const activeCompo = this.$route.query.activeCompo;
if (activeCompo) {
// this.changeHandler(activeCompo);
cdId = activeCompo;
}
this.activeMenuId = cdId;
this.gotoPage(cdId);
},
methods: {
gotoPage(menuId) {
@ -194,8 +207,11 @@ export default {
if (iframeUrl) {
this.iframeUrl = iframeUrl;
} else {
this.$router.push({
path: "/yhzx/" + menu.name
this.iframeUrl = "";
this.$nextTick(() => {
this.$router.push({
path: "/yhzx/" + menu.name
})
})
}
},

View File

@ -9,11 +9,11 @@
@click="handleClick(item.to)"
>
<div class="item-icon" :style="{ background: item.bgColor, color: item.color }">
<t-icon :name="item.icon" />
<component :is="getIconComponent(item.icon)" />
</div>
<span class="item-label">{{ item.label }}</span>
<div class="item-arrow">
<t-icon name="arrow-right" />
<ArrowRightIcon />
</div>
</button>
</div>
@ -21,8 +21,24 @@
</template>
<script>
import { MailIcon, UserIcon, EditIcon, LockOnIcon, ArrowRightIcon } from 'tdesign-icons-vue';
const iconMap = {
mail: MailIcon,
user: UserIcon,
edit: EditIcon,
'lock-on': LockOnIcon,
};
export default {
name: 'AccountShortcuts',
components: {
MailIcon,
UserIcon,
EditIcon,
LockOnIcon,
ArrowRightIcon,
},
data() {
return {
shortcuts: [
@ -34,6 +50,9 @@ export default {
};
},
methods: {
getIconComponent(name) {
return iconMap[name] || MailIcon;
},
handleClick(to) {
this.$router.push(to);
},

View File

@ -2,7 +2,7 @@
<div class="enterprise-cert">
<div class="cert-header">
<div class="cert-icon">
<t-icon name="user" />
<UserIcon />
</div>
<div class="cert-title">
<h3>企业认证</h3>
@ -34,7 +34,7 @@
<div class="cert-actions">
<button class="cert-btn" @click="handleClick">
<span>{{ certData.qymc ? '查看详情' : '立即认证' }}</span>
<t-icon name="arrow-right" />
<ArrowRightIcon />
</button>
</div>
</div>
@ -43,9 +43,14 @@
<script>
import api from '@/pages/index/api/gxzx/index.js';
import { UserIcon, ArrowRightIcon } from 'tdesign-icons-vue';
export default {
name: 'EnterpriseCert',
components: {
UserIcon,
ArrowRightIcon,
},
data() {
return {
certData: {},

View File

@ -2,7 +2,7 @@
<div class="policy-news">
<div class="panel-header">
<div class="header-icon">
<t-icon name="notification" />
<NotificationIcon />
</div>
<h3 class="header-title">{{ title }}</h3>
<span class="header-tag">政策</span>
@ -31,15 +31,21 @@
<div class="panel-footer">
<span class="more-link">
查看全部
<t-icon name="arrow-right" />
<ArrowRightIcon />
</span>
</div>
</div>
</template>
<script>
import { NotificationIcon, ArrowRightIcon } from 'tdesign-icons-vue';
export default {
name: 'PolicyNews',
components: {
NotificationIcon,
ArrowRightIcon,
},
props: {
title: {
type: String,
@ -203,14 +209,15 @@ export default {
}
.item-title {
display: box;
display: -webkit-box;
overflow: hidden;
font-size: 13px;
line-height: 1.6;
color: @text-dark;
box-orient: vertical;
transition: color 0.25s ease;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
line-clamp: 2;
transition: color 0.25s ease;
}
.item-meta {

View File

@ -10,12 +10,12 @@
>
<div class="item-icon-wrap">
<div class="item-icon" :style="{ background: action.bgColor, color: action.color }">
<t-icon :name="action.icon" />
<component :is="getIconComponent(action.icon)" />
</div>
</div>
<span class="item-label">{{ action.label }}</span>
<div class="item-arrow">
<t-icon name="arrow-right" />
<ArrowRightIcon />
</div>
</button>
</div>
@ -23,8 +23,24 @@
</template>
<script>
import { UploadIcon, CloudUploadIcon, EditIcon, BulletpointIcon, ArrowRightIcon } from 'tdesign-icons-vue';
const iconMap = {
upload: UploadIcon,
'cloud-upload': CloudUploadIcon,
edit: EditIcon,
bulletpoint: BulletpointIcon,
};
export default {
name: 'QuickActions',
components: {
UploadIcon,
CloudUploadIcon,
EditIcon,
BulletpointIcon,
ArrowRightIcon,
},
data() {
return {
actions: [
@ -36,6 +52,9 @@ export default {
};
},
methods: {
getIconComponent(name) {
return iconMap[name] || UploadIcon;
},
handleClick(to) {
this.$router.push(to);
},

View File

@ -4,7 +4,7 @@
<div class="card-inner">
<div class="card-icon-wrap" :style="iconWrapStyle">
<div class="icon-inner" :style="iconInnerStyle">
<t-icon :name="iconName" />
<component :is="iconComponent" />
</div>
</div>
<div class="card-content">
@ -20,8 +20,23 @@
</template>
<script>
import { UploadIcon, SearchIcon, SwapIcon, MailIcon } from 'tdesign-icons-vue';
const iconMap = {
upload: UploadIcon,
search: SearchIcon,
swap: SwapIcon,
mail: MailIcon,
};
export default {
name: 'StatsCard',
components: {
UploadIcon,
SearchIcon,
SwapIcon,
MailIcon,
},
props: {
title: String,
count: [String, Number],
@ -45,6 +60,9 @@ export default {
color: this.borderColor !== 'transparent' ? this.borderColor : '#666',
};
},
iconComponent() {
return iconMap[this.iconName] || UploadIcon;
},
},
methods: {
lightenColor(hex) {

View File

@ -82,7 +82,7 @@
<div class="panel-card">
<div class="panel-header">
<div class="header-icon">
<t-icon name="app" />
<AppIcon />
</div>
<div class="header-text">
<h2 class="panel-title">常用功能</h2>
@ -98,7 +98,7 @@
<div class="panel-card account-panel">
<div class="panel-header">
<div class="header-icon header-icon--account">
<t-icon name="setting" />
<SettingIcon />
</div>
<div class="header-text">
<h2 class="panel-title">账号管理</h2>
@ -121,6 +121,7 @@
</template>
<script>
import { AppIcon, SettingIcon } from 'tdesign-icons-vue';
import StatsCard from './components/StatsCard.vue';
import QuickActions from './components/QuickActions.vue';
import PolicyNews from './components/PolicyNews.vue';
@ -130,6 +131,8 @@ import EnterpriseCert from './components/EnterpriseCert.vue';
export default {
name: 'GztIndex',
components: {
AppIcon,
SettingIcon,
StatsCard,
QuickActions,
PolicyNews,

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
<template>
<div>
<Nav @gotoIfreamPage="gotoIfreamPage" @gotoPage="gotoPage" />
<div :style="{ 'height': documentClientHeight-64 + 'px' ,'margin-top':'64px'}">
<div ref="contentWrap" :style="{ 'height': documentClientHeight-65 + 'px' ,'margin-top':'64px' ,'overflow':'auto'}">
<iframe v-if="iframeUrl" :src="iframeUrl" width="100%" height="100%" frameborder="0" scrolling="yes">
</iframe>
<keep-alive v-else>
@ -24,6 +24,12 @@ export default {
components: {
Nav,
},
watch: {
$route() {
//
this.$refs.contentWrap && (this.$refs.contentWrap.scrollTop = 0);
},
},
computed: {
// documentClientHeight: {
// get() {
@ -49,11 +55,17 @@ export default {
},
methods: {
gotoPage(name) {
this.$router.push({ name })
this.iframeUrl = "";
this.$nextTick(() => {
this.$router.push({
path: "/" + name
})
});
// this.$router.replace({ name: name, force: true })
// window.location.href = name
// // this.$router.replace({ name: name, force: true })
// alert(name)
// window.location.href = name
},
gotoIfreamPage(iframeUrl) {

View File

@ -33,7 +33,7 @@ export default {
// { title: '上海市宝山区发改委', href: '#' },
// { title: '上海市宝山区生态环境局', href: '#' },
],
copyright: '© 2025 可信碳信息网 版权所有 | 主办单位:上海市宝山区大数据中心',
copyright: '© 2025 可信碳信息网 版权所有 | 技术支持:上海市宝山区大数据中心',
hyztList: [
{
title: '钢铁行业',

View File

@ -244,8 +244,8 @@ module.exports = {
terserOptions: {
compress: {
warnings: false,
drop_console: true,
drop_debugger: true,
drop_console: false,
drop_debugger: false,
},
},
}),
@ -266,7 +266,8 @@ module.exports = {
devServer: {
port: devServerPort,
host: '0.0.0.0',
contentBase: './dist',
// 开发时勿用 ./dist会与历史 npm run build 产物混用history 子路径刷新易命中旧 HTML/JS
contentBase: path.resolve(__dirname, 'public'),
publicPath: process.env.VUE_APP_ROUTER_BASE,
https: process.env.VUE_APP_PROTOCOL_HTTPS === 'true',
compress: false,
@ -281,21 +282,27 @@ module.exports = {
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS',
'Access-Control-Allow-Headers': 'X-Requested-With, content-type, Authorization',
},
// Vue CLI prepareProxy 用 pathname.match(代理键) 判断;键写 '/mhzc' 会变成匹配路径里任意位置的 /mhzc
// 会误伤 SPA 路由 /view/mhzc/...,刷新时整页请求被转发到后端导致 Proxy error。必须用 ^ 限定为路径前缀。
proxy: {
'/sso': {
'^/sso': {
target: 'http://carbon.liantu.tech',
// target: 'http://10.23.20.13:94/',
changeOrigin: true,
},
'^/mhzc': {
target: 'http://carbon.liantu.tech',
// target: 'http://10.23.20.13:94/',
changeOrigin: true,
},
'^/gxzx': {
target: 'http://carbon.liantu.tech',
// target: 'http://10.23.20.13:94/',
changeOrigin: true,
},
'^/yygl': {
target: 'http://carbon.liantu.tech',
// target: 'http://10.23.20.13:94/',
changeOrigin: true,
},
},

File diff suppressed because it is too large Load Diff

22112
txw-tzzx-web/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1196,11 +1196,6 @@
"@types/conventional-commits-parser" "^5.0.0"
chalk "^5.3.0"
"@fortawesome/fontawesome-free@^7.0.1":
version "7.2.0"
resolved "https://registry.npmmirror.com/@fortawesome/fontawesome-free/-/fontawesome-free-7.2.0.tgz#188c1053ce422ad1f934d7df242a973fcb89636d"
integrity sha512-3DguDv/oUE+7vjMeTSOjCSG+KeawgVQOHrKRnvUuqYh1mfArrh7s+s8hXW3e4RerBA1+Wh+hBqf8sJNpqNrBWg==
"@gar/promisify@^1.0.1":
version "1.1.3"
resolved "http://10.23.10.90:4873/@gar%2fpromisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"

View File

@ -1196,11 +1196,6 @@
"@types/conventional-commits-parser" "^5.0.0"
chalk "^5.3.0"
"@fortawesome/fontawesome-free@^7.0.1":
version "7.2.0"
resolved "https://registry.npmmirror.com/@fortawesome/fontawesome-free/-/fontawesome-free-7.2.0.tgz#188c1053ce422ad1f934d7df242a973fcb89636d"
integrity sha512-3DguDv/oUE+7vjMeTSOjCSG+KeawgVQOHrKRnvUuqYh1mfArrh7s+s8hXW3e4RerBA1+Wh+hBqf8sJNpqNrBWg==
"@gar/promisify@^1.0.1":
version "1.1.3"
resolved "http://10.23.10.90:4873/@gar%2fpromisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"

View File

@ -1196,11 +1196,6 @@
"@types/conventional-commits-parser" "^5.0.0"
chalk "^5.3.0"
"@fortawesome/fontawesome-free@^7.0.1":
version "7.2.0"
resolved "https://registry.npmmirror.com/@fortawesome/fontawesome-free/-/fontawesome-free-7.2.0.tgz#188c1053ce422ad1f934d7df242a973fcb89636d"
integrity sha512-3DguDv/oUE+7vjMeTSOjCSG+KeawgVQOHrKRnvUuqYh1mfArrh7s+s8hXW3e4RerBA1+Wh+hBqf8sJNpqNrBWg==
"@gar/promisify@^1.0.1":
version "1.1.3"
resolved "http://10.23.10.90:4873/@gar%2fpromisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"