This commit is contained in:
@jyuhsin
2025-09-18 15:57:10 +08:00
parent b05de4830c
commit d638f2baf9
27 changed files with 791 additions and 70 deletions
@@ -42,8 +42,8 @@ layout("/layouts/platform.html"){
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unitList"></el-option>
</el-select>
</search-item>
<search-item label="捐方式:">
<el-select placeholder="请选择捐方式" v-model="pageForm.payMode" style="width: 100%;"
<search-item label="捐方式:">
<el-select placeholder="请选择捐方式" v-model="pageForm.payMode" style="width: 100%;"
clearable @change="doSearch"
filterable>
<el-option label="微信" value="WeChat"></el-option>
@@ -54,7 +54,7 @@ layout("/layouts/platform.html"){
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="捐列表">
<table-tool label="捐列表">
<el-button type="primary" size="small" @click="onExport">
<i class="el-icon-download"></i>
导出
@@ -90,10 +90,10 @@ layout("/layouts/platform.html"){
<template #view>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="捐项目">
<el-descriptions-item label="捐项目">
{{ viewData.contributionName }}
</el-descriptions-item>
<el-descriptions-item label="捐人工号">
<el-descriptions-item label="捐人工号">
{{ viewData.loginName }}
</el-descriptions-item>
<el-descriptions-item label="姓名">
@@ -111,13 +111,13 @@ layout("/layouts/platform.html"){
<el-descriptions-item label="善款金额">
{{ viewData.money || 0}}元
</el-descriptions-item>
<el-descriptions-item label="捐方式">
<el-descriptions-item label="捐方式">
{{ viewData.payMode === 'WeChat' ? '微信' : '支付宝' }}
</el-descriptions-item>
<el-descriptions-item label="捐时间" :span="2">
<el-descriptions-item label="捐时间" :span="2">
{{ viewData.contributionTime }}
</el-descriptions-item>
<el-descriptions-item label="捐凭证" :span="2">
<el-descriptions-item label="捐凭证" :span="2">
<file-preview v-if="viewData.contributionFiles" complete_result :files="viewData.contributionFiles"></file-preview>
<span v-else>暂无</span>
</el-descriptions-item>
@@ -136,15 +136,15 @@ layout("/layouts/platform.html"){
data() {
return {
tableColumns: [
{prop: 'contributionName', label: '捐项目'},
{prop: 'loginName', label: '捐人工号'},
{prop: 'contributionName', label: '捐项目'},
{prop: 'loginName', label: '捐人工号'},
{prop: 'userName', label: '姓名'},
{prop: 'mobile', label: '联系方式'},
{prop: 'unionName', label: '所属工会'},
{prop: 'unitName', label: '所属单位'},
{prop: 'money', label: '善款金额'},
{prop: 'payMode', label: '捐方式'},
{prop: 'contributionTime', label: '捐时间'},
{prop: 'payMode', label: '捐方式'},
{prop: 'contributionTime', label: '捐时间'},
],
contributionOptions: [],
unionList: [],
@@ -6,8 +6,8 @@ const basicForm = {
<el-input type="text" v-model="formData.contributionName" maxlength="50"
placeholder="请填写项目名称"></el-input>
</el-form-item>
<el-form-item label="所属捐专题" prop="contributionTypeCode">
<el-select placeholder="所属捐专题" v-model="formData.contributionTypeCode"
<el-form-item label="所属捐专题" prop="contributionTypeCode">
<el-select placeholder="所属捐专题" v-model="formData.contributionTypeCode"
style="width: 100%;"
clearable
filterable>
@@ -16,7 +16,7 @@ const basicForm = {
:value="item.typeCode"></el-option>
</el-select>
</el-form-item>
<el-form-item label="捐时间" prop="contributionTime">
<el-form-item label="捐时间" prop="contributionTime">
<el-date-picker
style="width: 100%;"
v-model="formData.contributionTime"
@@ -27,16 +27,16 @@ const basicForm = {
end-placeholder="请选择结束日期">
</el-date-picker>
</el-form-item>
<el-form-item label="捐模式" prop="contributionMode">
<el-form-item label="捐模式" prop="contributionMode">
<el-radio-group v-model="formData.contributionMode">
<el-radio-button :label="1">水滴筹</el-radio-button>
<el-radio-button :label="2">一日捐</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="捐链接" prop="contributionUrl"
<el-form-item label="捐链接" prop="contributionUrl"
v-if="formData.contributionMode === 1">
<el-input type="text" v-model="formData.contributionUrl" maxlength="50"
placeholder="请填写捐链接"></el-input>
placeholder="请填写捐链接"></el-input>
</el-form-item>
<el-form-item label="是否开启" prop="isContributionEnable">
<el-switch v-model="formData.isContributionEnable" active-color="#13ce66"
@@ -5,16 +5,16 @@ const info = {
<el-descriptions-item label="项目名称">
{{ viewData.contributionName }}
</el-descriptions-item>
<el-descriptions-item label="所属捐专题">
<el-descriptions-item label="所属捐专题">
{{ viewData.typeName }}
</el-descriptions-item>
<el-descriptions-item label="捐时间">
<el-descriptions-item label="捐时间">
{{ viewData.contributionStartTime + ' 至 ' + viewData.contributionEndTime }}
</el-descriptions-item>
<el-descriptions-item label="捐模式">
<el-descriptions-item label="捐模式">
{{ viewData.contributionMode === 1 ? '水滴筹' : '一日捐' }}
</el-descriptions-item>
<el-descriptions-item label="捐链接" :span="2">
<el-descriptions-item label="捐链接" :span="2">
{{ viewData.contributionUrl || '暂无' }}
</el-descriptions-item>
<el-descriptions-item label="项目介绍" :span="2">
@@ -38,7 +38,7 @@ layout("/layouts/platform.html"){
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="捐列表"></table-tool>
<table-tool label="捐列表"></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize"
row-key="id" show-summary :summary-method="getSummaries"
max-height="600">
@@ -73,9 +73,9 @@ layout("/layouts/platform.html"){
tableColumns: [
{prop: 'unionCode', label: '工会编码'},
{prop: 'name', label: '工会名称'},
{prop: 'contributionUserNum', label: '捐人数'},
{prop: 'contributionNum', label: '捐多少笔'},
{prop: 'money', label: '捐总额(元)'},
{prop: 'contributionUserNum', label: '捐人数'},
{prop: 'contributionNum', label: '捐多少笔'},
{prop: 'money', label: '捐总额(元)'},
],
contributionOptions: [],
unionList: [],
@@ -77,7 +77,7 @@ layout("/layouts/platform.html"){
{prop: 'appointmentUserName', label: '姓名'},
{prop: 'appointmentLoginName', label: '工号'},
{prop: 'appointmentUnitName', label: '单位'},
{prop: 'doctorUserName', label: '心理咨询师'},
{prop: 'doctorUserName', label: '咨询师'},
],
}
},
@@ -18,7 +18,7 @@ const basicForm = {
<el-form-item>
<div class="text-primary">
<i class="el-icon-warning"></i>
提示:不会发布您的个人隐私信息,您咨询的内容只有心理咨询师可查看并回复。
提示:不会发布您的个人隐私信息,您咨询的内容只有咨询师可查看并回复。
</div>
</el-form-item>
</el-form>
@@ -77,7 +77,7 @@ layout("/layouts/platform.html"){
{prop: 'appointmentUserName', label: '姓名'},
{prop: 'appointmentLoginName', label: '工号'},
{prop: 'appointmentUnitName', label: '单位'},
{prop: 'doctorUserName', label: '心理咨询师'},
{prop: 'doctorUserName', label: '咨询师'},
],
}
},
@@ -18,7 +18,7 @@ const basicForm = {
<el-form-item>
<div class="text-primary">
<i class="el-icon-warning"></i>
提示:不会发布您的个人隐私信息,您咨询的内容只有心理咨询师可查看并回复。
提示:不会发布您的个人隐私信息,您咨询的内容只有咨询师可查看并回复。
</div>
</el-form-item>
</el-form>
@@ -25,6 +25,7 @@ const condolenceInfo = {
{{ viewData.remark || '暂无' }}
</van-cell>
<van-cell class="direction-column-cell" title="附件">
<file-preview :files="viewData.files" complete_result></file-preview>
</van-cell>
<van-cell class="direction-column-cell" title="签字">
<van-image :src="viewData.signature" v-if="viewData.signature" class="signature-image"></van-image>
@@ -0,0 +1,108 @@
const applyForm = {
template: /*language=HTML*/ `
<div>
<van-action-sheet :close-on-click-overlay="false" title="捐助信息" v-model="visible">
<van-form ref="formRef" class="form-container">
<van-cell-group title="基本信息" class="form-section">
<van-field label="姓名" readonly v-model="formData.userName"></van-field>
<van-field label="单位" readonly v-model="formData.unitName"></van-field>
<van-field label="工会" readonly v-model="formData.unionName"></van-field>
<van-field label="电话" v-model="formData.mobile" placeholder="请输入电话" type="number"
required :rules="[{ required: true }]" name="digit">
</van-field>
</van-cell-group>
<van-cell-group title="支付信息" class="form-section">
<van-field v-model="formData.money" label="捐助金额" type="number" placeholder="请输入捐助金额"
required :rules="[{ required: true }]" name="money">
<template #button>
</template>
</van-field>
<van-field label="捐助方式" required :rules="[{ required: true }]" name="payMode" >
<template #input>
<van-radio-group v-model="formData.payMode" direction="horizontal">
<van-radio name="WeChat"><van-icon size="18" name="wechat-pay" />微信</van-radio>
<van-radio name="Alipay"><van-icon size="18" name="alipay" />支付宝</van-radio>
</van-radio-group>
</template>
</van-field>
</van-cell-group>
<van-cell-group title="捐助凭证" class="form-section">
<van-field name="contributionFiles" label="捐助凭证" required :rules="[{ required: true }]">
<template #input>
<h5-file-upload
slot="input"
:value.sync="formData.contributionFiles"
:upload_number="5"
upload_result_category="array"
complete_result
></h5-file-upload>
</template>
</van-field>
</van-cell-group>
<div class="form-actions">
<van-button @click="onSubmit" round type="info">提交</van-button>
</div>
</van-form>
</van-action-sheet>
</div>
`,
store,
data() {
return {
visible:false,
row: {},
formData: {},
}
},
methods: {
onOpen(row) {
this.row = row
if(row && row.id) {
this.formData = clone(row)
} else {
this.init()
}
this.visible = true
},
init() {
this.$set(this.formData, 'contributionId', this.row.id)
this.$set(this.formData, 'contributionName', this.row.contributionName)
this.$set(this.formData, 'userId', this.$store.state.user.id)
this.$set(this.formData, 'sex', this.$store.state.user.sex)
this.$set(this.formData, 'userName', this.$store.state.user.username)
this.$set(this.formData, 'loginName', this.$store.state.user.loginname)
this.$set(this.formData, 'unitId', this.$store.state.user?.unit?.id)
this.$set(this.formData, 'unitName', this.$store.state.user?.unit?.name)
this.$set(this.formData, "unionId", this.$store.state.user?.union?.id)
this.$set(this.formData, "unionName", this.$store.state.user?.union?.name)
this.$set(this.formData, 'mobile', this.$store.state.user.mobile)
},
onSubmit() {
this.$refs.formRef.validate().then(() => {
this.$dialog.confirm({
title: "提示",
message: "您确定要提交吗?"
}).then(() => {
const formData = clone(this.formData)
formData.contributionFiles = JSON.stringify(formData.contributionFiles)
this.$axios.post("/platform/contribution/list/h5/submit", formData).then(res => {
if (res.code === 0) {
this.$toast(res.msg)
this.visible = false
this.$pjaxReplace("/platform/contribution/mine/h5")
}
})
})
})
},
},
style: /*language=CSS*/ `
::v-deep .van-radio__label {
display: flex;
}
`
}
@@ -0,0 +1,58 @@
const projectInfo = {
template: /*language=HTML*/ `
<div>
<van-action-sheet v-model="visible" title="项目信息" cancel-text="取消">
<div class="detail-container">
<van-image class="info-img" height="186" width="100%" :src="viewData.contributionFiles"></van-image>
<div class="info-middle">
<div>已筹总额:{{ viewData.totalMoney || 0 }}元</div>
<div>捐助人次:{{ viewData.peopleCount || 0 }}人</div>
</div>
<div class="info-title">{{viewData.contributionName}}</div>
<div class="info-content" v-html="viewData.contributionIntroduce"></div>
</div>
</van-action-sheet>
</div>
`,
data() {
return {
visible:false,
viewData: {},
}
},
methods: {
onOpen(row) {
this.$axios.post('/platform/contribution/list/h5/fetchOne', {id: row.contributionId})
.then((res) => {
this.viewData = res.data
})
this.visible = true
},
},
style: /*language=CSS*/ `
::v-deep .info-middle {
background-color: #F5F7FA;
width: 80%;
margin: 0 auto;
padding: 20px;
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
color: #666666;
font-size: 14px;
}
::v-deep .info-title {
font-weight: bold;
background-color: white;
padding: 13px;
box-shadow: 0 8px 12px #ebedf0;
text-align: center !important;
margin-top: 10px;
}
::v-deep .info-content {
padding: 10px;
background-color: white;
}
`
}
@@ -0,0 +1,59 @@
const typeInfo = {
template: /*language=HTML*/ `
<div>
<van-action-sheet v-model="visible" title="专题信息" cancel-text="取消">
<div class="detail-container">
<van-image class="info-img" height="186" width="100%" :src="viewData.contributionTypeFiles"></van-image>
<div class="info-middle">
<div>子项目数:{{ viewData.projectCount || 0 }}个</div>
<div>已筹总额:{{ viewData.totalMoney || 0 }}元</div>
<div>捐助人次:{{ viewData.peopleCount || 0 }}人</div>
</div>
<div class="info-title">{{viewData.typeName}}</div>
<div class="info-content">{{viewData.contributionTypeIntroduce}}</div>
</div>
</van-action-sheet>
</div>
`,
data() {
return {
visible:false,
viewData: {},
}
},
methods: {
onOpen(row) {
this.$axios.post('/platform/contribution/type/fetchOne', {id: row.typeId})
.then((res) => {
this.viewData = res.data
})
this.visible = true
},
},
style: /*language=CSS*/ `
::v-deep .info-middle {
background-color: #F5F7FA;
width: 80%;
margin: 0 auto;
padding: 20px;
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
color: #666666;
font-size: 14px;
}
::v-deep .info-title {
font-weight: bold;
background-color: white;
padding: 13px;
box-shadow: 0 8px 12px #ebedf0;
text-align: center !important;
margin-top: 10px;
}
::v-deep .info-content {
padding: 10px;
background-color: white;
}
`
}
@@ -0,0 +1,122 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<style scoped>
</style>
<div id="app">
<van-nav-bar title="慈善捐助项目" left-text="返回" left-arrow @click-left="historyBack" fixed placeholder></van-nav-bar>
<van-sticky offset-top="46px">
<van-dropdown-menu :close-on-click-outside="false" :close-on-click-overlay="false">
<year-van-dropdown-item :num="5" @change="doSearch" v-model="pageForm.year"></year-van-dropdown-item>
<van-dropdown-item v-model="pageForm.type" :options="typeOptions" :multiple="false"
@change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
</van-sticky>
<table-list api="/platform/contribution/list/h5/pageData"
:page_form.sync="pageForm"
ref="tableListRef"
img="contributionFiles"
@ready="onReady">
<template #header="{index,row}">
<div class="item-header">
<div class="item-title">{{ row.contributionName }}</div>
<van-tag type="primary">{{ row.contributionTypeCode ? '专题' : '' }}</van-tag>
</div>
</template>
<template v-slot="{index,row}">
<table-column label="捐助模式">{{ row.contributionMode === 1 ? '水滴筹' : '一日捐' }}</table-column>
<table-column label="开始时间">{{row.contributionStartTime}}</table-column>
<table-column label="结束时间">{{row.contributionEndTime}}</table-column>
</template>
<template #actions="{index,row}">
<div v-if="row.contributionTypeCode" class="action-btn" @click="onTypeView(row)">
<i class="fa fa-eye"></i>
<span>专题介绍</span>
</div>
<div class="action-btn" @click="onView(row)">
<i class="fa fa-eye"></i>
<span>项目介绍</span>
</div>
<div class="action-btn" @click="onApply(row)">
<i class="fa fa-cny"></i>
<span>捐助</span>
</div>
</template>
</table-list>
<type-info ref="typeInfoRef"></type-info>
<project-info ref="projectInfoRef"></project-info>
<apply-form ref="applyFormRef"></apply-form>
</div>
<script>
<!--#include('../common/typeInfo.js'){}#-->
<!--#include('../common/projectInfo.js'){}#-->
<!--#include('../common/applyForm.js'){}#-->
new Vue({
el: "#app",
store,
components: {
'type-info': typeInfo,
'project-info': projectInfo,
'apply-form': applyForm,
},
data() {
return {
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
year: new Date().getFullYear(),
type: null,
},
typeOptions: [],
}
},
methods: {
async onReady() {
const typeList = await this.queryType()
this.typeOptions = [
{
text: "全部类型",
value: null
}
].concat(typeList.map((v) => ({ text: v.typeName, value: v.typeCode })))
if (this.typeOptions.length > 0) {
this.pageForm.type = this.typeOptions[0].value
}
this.doSearch()
},
onApply(row) {
delete row.contributionFiles
this.$refs.applyFormRef.onOpen(row)
},
onTypeView(row) {
this.$refs.typeInfoRef.onOpen(row)
},
onView(row) {
this.$refs.projectInfoRef.onOpen(row)
},
async queryType() {
const res = await this.$axios.post('/platform/contribution/type/queryContributionType')
return res.data
},
doSearch() {
this.$nextTick(() => {
this.pageForm.pageNumber = 1
this.pageForm.totalCount = 0
this.$refs.tableListRef.doSearch()
})
}
},
})
</script>
<!--#
}
#-->
@@ -0,0 +1,143 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<style scoped>
</style>
<div id="app">
<van-nav-bar title="我的慈善捐助" left-text="返回" left-arrow @click-left="historyBack" fixed placeholder></van-nav-bar>
<van-sticky offset-top="46px">
<van-dropdown-menu :close-on-click-outside="false" :close-on-click-overlay="false">
<year-van-dropdown-item :num="5" @change="doSearch" v-model="pageForm.year"></year-van-dropdown-item>
<van-dropdown-item v-model="pageForm.type" :options="typeOptions" :multiple="false"
@change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
</van-sticky>
<table-list api="/platform/contribution/mine/h5/pageData"
:page_form.sync="pageForm"
ref="tableListRef"
@ready="onReady">
<template #header="{index,row}">
<div class="item-header">
<div class="item-title">{{ row.projectName }}</div>
<van-tag type="primary">{{ row.contributionTypeCode ? '专题' : '' }}</van-tag>
</div>
</template>
<template v-slot="{index,row}">
<table-column label="捐助方式">{{ row.payMode === 'WeChat' ? '微信' : '支付宝' }}</table-column>
<table-column label="捐助金额">{{row.money}}</table-column>
<table-column label="捐助时间">{{row.contributionTime}}</table-column>
</template>
<template #actions="{index,row}">
<div v-if="row.contributionTypeCode" class="action-btn" @click="onTypeView(row)">
<i class="fa fa-eye"></i>
<span>专题介绍</span>
</div>
<div class="action-btn" @click="onView(row)">
<i class="fa fa-eye"></i>
<span>项目介绍</span>
</div>
<div v-if="$moment().isBefore($moment(row.contributionStartTime))"
class="action-btn" @click="onEdit(row)">
<i class="fa fa-edit"></i>
<span>编辑</span>
</div>
<div v-if="$moment().isBefore($moment(row.contributionStartTime))"
class="action-btn delete" @click="onDelete(row)">
<i class="fa fa-trash"></i>
<span>删除</span>
</div>
</template>
</table-list>
<type-info ref="typeInfoRef"></type-info>
<project-info ref="projectInfoRef"></project-info>
<apply-form ref="applyFormRef"></apply-form>
</div>
<script>
<!--#include('../common/typeInfo.js'){}#-->
<!--#include('../common/projectInfo.js'){}#-->
<!--#include('../common/applyForm.js'){}#-->
new Vue({
el: "#app",
store,
components: {
'type-info': typeInfo,
'project-info': projectInfo,
'apply-form': applyForm,
},
data() {
return {
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
year: new Date().getFullYear(),
type: null,
},
typeOptions: [],
}
},
methods: {
async onReady() {
const typeList = await this.queryType()
this.typeOptions = [
{
text: "全部类型",
value: null
}
].concat(typeList.map((v) => ({ text: v.typeName, value: v.typeCode })))
if (this.typeOptions.length > 0) {
this.pageForm.type = this.typeOptions[0].value
}
this.doSearch()
},
onEdit(row) {
this.$refs.applyFormRef.onOpen(row)
},
onTypeView(row) {
this.$refs.typeInfoRef.onOpen(row)
},
onView(row) {
this.$refs.projectInfoRef.onOpen(row)
},
onDelete(row) {
this.$dialog.confirm({
title: "提示",
message: "您确定要删除吗?"
})
.then(() => {
this.$axios.post("/platform/contribution/mine/h5/delete", { id: row.id }).then((res) => {
if (res.code === 0) {
this.$toast.success(res.msg)
this.doSearch()
} else {
this.$toast.fail(res.msg)
}
})
})
.catch(() => {})
},
async queryType() {
const res = await this.$axios.post('/platform/contribution/type/queryContributionType')
return res.data
},
doSearch() {
this.$nextTick(() => {
this.pageForm.pageNumber = 1
this.pageForm.totalCount = 0
this.$refs.tableListRef.doSearch()
})
}
},
})
</script>
<!--#
}
#-->
@@ -4,7 +4,7 @@ const applyForm = {
<van-action-sheet :close-on-click-overlay="false" title="咨询信息" v-model="visible">
<van-notice-bar
left-icon="volume-o"
text="温馨提示:不会发布您的个人隐私信息,您咨询的内容只有心理咨询师可查看并回复。"
text="温馨提示:不会发布您的个人隐私信息,您咨询的内容只有咨询师可查看并回复。"
></van-notice-bar>
<van-form ref="formRef" class="form-container">
<van-cell-group title="基本信息" class="form-section">
@@ -4,7 +4,7 @@ const applyForm = {
<van-action-sheet :close-on-click-overlay="false" title="咨询信息" v-model="visible">
<van-notice-bar
left-icon="volume-o"
text="温馨提示:不会发布您的个人隐私信息,您咨询的内容只有心理咨询师可查看并回复。"
text="温馨提示:不会发布您的个人隐私信息,您咨询的内容只有咨询师可查看并回复。"
></van-notice-bar>
<van-form ref="formRef" class="form-container">
<van-cell-group title="基本信息" class="form-section">