Browse Source

活动/预约

master
xuhuajiao 4 weeks ago
parent
commit
f734558b44
  1. 21
      src/api/weixin/index.js
  2. 10
      src/views/weChatMiniProgram/activity.vue
  3. 4
      src/views/weChatMiniProgram/activityLog.vue
  4. 267
      src/views/weChatMiniProgram/reservation.vue
  5. 63
      src/views/weChatMiniProgram/reservationLog.vue

21
src/api/weixin/index.js

@ -66,6 +66,23 @@ export function FetchSaveLibraryReservationSettings(data) {
})
}
// 编辑临时闭馆设置
export function FetchEditClosureNotice(data) {
return request({
url: 'api/weixin/editClosureNotice',
method: 'post',
data
})
}
// 临时闭馆列表
export function FetchInitClosureNotice(params) {
return request({
url: 'api/weixin/initClosureNotice' + '?' + qs.stringify(params, { indices: false }),
method: 'get'
})
}
export default {
FetchReplyReaderMessage,
add,
@ -73,5 +90,7 @@ export default {
FetchCancelResumeActivity,
FetchDeleteActivity,
FetchInitLibraryReservationSettings,
FetchSaveLibraryReservationSettings
FetchSaveLibraryReservationSettings,
FetchEditClosureNotice,
FetchInitClosureNotice
}

10
src/views/weChatMiniProgram/activity.vue

@ -74,7 +74,8 @@
<el-row>
<el-form-item label="活动封面" prop="coverImage">
<div class="activity-upload">
<img v-if="form.coverImage" :src="`${baseApi}/api/fileRelevant/getImg?imgType=2&imgId=${form.coverImage}`" class="upload-preview">
<!-- <img v-if="form.coverImage" :src="`${baseApi}/api/fileRelevant/getImg?imgType=2&imgId=${form.coverImage}`" class="upload-preview"> -->
<img v-if="form.coverImage" :src="`${imgHttpsUrl}/files/${form.coverImage}`" class="upload-preview">
<div v-else class="upload-preview-placeholder">
<img :src="require('@/assets/images/system/default-img.jpg')" class="placeholder-img">
</div>
@ -154,10 +155,15 @@
<el-table-column type="selection" align="center" width="55" />
<el-table-column prop="coverImage" label="封面" align="center">
<template slot-scope="scope">
<img
<!-- <img
style="height:80px;display:block;margin:0 auto;"
:src="scope.row.coverImage ? `${baseApi}/api/fileRelevant/getImg?imgType=2&imgId=${scope.row.coverImage}` : require('@/assets/images/system/default-img.jpg')"
alt="封面"
> -->
<img
style="height:80px;display:block;margin:0 auto;"
:src="scope.row.coverImage ? `${imgHttpsUrl}${scope.row.coverImage}` : require('@/assets/images/system/default-img.jpg')"
alt="封面"
>
</template>
</el-table-column>

4
src/views/weChatMiniProgram/activityLog.vue

@ -38,8 +38,8 @@
</el-table-column> -->
<!-- width="260" :show-overflow-tooltip="true" -->
<el-table-column label="活动标题" prop="title" min-width="260" :show-overflow-tooltip="true" />
<el-table-column prop="readCardNo" label="读者证号" />
<el-table-column prop="readName" label="读者昵称" />
<!-- <el-table-column prop="readCardNo" label="读者证号" />
<el-table-column prop="readName" label="读者昵称" /> -->
<el-table-column prop="signName" label="姓名" />
<el-table-column prop="signPhone" label="联系方式" />
<el-table-column prop="signNum" label="参加人数" />

267
src/views/weChatMiniProgram/reservation.vue

@ -61,25 +61,81 @@
<el-card class="reservation-card">
<div slot="header" style="display: flex; justify-content: space-between; align-items: center; width: 100%;">
<span>临时闭馆设置</span>
<el-button size="mini" @click="closedDialogVisible = true">
<div>
<el-button size="mini" @click="handleAdd">
<i class="iconfont icon-xinzeng" />
新增
</el-button>
<el-button size="mini" :disabled="!selectedRow" @click="handleEdit">
<i class="iconfont icon-bianji" />
编辑
</el-button>
</div>
</div>
<!-- 查询条件区域 -->
<div style="padding:12px 20px;display:flex;gap:12px;align-items:center">
<el-date-picker
v-model="searchDateRange"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
style="width:260px"
/>
<el-input
v-model="query"
placeholder="输入关键字搜索"
clearable
style="width:240px"
@clear="resetSearch"
@keyup.enter.native="handleSearch"
/>
<el-button class="filter-item filter-search" size="mini" type="success" icon="el-icon-search" @click="handleSearch">搜索</el-button>
<el-button class="filter-item filter-refresh" size="mini" type="warning" icon="el-icon-refresh-left" @click="resetSearch">重置</el-button>
</div>
<div style="padding: 20px;">
<el-table ref="table" v-loading="closedLoading" highlight-current-row style="width: 100%;" height="calc(100vh - 234px)" :data="closedTableData">
<el-table-column prop="closeTime" label="闭馆日期" width="160px">
<div style="padding: 0 20px 10px;">
<el-table
ref="table"
v-loading="closedLoading"
highlight-current-row
style="width: 100%;"
height="calc(100vh - 360px)"
:data="closedTableData"
@selection-change="selectionChangeHandler"
@row-click="clickRowHandler"
@row-dblclick="handleDbClick"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="closureStartDate" label="闭馆开始时间" width="160px">
<template slot-scope="scope">
<div>{{ scope.row.closureStartDate | parseTime }}</div>
</template>
</el-table-column>
<el-table-column prop="closureEndDate" label="闭馆结束时间" width="160px">
<template slot-scope="scope">
<div>{{ scope.row.closeTime | parseTime }}</div>
<div>{{ scope.row.closureEndDate | parseTime }}</div>
</template>
</el-table-column>
<el-table-column prop="phone" label="闭馆公告" />
<el-table-column prop="title" label="闭馆标题" width="200" show-overflow-tooltip />
<el-table-column prop="content" label="闭馆公告" show-overflow-tooltip />
</el-table>
<!-- 分页组件 -->
<el-pagination
:page-size.sync="pageSize"
:total="total"
:current-page.sync="page"
style="margin-top: 8px;"
:page-sizes="[10, 20, 30, 40]"
layout="total, sizes, prev, pager, next"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</el-card>
<el-dialog
title="新增临时闭馆"
:title="dialogTitle"
class="closed-dialog"
:visible.sync="closedDialogVisible"
width="600px"
@ -91,25 +147,36 @@
<el-form-item label="闭馆日期" prop="closeTime">
<el-date-picker
v-model="closedForm.closeTime"
type="date"
placeholder="选择日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
type="datetimerange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="['00:00:00', '23:59:59']"
:disabled="dialogMode === 'view'"
/>
</el-form-item>
<el-form-item label="闭馆标题" prop="title">
<el-input
v-model="closedForm.title"
type="text"
placeholder="请输入闭馆标题"
style="width: 480px;"
:disabled="dialogMode === 'view'"
/>
</el-form-item>
<el-form-item label="闭馆公告" prop="reason">
<el-form-item label="闭馆公告" prop="content">
<el-input
v-model="closedForm.reason"
v-model="closedForm.content"
type="textarea"
:rows="5"
placeholder="请输入闭馆公告"
style="width: 480px;"
:disabled="dialogMode === 'view'"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer" style="margin-top: 20px;">
<el-button @click="beforeClose">取消</el-button>
<el-button type="primary" @click="confirmAdd">确认</el-button>
<el-button v-if="dialogMode !== 'view'" type="primary" @click="confirmAdd">确认</el-button>
</div>
</el-dialog>
@ -117,8 +184,9 @@
</template>
<script>
import { FetchInitLibraryReservationSettings, FetchSaveLibraryReservationSettings } from '@/api/weixin'
import { FetchInitLibraryReservationSettings, FetchSaveLibraryReservationSettings, FetchEditClosureNotice, FetchInitClosureNotice } from '@/api/weixin'
import { mapGetters } from 'vuex'
import { parseTime } from '@/utils/index'
export default {
name: 'Reservation',
@ -140,14 +208,27 @@ export default {
closedTableData: [],
closedLoading: false,
closedDialogVisible: false,
dialogMode: 'add', // add / edit / view
dialogTitle: '新增临时闭馆',
selectedRow: null, //
closedForm: {
id: null,
closeTime: '',
reason: ''
content: '',
title: ''
},
rules: {
closeTime: [{ required: true, message: '请选择闭馆日期', trigger: 'blur' }],
reason: [{ required: true, message: '请输入闭馆公告', trigger: 'blur' }]
}
closeTime: [{ required: true, message: '请选择闭馆日期', trigger: 'change' }],
title: [{ required: true, message: '请输入闭馆标题', trigger: 'blur' }],
content: [{ required: true, message: '请输入闭馆公告内容', trigger: 'blur' }]
},
page: 1,
pageSize: 10,
total: 0,
searchDateRange: [], // [start,end]
startTime: '',
endTime: '',
query: ''
}
},
computed: {
@ -158,9 +239,10 @@ export default {
},
mounted() {
this.initReservationSettings()
this.initClosureNotice()
},
methods: {
// HH:mm:ss HH:mm
// HH:mm:ss HH:mm
formatTimeDisplay(timeStr) {
if (timeStr === '全天') return '全天'
// "08:30:00 - 12:00:00" "08:30 - 12:00"
@ -327,11 +409,152 @@ export default {
this.$message.info(`${day.name}已勾选,未设置时段保存将默认为全天`)
}
},
confirmAdd() {
this.$refs.closedForm.validate((valid) => {
//
async initClosureNotice() {
this.closedLoading = true
const params = {
page: this.page - 1,
pageSize: this.pageSize,
startTime: this.startTime,
endTime: this.endTime,
query: this.query
}
try {
const res = await FetchInitClosureNotice(params)
console.log('FetchInitClosureNotice', res)
if (res.content) {
this.closedTableData = res.content
this.total = res.totalElements
} else {
this.closedTableData = res || []
this.total = res.length || 0
}
//
this.$refs.table.clearSelection()
this.selectedRow = null
} catch (e) {
console.error(e)
} finally {
this.closedLoading = false
}
},
//
handleSearch() {
if (this.searchDateRange?.length === 2) {
this.startTime = this.searchDateRange[0] + ' 00:00:00'
this.endTime = this.searchDateRange[1] + ' 23:59:59'
} else {
this.startTime = ''
this.endTime = ''
}
this.page = 1
this.initClosureNotice()
},
//
resetSearch() {
this.searchDateRange = []
this.startTime = ''
this.endTime = ''
this.query = ''
this.page = 1
this.initClosureNotice()
},
//
handleSizeChange(val) {
this.pageSize = val
this.page = 1
this.initClosureNotice()
},
//
handleCurrentChange(val) {
this.page = val
this.initClosureNotice()
},
// ================
selectionChangeHandler(rows) {
if (rows.length === 1) {
this.selectedRow = rows[0]
} else {
this.selectedRow = null
}
},
clickRowHandler(row) {
this.$refs.table.clearSelection()
this.$refs.table.toggleRowSelection(row, true)
},
handleDbClick(row) {
//
this.openDialog('view', row)
},
// ================
handleAdd() {
this.openDialog('add')
},
handleEdit() {
if (!this.selectedRow) {
this.$message.warning('请先选择一条记录')
return
}
this.openDialog('edit', this.selectedRow)
},
openDialog(mode, row = null) {
this.dialogMode = mode
if (mode === 'add') {
this.dialogTitle = '新增临时闭馆'
this.closedForm.id = null
this.closedForm.closeTime = ''
this.closedForm.title = ''
this.closedForm.content = ''
} else {
if (mode === 'edit') {
this.dialogTitle = '编辑临时闭馆'
} else if (mode === 'view') {
this.dialogTitle = '查看临时闭馆'
}
//
this.closedForm.id = row.id
// datetimerange
this.closedForm.closeTime = [row.closureStartDate, row.closureEndDate]
this.closedForm.title = row.title
this.closedForm.content = row.content
}
this.closedDialogVisible = true
},
// /
async confirmAdd() {
this.$refs.closedForm.validate(async(valid) => {
if (valid) {
console.log(this.closedForm)
const [startDt, endDt] = this.closedForm.closeTime
const params = {
libcode: this.user.fonds.fondsNo,
id: this.closedForm.id, // idnull
closureStartDate: parseTime(startDt),
closureEndDate: parseTime(endDt),
title: this.closedForm.title,
content: this.closedForm.content
}
console.log('FetchEditClosureNotice', params)
try {
const res = await FetchEditClosureNotice(params)
console.log('FetchEditClosureNotice res', res)
if (res) {
this.$message.success('保存成功')
this.closedDialogVisible = false
this.initClosureNotice()
} else {
this.$message.error(res.msg || '保存失败')
}
} catch (err) {
console.error(err)
this.$message.error('保存异常,请重试')
}
} else {
console.log('校验失败')
}

63
src/views/weChatMiniProgram/reservationLog.vue

@ -2,7 +2,7 @@
<div class="app-container row-container" style="height: calc(100vh - 140px);">
<!--工具栏-->
<div class="head-container">
<div class="head-search">
<div class="head-search" style="align-items: center;">
<!-- 搜索 -->
<el-select v-model="query.status" clearable size="small" placeholder="状态" class="filter-item" style="width: 100px" @change="crud.toQuery">
<i slot="prefix" class="iconfont icon-zhuangtai" />
@ -10,6 +10,8 @@
</el-select>
<el-input v-model="query.search" clearable size="small" placeholder="输入检索条件检索" prefix-icon="el-icon-search" style="width: 220px;" class="filter-item" @clear="crud.toQuery" @keyup.enter.native="crud.toQuery" />
<rrOperation />
<el-button class="filter-item filter-refresh" size="mini" type="warning" icon="el-icon-refresh-left" @click="handleMyReset">重置</el-button>
<el-checkbox v-model="query.isCancel" @change="crud.toQuery">用户是否取消</el-checkbox>
</div>
<!-- <crudOperation :permission="permission" /> -->
</div>
@ -27,18 +29,27 @@
@row-click="clickRowHandler"
>
<el-table-column type="selection" align="center" width="55" />
<el-table-column prop="readCardNo" label="读者证号" />
<el-table-column prop="readName" label="读者昵称" />
<el-table-column prop="phone" label="联系方式" />
<!-- <el-table-column prop="contact" label="联系方式" /> -->
<el-table-column prop="create_time" label="预约日期">
<el-table-column prop="fondsName" label="预约馆" />
<el-table-column prop="bindValue" label="读者证号" />
<el-table-column prop="nickname" label="读者昵称" />
<el-table-column prop="specificDate" label="预约日期">
<template slot-scope="scope">
<div>{{ scope.row.create_time | parseTime }}</div>
<div>{{ scope.row.specificDate | parseTime('{y}-{m}-{d}') }}</div>
</template>
</el-table-column>
<el-table-column prop="status" label="预约状态" width="100" align="center">
<el-table-column prop="startTime" label="预约时间">
<template slot-scope="scope">
<span v-if="scope.row.status === 0" class="row-state row-lending state-active">已取消</span>
<div>
{{ scope.row.startTime ? scope.row.startTime.substring(0,5) : '' }}
-
{{ scope.row.endTime ? scope.row.endTime.substring(0,5) : '' }}
</div>
</template>
</el-table-column>
<el-table-column prop="isCancel" label="预约状态" width="100" align="center">
<template slot-scope="scope">
<span v-if="scope.row.isCancel === true" class="row-state row-lending state-active">已取消</span>
<span v-else>-</span>
</template>
</el-table-column>
</el-table>
@ -62,14 +73,14 @@ export default {
name: 'ReservationLog',
components: { rrOperation, pagination },
cruds() {
return CRUD({ title: '预约入馆日志', url: 'api/screenSetting/initScreenBookRecommend2', crudMethod: { ...crudWeChat },
return CRUD({ title: '预约入馆日志', url: 'api/weixin/reservationLog', crudMethod: { ...crudWeChat },
optShow: {
add: false,
edit: false,
del: false,
download: false,
group: false,
reset: true
reset: false
}
})
},
@ -77,8 +88,9 @@ export default {
data() {
return {
statusOptions: [
{ key: 0, display_name: '未开始' },
{ key: 1, display_name: '进行中' },
{ key: 0, display_name: '已取消' }
{ key: 2, display_name: '已结束' }
],
permission: { add: [], edit: [], del: [] }
}
@ -90,30 +102,13 @@ export default {
])
},
methods: {
handleMyReset() {
this.crud.resetQuery()
this.crud.query.isCancel = false
this.crud.toQuery()
},
[CRUD.HOOK.beforeRefresh]() {
this.crud.params.libcode = this.user.fonds.fondsNo
const mockData = [
{
id: 1,
name: '张三',
contact: '13800000000',
title: '读书分享会',
number: 4,
status: 1,
create_time: '2026-01-10 10:00:00'
},
{
id: 2,
name: '李四',
contact: '13800000001',
title: '新书发布会',
number: 1,
status: 0,
create_time: '2026-01-12 14:30:00'
}
]
this.crud.data = mockData
this.crud.loading = false
},
//
[CRUD.HOOK.afterToCU](crud, form) {

Loading…
Cancel
Save