提交 a09097bb authored 作者: CRS's avatar CRS

new

......@@ -50,7 +50,7 @@
</el-table>
</div>
<!-- 分页 -->
<div class="block" v-if="this.totleLength >= 10">
<div class="block">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
......
<template>
<div class="newCompany">
<p class="dialog-header">
<span>新建产品</span>
</p>
<div class="company-content" style="text-align: center; margin-top: 4px;">
<p class="new">
<span class="addVal">
<span>产品名称:</span>
<el-input v-model="name" size="medium" placeholder="请输入"></el-input>
</span>
<span class="addVal" style="width: 450px;">
<span>产品分类:</span>
<el-radio-group v-model="type" size="small" style="padding-top: 11px;width: 100%;text-align: left">
<el-radio label="1">软件 </el-radio>
<el-radio label="2">硬件</el-radio>
</el-radio-group>
</span>
<span class="addVal" style="margin-top: 4px">
<span>产品类型:</span>
<el-radio-group v-model="form" size="small" style="padding-top: 11px; width: 100%;text-align: left">
<el-radio label="1">服务器</el-radio>
<el-radio label="2">CPU</el-radio>
<el-radio label="3">操作系统</el-radio>
<el-radio label="4">数据库</el-radio>
<el-radio label="5">中间件</el-radio>
<el-radio label="6">其他</el-radio>
</el-radio-group>
</span>
<span class="addVal">
<span>产品型号:</span>
<el-input v-model="model" size="medium" placeholder="请输入"></el-input>
</span>
<span class="addVal">
<span>是否准入:</span>
<el-radio-group v-model="status" size="small" style="padding-top: 11px; width: 100%;text-align: left">
<el-radio label="1"></el-radio>
<el-radio label="-1"></el-radio>
</el-radio-group>
</span>
</p>
</div>
<p class="line"></p>
<p class="buttonClick">
<span class="buttonCancl" @click="cancel">取消</span>
<span class="buttonSave" @click="save">确定</span>
</p>
</div>
</template>
<script>
export default {
data () {
return {
type: '',
name: '',
status: '',
model: '',
number: '',
form: ''
}
},
created() {
},
mounted(){
},
methods: {
cancel() {
this.$emit('on-cancel')
},
save() {
console.log(1111)
if (!this.name) {
this.$message.error('产品名称不可为空!');
return;
};
let data = {
form: parseInt(this.form),
model: this.model,
name: this.name,
producer: '',
status: parseInt(this.status),
techId: '',
type: parseInt(this.type)
};
this.$server.postProduceAdd(data).then(res => {
if (res.data.code === 200) {
this.$message.success('产品新建成功!');
this.$emit('on-cancel', true)
} else {
this.$message.error('产品新建失败!');
}
}).catch(err => {
this.$message.error('产品新建失败!');
})
}
},
components: {
},
watch: {
}
}
</script>
<style scoped>
.newCompany .new{
display: inline-block;
}
.newCompany .new{
right: 220px;
}
.newCompany .addVal{
width: 390px;
display: flex;
font-size: 18px;
color: #666;
text-align: center;
margin-top: 15px;
}
.newCompany .addVal>span{
width: 140px;
display: inline-block;
line-height: 34px;
}
.newCompany>>>.el-input__inner{
border: 1px solid rgba(8,104,157,.3);
border-radius: 2px;
font-size: 18px;
color: #999;
height: 34px;
line-height: 34px;
width: 180px;
}
.newCompany .line{
margin: 25px 30px 0 30px;
height: 1px;
background: rgba(72,119,230,0.2);
}
.newCompany .buttonClick{
display: flex;
justify-content: space-evenly;
margin-top: 13px;
}
.newCompany .company-content>>>.el-radio{
margin-right: 22px;
margin-bottom: 11px;
width: 49px;
}
.newCompany .company-content>>>.el-input__inner{
width: 290px;
}
</style>
<template>
<div class="role">
<div class="product">
<el-row>
<el-col :span="24">
<div class="content">
......@@ -7,7 +7,7 @@
<p class="search">
<span class="searchVal">
<span>产品名称:</span>
<el-input size="medium" placeholder="请输入"></el-input>
<el-input v-model="name" size="medium" placeholder="请输入"></el-input>
</span>
<span class="searchVal">
<span>产品分类:</span>
......@@ -20,11 +20,18 @@
</el-option>
</el-select>
</span>
<span class="searchVal">
<span class="searchVal" style="margin-left: 6px">
<span>技术路线:</span>
<el-select v-model="techVal" placeholder="请选择">
<el-option
v-for="item in techList"
:label="item.name"
:value="item.name">
</el-option>
</el-select>
</span>
<span class="button">搜索</span>
<span class="button add">新建产品</span>
<span class="button searchBtn" @click="search('search')">搜索</span>
<span class="button add" @click="addProduct">新建产品</span>
<span class="button import">导入产品
</span>
</p>
......@@ -56,6 +63,9 @@
prop="number"
label="技术路线"
align="center">
<template>
<span class="change"><img src="../../basicInformation/company/img/look.png">查看</span>
</template>
</el-table-column>
<el-table-column
prop="type"
......@@ -68,98 +78,181 @@
</el-table>
</div>
<!-- 分页 -->
<div class="block">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page.sync="currentPage"
:page-size="pageSize"
background
layout="prev, pager, next"
:total="totalLength">
</el-pagination>
</div>
<!-- 分页 -->
</div>
</el-col>
</el-row>
<!-- 新增 / 编辑 公用弹窗 -->
<!-- <el-dialog :visible.sync="openModel" class="model">-->
<!-- <img src="../../../assets/img/close.png" class="closeModel" @click="reset()">-->
<!-- <component :is="components" :name="companyName" :list="companyList" @on-cancel="reset" @on-name="getName"></component>-->
<!-- </el-dialog>-->
<el-dialog :visible.sync="openModel" class="model">
<img src="../../../assets/img/close.png" class="closeModel" @click="reset()">
<component :is="components" :name="productName" :list="productList" @on-cancel="reset" @on-name="getName"></component>
</el-dialog>
</div>
</template>
<script>
import '../../basicInformation/company/company.css'
import '../../basicInformation/company/company.css';
import newProduct from './newProduct';
export default {
name: 'product',
data() {
return {
totalLength: 0,
currentPage: 1, // 分页第一页
pageSize: 8, // 每页个数
type: '',
typeList: [
{type: '1'},
{type: '2'}
],
name: '',
typeList: [{type: '1'}, {type: '2'}],
allData: [],
typeVal: {
'1':'软件',
'2': '硬件'
}
},
techList: [],
techVal: '',
openModel: false, // 弹框开关
components: '', // 当前弹框内容
productName: '',
productList: ''
}
},
components: {
newProduct
},
mounted() {
this.init();
// this.search();
},
methods: {
init() {
this.$server.getProduceFindAll().then(res => {
this.allData = res.data.data;
this.$server.getProduceFindAccess().then(res => {
this.allData = res.data.data
})
this.$server.getTechFindAll().then(res => { // 请求技术路线
this.techList = res.data.data
})
},
// 产品分类转换
typeChange(row) {
return this.typeVal[String(row.type)]
}
},
// 搜索
search(val) {
let message = {
form: '',
model: '',
name: '',
producer: '',
status: 0,
techId: 0,
type: 0
};
if (val === 'search') {
this.page = 1;
message.name = this.name;
console.log(this.techVal);
console.log(this.type);
}
// let data = {
// page: this.page,
// pageSize: this.pageSize,
// t: message
// };
// this.$server.postProduceSearch(data).then(res => {
// this.allData = res.data.data;
// this.totalLength = this.allData.length;
// })
},
// 点击分页
handleSizeChange(val) {
console.log(`每页 ${val} 条`);
},
// 当前页数
handleCurrentChange(val) {
this.currentPage = val;
this.search('page')
},
// 新建产品
addProduct() {
this.openModel = true;
this.components = 'newProduct';
},
// 关闭弹框
reset(val) {
this.openModel = false;
this.components = '';
this.productName = '';
if (val) {
this.unit()
}
},
// 获取单位名称
getName(val) {
if (val !== '') {
this.productName = val;
}
},
}
}
</script>
<style scoped>
.role{
.product{
background: #ebf0f8;
width: 100%;
}
.role .content{
.product .content{
margin: 40px;
height: 841px;
background: #fff;
overflow: hidden;
}
.role .content .title{
.product .content .title{
padding: 30px 0 0 60px;
font-size: 20px;
color: #233b6e;
}
.role .content .search{
.product .content .search{
position: relative;
margin-top: 36px;
padding: 0px 70px 0px 70px;
display: flex;
}
.role .content .searchVal{
.product .content .searchVal{
width: 280px;
display: flex;
font-size: 18px;
color: #4663a6;
}
.role .content .searchVal>span{
.product .content .searchVal>span{
width: 140px;
display: inline-block;
line-height: 34px;
}
.role .content .change{
.product .content .change{
color: #4877e6;
cursor: pointer;
}
.role .content .change>img{
.product .content .change>img{
margin-right: 3px;
}
.role .content .common-table{
.product .content .common-table{
box-shadow: 4px 4px 5px rgba(72,119,230,0.1);
border: .5px solid transparent;
border-radius: 10px;
}
.role>>>.el-input__inner{
.product>>>.el-input__inner{
border: 1px solid rgba(8,104,157,.3);
border-radius: 2px;
font-size: 18px;
......@@ -168,7 +261,7 @@ export default {
line-height: 34px;
width: 180px;
}
.role .content .button{
.product .content .button{
display: inline-block;
width: 100px;
height: 34px;
......@@ -176,77 +269,77 @@ export default {
text-align: center;
background: #4877e6;
cursor: pointer;
margin-left: 35px;
margin-left: 20px;
border-radius: 2px;
color: #fff;
font-size: 18px;
}
.role .content .button:hover{
.product .content .button:hover{
background: rgba(72,119,230,.6);
}
.role .content .import{
.product .content .import{
position: absolute;
right: 70px;
}
.add{
.product .add{
position: absolute;
right: 220px;
right: 180px;
}
.role .content .common-table{
.product .content .common-table{
margin: 24px 70px 0 70px;
}
.role .content .common-table>>>.el-table th > .cell{
.product .content .common-table>>>.el-table th > .cell{
font-size: 18px;
color: #333;
font-weight: normal;
}
.role .content .common-table>>>.el-table th.is-leaf{
.product .content .common-table>>>.el-table th.is-leaf{
height: 70px;
}
.role .content .common-table>>>.el-table tr{
.product .content .common-table>>>.el-table tr{
font-size: 18px;
}
.role .content .common-table>>>.el-table{
.product .content .common-table>>>.el-table{
color: #233b6e;
}
.role .content .common-table>>>.el-table--striped .el-table__body tr.el-table__row--striped.el-table__row--striped.el-table__row--striped td {
.product .content .common-table>>>.el-table--striped .el-table__body tr.el-table__row--striped.el-table__row--striped.el-table__row--striped td {
background-color: #fff;
}
.role .content .common-table>>>.el-table--enable-row-hover .el-table__body tr:hover>td{
.product .content .common-table>>>.el-table--enable-row-hover .el-table__body tr:hover>td{
background-color: #f5f8fd;
}
.role .content .common-table>>>.el-table th.is-leaf, .el-table td {
.product .content .common-table>>>.el-table th.is-leaf, .el-table td {
border-bottom: 1px solid #d5e3ff;
}
.role .content .common-table>>>.el-table__body tr, .el-table__body td {
.product .content .common-table>>>.el-table__body tr, .el-table__body td {
padding: 0;
height: 60px;
background: #f5f8fd;
}
.role .content .block{
.product .content .block{
text-align: right;
padding: 30px 70px 0 0;
}
.role .content>>>.el-pagination.is-background .el-pager li{
.product .content>>>.el-pagination.is-background .el-pager li{
background-image: linear-gradient(to bottom, #c5d5f7,#7a95e6);
color: #fff;
}
.role .content>>>.el-pagination.is-background .el-pager li:not(.disabled).active{
.product .content>>>.el-pagination.is-background .el-pager li:not(.disabled).active{
background-image: linear-gradient(to bottom, #7a9eeb,#274acf);
color: #fff;
}
.role .content>>>.el-table td{
.product .content>>>.el-table td{
border-bottom: 1px solid #d5e3ff;
}
.role .content>>>.btn-prev,.role .content>>>.btn-next{
.product .content>>>.btn-prev,.product .content>>>.btn-next{
background: #c5d5f7;
background-image: linear-gradient(to bottom, #c5d5f7,#7a95e6);
color: #fff;
}
.role .content>>>.btn-prev:disabled,.dynamicList .content>>>.btn-next:disabled{
.product .content>>>.btn-prev:disabled,.dynamicList .content>>>.btn-next:disabled{
color: #C0C4CC;
}
.role .content>>>.el-table__body tr.current-row > td{
.product .content>>>.el-table__body tr.current-row > td{
background: #f5f8fd;
}
</style>
\ No newline at end of file
<template>
<div class="role">
<div class="company">
<el-row>
<el-col :span="24">
<div class="content">
......@@ -19,7 +19,7 @@
</el-option>
</el-select>
</span>
<span class="button" @click="search">搜索</span>
<span class="button searchBtn" @click="search">搜索</span>
<span class="button add" @click="addCompany">新建单位</span>
<span class="button import">导入单位
<el-upload
......@@ -136,16 +136,6 @@ export default {
newCompany
},
mounted() {
let val = this.$store.getters.getSidebar;
if (val[val.length - 1].path !== 'company') {
val.push(
{
name: '单位管理',
path: 'company'
}
)
this.$store.commit('changeSidebar', val);
}
this.search('page')
},
methods: {
......@@ -161,10 +151,7 @@ export default {
type: 0
};
if (val !== 'page') { // 点击搜索按钮,不是点击分页跳转
if (!this.searchName || !this.classVal) {
this.$message.error('单位名称和单位类别不可为空!');
return;
}
this.currentPage = 1;
this.companyClass.map(item => {
let type = this.typeVal[item.type];
if (this.classVal === type) {
......@@ -205,7 +192,6 @@ export default {
getName(val) {
if (val !== '') {
this.companyName = val;
this.components = 'authority';
}
},
// 单位准入状态转换
......@@ -243,51 +229,51 @@ export default {
}
</script>
<style scoped>
.role{
.company{
background: #ebf0f8;
width: 100%;
}
.role .content{
.company .content{
margin: 40px;
height: 841px;
background: #fff;
overflow: hidden;
}
.role .content .title{
.company .content .title{
padding: 30px 0 0 60px;
font-size: 20px;
color: #233b6e;
}
.role .content .search{
.company .content .search{
position: relative;
margin-top: 36px;
padding: 0px 70px 0px 70px;
display: flex;
}
.role .content .searchVal{
.company .content .searchVal{
width: 280px;
display: flex;
font-size: 18px;
color: #4663a6;
}
.role .content .searchVal>span{
.company .content .searchVal>span{
width: 140px;
display: inline-block;
line-height: 34px;
}
.role .content .change{
.company .content .change{
color: #4877e6;
cursor: pointer;
}
.role .content .change>img{
.company .content .change>img{
margin-right: 3px;
}
.role .content .common-table{
.company .content .common-table{
box-shadow: 4px 4px 5px rgba(72,119,230,0.1);
border: .5px solid transparent;
border-radius: 10px;
}
.role>>>.el-input__inner{
.company>>>.el-input__inner{
border: 1px solid rgba(8,104,157,.3);
border-radius: 2px;
font-size: 18px;
......@@ -296,7 +282,7 @@ export default {
line-height: 34px;
width: 180px;
}
.role .content .button{
.company .content .button{
display: inline-block;
width: 100px;
height: 34px;
......@@ -304,86 +290,93 @@ export default {
text-align: center;
background: #4877e6;
cursor: pointer;
margin-left: 100px;
/*margin-left: 100px;*/
border-radius: 2px;
color: #fff;
font-size: 18px;
}
.role .content .button:hover{
.company .content .button:hover{
background: rgba(72,119,230,.6);
}
.role .content .new{
.company .content .new{
position: absolute;
right: 70px;
}
.company .import{
right: 70px;
position: absolute;
}
.company .searchBtn{
margin-left: 30px;
}
/*表格样式*/
.role .content .common-table{
.company .content .common-table{
margin: 24px 70px 0 70px;
}
.role .content .common-table>>>.el-table th > .cell{
.company .content .common-table>>>.el-table th > .cell{
font-size: 18px;
color: #333;
font-weight: normal;
}
.role .content .common-table>>>.el-table th.is-leaf{
.company .content .common-table>>>.el-table th.is-leaf{
height: 70px;
}
.role .content .common-table>>>.el-table tr{
.company .content .common-table>>>.el-table tr{
font-size: 18px;
}
.role .content .common-table>>>.el-table{
.company .content .common-table>>>.el-table{
color: #233b6e;
}
.role .content .common-table>>>.el-table--striped .el-table__body tr.el-table__row--striped.el-table__row--striped.el-table__row--striped td {
.company .content .common-table>>>.el-table--striped .el-table__body tr.el-table__row--striped.el-table__row--striped.el-table__row--striped td {
background-color: #fff;
}
.role .content .common-table>>>.el-table--enable-row-hover .el-table__body tr:hover>td{
.company .content .common-table>>>.el-table--enable-row-hover .el-table__body tr:hover>td{
background-color: #f5f8fd;
}
.role .content .common-table>>>.el-table th.is-leaf, .el-table td {
.company .content .common-table>>>.el-table th.is-leaf, .el-table td {
border-bottom: 1px solid #d5e3ff;
}
.role .content .common-table>>>.el-table__body tr, .el-table__body td {
.company .content .common-table>>>.el-table__body tr, .el-table__body td {
padding: 0;
height: 60px;
background: #f5f8fd;
}
.role .content .block{
.company .content .block{
text-align: right;
padding: 30px 70px 0 0;
}
.role .content>>>.el-pagination.is-background .el-pager li{
.company .content>>>.el-pagination.is-background .el-pager li{
background-image: linear-gradient(to bottom, #c5d5f7,#7a95e6);
color: #fff;
}
.role .content>>>.el-pagination.is-background .el-pager li:not(.disabled).active{
.company .content>>>.el-pagination.is-background .el-pager li:not(.disabled).active{
background-image: linear-gradient(to bottom, #7a9eeb,#274acf);
color: #fff;
}
.role .content>>>.el-table td{
.company .content>>>.el-table td{
border-bottom: 1px solid #d5e3ff;
}
.role .content>>>.btn-prev,.role .content>>>.btn-next{
.company .content>>>.btn-prev,.role .content>>>.btn-next{
background: #c5d5f7;
background-image: linear-gradient(to bottom, #c5d5f7,#7a95e6);
color: #fff;
}
.role .content>>>.btn-prev:disabled,.dynamicList .content>>>.btn-next:disabled{
.company .content>>>.btn-prev:disabled,.dynamicList .content>>>.btn-next:disabled{
color: #C0C4CC;
}
.role .content>>>.el-table__body tr.current-row > td{
.company .content>>>.el-table__body tr.current-row > td{
background: #f5f8fd;
}
.role .content>>>.el-pagination.is-background .el-pager li{
.company .content>>>.el-pagination.is-background .el-pager li{
background-image: linear-gradient(to bottom, #c5d5f7,#7a95e6);
color: #fff;
}
.role .content>>>.el-pagination.is-background .el-pager li:not(.disabled).active{
.company .content>>>.el-pagination.is-background .el-pager li:not(.disabled).active{
background-image: linear-gradient(to bottom, #7a9eeb,#274acf);
color: #fff;
}
.role .content .common-table {
.company .content .common-table {
box-shadow: rgba(72, 119, 230, 0.1) 4px 4px 5px;
border-width: 0.5px;
border-style: solid;
......
<template>
<div class="newrole">
<div class="newCompany">
<p class="dialog-header">
<span>新建单位</span>
</p>
......@@ -104,13 +104,13 @@ export default {
}
</script>
<style scoped>
.newrole .new{
.newCompany .new{
display: inline-block;
}
.new{
.newCompany .new{
right: 220px;
}
.newrole .addVal{
.newCompany .addVal{
width: 390px;
display: flex;
font-size: 18px;
......@@ -118,12 +118,12 @@ export default {
text-align: center;
margin-top: 15px;
}
.newrole .addVal>span{
.newCompany .addVal>span{
width: 140px;
display: inline-block;
line-height: 34px;
}
.newrole>>>.el-input__inner{
.newCompany>>>.el-input__inner{
border: 1px solid rgba(8,104,157,.3);
border-radius: 2px;
font-size: 18px;
......@@ -132,22 +132,22 @@ export default {
line-height: 34px;
width: 180px;
}
.newrole .line{
.newCompany .line{
margin: 25px 30px 0 30px;
height: 1px;
background: rgba(72,119,230,0.2);
}
.newrole .buttonClick{
.newCompany .buttonClick{
display: flex;
justify-content: space-evenly;
margin-top: 13px;
}
.newrole .company-content>>>.el-radio{
.newCompany .company-content>>>.el-radio{
margin-right: 22px;
margin-bottom: 11px;
width: 49px;
}
.newrole .company-content>>>.el-input__inner{
.newCompany .company-content>>>.el-input__inner{
width: 290px;
}
</style>
......@@ -43,7 +43,7 @@
</el-table>
</div>
<!-- 分页 -->
<div class="block" v-if="this.totleLength >= 10">
<div class="block">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
......
......@@ -62,7 +62,7 @@
</el-table>
</div>
<!-- 分页 -->
<div class="block" v-if="this.totleLength >= 10">
<div class="block">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
......
......@@ -62,7 +62,7 @@
</el-table>
</div>
<!-- 分页 -->
<div class="block" v-if="this.totleLength >= 10">
<div class="block">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
......
......@@ -25,19 +25,19 @@
<img src="./img/SJ.png">
<span>市级名录</span>
</p>
<p class="bg" v-if="this.$store.getters.getUserData.type === 1">
<p class="bg" v-if="this.$store.getters.getUserData.type === 1" @click="jump('company',3,'基础资料管理')">
<img src="./img/GJ.png">
<span>基础资料管理</span>
</p>
<p class="bg" v-if="this.$store.getters.getUserData.type === 1">
<p class="bg" v-if="this.$store.getters.getUserData.type === 1" @click="jump('product',4,'市级准入管理')">
<img src="./img/SJ.png">
<span>市级准入管理</span>
</p>
<p class="bg" v-if="this.$store.getters.getUserData.type !== 1">
<p class="bg" v-if="this.$store.getters.getUserData.type !== 1" @click="jump('complaint',5,'意见建议')">
<img src="./img/YJ.png">
<span>意见建议</span>
</p>
<p class="bg" v-if="this.$store.getters.getUserData.type === 1">
<p class="bg" v-if="this.$store.getters.getUserData.type === 1" @click="jump('complaintManagement',5,'投诉管理')">
<img src="./img/YJ.png">
<span>投诉管理</span>
</p>
......
......@@ -50,7 +50,7 @@
</el-table>
</div>
<!-- 分页 -->
<div class="block" v-if="this.totleLength >= 10">
<div class="block">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
......
......@@ -171,7 +171,7 @@ export default {
]
},
{
name: '市准入管理',
name: '市准入管理',
menuList: [
{
name: '单位管理',
......@@ -277,6 +277,7 @@ export default {
this.$store.commit('changeSidebar', val);
}
}
$('.listVal>span').removeClass('menuClick')
this.$router.push({name: name});
}
},
......
......@@ -91,7 +91,7 @@ export default new Router({
name: 'companyDetails',
component: resolve => require(['../components/basicInformation/company/companyDetails.vue'], resolve)
},
// 基础资料管理-单位信息
// 市准入管理-产品管理
{
path: '/product',
name: 'product',
......
......@@ -114,5 +114,27 @@ const server = {
method: 'get'
});
},
getTechFindAll() { // 获取所有技术路线列表
return axios('/tech/findAll', {
method: 'get'
});
},
postProduceSearchAccess(data) { // 准入产品分页查询
return axios('/produce/searchAccesss', {
method: 'post',
data: data
});
},
getProduceFindAccess() { // 获取所有准入产品列表
return axios('/produce/findAccess', {
method: 'get'
});
},
postProduceAdd(data) { // 新建产品
return axios('/produce/add', {
method: 'post',
data: data
});
},
}
export default server;
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论