feat: 新闻咨询由后台配置
BIN
txw-mhzc-web/public/static_res/images/news/default-hyzx.png
Normal file
|
After Width: | Height: | Size: 631 KiB |
BIN
txw-mhzc-web/public/static_res/images/news/default-news.png
Normal file
|
After Width: | Height: | Size: 832 KiB |
BIN
txw-mhzc-web/public/static_res/images/news/default-ptgg.png
Normal file
|
After Width: | Height: | Size: 804 KiB |
BIN
txw-mhzc-web/public/static_res/images/news/news1.png
Normal file
|
After Width: | Height: | Size: 79 KiB |
BIN
txw-mhzc-web/public/static_res/images/news/news2.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
txw-mhzc-web/public/static_res/images/news/news3.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
txw-mhzc-web/public/static_res/images/news/news4.png
Normal file
|
After Width: | Height: | Size: 381 KiB |
BIN
txw-mhzc-web/public/static_res/images/news/news5.png
Normal file
|
After Width: | Height: | Size: 308 KiB |
BIN
txw-mhzc-web/public/static_res/images/news/news6.png
Normal file
|
After Width: | Height: | Size: 574 KiB |
@ -200,12 +200,23 @@ export default {
|
||||
data: JSON.stringify(params),
|
||||
});
|
||||
},
|
||||
getSjlbb(params) {
|
||||
// 代码表查询(tableName: fwlx/sshy/xzqh/bq/dw)
|
||||
dms2mc(tableName, params) {
|
||||
return fetchSso({
|
||||
url: `${basurl}/gxdt/getSjlbb`,
|
||||
method: 'get',
|
||||
url: `/yygl/cache/v1/list/${tableName}`,
|
||||
method: 'post',
|
||||
loading: true,
|
||||
params,
|
||||
data: JSON.stringify(params),
|
||||
});
|
||||
},
|
||||
|
||||
// 发布供需信息(ywlxDm: '01'=供给, '02'=需求)
|
||||
gxfb(params) {
|
||||
return fetchSso({
|
||||
url: `${basurl}/gxdt/gxfb`,
|
||||
method: 'post',
|
||||
loading: true,
|
||||
data: JSON.stringify(params),
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
30
txw-mhzc-web/src/pages/index/api/hydt/index.js
Normal file
@ -0,0 +1,30 @@
|
||||
import { fetchSso } from '@/core/request';
|
||||
|
||||
const basurl = '/mhzc';
|
||||
|
||||
export default {
|
||||
// 行业动态 - 按类型查询(gjzc=国家政策、hyzx=行业资讯)
|
||||
getHydtList(params) {
|
||||
return fetchSso({
|
||||
url: `${basurl}/sy/hydt/list`,
|
||||
method: 'get',
|
||||
params,
|
||||
});
|
||||
},
|
||||
|
||||
// 行业动态 - 按类型分组查询
|
||||
getHydtGroupedList() {
|
||||
return fetchSso({
|
||||
url: `${basurl}/sy/hydt/groupedList`,
|
||||
method: 'get',
|
||||
});
|
||||
},
|
||||
|
||||
// 平台公告列表
|
||||
getPtggList() {
|
||||
return fetchSso({
|
||||
url: `${basurl}/sy/ptgg/list`,
|
||||
method: 'get',
|
||||
});
|
||||
},
|
||||
};
|
||||
@ -39,6 +39,9 @@
|
||||
</t-form>
|
||||
<!-- <div class="py-4"><t-button theme="primary" @click="reactqyglxx()">新增</t-button></div> -->
|
||||
<div class="table-box" style="padding: 16px; background-color: #fff">
|
||||
<div class="table-toolbar">
|
||||
<t-button theme="primary" @click="handlePublish">发布服务</t-button>
|
||||
</div>
|
||||
<t-table
|
||||
class="add-edit-table"
|
||||
ref="tableRef"
|
||||
@ -68,6 +71,110 @@
|
||||
</template>
|
||||
</t-table>
|
||||
</div>
|
||||
|
||||
<!-- 发布服务弹窗 -->
|
||||
<t-dialog
|
||||
:visible.sync="publishVisible"
|
||||
header="发布碳服务供给"
|
||||
:closeOnOverlayClick="true"
|
||||
:footer="false"
|
||||
width="600px"
|
||||
@close="onPublishClose"
|
||||
class="global-dialog"
|
||||
>
|
||||
<div class="publish-form">
|
||||
<t-form
|
||||
:rules="publishRules"
|
||||
:data="publishFormData"
|
||||
ref="publishFormRef"
|
||||
labelAlign="top"
|
||||
>
|
||||
<t-row :gutter="16">
|
||||
<t-col :span="12">
|
||||
<t-form-item label="服务标题" name="bt1">
|
||||
<t-input v-model="publishFormData.bt1" placeholder="请输入服务标题" clearable />
|
||||
</t-form-item>
|
||||
</t-col>
|
||||
<t-col :span="12">
|
||||
<t-form-item label="服务类型" name="fwlxjh">
|
||||
<t-select
|
||||
v-model="publishFormData.fwlxjh"
|
||||
:max="4"
|
||||
:options="fwlxOptions"
|
||||
placeholder="请选择服务类型"
|
||||
multiple
|
||||
clearable
|
||||
/>
|
||||
</t-form-item>
|
||||
</t-col>
|
||||
</t-row>
|
||||
|
||||
<t-row :gutter="16">
|
||||
<t-col :span="12">
|
||||
<t-form-item label="所属行业" name="sshy">
|
||||
<t-select v-model="publishFormData.sshy" :options="sshyDmOptions" placeholder="请选择所属行业" clearable />
|
||||
</t-form-item>
|
||||
</t-col>
|
||||
<t-col :span="12">
|
||||
<t-form-item label="服务地区" name="fwfw">
|
||||
<t-select v-model="publishFormData.fwfw" :options="fwfwOptions" placeholder="请选择服务地区" clearable />
|
||||
</t-form-item>
|
||||
</t-col>
|
||||
</t-row>
|
||||
|
||||
<t-row :gutter="16">
|
||||
<t-col :span="12">
|
||||
<t-form-item label="价格" name="gjjg">
|
||||
<t-input v-model="publishFormData.gjjg" :disabled="isMy" placeholder="请输入价格" clearable />
|
||||
<t-radio style="width: 80px; margin-left: 8px" allowUncheck v-model="isMy" @click="isMyChange">面议</t-radio>
|
||||
</t-form-item>
|
||||
</t-col>
|
||||
<t-col :span="12">
|
||||
<t-form-item label="单位" name="gjdwDm">
|
||||
<t-select v-model="publishFormData.gjdwDm" :disabled="isMy" :options="gjdwdmOptions" placeholder="请选择单位" clearable />
|
||||
</t-form-item>
|
||||
</t-col>
|
||||
</t-row>
|
||||
|
||||
<t-form-item label="服务详细描述" name="fwnr">
|
||||
<t-textarea v-model="publishFormData.fwnr" placeholder="请填写服务详细描述" :maxlength="100" />
|
||||
</t-form-item>
|
||||
|
||||
<t-form-item label="标签" name="bqjh">
|
||||
<t-select
|
||||
v-model="publishFormData.bqjh"
|
||||
:max="4"
|
||||
:options="bqOptions"
|
||||
placeholder="请选择标签"
|
||||
multiple
|
||||
clearable
|
||||
/>
|
||||
</t-form-item>
|
||||
|
||||
<t-row :gutter="16">
|
||||
<t-col :span="8">
|
||||
<t-form-item label="联系人" name="lxr">
|
||||
<t-input v-model="publishFormData.lxr" placeholder="请输入联系人" />
|
||||
</t-form-item>
|
||||
</t-col>
|
||||
<t-col :span="8">
|
||||
<t-form-item label="联系电话" name="lxdh">
|
||||
<t-input v-model="publishFormData.lxdh" placeholder="请输入联系电话" />
|
||||
</t-form-item>
|
||||
</t-col>
|
||||
<t-col :span="8">
|
||||
<t-form-item label="电子邮箱" name="email">
|
||||
<t-input v-model="publishFormData.email" placeholder="请输入电子邮箱" />
|
||||
</t-form-item>
|
||||
</t-col>
|
||||
</t-row>
|
||||
</t-form>
|
||||
|
||||
<div class="form-actions">
|
||||
<t-button theme="primary" type="button" @click="handlePublishSubmit">提交发布</t-button>
|
||||
</div>
|
||||
</div>
|
||||
</t-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -83,6 +190,36 @@ export default {
|
||||
return {
|
||||
formData: { ywlxDm: '01' },
|
||||
list: [],
|
||||
// 发布抽屉
|
||||
publishVisible: false,
|
||||
isMy: false,
|
||||
publishFormData: {
|
||||
bt1: '',
|
||||
fwlxjh: '',
|
||||
sshy: '',
|
||||
gjjg: '',
|
||||
gjdwDm: '',
|
||||
fwfw: '',
|
||||
fwnr: '',
|
||||
bqjh: [],
|
||||
lxr: '',
|
||||
lxdh: '',
|
||||
email: '',
|
||||
},
|
||||
publishRules: {
|
||||
bt1: [{ required: true, message: '必填', type: 'error' }],
|
||||
fwlxjh: [{ required: true, message: '必填', type: 'error' }],
|
||||
sshy: [{ required: true, message: '必填', type: 'error' }],
|
||||
fwfw: [{ required: true, message: '必填', type: 'error' }],
|
||||
fwnr: [{ required: true, message: '必填', type: 'error' }],
|
||||
lxr: [{ required: true, message: '必填', type: 'error' }],
|
||||
lxdh: [{ required: true, message: '必填', type: 'error' }],
|
||||
},
|
||||
fwlxOptions: [],
|
||||
sshyDmOptions: [],
|
||||
fwfwOptions: [],
|
||||
bqOptions: [],
|
||||
gjdwdmOptions: [],
|
||||
columns: [
|
||||
{ align: 'center', colKey: 'serial-number', width: '80px', title: '序号' },
|
||||
{ align: 'left', width: '120px', colKey: 'bt1', title: '标题', ellipsis: true },
|
||||
@ -152,13 +289,123 @@ export default {
|
||||
this.onQuery();
|
||||
}
|
||||
},
|
||||
// 加载代码表
|
||||
loadDmList() {
|
||||
this.fwlxoptionsSearch();
|
||||
this.sshyoptionsSearch();
|
||||
this.fwfwoptionsSearch();
|
||||
this.bqoptionsSearch();
|
||||
this.gjdwdmoptionsSearch();
|
||||
},
|
||||
async fwlxoptionsSearch() {
|
||||
try {
|
||||
const res = await api.dms2mc('fwlx', {});
|
||||
this.fwlxOptions = res.data || [];
|
||||
} catch (error) {
|
||||
this.fwlxOptions = [];
|
||||
}
|
||||
},
|
||||
async sshyoptionsSearch() {
|
||||
try {
|
||||
const res = await api.dms2mc('sshy', {});
|
||||
this.sshyDmOptions = res.data || [];
|
||||
} catch (error) {
|
||||
this.sshyDmOptions = [];
|
||||
}
|
||||
},
|
||||
async fwfwoptionsSearch() {
|
||||
try {
|
||||
const res = await api.dms2mc('xzqh', {});
|
||||
this.fwfwOptions = res.data || [];
|
||||
} catch (error) {
|
||||
this.fwfwOptions = [];
|
||||
}
|
||||
},
|
||||
async bqoptionsSearch() {
|
||||
try {
|
||||
const res = await api.dms2mc('bq', {});
|
||||
this.bqOptions = res.data || [];
|
||||
} catch (error) {
|
||||
this.bqOptions = [];
|
||||
}
|
||||
},
|
||||
async gjdwdmoptionsSearch() {
|
||||
try {
|
||||
const res = await api.dms2mc('dw', {});
|
||||
this.gjdwdmOptions = res.data || [];
|
||||
} catch (error) {
|
||||
this.gjdwdmOptions = [];
|
||||
}
|
||||
},
|
||||
// 打开发布抽屉
|
||||
handlePublish() {
|
||||
this.publishVisible = true;
|
||||
this.loadDmList();
|
||||
},
|
||||
isMyChange() {
|
||||
this.isMy = !this.isMy;
|
||||
if (this.isMy) {
|
||||
this.publishFormData.gjjg = '';
|
||||
this.publishFormData.gjdwDm = '';
|
||||
}
|
||||
},
|
||||
handlePublishSubmit() {
|
||||
this.$refs.publishFormRef.validate().then((result) => {
|
||||
if (result === true) {
|
||||
this.submitGxfb();
|
||||
} else {
|
||||
this.$message.warning('请填写全部必填信息');
|
||||
}
|
||||
});
|
||||
},
|
||||
async submitGxfb() {
|
||||
try {
|
||||
let params = {
|
||||
ywlxDm: '01',
|
||||
...this.publishFormData,
|
||||
};
|
||||
if (params.bqjh && params.bqjh.length) {
|
||||
params.bqjh = params.bqjh.toString();
|
||||
}
|
||||
if (params.fwlxjh && params.fwlxjh.length) {
|
||||
params.fwlxjh = params.fwlxjh.toString();
|
||||
}
|
||||
await api.gxfb(params);
|
||||
this.$message.success('发布成功,请等待审核');
|
||||
this.publishVisible = false;
|
||||
this.resetPublishForm();
|
||||
this.onQuery();
|
||||
} catch (error) {
|
||||
console.error('发布失败', error);
|
||||
}
|
||||
},
|
||||
resetPublishForm() {
|
||||
this.publishFormData = {
|
||||
bt1: '',
|
||||
fwlxjh: '',
|
||||
sshy: '',
|
||||
gjjg: '',
|
||||
gjdwDm: '',
|
||||
fwfw: '',
|
||||
fwnr: '',
|
||||
bqjh: [],
|
||||
lxr: '',
|
||||
lxdh: '',
|
||||
email: '',
|
||||
};
|
||||
this.isMy = false;
|
||||
},
|
||||
onPublishClose() {
|
||||
this.publishVisible = false;
|
||||
this.resetPublishForm();
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style lang="less" scoped>
|
||||
.container-body {
|
||||
height: 100%;
|
||||
padding: 40px 40px 0;
|
||||
height: calc(100vh - 64px);
|
||||
padding: 24px;
|
||||
background: #ecf1f9;
|
||||
}
|
||||
/deep/ .t-table__header tr th{
|
||||
@ -173,4 +420,19 @@ export default {
|
||||
/deep/ .t-table__content{
|
||||
border: 1px solid #bdbdbd66;
|
||||
}
|
||||
.table-toolbar {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
.publish-form {
|
||||
padding: 0 8px;
|
||||
}
|
||||
.form-actions {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin-top: 30px;
|
||||
|
||||
.t-button {
|
||||
width: 200px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@ -39,6 +39,9 @@
|
||||
</t-form>
|
||||
<!-- <div class="py-4"><t-button theme="primary" @click="reactqyglxx()">新增</t-button></div> -->
|
||||
<div class="table-box" style="padding: 16px; background-color: #fff">
|
||||
<div class="table-toolbar">
|
||||
<t-button theme="primary" @click="handlePublish">发布需求</t-button>
|
||||
</div>
|
||||
<t-table
|
||||
class="add-edit-table"
|
||||
ref="tableRef"
|
||||
@ -63,6 +66,107 @@
|
||||
</template>
|
||||
</t-table>
|
||||
</div>
|
||||
|
||||
<!-- 发布需求弹窗 -->
|
||||
<t-dialog
|
||||
:visible.sync="publishVisible"
|
||||
header="发布碳服务需求"
|
||||
:closeOnOverlayClick="true"
|
||||
:footer="false"
|
||||
width="600px"
|
||||
@close="onPublishClose"
|
||||
class="global-dialog"
|
||||
>
|
||||
<div class="publish-form">
|
||||
<t-form
|
||||
:rules="publishRules"
|
||||
:data="publishFormData"
|
||||
ref="publishFormRef"
|
||||
labelAlign="top"
|
||||
>
|
||||
<t-row :gutter="16">
|
||||
<t-col :span="12">
|
||||
<t-form-item label="需求标题" name="bt1">
|
||||
<t-input v-model="publishFormData.bt1" placeholder="请输入需求标题" clearable />
|
||||
</t-form-item>
|
||||
</t-col>
|
||||
<t-col :span="12">
|
||||
<t-form-item label="需求类型" name="fwlxjh">
|
||||
<t-select v-model="publishFormData.fwlxjh" :options="xqlxOptions" placeholder="请选择需求类型" clearable />
|
||||
</t-form-item>
|
||||
</t-col>
|
||||
</t-row>
|
||||
|
||||
<t-row :gutter="16">
|
||||
<t-col :span="12">
|
||||
<t-form-item label="所属行业" name="sshy">
|
||||
<t-select v-model="publishFormData.sshy" :options="sshyDmOptions" placeholder="请选择所属行业" clearable />
|
||||
</t-form-item>
|
||||
</t-col>
|
||||
<t-col :span="12">
|
||||
<t-form-item label="预算范围" name="ysfwDm1">
|
||||
<t-select v-model="publishFormData.ysfwDm1" :options="ysfwDm1Options" placeholder="请选择预算范围" clearable />
|
||||
</t-form-item>
|
||||
</t-col>
|
||||
</t-row>
|
||||
|
||||
<t-row :gutter="16">
|
||||
<t-col :span="12">
|
||||
<t-form-item label="期望完成时间" name="qwwcsj">
|
||||
<t-date-picker
|
||||
v-model="publishFormData.qwwcsj"
|
||||
placeholder="请选择期望完成时间"
|
||||
style="width: 100%"
|
||||
clearable
|
||||
/>
|
||||
</t-form-item>
|
||||
</t-col>
|
||||
<t-col :span="12">
|
||||
<t-form-item label="服务地区" name="fwfw">
|
||||
<t-select v-model="publishFormData.fwfw" :options="fwfwOptions" placeholder="请选择服务地区" clearable />
|
||||
</t-form-item>
|
||||
</t-col>
|
||||
</t-row>
|
||||
|
||||
<t-form-item label="需求详细描述" name="fwnr">
|
||||
<t-textarea v-model="publishFormData.fwnr" placeholder="请填写需求详细描述" :maxlength="100" />
|
||||
</t-form-item>
|
||||
|
||||
<t-form-item label="标签" name="bqjh">
|
||||
<t-select
|
||||
v-model="publishFormData.bqjh"
|
||||
:max="4"
|
||||
:options="bqOptions"
|
||||
placeholder="请选择标签"
|
||||
multiple
|
||||
clearable
|
||||
/>
|
||||
</t-form-item>
|
||||
|
||||
<t-row :gutter="16">
|
||||
<t-col :span="8">
|
||||
<t-form-item label="联系人" name="lxr">
|
||||
<t-input v-model="publishFormData.lxr" placeholder="请输入联系人" />
|
||||
</t-form-item>
|
||||
</t-col>
|
||||
<t-col :span="8">
|
||||
<t-form-item label="联系电话" name="lxdh">
|
||||
<t-input v-model="publishFormData.lxdh" placeholder="请输入联系电话" />
|
||||
</t-form-item>
|
||||
</t-col>
|
||||
<t-col :span="8">
|
||||
<t-form-item label="电子邮箱" name="email">
|
||||
<t-input v-model="publishFormData.email" placeholder="请输入电子邮箱" />
|
||||
</t-form-item>
|
||||
</t-col>
|
||||
</t-row>
|
||||
</t-form>
|
||||
|
||||
<div class="form-actions">
|
||||
<t-button theme="primary" type="button" @click="handlePublishSubmit">提交发布</t-button>
|
||||
</div>
|
||||
</div>
|
||||
</t-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -78,6 +182,37 @@ export default {
|
||||
return {
|
||||
formData: { ywlxDm: '02' },
|
||||
list: [],
|
||||
// 发布弹窗
|
||||
publishVisible: false,
|
||||
publishFormData: {
|
||||
bt1: '',
|
||||
fwlxjh: '',
|
||||
sshy: '',
|
||||
ysfwDm1: '',
|
||||
qwwcsj: '',
|
||||
fwfw: '',
|
||||
fwnr: '',
|
||||
bqjh: [],
|
||||
lxr: '',
|
||||
lxdh: '',
|
||||
email: '',
|
||||
},
|
||||
publishRules: {
|
||||
bt1: [{ required: true, message: '必填', type: 'error' }],
|
||||
fwlxjh: [{ required: true, message: '必填', type: 'error' }],
|
||||
sshy: [{ required: true, message: '必填', type: 'error' }],
|
||||
ysfwDm1: [{ required: true, message: '必填', type: 'error' }],
|
||||
qwwcsj: [{ required: true, message: '必填', type: 'error' }],
|
||||
fwfw: [{ required: true, message: '必填', type: 'error' }],
|
||||
fwnr: [{ required: true, message: '必填', type: 'error' }],
|
||||
lxr: [{ required: true, message: '必填', type: 'error' }],
|
||||
lxdh: [{ required: true, message: '必填', type: 'error' }],
|
||||
},
|
||||
xqlxOptions: [],
|
||||
sshyDmOptions: [],
|
||||
ysfwDm1Options: [],
|
||||
fwfwOptions: [],
|
||||
bqOptions: [],
|
||||
columns: [
|
||||
{ align: 'center', colKey: 'serial-number', width: '80px', title: '序号' },
|
||||
{ align: 'left', width: '120px', colKey: 'bt1', title: '标题', ellipsis: true },
|
||||
@ -147,13 +282,112 @@ export default {
|
||||
this.onQuery();
|
||||
}
|
||||
},
|
||||
// 加载代码表
|
||||
loadDmList() {
|
||||
this.xqlxoptionsSearch();
|
||||
this.sshyoptionsSearch();
|
||||
this.ysfwoptionsSearch();
|
||||
this.fwfwoptionsSearch();
|
||||
this.bqoptionsSearch();
|
||||
},
|
||||
async xqlxoptionsSearch() {
|
||||
try {
|
||||
const res = await api.dms2mc('xqlx', {});
|
||||
this.xqlxOptions = res.data || [];
|
||||
} catch (error) {
|
||||
this.xqlxOptions = [];
|
||||
}
|
||||
},
|
||||
async sshyoptionsSearch() {
|
||||
try {
|
||||
const res = await api.dms2mc('sshy', {});
|
||||
this.sshyDmOptions = res.data || [];
|
||||
} catch (error) {
|
||||
this.sshyDmOptions = [];
|
||||
}
|
||||
},
|
||||
async ysfwoptionsSearch() {
|
||||
try {
|
||||
const res = await api.dms2mc('ysfw', {});
|
||||
this.ysfwDm1Options = res.data || [];
|
||||
} catch (error) {
|
||||
this.ysfwDm1Options = [];
|
||||
}
|
||||
},
|
||||
async fwfwoptionsSearch() {
|
||||
try {
|
||||
const res = await api.dms2mc('xzqh', {});
|
||||
this.fwfwOptions = res.data || [];
|
||||
} catch (error) {
|
||||
this.fwfwOptions = [];
|
||||
}
|
||||
},
|
||||
async bqoptionsSearch() {
|
||||
try {
|
||||
const res = await api.dms2mc('bq', {});
|
||||
this.bqOptions = res.data || [];
|
||||
} catch (error) {
|
||||
this.bqOptions = [];
|
||||
}
|
||||
},
|
||||
// 打开发布弹窗
|
||||
handlePublish() {
|
||||
this.publishVisible = true;
|
||||
this.loadDmList();
|
||||
},
|
||||
handlePublishSubmit() {
|
||||
this.$refs.publishFormRef.validate().then((result) => {
|
||||
if (result === true) {
|
||||
this.submitGxfb();
|
||||
} else {
|
||||
this.$message.warning('请填写全部必填信息');
|
||||
}
|
||||
});
|
||||
},
|
||||
async submitGxfb() {
|
||||
try {
|
||||
let params = {
|
||||
ywlxDm: '02',
|
||||
...this.publishFormData,
|
||||
};
|
||||
if (params.bqjh && params.bqjh.length) {
|
||||
params.bqjh = params.bqjh.toString();
|
||||
}
|
||||
await api.gxfb(params);
|
||||
this.$message.success('发布成功,请等待审核');
|
||||
this.publishVisible = false;
|
||||
this.resetPublishForm();
|
||||
this.onQuery();
|
||||
} catch (error) {
|
||||
console.error('发布失败', error);
|
||||
}
|
||||
},
|
||||
resetPublishForm() {
|
||||
this.publishFormData = {
|
||||
bt1: '',
|
||||
fwlxjh: '',
|
||||
sshy: '',
|
||||
ysfwDm1: '',
|
||||
qwwcsj: '',
|
||||
fwfw: '',
|
||||
fwnr: '',
|
||||
bqjh: [],
|
||||
lxr: '',
|
||||
lxdh: '',
|
||||
email: '',
|
||||
};
|
||||
},
|
||||
onPublishClose() {
|
||||
this.publishVisible = false;
|
||||
this.resetPublishForm();
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style lang="less" scoped>
|
||||
.container-body {
|
||||
height: 100%;
|
||||
padding: 40px 40px 0;
|
||||
height: calc(100vh - 64px);
|
||||
padding: 24px;
|
||||
background: #ecf1f9;
|
||||
}
|
||||
/deep/ .t-table__header tr th{
|
||||
@ -168,4 +402,19 @@ export default {
|
||||
/deep/ .t-table__content{
|
||||
border: 1px solid #bdbdbd66;
|
||||
}
|
||||
.table-toolbar {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
.publish-form {
|
||||
padding: 0 8px;
|
||||
}
|
||||
.form-actions {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin-top: 30px;
|
||||
|
||||
.t-button {
|
||||
width: 200px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@ -38,7 +38,7 @@ export default {
|
||||
return {
|
||||
shortcuts: [
|
||||
{ label: '我的认证', icon: 'user', to: '/yhzx/qyrenzheng', bgColor: '#E6F8F0', color: '#344F3D' },
|
||||
{ label: '账号编辑', icon: 'edit', to: '/yhzx/qyrenzheng', bgColor: '#E6F8F0', color: '#344F3D' },
|
||||
// { label: '账号编辑', icon: 'edit', to: '/yhzx/qyrenzheng', bgColor: '#E6F8F0', color: '#344F3D' },
|
||||
{ label: '修改密码', icon: 'lock-on', to: '/yhzx/zhanghugl', bgColor: '#E6F8F0', color: '#344F3D' },
|
||||
],
|
||||
};
|
||||
@ -62,7 +62,8 @@ export default {
|
||||
.account-shortcuts {
|
||||
.shortcuts-row {
|
||||
display: flex;
|
||||
gap: 0;
|
||||
flex-wrap: wrap;
|
||||
gap: 8px;
|
||||
}
|
||||
}
|
||||
|
||||
@ -77,7 +78,7 @@ export default {
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
transition: background 0.2s ease;
|
||||
flex: 1;
|
||||
width: calc(33.33% - 6px);
|
||||
min-width: 0;
|
||||
|
||||
&:hover {
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="panel-card carbon-service-table">
|
||||
<div class="table-wrapper">
|
||||
<table class="data-table">
|
||||
<table class="data-table" v-if="tableData.length > 0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="col-title">标题</th>
|
||||
@ -13,27 +13,42 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="item in tableData" :key="item.id">
|
||||
<td class="col-title">{{ item.title }}</td>
|
||||
<td class="col-industry">{{ item.industry }}</td>
|
||||
<td class="col-scope">{{ item.scope }}</td>
|
||||
<td class="col-time">{{ item.createTime }}</td>
|
||||
<tr v-for="item in tableData" :key="item.gxUuid">
|
||||
<td class="col-title">{{ item.bt1 || item.bt }}</td>
|
||||
<td class="col-industry">{{ item.sshy }}</td>
|
||||
<td class="col-scope">{{ item.fwfw }}</td>
|
||||
<td class="col-time">{{ item.lrrq }}</td>
|
||||
<td class="col-status">
|
||||
<span class="status-dot" :class="item.status === 'online' ? 'status--online' : 'status--offline'"></span>
|
||||
{{ item.status === 'online' ? '已上线' : '未上线' }}
|
||||
<span class="status-dot" :class="item.sjzt === 'Y' ? 'status--online' : 'status--offline'"></span>
|
||||
{{ item.sjzt === 'Y' ? '已上线' : '未上线' }}
|
||||
</td>
|
||||
<td class="col-action">
|
||||
<a class="action-link" @click="handleView(item)">查看</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="more-row">
|
||||
<td colspan="6">
|
||||
<a class="more-link" @click="goToTfwgj">查看更多</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<template v-else>
|
||||
<div class="panel-header">
|
||||
<h3 class="header-title">我的碳服务</h3>
|
||||
</div>
|
||||
<div class="empty-state">
|
||||
<p class="empty-text">暂无服务</p>
|
||||
<t-button theme="primary" size="small" @click="goToTfwgj">去发布</t-button>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { ListIcon } from 'tdesign-icons-vue';
|
||||
import api from '@/pages/index/api/gxzx/index';
|
||||
|
||||
export default {
|
||||
name: 'CarbonServiceTable',
|
||||
@ -42,19 +57,32 @@ export default {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
tableData: [
|
||||
{ id: 1, title: '碳服务供给信息', industry: '制造业', scope: '全国', createTime: '2026-04-20', status: 'online' },
|
||||
{ id: 2, title: '碳服务供给信息', industry: '制造业', scope: '全国', createTime: '2026-04-18', status: 'online' },
|
||||
{ id: 3, title: '碳服务供给信息', industry: '制造业', scope: '全国', createTime: '2026-04-15', status: 'offline' },
|
||||
{ id: 4, title: '碳服务供给信息', industry: '制造业', scope: '全国', createTime: '2026-04-10', status: 'online' },
|
||||
{ id: 5, title: '碳服务供给信息', industry: '制造业', scope: '全国', createTime: '2026-04-08', status: 'offline' },
|
||||
],
|
||||
tableData: [],
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.fetchData();
|
||||
},
|
||||
methods: {
|
||||
async fetchData() {
|
||||
try {
|
||||
const params = {
|
||||
pageNumber: 1,
|
||||
pageSize: 5,
|
||||
};
|
||||
const res = await api.gxxxListByYh(params);
|
||||
this.tableData = res.data?.records || [];
|
||||
} catch (error) {
|
||||
console.error('获取服务列表失败', error);
|
||||
this.tableData = [];
|
||||
}
|
||||
},
|
||||
handleView(item) {
|
||||
console.log('查看详情', item);
|
||||
},
|
||||
goToTfwgj() {
|
||||
this.$router.push('/yhzx/tfwgj');
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@ -81,42 +109,24 @@ export default {
|
||||
|
||||
.panel-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 14px;
|
||||
padding: 18px 24px 16px;
|
||||
padding: 18px 20px;
|
||||
background: linear-gradient(180deg, #FAFFFE 0%, @bg-card 100%);
|
||||
border-bottom: 1px solid @border-light;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
|
||||
.header-icon {
|
||||
display: flex;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
font-size: 20px;
|
||||
color: #fff;
|
||||
background: linear-gradient(135deg, @green-primary 0%, @green-dark 100%);
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 4px 12px rgba(72, 198, 102, 0.3);
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.header-text {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.panel-title {
|
||||
.header-title {
|
||||
margin: 0;
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
line-height: 1.4;
|
||||
color: @text-dark;
|
||||
flex: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.table-wrapper {
|
||||
overflow-x: auto;
|
||||
max-height: 320px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.data-table {
|
||||
@ -135,6 +145,9 @@ export default {
|
||||
font-weight: 600;
|
||||
color: @text-muted;
|
||||
background: #FAFBFC;
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
td {
|
||||
@ -206,5 +219,52 @@ export default {
|
||||
color: @green-dark;
|
||||
}
|
||||
}
|
||||
|
||||
.more-row td {
|
||||
text-align: center;
|
||||
padding: 12px 16px;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.more-link {
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
color: @green-primary;
|
||||
cursor: pointer;
|
||||
transition: color 0.2s ease;
|
||||
|
||||
&:hover {
|
||||
color: @green-dark;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.empty-state {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 40px 16px;
|
||||
min-height: 200px;
|
||||
|
||||
|
||||
.empty-icon {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
margin-bottom: 16px;
|
||||
font-size: 24px;
|
||||
color: @text-light;
|
||||
background: #F5F7FA;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.empty-text {
|
||||
margin: 0 0 16px;
|
||||
font-size: 14px;
|
||||
color: @text-muted;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -157,23 +157,36 @@
|
||||
|
||||
<div class="news-tabs">
|
||||
<div class="news-tab" :class="{ 'news-tab-active': activeTab === index }" v-for="(tab, index) in newsTabs" :key="index" @click="activeTab = index">
|
||||
{{ tab }}
|
||||
{{ tab.name }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="news-list">
|
||||
<!-- 骨架屏 -->
|
||||
<div v-if="newsLoading" class="news-list">
|
||||
<div class="news-item news-skeleton" v-for="i in 3" :key="i">
|
||||
<div class="skeleton-pic"></div>
|
||||
<div class="news-content">
|
||||
<div class="skeleton-title"></div>
|
||||
<div class="skeleton-meta"></div>
|
||||
<div class="skeleton-desc"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 新闻列表 -->
|
||||
<div v-else class="news-list">
|
||||
<div class="news-item" v-for="(item, index) in currentNewsList" :key="index" @click="handleNewsClick(item)">
|
||||
<img v-if="item.src" :src="item.pic" alt="" class="news-pic" />
|
||||
<img :src="item.tp || getDefaultPic(newsTabs[activeTab].type)" alt="" class="news-pic" />
|
||||
<div class="news-content">
|
||||
<div class="news-content-top">
|
||||
<div class="news-title">{{ item.title }}</div>
|
||||
<div class="news-title">{{ item.bt }}</div>
|
||||
</div>
|
||||
<div class="news-content-middle">
|
||||
<img src="@/pages/index/assets/alarm.png" class="news-alarm-icon" />
|
||||
<span class="news-date">{{ item.date }}</span>
|
||||
<span v-if="item.remark" class="news-remark">{{ item.remark }}</span>
|
||||
<span class="news-date">{{ item.fbsj }}</span>
|
||||
<span v-if="item.lxr" class="news-remark">转载自 {{ item.lxr }}</span>
|
||||
</div>
|
||||
<div v-if="item.content" class="news-content-bottom">{{ item.content }}</div>
|
||||
<div v-if="item.nr" class="news-content-bottom">{{ item.nr }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -248,12 +261,19 @@
|
||||
|
||||
<script>
|
||||
import Footer from '@/pages/index/components/footer/index.vue';
|
||||
import hydtApi from '@/pages/index/api/hydt';
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
inputValue: '',
|
||||
activeTab: 0,
|
||||
topBannerHeight: 820,
|
||||
newsLoading: true,
|
||||
newsListByType: {
|
||||
gjzc: [], // 国家政策
|
||||
hyzx: [], // 行业资讯
|
||||
ptgg: [] // 平台公告
|
||||
},
|
||||
topBannerImages: [
|
||||
require('@/pages/index/assets/home-top-bg1.jpg'),
|
||||
// require('@/pages/index/assets/home-top-bg2.jpg'),
|
||||
@ -300,60 +320,11 @@ export default {
|
||||
{ name: 'CBAM', btnName: "CBAM\n试算", desc: "欧盟对进口高碳产品按隐含排放征收碳关税。", icon: require('@/pages/index/assets/home-cbam-icon.png') },
|
||||
{ name: '航运燃料', btnName: "申请服务", desc: "从化石油基向LNG、绿甲醇、绿氨等多元低碳方向加速转型。", icon: require('@/pages/index/assets/home-hyrl-icon.png') }
|
||||
],
|
||||
// 行业动态数据
|
||||
newsTabs: ['国家政策', '行业资讯', '平台公告'],
|
||||
newsData: [
|
||||
[
|
||||
{ title: '媒体报道 | “十五五”新图景:增绿降碳 加减之间再造万亿级新机遇', pic: require('@/pages/index/assets/news1.png'), date: '2026-03-31', remark: "转载自 中华人民共和国国家发展和改革委员会", content: "“十五五”规划纲要中提出,加快经济社会发展全面绿色转型。当前,一场增绿降碳的变革正在重塑我们的生产生活方式,持续激发绿色发展动能。粤西海域,离岸70公里外,水深超50米,一场绿色能源的接力正在加紧进行。一场绿色能源的接力正在加紧进行。一场绿色能源的接力正在加紧进行。总台央视记者 刘柏煊:全球最大输送容量海上风电项目,现在进入开春后的首个集中施工期,8艘风机安装船在同步作业,超过120米长的……", src: "https://www.ndrc.gov.cn/xwdt/spfg/mtjj/202603/t20260331_1404430.html" },
|
||||
{ title: '2026年循环经济发展和资源综合利用专项扶持项目开始申报', pic: require('@/pages/index/assets/news2.png'), date: '2026-02-02', remark: "转载自 上海市发展和改革委员会", content: "根据《上海市循环经济发展和资源综合利用专项扶持办法(2021版)》(沪发改规范〔2021〕13号,以下简称《扶持办法》)的要求,结合上海市“免申即享”相关工作要求,为做好2026年循环经济和资源综合利用项目申报工作,上海市发展改革委近日发布《上海市发展改革委关于组织申报2026年循环经济发展和资源综合利用专项扶持项目的通知》", src: "https://fgw.sh.gov.cn/fgw_zyjyhhjbh/20260202/dbb80b9041b740da958411f9b3ea7e95.html" },
|
||||
{ title: '商务部等9部门关于实施绿色消费推进行动的通知', pic: require('@/pages/index/assets/news3.png'), date: '2026-01-04', remark: "转载自 中华人民共和国中央人民政府", content: "各省、自治区、直辖市及计划单列市、新疆生产建设兵团商务、发展改革、工业和信息化、生态环境、住房城乡建设、农业农村、市场监管、金融监管部门,中国人民银行上海总部,各省、自治区、直辖市及计划单列市分行:为深入贯彻党的二十大和二十届历次全会精神,落实《中共中央 国务院关于加快经济社会发展全面绿色转型的意见》和中共中央办公厅、国务院办公厅印发的《提振消费专项行动方案》要求,加快发展方式和……", src: "https://www.gov.cn/zhengce/zhengceku/202601/content_7053876.htm" },
|
||||
],
|
||||
[
|
||||
{
|
||||
title: '全国首个红树林营造CCER项目完成登记 蓝碳生态价值实现路径获重要突破',
|
||||
pic: require('@/pages/index/assets/news4.png'),
|
||||
src: "https://www.cets.org.cn/xyyw/7348.jhtml",
|
||||
date: '2026-03-22',
|
||||
remark: "转载自 光明日报",
|
||||
content: "3月20日,全国首个红树林营造碳汇类国家温室气体自愿减排(CCER)项目“福建省霞浦县盐田乡和长春镇红树林植被修复项目”正式通过国家主管部门审核并完成登记注册。该项目由自然资源部第三海洋研究所作为项目业主申报实施,中国质量认证中心(CQC)负责审定。项目的成功完成,为海洋碳汇价值实现探索出可复制、可推广的实践路径,是我国海洋生态系统保护修复领域的重要里程碑……"
|
||||
},
|
||||
{
|
||||
title: '可再生能源电解水制氢等12项CCER方法学解读视频来了',
|
||||
pic: require('@/pages/index/assets/news5.png'),
|
||||
src: "https://www.cets.org.cn/xyyw/7347.jhtml",
|
||||
date: '2026-03-20',
|
||||
remark: "转载自 国家气候战略中心",
|
||||
content: "可再生能源电解水制氢等12项CCER方法学解读视频来了"
|
||||
},
|
||||
{
|
||||
title: '中碳登结算业务部获评2025年度全国巾帼文明岗',
|
||||
pic: require('@/pages/index/assets/news6.png'),
|
||||
src: "https://www.cets.org.cn/xyyw/7334.jhtml",
|
||||
date: '2026-03-06',
|
||||
remark: "转载自 中碳登",
|
||||
content: "3月2日,2025年度全国巾帼文明岗表彰名单正式揭晓,碳排放权登记结算(武汉)有限责任公司(以下简称“中碳登”)结算业务部成功获评。这份全国巾帼建功领域的重磅荣誉,是对中碳登“娘子军”专业实力、服务担当的高度认可,更是对中碳登深耕全国碳市场基础设施建设、助力国家“双碳”战略落地成效的充分肯定..."
|
||||
},
|
||||
],
|
||||
[
|
||||
{
|
||||
title: '关于碳信网接入全国温室气体排放因子数据库(第二版)的公告',
|
||||
remark: "非真实公告,仅展示",
|
||||
date: '2026-03-22',
|
||||
content: "为进一步提升平台碳数据核算的准确性、权威性,助力平台用户高效完成碳排放核算、碳信息报送工作,碳信网已于2026年4月18日完成与国家温室气体排放因子数据库(第二版)的全面对接。本次对接后,平台将同步更新576个全行业排放因子,新增291个细分领域因子,覆盖发电、钢铁、水泥、铝冶炼等重点控排行业,可直接为用户提供合规、精准的因子查询、自动匹配及核算辅助服务。请各用户及时登录平台更新个人/企业碳数据核算模板,确保数据符合最新监管要求,如有操作疑问可通过平台在线客服或咨询热线400-XXXX-8899反馈……"
|
||||
},
|
||||
{
|
||||
title: '2026年全国碳市场配额预分配相关信息提醒',
|
||||
remark: "非真实公告,仅展示",
|
||||
date: '2026-03-20',
|
||||
content: "根据生态环境部《关于做好2026年全国碳排放权交易市场有关工作的通知》(环办气候函〔2026〕32号)要求,2026年全国碳市场配额预分配工作已正式启动。为帮助平台控排企业顺利完成配额认领、核对工作,碳信网已开通配额预分配查询通道,平台注册企业可登录“碳交易-配额管理”板块,查询本企业预分配额度、行业基准值及相关政策说明。请钢铁、水泥、铝冶炼行业企业于4月30日前完成配额核对,发电行业企业于6月20日前完成核对,如有异议请在核对期限内提交书面说明,逾期将视为无异议,具体操作指南可在平台“政策中心”下载查阅"
|
||||
},
|
||||
{
|
||||
title: '碳信网碳信息披露服务升级及上线通知',
|
||||
date: '2026-03-06',
|
||||
remark: "非真实公告,仅展示",
|
||||
content: "为响应欧盟CBAM(碳边境调节机制)全面实施及国内上市公司ESG报告强制披露要求,碳信网对碳信息披露服务进行全面升级,新增碳足迹核算、ESG碳信息填报、报告生成及合规校验四大功能模块。本次升级后,平台可支持企业快速完成全流程碳信息披露,自动生成符合国内外标准的披露报告,助力企业对接国际市场、满足监管要求。升级功能于2026年4月12日正式上线,所有注册用户可免费体验基础版服务,企业用户可申请升级专业版,享受一对一咨询、定制化报告及合规审核服务,详情可登录平台“碳信息-披露服务”板块了解..."
|
||||
},
|
||||
],
|
||||
// 行业动态tabs配置
|
||||
newsTabs: [
|
||||
{ name: '国家政策', type: 'gjzc' },
|
||||
{ name: '行业资讯', type: 'hyzx' },
|
||||
{ name: '平台公告', type: 'ptgg' }
|
||||
],
|
||||
// 合作伙伴数据
|
||||
partnerCount: '200+',
|
||||
@ -400,6 +371,7 @@ export default {
|
||||
mounted() {
|
||||
this.syncBannerHeight();
|
||||
window.addEventListener('resize', this.syncBannerHeight);
|
||||
this.fetchNewsData();
|
||||
},
|
||||
beforeDestroy() {
|
||||
window.removeEventListener('resize', this.syncBannerHeight);
|
||||
@ -469,20 +441,52 @@ export default {
|
||||
},
|
||||
// 行业动态点击
|
||||
handleNewsClick(item) {
|
||||
if (item.src) {
|
||||
window.open(item.src, '_blank');
|
||||
if (item.yyLj) {
|
||||
window.open(item.yyLj, '_blank');
|
||||
} else {
|
||||
console.log('点击新闻:', item.title);
|
||||
this.$message.info(item.title);
|
||||
console.log('点击新闻:', item.bt);
|
||||
this.$message.info(item.bt);
|
||||
}
|
||||
},
|
||||
handleNewsMore() {
|
||||
this.$message.info('暂无更多动态');
|
||||
},
|
||||
async fetchNewsData() {
|
||||
this.newsLoading = 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);
|
||||
} finally {
|
||||
this.newsLoading = false;
|
||||
}
|
||||
},
|
||||
getDefaultPic(type) {
|
||||
const defaultPics = {
|
||||
gjzc: '/static_res/images/news/default-news.png',
|
||||
hyzx: '/static_res/images/news/default-hydt.png',
|
||||
ptgg: '/static_res/images/news/default-ptgg.png'
|
||||
};
|
||||
return defaultPics[type] || '/static_res/images/news/default-news.png';
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
currentNewsList() {
|
||||
return this.newsData[this.activeTab] || [];
|
||||
const type = this.newsTabs[this.activeTab]?.type;
|
||||
const list = this.newsListByType[type] || [];
|
||||
return list.slice(0, 3); // 默认显示3条
|
||||
},
|
||||
partnerRow1() {
|
||||
const row = this.partnerList.slice(0, 4);
|
||||
@ -1502,6 +1506,57 @@ export default {
|
||||
-webkit-box-orient: vertical;
|
||||
}
|
||||
|
||||
/* 骨架屏样式 */
|
||||
.news-skeleton {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.skeleton-pic {
|
||||
width: 200px;
|
||||
height: 150px;
|
||||
border-radius: 8px;
|
||||
flex-shrink: 0;
|
||||
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
|
||||
background-size: 200% 100%;
|
||||
animation: skeleton-loading 1.5s infinite;
|
||||
}
|
||||
|
||||
.skeleton-title {
|
||||
width: 80%;
|
||||
height: 20px;
|
||||
border-radius: 4px;
|
||||
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
|
||||
background-size: 200% 100%;
|
||||
animation: skeleton-loading 1.5s infinite;
|
||||
}
|
||||
|
||||
.skeleton-meta {
|
||||
width: 50%;
|
||||
height: 14px;
|
||||
border-radius: 4px;
|
||||
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
|
||||
background-size: 200% 100%;
|
||||
animation: skeleton-loading 1.5s infinite;
|
||||
}
|
||||
|
||||
.skeleton-desc {
|
||||
width: 95%;
|
||||
height: 40px;
|
||||
border-radius: 4px;
|
||||
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
|
||||
background-size: 200% 100%;
|
||||
animation: skeleton-loading 1.5s infinite;
|
||||
}
|
||||
|
||||
@keyframes skeleton-loading {
|
||||
0% {
|
||||
background-position: 200% 0;
|
||||
}
|
||||
100% {
|
||||
background-position: -200% 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* ==================== 企业出海模块 ==================== */
|
||||
.overseas-section {
|
||||
position: relative;
|
||||
|
||||
@ -1,54 +1,56 @@
|
||||
<template>
|
||||
<div class="change-password-page">
|
||||
<div class="page-header">
|
||||
<div class="page-title">修改密码</div>
|
||||
</div>
|
||||
<div class="page-content">
|
||||
<t-form
|
||||
ref="formRef"
|
||||
:data="formData"
|
||||
:rules="rules"
|
||||
labelWidth="120"
|
||||
@submit="onSubmit"
|
||||
class="password-form"
|
||||
>
|
||||
<t-form-item label="旧密码" name="oldPassword">
|
||||
<t-input
|
||||
v-model="formData.oldPassword"
|
||||
type="password"
|
||||
placeholder="请输入旧密码"
|
||||
clearable
|
||||
showPassword
|
||||
/>
|
||||
</t-form-item>
|
||||
<section class="left-panel">
|
||||
<div class="page-header">
|
||||
<div class="page-title">修改密码</div>
|
||||
</div>
|
||||
<div class="page-content">
|
||||
<t-form
|
||||
ref="formRef"
|
||||
:data="formData"
|
||||
:rules="rules"
|
||||
labelWidth="120"
|
||||
@submit="onSubmit"
|
||||
class="password-form"
|
||||
>
|
||||
<t-form-item label="旧密码" name="oldPassword">
|
||||
<t-input
|
||||
v-model="formData.oldPassword"
|
||||
type="password"
|
||||
placeholder="请输入旧密码"
|
||||
clearable
|
||||
showPassword
|
||||
/>
|
||||
</t-form-item>
|
||||
|
||||
<t-form-item label="新密码" name="newPassword">
|
||||
<t-input
|
||||
v-model="formData.newPassword"
|
||||
type="password"
|
||||
placeholder="请输入新密码"
|
||||
clearable
|
||||
showPassword
|
||||
/>
|
||||
<div class="password-tip">密码长度6-20位,需包含字母和数字</div>
|
||||
</t-form-item>
|
||||
<t-form-item label="新密码" name="newPassword">
|
||||
<t-input
|
||||
v-model="formData.newPassword"
|
||||
type="password"
|
||||
placeholder="请输入新密码"
|
||||
clearable
|
||||
showPassword
|
||||
/>
|
||||
<div class="password-tip">密码长度6-20位,需包含字母和数字</div>
|
||||
</t-form-item>
|
||||
|
||||
<t-form-item label="确认密码" name="confirmPassword">
|
||||
<t-input
|
||||
v-model="formData.confirmPassword"
|
||||
type="password"
|
||||
placeholder="请再次输入新密码"
|
||||
clearable
|
||||
showPassword
|
||||
/>
|
||||
</t-form-item>
|
||||
<t-form-item label="确认密码" name="confirmPassword">
|
||||
<t-input
|
||||
v-model="formData.confirmPassword"
|
||||
type="password"
|
||||
placeholder="请再次输入新密码"
|
||||
clearable
|
||||
showPassword
|
||||
/>
|
||||
</t-form-item>
|
||||
|
||||
<t-form-item class="submit-item">
|
||||
<t-button theme="primary" type="submit" :loading="submitLoading">确认修改</t-button>
|
||||
<t-button theme="default" variant="outline" @click="onReset" style="margin-left: 12px">重置</t-button>
|
||||
</t-form-item>
|
||||
</t-form>
|
||||
</div>
|
||||
<t-form-item class="submit-item">
|
||||
<t-button theme="primary" type="submit" :loading="submitLoading">确认修改</t-button>
|
||||
<t-button theme="default" variant="outline" @click="onReset" style="margin-left: 12px">重置</t-button>
|
||||
</t-form-item>
|
||||
</t-form>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -156,9 +158,17 @@ export default {
|
||||
|
||||
<style lang="less" scoped>
|
||||
.change-password-page {
|
||||
min-height: calc(100vh - 60px);
|
||||
padding: 24px;
|
||||
background: #fff;
|
||||
min-height: 100%;
|
||||
background: #F5F7FA;
|
||||
}
|
||||
|
||||
.left-panel {
|
||||
padding: 20px;
|
||||
background: #FFFFFF;
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.04);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.page-header {
|
||||
|
||||
49
txw-mhzc/sql/txw_mhzc_hydtb.sql
Normal file
@ -0,0 +1,49 @@
|
||||
-- 行业动态表(国家政策、行业资讯)
|
||||
CREATE TABLE `txw_mhzc_hydtb` (
|
||||
`uuid` VARCHAR(50) NOT NULL COMMENT 'UUID',
|
||||
`bt` VARCHAR(500) NOT NULL COMMENT '标题',
|
||||
`tp` VARCHAR(500) DEFAULT NULL COMMENT '图片',
|
||||
`nr` TEXT COMMENT '内容',
|
||||
`wx_nr` TEXT COMMENT '详细内容(富文本)',
|
||||
`fbsj` DATETIME DEFAULT NULL COMMENT '发布时间',
|
||||
`lx` VARCHAR(10) NOT NULL COMMENT '类型(gjzc=国家政策、hyzx=行业资讯)',
|
||||
`lx_mc` VARCHAR(50) DEFAULT NULL COMMENT '类型名称',
|
||||
`lxr` VARCHAR(100) DEFAULT NULL COMMENT '来源',
|
||||
`yy_lj` VARCHAR(500) DEFAULT NULL COMMENT '原文链接',
|
||||
`zt` CHAR(1) DEFAULT '1' COMMENT '状态(1=正常,0=禁用)',
|
||||
`llcs` INT DEFAULT 0 COMMENT '浏览次数',
|
||||
`lrrq` DATETIME DEFAULT NULL COMMENT '录入日期',
|
||||
`lrruuid` VARCHAR(50) DEFAULT NULL COMMENT '录入人UUID',
|
||||
`xgrq` DATETIME DEFAULT NULL COMMENT '修改日期',
|
||||
`xgruuid` VARCHAR(50) DEFAULT NULL COMMENT '修改人UUID',
|
||||
PRIMARY KEY (`uuid`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='行业动态表';
|
||||
|
||||
-- 插入示例数据(图片路径为public下的相对路径)
|
||||
INSERT INTO `txw_mhzc_hydtb` (`uuid`, `bt`, `tp`, `nr`, `fbsj`, `lx`, `lx_mc`, `lxr`, `yy_lj`) VALUES
|
||||
('hydt_001', '媒体报道 | "十五五"新图景:增绿降碳 加减之间再造万亿级新机遇', '/static_res/images/news/news1.png', '"十五五"规划纲要中提出,加快经济社会发展全面绿色转型...', '2026-03-31 00:00:00', 'gjzc', '国家政策', '中华人民共和国国家发展和改革委员会', 'https://www.ndrc.gov.cn/xwdt/spfg/mtjj/202603/t20260331_1404430.html'),
|
||||
('hydt_002', '2026年循环经济发展和资源综合利用专项扶持项目开始申报', '/static_res/images/news/news2.png', '根据《上海市循环经济发展和资源综合利用专项扶持办法(2021版)》...', '2026-02-02 00:00:00', 'gjzc', '国家政策', '上海市发展和改革委员会', 'https://fgw.sh.gov.cn/fgw_zyjyhhjbh/20260202/dbb80b9041b740da958411f9b3ea7e95.html'),
|
||||
('hydt_003', '商务部等9部门关于实施绿色消费推进行动的通知', '/static_res/images/news/news3.png', '各省、自治区、直辖市及计划单列市、新疆生产建设兵团商务、发展改革、工业和信息化、生态环境、住房城乡建设、农业农村、市场监管、金融监管部门...', '2026-01-04 00:00:00', 'gjzc', '国家政策', '中华人民共和国中央人民政府', 'https://www.gov.cn/zhengce/zhengceku/202601/content_7053876.htm'),
|
||||
('hydt_004', '全国首个红树林营造CCER项目完成登记 蓝碳生态价值实现路径获重要突破', '/static_res/images/news/news4.png', '3月20日,全国首个红树林营造碳汇类国家温室气体自愿减排(CCER)项目...', '2026-03-22 00:00:00', 'hyzx', '行业资讯', '光明日报', 'https://www.cets.org.cn/xyyw/7348.jhtml'),
|
||||
('hydt_005', '可再生能源电解水制氢等12项CCER方法学解读视频来了', '/static_res/images/news/news5.png', '可再生能源电解水制氢等12项CCER方法学解读视频来了', '2026-03-20 00:00:00', 'hyzx', '行业资讯', '国家气候战略中心', 'https://www.cets.org.cn/xyyw/7347.jhtml'),
|
||||
('hydt_006', '中碳登结算业务部获评2025年度全国巾帼文明岗', '/static_res/images/news/news6.png', '3月2日,2025年度全国巾帼文明岗表彰名单正式揭晓...', '2026-03-06 00:00:00', 'hyzx', '行业资讯', '中碳登', 'https://www.cets.org.cn/xyyw/7334.jhtml');
|
||||
|
||||
-- 平台公告表
|
||||
CREATE TABLE `txw_mhzc_ptgg` (
|
||||
`uuid` VARCHAR(50) NOT NULL COMMENT 'UUID',
|
||||
`bt` VARCHAR(500) NOT NULL COMMENT '标题',
|
||||
`nr` TEXT COMMENT '内容',
|
||||
`fbsj` DATETIME DEFAULT NULL COMMENT '发布时间',
|
||||
`zt` CHAR(1) DEFAULT '1' COMMENT '状态(1=正常,0=禁用)',
|
||||
`lrrq` DATETIME DEFAULT NULL COMMENT '录入日期',
|
||||
`lrruuid` VARCHAR(50) DEFAULT NULL COMMENT '录入人UUID',
|
||||
`xgrq` DATETIME DEFAULT NULL COMMENT '修改日期',
|
||||
`xgruuid` VARCHAR(50) DEFAULT NULL COMMENT '修改人UUID',
|
||||
PRIMARY KEY (`uuid`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台公告表';
|
||||
|
||||
-- 插入平台公告示例数据
|
||||
INSERT INTO `txw_mhzc_ptgg` (`uuid`, `bt`, `nr`, `fbsj`) VALUES
|
||||
('ptgg_001', '关于碳信网接入全国温室气体排放因子数据库(第二版)的公告', '为进一步提升平台碳数据核算的准确性、权威性,助力平台用户高效完成碳排放核算、碳信息报送工作,碳信网已于2026年4月18日完成与国家温室气体排放因子数据库(第二版)的全面对接...', '2026-03-22 00:00:00'),
|
||||
('ptgg_002', '2026年全国碳市场配额预分配相关信息提醒', '根据生态环境部《关于做好2026年全国碳排放权交易市场有关工作的通知》要求,2026年全国碳市场配额预分配工作已正式启动...', '2026-03-20 00:00:00'),
|
||||
('ptgg_003', '碳信网碳信息披露服务升级及上线通知', '为响应欧盟CBAM(碳边境调节机制)全面实施及国内上市公司ESG报告强制披露要求,碳信网对碳信息披露服务进行全面升级...', '2026-03-06 00:00:00');
|
||||
1048576
txw-mhzc/sql/碳信网网站资料素材清单20260323.csv
Normal file
@ -0,0 +1,45 @@
|
||||
package com.css.txw.mhzc.controller;
|
||||
|
||||
import com.css.ggzc.framework.common.pojo.CommonResult;
|
||||
import com.css.txw.mhzc.pojo.vo.HydtbVO;
|
||||
import com.css.txw.mhzc.service.TxwMhzcHydtbService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Tag(name = "行业动态接口")
|
||||
@RestController
|
||||
@RequestMapping("/sy/hydt")
|
||||
@Validated
|
||||
@Slf4j
|
||||
public class HydtController {
|
||||
|
||||
@Resource
|
||||
private TxwMhzcHydtbService hydtbService;
|
||||
|
||||
@GetMapping("/list")
|
||||
@Operation(summary = "查询行业动态列表", description = "按类型查询行业动态,不传类型则查询全部")
|
||||
public CommonResult<List<HydtbVO>> getList(@RequestParam(required = false) String lx) {
|
||||
List<HydtbVO> list;
|
||||
if (lx == null || lx.isEmpty()) {
|
||||
list = hydtbService.getAll();
|
||||
} else {
|
||||
list = hydtbService.getByLx(lx);
|
||||
}
|
||||
return CommonResult.success(list);
|
||||
}
|
||||
|
||||
@GetMapping("/groupedList")
|
||||
@Operation(summary = "查询行业动态列表(按类型分组)", description = "返回按类型分组的行业动态")
|
||||
public CommonResult<Map<String, List<HydtbVO>>> getGroupedList() {
|
||||
Map<String, List<HydtbVO>> map = hydtbService.getGroupedByLx();
|
||||
return CommonResult.success(map);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,32 @@
|
||||
package com.css.txw.mhzc.controller;
|
||||
|
||||
import com.css.ggzc.framework.common.pojo.CommonResult;
|
||||
import com.css.txw.mhzc.pojo.vo.PtggVO;
|
||||
import com.css.txw.mhzc.service.TxwMhzcPtggService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
@Tag(name = "平台公告接口")
|
||||
@RestController
|
||||
@RequestMapping("/sy/ptgg")
|
||||
@Validated
|
||||
@Slf4j
|
||||
public class PtggController {
|
||||
|
||||
@Resource
|
||||
private TxwMhzcPtggService ptggService;
|
||||
|
||||
@GetMapping("/list")
|
||||
@Operation(summary = "查询平台公告列表", description = "查询所有平台公告,按发布时间倒序")
|
||||
public CommonResult<List<PtggVO>> getList() {
|
||||
List<PtggVO> list = ptggService.getAll();
|
||||
return CommonResult.success(list);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,40 @@
|
||||
package com.css.txw.mhzc.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.css.txw.mhzc.pojo.domain.TxwMhzcHydtbDO;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Claude
|
||||
* @description 针对表【txw_mhzc_hydtb(行业动态表)】的数据库操作Mapper
|
||||
* @createDate 2026-04-30
|
||||
* @Entity com.css.txw.mhzc.pojo.domain.TxwMhzcHydtbDO
|
||||
*/
|
||||
public interface TxwMhzcHydtbMapper extends BaseMapper<TxwMhzcHydtbDO> {
|
||||
|
||||
/**
|
||||
* 根据类型查询行业动态,按发布时间倒序
|
||||
*/
|
||||
default List<TxwMhzcHydtbDO> getByLx(@Param("lx") String lx) {
|
||||
QueryWrapper<TxwMhzcHydtbDO> wrapper = new QueryWrapper<>();
|
||||
wrapper.lambda().eq(TxwMhzcHydtbDO::getZt, "1");
|
||||
if (lx != null && !lx.isEmpty()) {
|
||||
wrapper.lambda().eq(TxwMhzcHydtbDO::getLx, lx);
|
||||
}
|
||||
wrapper.lambda().orderByDesc(TxwMhzcHydtbDO::getFbsj);
|
||||
return selectList(wrapper);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询所有行业动态,按发布时间倒序
|
||||
*/
|
||||
default List<TxwMhzcHydtbDO> getAllOrderByFbsj() {
|
||||
QueryWrapper<TxwMhzcHydtbDO> wrapper = new QueryWrapper<>();
|
||||
wrapper.lambda().eq(TxwMhzcHydtbDO::getZt, "1");
|
||||
wrapper.lambda().orderByDesc(TxwMhzcHydtbDO::getFbsj);
|
||||
return selectList(wrapper);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,27 @@
|
||||
package com.css.txw.mhzc.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.css.txw.mhzc.pojo.domain.TxwMhzcPtggDO;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Claude
|
||||
* @description 针对表【txw_mhzc_ptgg(平台公告表)】的数据库操作Mapper
|
||||
* @createDate 2026-04-30
|
||||
* @Entity com.css.txw.mhzc.pojo.domain.TxwMhzcPtggDO
|
||||
*/
|
||||
public interface TxwMhzcPtggMapper extends BaseMapper<TxwMhzcPtggDO> {
|
||||
|
||||
/**
|
||||
* 查询所有平台公告,按发布时间倒序
|
||||
*/
|
||||
default List<TxwMhzcPtggDO> getAllOrderByFbsj() {
|
||||
QueryWrapper<TxwMhzcPtggDO> wrapper = new QueryWrapper<>();
|
||||
wrapper.lambda().eq(TxwMhzcPtggDO::getZt, "1");
|
||||
wrapper.lambda().orderByDesc(TxwMhzcPtggDO::getFbsj);
|
||||
return selectList(wrapper);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,116 @@
|
||||
package com.css.txw.mhzc.pojo.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import java.io.Serializable;
|
||||
import java.time.LocalDateTime;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 行业动态表
|
||||
* @TableName txw_mhzc_hydtb
|
||||
*/
|
||||
@TableName(value ="txw_mhzc_hydtb")
|
||||
@Data
|
||||
public class TxwMhzcHydtbDO implements Serializable {
|
||||
/**
|
||||
* UUID||uuid
|
||||
*/
|
||||
@TableId(value = "uuid")
|
||||
private String uuid;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
@TableField(value = "bt")
|
||||
private String bt;
|
||||
|
||||
/**
|
||||
* 图片
|
||||
*/
|
||||
@TableField(value = "tp")
|
||||
private String tp;
|
||||
|
||||
/**
|
||||
* 内容
|
||||
*/
|
||||
@TableField(value = "nr")
|
||||
private String nr;
|
||||
|
||||
/**
|
||||
* 详细内容(富文本)
|
||||
*/
|
||||
@TableField(value = "wx_nr")
|
||||
private String wxNr;
|
||||
|
||||
/**
|
||||
* 发布时间
|
||||
*/
|
||||
@TableField(value = "fbsj")
|
||||
private LocalDateTime fbsj;
|
||||
|
||||
/**
|
||||
* 类型(gjzc=国家政策、hyzx=行业资讯、ptgg=平台公告)
|
||||
*/
|
||||
@TableField(value = "lx")
|
||||
private String lx;
|
||||
|
||||
/**
|
||||
* 类型名称
|
||||
*/
|
||||
@TableField(value = "lx_mc")
|
||||
private String lxMc;
|
||||
|
||||
/**
|
||||
* 来源
|
||||
*/
|
||||
@TableField(value = "lxr")
|
||||
private String lxr;
|
||||
|
||||
/**
|
||||
* 原文链接
|
||||
*/
|
||||
@TableField(value = "yy_lj")
|
||||
private String yyLj;
|
||||
|
||||
/**
|
||||
* 状态(1=正常,0=禁用)
|
||||
*/
|
||||
@TableField(value = "zt")
|
||||
private String zt;
|
||||
|
||||
/**
|
||||
* 浏览次数
|
||||
*/
|
||||
@TableField(value = "llcs")
|
||||
private Integer llcs;
|
||||
|
||||
/**
|
||||
* 录入日期
|
||||
*/
|
||||
@TableField(value = "lrrq")
|
||||
private LocalDateTime lrrq;
|
||||
|
||||
/**
|
||||
* 录入人UUID
|
||||
*/
|
||||
@TableField(value = "lrruuid")
|
||||
private String lrruuid;
|
||||
|
||||
/**
|
||||
* 修改日期
|
||||
*/
|
||||
@TableField(value = "xgrq")
|
||||
private LocalDateTime xgrq;
|
||||
|
||||
/**
|
||||
* 修改人UUID
|
||||
*/
|
||||
@TableField(value = "xgruuid")
|
||||
private String xgruuid;
|
||||
|
||||
@TableField(exist = false)
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
||||
@ -0,0 +1,74 @@
|
||||
package com.css.txw.mhzc.pojo.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import java.io.Serializable;
|
||||
import java.time.LocalDateTime;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 平台公告表
|
||||
* @TableName txw_mhzc_ptgg
|
||||
*/
|
||||
@TableName(value ="txw_mhzc_ptgg")
|
||||
@Data
|
||||
public class TxwMhzcPtggDO implements Serializable {
|
||||
/**
|
||||
* UUID||uuid
|
||||
*/
|
||||
@TableId(value = "uuid")
|
||||
private String uuid;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
@TableField(value = "bt")
|
||||
private String bt;
|
||||
|
||||
/**
|
||||
* 内容
|
||||
*/
|
||||
@TableField(value = "nr")
|
||||
private String nr;
|
||||
|
||||
/**
|
||||
* 发布时间
|
||||
*/
|
||||
@TableField(value = "fbsj")
|
||||
private LocalDateTime fbsj;
|
||||
|
||||
/**
|
||||
* 状态(1=正常,0=禁用)
|
||||
*/
|
||||
@TableField(value = "zt")
|
||||
private String zt;
|
||||
|
||||
/**
|
||||
* 录入日期
|
||||
*/
|
||||
@TableField(value = "lrrq")
|
||||
private LocalDateTime lrrq;
|
||||
|
||||
/**
|
||||
* 录入人UUID
|
||||
*/
|
||||
@TableField(value = "lrruuid")
|
||||
private String lrruuid;
|
||||
|
||||
/**
|
||||
* 修改日期
|
||||
*/
|
||||
@TableField(value = "xgrq")
|
||||
private LocalDateTime xgrq;
|
||||
|
||||
/**
|
||||
* 修改人UUID
|
||||
*/
|
||||
@TableField(value = "xgruuid")
|
||||
private String xgruuid;
|
||||
|
||||
@TableField(exist = false)
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
||||
@ -0,0 +1,57 @@
|
||||
package com.css.txw.mhzc.pojo.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
public class HydtbVO implements Serializable {
|
||||
|
||||
private String uuid;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
private String bt;
|
||||
|
||||
/**
|
||||
* 图片
|
||||
*/
|
||||
private String tp;
|
||||
|
||||
/**
|
||||
* 内容
|
||||
*/
|
||||
private String nr;
|
||||
|
||||
/**
|
||||
* 详细内容(富文本)
|
||||
*/
|
||||
private String wxNr;
|
||||
|
||||
/**
|
||||
* 发布时间
|
||||
*/
|
||||
private String fbsj;
|
||||
|
||||
/**
|
||||
* 类型
|
||||
*/
|
||||
private String lx;
|
||||
|
||||
/**
|
||||
* 类型名称
|
||||
*/
|
||||
private String lxMc;
|
||||
|
||||
/**
|
||||
* 来源
|
||||
*/
|
||||
private String lxr;
|
||||
|
||||
/**
|
||||
* 原文链接
|
||||
*/
|
||||
private String yyLj;
|
||||
|
||||
}
|
||||
@ -0,0 +1,27 @@
|
||||
package com.css.txw.mhzc.pojo.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
public class PtggVO implements Serializable {
|
||||
|
||||
private String uuid;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
private String bt;
|
||||
|
||||
/**
|
||||
* 内容
|
||||
*/
|
||||
private String nr;
|
||||
|
||||
/**
|
||||
* 发布时间
|
||||
*/
|
||||
private String fbsj;
|
||||
|
||||
}
|
||||
@ -0,0 +1,33 @@
|
||||
package com.css.txw.mhzc.service;
|
||||
|
||||
import com.css.txw.mhzc.pojo.domain.TxwMhzcHydtbDO;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.css.txw.mhzc.pojo.vo.HydtbVO;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author Claude
|
||||
* @description 针对表【txw_mhzc_hydtb(行业动态表)】的数据库操作Service
|
||||
* @createDate 2026-04-30
|
||||
*/
|
||||
public interface TxwMhzcHydtbService extends IService<TxwMhzcHydtbDO> {
|
||||
|
||||
/**
|
||||
* 按类型查询行业动态列表
|
||||
* @param lx 类型(gjzc=国家政策、hyzx=行业资讯、ptgg=平台公告)
|
||||
*/
|
||||
List<HydtbVO> getByLx(String lx);
|
||||
|
||||
/**
|
||||
* 获取所有行业动态(按发布时期倒序)
|
||||
*/
|
||||
List<HydtbVO> getAll();
|
||||
|
||||
/**
|
||||
* 获取所有行业动态,按类型分组
|
||||
*/
|
||||
Map<String, List<HydtbVO>> getGroupedByLx();
|
||||
|
||||
}
|
||||
@ -0,0 +1,21 @@
|
||||
package com.css.txw.mhzc.service;
|
||||
|
||||
import com.css.txw.mhzc.pojo.domain.TxwMhzcPtggDO;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.css.txw.mhzc.pojo.vo.PtggVO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Claude
|
||||
* @description 针对表【txw_mhzc_ptgg(平台公告表)】的数据库操作Service
|
||||
* @createDate 2026-04-30
|
||||
*/
|
||||
public interface TxwMhzcPtggService extends IService<TxwMhzcPtggDO> {
|
||||
|
||||
/**
|
||||
* 获取所有平台公告(按发布时间倒序)
|
||||
*/
|
||||
List<PtggVO> getAll();
|
||||
|
||||
}
|
||||
@ -0,0 +1,49 @@
|
||||
package com.css.txw.mhzc.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.css.ggzc.framework.common.util.gy.GyUtils;
|
||||
import com.css.ggzc.framework.common.util.object.BeanUtils;
|
||||
import com.css.txw.mhzc.pojo.domain.TxwMhzcHydtbDO;
|
||||
import com.css.txw.mhzc.pojo.vo.HydtbVO;
|
||||
import com.css.txw.mhzc.mapper.TxwMhzcHydtbMapper;
|
||||
import com.css.txw.mhzc.service.TxwMhzcHydtbService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author Claude
|
||||
* @description 针对表【txw_mhzc_hydtb(行业动态表)】的数据库操作Service实现
|
||||
* @createDate 2026-04-30
|
||||
*/
|
||||
@Service
|
||||
public class TxwMhzcHydtbServiceImpl extends ServiceImpl<TxwMhzcHydtbMapper, TxwMhzcHydtbDO>
|
||||
implements TxwMhzcHydtbService {
|
||||
|
||||
@Resource
|
||||
private TxwMhzcHydtbMapper hydtbMapper;
|
||||
|
||||
@Override
|
||||
public List<HydtbVO> getByLx(String lx) {
|
||||
List<TxwMhzcHydtbDO> list = hydtbMapper.getByLx(lx);
|
||||
if (GyUtils.isNull(list)) return null;
|
||||
return BeanUtils.toBean(list, HydtbVO.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<HydtbVO> getAll() {
|
||||
List<TxwMhzcHydtbDO> list = hydtbMapper.getAllOrderByFbsj();
|
||||
if (GyUtils.isNull(list)) return null;
|
||||
return BeanUtils.toBean(list, HydtbVO.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, List<HydtbVO>> getGroupedByLx() {
|
||||
List<HydtbVO> all = getAll();
|
||||
if (GyUtils.isNull(all)) return null;
|
||||
return all.stream().collect(Collectors.groupingBy(HydtbVO::getLx));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,33 @@
|
||||
package com.css.txw.mhzc.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.css.ggzc.framework.common.util.gy.GyUtils;
|
||||
import com.css.ggzc.framework.common.util.object.BeanUtils;
|
||||
import com.css.txw.mhzc.pojo.domain.TxwMhzcPtggDO;
|
||||
import com.css.txw.mhzc.pojo.vo.PtggVO;
|
||||
import com.css.txw.mhzc.mapper.TxwMhzcPtggMapper;
|
||||
import com.css.txw.mhzc.service.TxwMhzcPtggService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Claude
|
||||
* @description 针对表【txw_mhzc_ptgg(平台公告表)】的数据库操作Service实现
|
||||
* @createDate 2026-04-30
|
||||
*/
|
||||
@Service
|
||||
public class TxwMhzcPtggServiceImpl extends ServiceImpl<TxwMhzcPtggMapper, TxwMhzcPtggDO>
|
||||
implements TxwMhzcPtggService {
|
||||
|
||||
@Resource
|
||||
private TxwMhzcPtggMapper ptggMapper;
|
||||
|
||||
@Override
|
||||
public List<PtggVO> getAll() {
|
||||
List<TxwMhzcPtggDO> list = ptggMapper.getAllOrderByFbsj();
|
||||
if (GyUtils.isNull(list)) return null;
|
||||
return BeanUtils.toBean(list, PtggVO.class);
|
||||
}
|
||||
}
|
||||