Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
customer-admin
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
customer-admin
Commits
7d2365d9
提交
7d2365d9
authored
10月 27, 2021
作者:
pengxiaohui
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of
https://gitlab.ezijing.com/webapp/customer-admin
上级
2cd696b8
883d16cf
隐藏空白字符变更
内嵌
并排
正在显示
9 个修改的文件
包含
61 行增加
和
111 行删除
+61
-111
BaseInfo.vue
src/modules/customer/components/BaseInfo.vue
+6
-25
Contact.vue
src/modules/customer/components/Contact.vue
+0
-2
CreateFollow.vue
src/modules/customer/components/CreateFollow.vue
+17
-15
CustomerFormDialog.vue
src/modules/customer/components/CustomerFormDialog.vue
+14
-28
FollowRemark.vue
src/modules/customer/components/FollowRemark.vue
+17
-23
Project.vue
src/modules/customer/components/Project.vue
+0
-3
AddCustomer.vue
src/modules/system/customergroup/components/AddCustomer.vue
+0
-2
AddCustomerGroup.vue
...ules/system/customergroup/components/AddCustomerGroup.vue
+7
-11
Customer.vue
src/modules/system/customergroup/components/Customer.vue
+0
-2
没有找到文件。
src/modules/customer/components/BaseInfo.vue
浏览文件 @
7d2365d9
...
@@ -3,39 +3,20 @@
...
@@ -3,39 +3,20 @@
<div
class=
"bar"
>
<div
class=
"bar"
>
<el-button
v-if=
"btnUpdate"
type=
"primary"
size=
"small"
@
click=
"dialogVisable = true"
>
更 新
</el-button>
<el-button
v-if=
"btnUpdate"
type=
"primary"
size=
"small"
@
click=
"dialogVisable = true"
>
更 新
</el-button>
</div>
</div>
<!--
<div
class=
"info"
>
<div
class=
"item"
><label>
客户名称:
</label>
{{
form
.
name
}}
</div>
<div
class=
"item"
><label>
客户简称:
</label>
{{
form
.
short_name
}}
</div>
<div
class=
"item"
><label>
客户来源:
</label>
{{
form
.
source
|
sourceFilter
}}
</div>
<div
class=
"item"
><label>
客户分类:
</label>
{{
form
.
type
|
typeFilter
}}
</div>
<div
class=
"item"
><label>
所在地区:
</label>
{{
form
.
region
}}
</div>
<div
class=
"item"
><label>
详细地址:
</label>
{{
form
.
address
}}
</div>
<div
class=
"item"
><label>
备注:
</label>
{{
form
.
remark
}}
</div>
</div>
-->
<el-descriptions
class=
"margin-top"
title=
""
:column=
"2"
size=
""
border
>
<el-descriptions
class=
"margin-top"
title=
""
:column=
"2"
size=
""
border
>
<el-descriptions-item>
<el-descriptions-item>
<template
slot=
"label"
>
客户名称
</
template
>
{{ form.name }}
</el-descriptions-item>
<template
slot=
"label"
>
客户名称
</
template
>
{{ form.name }}
<el-descriptions-item>
<
template
slot=
"label"
>
客户简称
</
template
>
{{ form.short_name }}
</el-descriptions-item>
</el-descriptions-item>
<el-descriptions-item>
<
template
slot=
"label"
>
客户简称
</
template
>
{{ form.short_name }}
</el-descriptions-item>
<el-descriptions-item>
<el-descriptions-item>
<
template
slot=
"label"
>
客户来源
</
template
>
{{ form.source | sourceFilter }}
<
template
slot=
"label"
>
客户来源
</
template
>
{{ form.source | sourceFilter }}
</el-descriptions-item>
</el-descriptions-item>
<el-descriptions-item>
<el-descriptions-item>
<
template
slot=
"label"
>
客户分类
</
template
>
{{ form.type | typeFilter }}
<
template
slot=
"label"
>
客户分类
</
template
>
{{ form.type | typeFilter }}
</el-descriptions-item>
</el-descriptions-item>
<el-descriptions-item>
<el-descriptions-item>
<
template
slot=
"label"
>
所在地区
</
template
>
{{ form.region }}
</el-descriptions-item>
<
template
slot=
"label"
>
所在地区
</
template
>
{{ form.region }}
<el-descriptions-item>
<
template
slot=
"label"
>
详细地址
</
template
>
{{ form.address }}
</el-descriptions-item>
</el-descriptions-item>
<el-descriptions-item>
<
template
slot=
"label"
>
备注
</
template
>
{{ form.remark }}
</el-descriptions-item>
<el-descriptions-item>
<
template
slot=
"label"
>
详细地址
</
template
>
{{ form.address }}
</el-descriptions-item>
<el-descriptions-item>
<
template
slot=
"label"
>
备注
</
template
>
{{ form.remark }}
</el-descriptions-item>
</el-descriptions>
</el-descriptions>
<customer-form-dialog
v-model=
"dialogVisable"
:info=
"form"
@
change=
"getBaseInfo"
/>
<customer-form-dialog
v-model=
"dialogVisable"
:info=
"form"
@
change=
"getBaseInfo"
/>
</div>
</div>
</template>
</template>
<
script
>
<
script
>
...
...
src/modules/customer/components/Contact.vue
浏览文件 @
7d2365d9
...
@@ -75,11 +75,9 @@ export default {
...
@@ -75,11 +75,9 @@ export default {
{
prop
:
'wechat'
,
label
:
'微信号'
,
align
:
'center'
},
{
prop
:
'wechat'
,
label
:
'微信号'
,
align
:
'center'
},
{
prop
:
'sub_mobile'
,
label
:
'附属手机号'
,
align
:
'center'
},
{
prop
:
'sub_mobile'
,
label
:
'附属手机号'
,
align
:
'center'
},
{
prop
:
'qq'
,
label
:
'QQ号'
,
align
:
'center'
},
{
prop
:
'qq'
,
label
:
'QQ号'
,
align
:
'center'
},
// { prop: 'created_by.username', label: '创建员工', align: 'center' },
{
{
prop
:
'created_by'
,
prop
:
'created_by'
,
label
:
'创建员工'
,
label
:
'创建员工'
,
// minWidth: '100px',
computed
({
row
})
{
computed
({
row
})
{
return
row
.
created_by
.
realname
||
row
.
created_by
.
nickname
||
row
.
created_by
.
username
return
row
.
created_by
.
realname
||
row
.
created_by
.
nickname
||
row
.
created_by
.
username
}
}
...
...
src/modules/customer/components/CreateFollow.vue
浏览文件 @
7d2365d9
<
template
>
<
template
>
<el-dialog
:visible=
"value"
:close-on-click-modal=
"false"
:close-on-press-escape=
"false"
top=
"15vh"
@
close=
"handleClose"
width=
"560px"
title=
"创建跟进记录"
>
<el-dialog
:visible=
"value"
:close-on-click-modal=
"false"
:close-on-press-escape=
"false"
top=
"15vh"
@
close=
"handleClose"
width=
"560px"
title=
"创建跟进记录"
>
<el-form
ref=
"form"
:model=
"form"
:rules=
"rules"
label-width=
"120px"
>
<el-form
ref=
"form"
:model=
"form"
:rules=
"rules"
label-width=
"120px"
>
<el-form-item
label=
"跟进员工"
prop=
"staff"
>
<el-form-item
label=
"跟进员工"
prop=
"staff"
>
<app-user-search
v-model=
"form.staff"
></app-user-search>
<app-user-search
v-model=
"form.staff"
></app-user-search>
</el-form-item>
</el-form-item>
<el-form-item
label=
"跟进时间"
prop=
"follow_up_date"
>
<el-form-item
label=
"跟进时间"
prop=
"follow_up_date"
>
<!--
<el-input
v-model=
"form.follow_up_date"
/>
-->
<el-date-picker
v-model=
"form.follow_up_date"
type=
"datetime"
placeholder=
"请选择跟进时间"
size=
"small"
>
<el-date-picker
v-model=
"form.follow_up_date"
type=
"datetime"
placeholder=
"请选择跟进时间"
size=
"small"
>
</el-date-picker>
</el-date-picker>
</el-form-item>
</el-form-item>
<el-form-item
label=
"联系人"
prop=
"contact_id"
>
<el-form-item
label=
"联系人"
prop=
"contact_id"
>
...
@@ -21,7 +23,12 @@
...
@@ -21,7 +23,12 @@
</el-form-item>
</el-form-item>
<el-form-item
label=
"跟进项目"
prop=
"project_id"
>
<el-form-item
label=
"跟进项目"
prop=
"project_id"
>
<el-select
v-model=
"form.project_id"
placeholder=
"请选择跟进项目"
size=
"small"
style=
"width: 100%"
>
<el-select
v-model=
"form.project_id"
placeholder=
"请选择跟进项目"
size=
"small"
style=
"width: 100%"
>
<el-option
:label=
"item.tag === 1 ? '产业学院':'1+X'"
:value=
"item.id"
:key=
"item.id"
v-for=
"item in projectList"
></el-option>
<el-option
:label=
"item.tag === 1 ? '产业学院' : '1+X'"
:value=
"item.id"
:key=
"item.id"
v-for=
"item in projectList"
></el-option>
</el-select>
</el-select>
</el-form-item>
</el-form-item>
<el-form-item
label=
"跟进方式"
prop=
"communication_mode"
>
<el-form-item
label=
"跟进方式"
prop=
"communication_mode"
>
...
@@ -33,12 +40,7 @@
...
@@ -33,12 +40,7 @@
</el-select>
</el-select>
</el-form-item>
</el-form-item>
<el-form-item
label=
"下次联络时间"
prop=
"next_contact_time"
>
<el-form-item
label=
"下次联络时间"
prop=
"next_contact_time"
>
<el-date-picker
<el-date-picker
v-model=
"form.next_contact_time"
type=
"datetime"
placeholder=
"请选择下次联络时间"
size=
"small"
>
v-model=
"form.next_contact_time"
type=
"datetime"
placeholder=
"请选择下次联络时间"
size=
"small"
>
</el-date-picker>
</el-date-picker>
</el-form-item>
</el-form-item>
<el-form-item
label=
"当前项目进展"
prop=
"project_status"
>
<el-form-item
label=
"当前项目进展"
prop=
"project_status"
>
...
...
src/modules/customer/components/CustomerFormDialog.vue
浏览文件 @
7d2365d9
...
@@ -8,8 +8,6 @@
...
@@ -8,8 +8,6 @@
top=
"15vh"
top=
"15vh"
@
close=
"handleClose"
@
close=
"handleClose"
>
>
<!--
<div
slot=
"title"
>
</div>
-->
<el-form
:model=
"form"
:rules=
"rules"
ref=
"ruleForm"
label-width=
"90px"
>
<el-form
:model=
"form"
:rules=
"rules"
ref=
"ruleForm"
label-width=
"90px"
>
<el-form-item
label=
"客户名称"
prop=
"name"
>
<el-form-item
label=
"客户名称"
prop=
"name"
>
<el-input
v-model=
"form.name"
size=
"small"
placeholder=
"请输入客户名称"
/>
<el-input
v-model=
"form.name"
size=
"small"
placeholder=
"请输入客户名称"
/>
...
@@ -113,36 +111,24 @@ export default {
...
@@ -113,36 +111,24 @@ export default {
fetchCreateCustomer
()
{
fetchCreateCustomer
()
{
const
params
=
Object
.
assign
({},
this
.
form
)
const
params
=
Object
.
assign
({},
this
.
form
)
params
.
region
=
this
.
form
.
region
.
join
(
'-'
)
params
.
region
=
this
.
form
.
region
.
join
(
'-'
)
createCustomer
(
params
)
createCustomer
(
params
).
then
(
res
=>
{
.
then
(
res
=>
{
if
(
res
.
code
===
0
&&
res
.
data
&&
res
.
data
.
id
)
{
if
(
res
.
code
===
0
&&
res
.
data
&&
res
.
data
.
id
)
{
this
.
$message
.
success
(
'创建客户成功'
)
this
.
$message
.
success
(
'创建客户成功'
)
this
.
$emit
(
'input'
,
false
)
this
.
$emit
(
'input'
,
false
)
this
.
$emit
(
'change'
)
this
.
$emit
(
'change'
)
}
}
else
{
})
this
.
$message
.
error
(
'创建客户失败'
)
}
})
.
catch
(()
=>
{
this
.
$message
.
error
(
'创建客户失败'
)
})
},
},
fetchUpdateCustomer
()
{
fetchUpdateCustomer
()
{
const
params
=
Object
.
assign
({},
this
.
form
)
const
params
=
Object
.
assign
({},
this
.
form
)
params
.
region
=
this
.
form
.
region
.
join
(
'-'
)
params
.
region
=
this
.
form
.
region
.
join
(
'-'
)
updateCustomer
(
this
.
info
.
id
,
params
)
updateCustomer
(
this
.
info
.
id
,
params
).
then
(
res
=>
{
.
then
(
res
=>
{
if
(
res
.
code
===
0
&&
res
.
data
&&
res
.
data
.
status
)
{
if
(
res
.
code
===
0
&&
res
.
data
&&
res
.
data
.
status
)
{
this
.
$message
.
success
(
'更新客户成功'
)
this
.
$message
.
success
(
'更新客户成功'
)
this
.
$emit
(
'input'
,
false
)
this
.
$emit
(
'input'
,
false
)
this
.
$emit
(
'change'
)
this
.
$emit
(
'change'
)
}
}
else
{
})
this
.
$message
.
error
(
'更新客户失败'
)
}
})
.
catch
(()
=>
{
this
.
$message
.
error
(
'更新客户失败'
)
})
}
}
}
}
}
}
...
...
src/modules/customer/components/FollowRemark.vue
浏览文件 @
7d2365d9
...
@@ -12,7 +12,7 @@
...
@@ -12,7 +12,7 @@
</
template
>
</
template
>
</template>
</template>
</app-list>
</app-list>
<create-follow
v-model=
"dialogVisible"
v-if=
"dialogVisible"
@
success=
"handleRefetchList"
/>
<create-follow
v-model=
"dialogVisible"
v-if=
"dialogVisible"
@
success=
"handleRefetchList"
/>
</div>
</div>
</template>
</template>
<
script
>
<
script
>
...
@@ -55,47 +55,44 @@ export default {
...
@@ -55,47 +55,44 @@ export default {
}
}
},
},
columns
:
[
columns
:
[
// { type: 'selection', minWidth: '40px' },
{
{
align
:
'center'
,
prop
:
'staff'
,
prop
:
'staff'
,
label
:
'跟进员工'
,
label
:
'跟进员工'
,
minWidth
:
'100px'
,
computed
({
row
})
{
computed
({
row
})
{
return
row
.
staff
.
realname
||
row
.
staff
.
nickname
return
row
.
staff
.
realname
||
row
.
staff
.
nickname
}
}
},
},
// { prop: 'project.tag', label: '跟进项目', minWidth: '120px' },
{
{
align
:
'center'
,
prop
:
'project.tag'
,
prop
:
'project.tag'
,
label
:
'跟进项目'
,
label
:
'跟进项目'
,
minWidth
:
'120px'
,
computed
({
row
})
{
computed
({
row
})
{
return
row
.
project
.
tag
===
1
?
'产业学院'
:
'1+x'
return
row
.
project
.
tag
===
1
?
'产业学院'
:
'1+x'
}
}
},
},
{
prop
:
'contact.name'
,
label
:
'联系人'
,
minWidth
:
'80px'
},
{
align
:
'center'
,
prop
:
'contact.name'
,
label
:
'联系人'
,
minWidth
:
'80px'
},
{
prop
:
'follow_up_date'
,
label
:
'跟进时间'
,
minWidth
:
'150px'
},
{
align
:
'center'
,
prop
:
'follow_up_date'
,
label
:
'跟进时间'
,
minWidth
:
'150px'
},
{
prop
:
'next_contact_time'
,
label
:
'下次联络时间'
,
minWidth
:
'150px'
},
{
align
:
'center'
,
prop
:
'next_contact_time'
,
label
:
'下次联络时间'
,
minWidth
:
'150px'
},
// { prop: 'communication_mode', label: '跟进方式', minWidth: '140px' },
{
{
align
:
'center'
,
prop
:
'communication_mode'
,
prop
:
'communication_mode'
,
label
:
'跟进方式'
,
label
:
'跟进方式'
,
minWidth
:
'120px'
,
computed
({
row
})
{
computed
({
row
})
{
return
communicationModeMap
[
row
.
communication_mode
]
return
communicationModeMap
[
row
.
communication_mode
]
}
}
},
},
{
{
align
:
'center'
,
prop
:
'created_by'
,
prop
:
'created_by'
,
label
:
'创建人'
,
label
:
'创建人'
,
minWidth
:
'100px'
,
computed
({
row
})
{
computed
({
row
})
{
return
row
.
created_by
.
realname
||
row
.
created_by
.
nickname
||
row
.
created_by
.
username
return
row
.
created_by
.
realname
||
row
.
created_by
.
nickname
||
row
.
created_by
.
username
}
}
},
},
{
prop
:
'created_at'
,
label
:
'创建时间'
,
minWidth
:
'140px
'
},
{
align
:
'center'
,
prop
:
'created_at'
,
label
:
'创建时间
'
},
{
prop
:
'desc'
,
label
:
'跟进记录'
,
minWidth
:
'140px
'
},
{
align
:
'center'
,
prop
:
'desc'
,
label
:
'跟进记录
'
},
{
label
:
'操作'
,
minWidth
:
'140px'
,
slots
:
'table-operate
'
}
{
label
:
'操作'
,
slots
:
'table-operate'
,
align
:
'center
'
}
]
]
}
}
}
}
...
@@ -125,10 +122,7 @@ export default {
...
@@ -125,10 +122,7 @@ export default {
if
(
res
.
code
===
0
&&
res
.
data
&&
res
.
data
.
status
)
{
if
(
res
.
code
===
0
&&
res
.
data
&&
res
.
data
.
status
)
{
this
.
$message
.
success
(
'删除跟进记录成功'
)
this
.
$message
.
success
(
'删除跟进记录成功'
)
this
.
handleRefetchList
()
this
.
handleRefetchList
()
}
else
{
this
.
$message
.
error
(
'删除跟进记录失败'
)
}
}
}).
catch
(()
=>
{
this
.
$message
.
error
(
'删除跟进记录失败'
)
this
.
$message
.
error
(
'删除跟进记录失败'
)
})
})
},
},
...
@@ -139,12 +133,12 @@ export default {
...
@@ -139,12 +133,12 @@ export default {
}
}
</
script
>
</
script
>
<
style
scoped
>
<
style
scoped
>
.bar
{
.bar
{
padding-bottom
:
10px
;
padding-bottom
:
10px
;
}
}
.item
{
.item
{
font-size
:
16px
;
font-size
:
16px
;
line-height
:
48px
;
line-height
:
48px
;
color
:
#494949
;
color
:
#494949
;
}
}
</
style
>
</
style
>
src/modules/customer/components/Project.vue
浏览文件 @
7d2365d9
...
@@ -6,7 +6,6 @@
...
@@ -6,7 +6,6 @@
<app-list
v-bind=
"tableOptions"
ref=
"list"
>
<app-list
v-bind=
"tableOptions"
ref=
"list"
>
<template
v-slot:table-person=
"
{ row }">
<template
v-slot:table-person=
"
{ row }">
<p
v-for=
"(item, index) in row.charge_persons"
:key=
"index"
>
{{
item
.
username
}}
</p>
<p
v-for=
"(item, index) in row.charge_persons"
:key=
"index"
>
{{
item
.
username
}}
</p>
<!--
{{
row
.
charge_persons
}}
-->
</
template
>
</
template
>
<!-- 操作 -->
<!-- 操作 -->
<
template
v-slot:table-operate=
"{ row }"
>
<
template
v-slot:table-operate=
"{ row }"
>
...
@@ -112,11 +111,9 @@ export default {
...
@@ -112,11 +111,9 @@ export default {
}
}
},
},
{
prop
:
'cooperation_intention'
,
label
:
'合作意向'
,
align
:
'center'
},
{
prop
:
'cooperation_intention'
,
label
:
'合作意向'
,
align
:
'center'
},
// { prop: 'created_by.username', label: '创建人', align: 'center' },
{
{
prop
:
'created_by'
,
prop
:
'created_by'
,
label
:
'创建员工'
,
label
:
'创建员工'
,
// minWidth: '100px',
computed
({
row
})
{
computed
({
row
})
{
return
row
.
created_by
.
realname
||
row
.
created_by
.
nickname
||
row
.
created_by
.
username
return
row
.
created_by
.
realname
||
row
.
created_by
.
nickname
||
row
.
created_by
.
username
}
}
...
...
src/modules/system/customergroup/components/AddCustomer.vue
浏览文件 @
7d2365d9
...
@@ -59,11 +59,9 @@ export default {
...
@@ -59,11 +59,9 @@ export default {
{
label
:
'合作项目'
,
prop
:
'project_count'
,
align
:
'center'
},
{
label
:
'合作项目'
,
prop
:
'project_count'
,
align
:
'center'
},
{
label
:
'所在地区'
,
prop
:
'region'
,
align
:
'center'
},
{
label
:
'所在地区'
,
prop
:
'region'
,
align
:
'center'
},
{
label
:
'创建时间'
,
prop
:
'created_at'
,
align
:
'center'
},
{
label
:
'创建时间'
,
prop
:
'created_at'
,
align
:
'center'
},
// { label: '创建人', prop: 'created_by.username', align: 'center' }
{
{
prop
:
'created_by'
,
prop
:
'created_by'
,
label
:
'创建人'
,
label
:
'创建人'
,
// minWidth: '100px',
computed
({
row
})
{
computed
({
row
})
{
return
row
.
created_by
.
realname
||
row
.
created_by
.
nickname
||
row
.
created_by
.
username
return
row
.
created_by
.
realname
||
row
.
created_by
.
nickname
||
row
.
created_by
.
username
}
}
...
...
src/modules/system/customergroup/components/AddCustomerGroup.vue
浏览文件 @
7d2365d9
...
@@ -68,17 +68,13 @@ export default {
...
@@ -68,17 +68,13 @@ export default {
},
},
// 新建客户组
// 新建客户组
create
()
{
create
()
{
createCustomerGroup
(
this
.
form
)
createCustomerGroup
(
this
.
form
).
then
(
res
=>
{
.
then
(
res
=>
{
if
(
res
.
code
===
0
)
{
if
(
res
.
code
===
0
)
{
this
.
$message
.
success
(
'客户组创建成功'
)
this
.
$message
.
success
(
'客户组创建成功'
)
this
.
$emit
(
'update:visible'
,
false
)
this
.
$emit
(
'update:visible'
,
false
)
this
.
$emit
(
'success'
,
res
.
data
)
this
.
$emit
(
'success'
,
res
.
data
)
}
}
})
})
.
catch
(
error
=>
{
this
.
$message
.
error
(
error
.
message
)
})
}
}
}
}
}
}
...
...
src/modules/system/customergroup/components/Customer.vue
浏览文件 @
7d2365d9
...
@@ -55,11 +55,9 @@ export default {
...
@@ -55,11 +55,9 @@ export default {
columns
:
[
columns
:
[
{
label
:
'客户名称'
,
prop
:
'customer.name'
,
align
:
'center'
},
{
label
:
'客户名称'
,
prop
:
'customer.name'
,
align
:
'center'
},
{
label
:
'创建时间'
,
prop
:
'created_at'
,
align
:
'center'
},
{
label
:
'创建时间'
,
prop
:
'created_at'
,
align
:
'center'
},
// { label: '创建人', prop: 'created_by.username', align: 'center' },
{
{
prop
:
'created_by'
,
prop
:
'created_by'
,
label
:
'创建人'
,
label
:
'创建人'
,
// minWidth: '100px',
computed
({
row
})
{
computed
({
row
})
{
return
row
.
created_by
.
realname
||
row
.
created_by
.
nickname
||
row
.
created_by
.
username
return
row
.
created_by
.
realname
||
row
.
created_by
.
nickname
||
row
.
created_by
.
username
}
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论