This commit is contained in:
那些花儿
2025-09-12 15:58:49 +08:00
parent 276f4b7190
commit 52715e3e9a
16 changed files with 653 additions and 27 deletions
@@ -6,7 +6,7 @@
<van-list v-if="tableData && tableData.length>0"
v-model="tableLoading"
:finished="tableFinished"
finished-text=""
finished-text="没有更多了"
@load="onLoad">
<div class="table-list-container">
<div v-for="(row, index) in tableData" :key="index" class="table-list-item">
@@ -0,0 +1,72 @@
<script>
module.exports = {
name: "index",
components: {
"drawer-user-scope": httpVueLoader("/components/module/activity/DrawerUserScope.vue")
},
props: {
value: {
type: [String, Number],
default: null
}
},
data() {
return {
groupOptions: [],
internalGroupId: null
}
},
watch: {
internalGroupId(newValue) {
this.$emit('update:value', newValue);
},
value:{
handler:function (val){
this.internalGroupId = val
},
immediate:true
}
},
methods: {
async listGroups() {
const {data} = await $.get("/platform/activity/basic/scope/getActivityUserScopeGroup")
this.groupOptions = data
},
onGroupChange(id) {
this.listGroups()
}
},
created() {
this.listGroups()
}
}
</script>
<template>
<div>
<div style="display: flex;">
<el-select placeholder="参加人员范围"
v-model="internalGroupId"
clearable
filterable>
<el-option v-for="item in groupOptions"
:label="item.groupName"
:value="item.groupId"
:key="item.groupId"
></el-option>
</el-select>
<el-button @click="$refs.drawerUserScope.userScopeDialog = true" type="primary" icon="el-icon-setting">设置
</el-button>
</div>
<drawer-user-scope
@group_change="onGroupChange"
ref="drawerUserScope"
:group_id.sync="internalGroupId"
></drawer-user-scope>
</div>
</template>
<style scoped>
</style>
@@ -354,6 +354,7 @@
)
Vue.component("snaker-chart", httpVueLoader("/components/plugins/snaker/snakerChart.vue?v=" + new Date().getTime()))
Vue.component("snaker-start", httpVueLoader("/components/plugins/snaker/snakerStart.vue?v=" + new Date().getTime()))
Vue.component("permission-group", httpVueLoader("/components/plugins/permissionGroup/index.vue?v=" + new Date().getTime()))
</script>
<style>
@@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
</html>
@@ -0,0 +1,135 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="名称">
<el-input placeholder="名称" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="数据列表">
<el-button type="primary" size="small" icon="el-icon-plus" @click="onOpen">新增</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" align="center" header-align="center" label="序号" type="index" width="80px"></el-table-column>
<el-table-column label="名称" prop="name" sortable></el-table-column>
<el-table-column label="模板内容" prop="template" width="400px"></el-table-column>
<el-table-column label="定时任务" prop="cron" width="150px"></el-table-column>
<el-table-column label="是否启用" prop="enabled" sortable width="150px">
<template scope="{row}">
<el-tag :type="row.enabled ? 'success' : 'danger'" size="mini">{{row.enabled ? '是' : '否'}}</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200px">
<template scope="{row}">
<el-button size="mini" type="primary" @click="onEdit(row)">修改</el-button>
<el-button size="mini" type="danger" @click="onDelete(row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</guava>
<el-dialog :title="formData.id ? '编辑' : '新增'" :visible.sync="dialogVisible" :close-on-click-modal="false" width="60%">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="80px">
<el-form-item label="名称" prop="name">
<el-input v-model="formData.name" placeholder="名称"></el-input>
</el-form-item>
<el-form-item label="模板内容" prop="template">
<el-input v-model="formData.template" placeholder="模板内容" type="textarea" rows="5"></el-input>
</el-form-item>
<el-form-item label="定时任务" prop="cron">
{{formData.cron}}
<el-select v-model="formData.cron" placeholder="请选择定时任务或者输入cron表达式" allow-create filterable>
<el-option label="早上8点" value="0 0 8 * * ?"></el-option>
<el-option label="早上9点" value="0 0 9 * * ?"></el-option>
<el-option label="早上10点" value="0 0 10 * * ?"></el-option>
</el-select>
</el-form-item>
<el-form-item label="是否启用" prop="enabled">
<el-switch v-model="formData.enabled"></el-switch>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="onSubmit">确 定</el-button>
</div>
</el-dialog>
</div>
<script>
new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
dialogVisible: false,
formRules: {
name: [{ required: true, message: "请输入名称", trigger: "blur" }],
template: [{ required: true, message: "请输入模板内容", trigger: "blur" }],
cron: [{ required: true, message: "请选择定时任务或者输入cron表达式", trigger: "blur" }],
enabled: [{ required: true, message: "请选择是否启用", trigger: "blur" }]
}
}
},
methods: {
onOpen() {
this.dialogVisible = true
this.$nextTick(() => {
this.formData = {}
this.$refs.formRef.resetFields()
})
},
onEdit(row) {
this.dialogVisible = true
this.$nextTick(() => {
this.formData = { ...row }
})
},
onSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$axios.post("/platform/birthdayWishes/plan/" + (this.formData.id ? "update" : "insert"), this.formData).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.dialogVisible = false
this.doSearch()
} else {
this.$message.error(res.msg)
}
})
}
})
},
onDelete(id) {
this.$confirm("确定删除吗?", "提示", {
type: "warning",
confirmButtonText: "确定",
cancelButtonText: "取消"
}).then(() => {
this.$axios.post("/platform/birthdayWishes/plan/delete", { id }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
} else {
this.$message.error(res.msg)
}
})
})
}
},
created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -7,7 +7,7 @@ layout("/layouts/platform.html"){
<el-card shadow="never">
<search @search="doSearch">
<search-item label="名称">
<el-input v-model="pageForm.displayName" placeholder="名称" clearable></el-input>
<el-input v-model="pageForm.searchKeyword" placeholder="名称" clearable></el-input>
</search-item>
</search>
</el-card>
@@ -41,18 +41,26 @@ layout("/layouts/platform.html"){
<el-form-item label="标题" prop="title" :rules="{ required: true, message: '请输入标题', trigger: 'blur' }">
<el-input v-model="formData.title" placeholder="请输入标题"></el-input>
</el-form-item>
<el-form-item label="封面图" prop="cover" :rules="{ required: true, message: '请上传封面图', trigger: 'blur' }">
<el-form-item label="封面图" prop="cover"
:rules="{ required: true, message: '请上传封面图', trigger: 'blur' }">
<file-upload
:value.sync="formData.cover"
:upload_number="1"
upload_mode="image"
upload_result_category="interval"
upload_result_type="url"
:value.sync="formData.cover"
:upload_number="1"
upload_mode="image"
upload_result_category="interval"
upload_result_type="url"
></file-upload>
</el-form-item>
<el-form-item label="内容" prop="content" :rules="{ required: true, message: '请输入内容', trigger: 'blur' }">
<el-form-item label="内容" prop="content"
:rules="{ required: true, message: '请输入内容', trigger: 'blur' }">
<text-editor v-model="formData.content"></text-editor>
</el-form-item>
<el-form-item label="可见人员" prop="groupId">
<permission-group :value.sync="formData.groupId"></permission-group>
</el-form-item>
<el-form-item label="外部链接" prop="link">
<el-input v-model="formData.link" placeholder="请输入外部链接" maxlength="255"></el-input>
</el-form-item>
<el-form-item label="是否启用" prop="enable">
<el-switch v-model="formData.enable"></el-switch>
</el-form-item>
@@ -82,10 +90,24 @@ layout("/layouts/platform.html"){
},
onEdit(row) {
this.dialogVisible = true
this.formData = { ...row }
this.formData = {...row}
},
onDelete(row) {
this.$confirm("您确定删除吗?", "提示", {
type: "warning",
confirmButtonText: "确定",
cancelButtonText: "取消"
}).then(() => {
this.$axios.post("/platform/huimin/manage/delete", {id: row.id}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
onSubmit() {
$.post("/platform/huimin/manage/" + (this.formData.id ? "update" : "insert"), { data: JSON.stringify(this.formData) }).then((res) => {
this.$axios.post("/platform/huimin/manage/" + (this.formData.id ? "update" : "insert"), {data: JSON.stringify(this.formData)}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
@@ -2,6 +2,61 @@
layout("/layouts/platform_h5.html"){
#-->
<style>
.detail-content {
padding: 16px;
max-height: 70vh;
overflow-y: auto;
}
.detail-cover {
margin-bottom: 16px;
border-radius: 8px;
overflow: hidden;
}
.detail-text {
margin-bottom: 16px;
}
.content-label {
font-size: 14px;
font-weight: 500;
color: #323233;
margin-bottom: 8px;
}
.content-html {
font-size: 14px;
line-height: 1.6;
color: #646566;
word-break: break-all;
}
.content-html p {
margin: 8px 0;
}
.detail-link {
margin-bottom: 16px;
}
.detail-info {
border-top: 1px solid #ebedf0;
padding-top: 12px;
}
.info-item {
font-size: 12px;
color: #969799;
margin-bottom: 4px;
}
.info-item:last-child {
margin-bottom: 0;
}
</style>
<div id="app" v-cloak>
<van-nav-bar title="惠民服务" left-text="返回" left-arrow @click-left="historyBack" placeholder fixed></van-nav-bar>
<van-sticky offset-top="46px">
@@ -10,19 +65,57 @@ layout("/layouts/platform_h5.html"){
:show-action="false"
:reverse-color="false"
input-align="left"
placeholder="请输入姓名/工号搜索"
placeholder="请输入关键字搜索"
@search="doSearch"
></van-search>
</van-sticky>
<table-list api="/platform/huimin/mine/pageData"
:page_form.sync="pageForm"
json
@ready="onReady"
img=""
img="cover"
ref="tableListRef">
<template v-slot="{index,row}">
<table-column label="标题">{{row.title}}</table-column>
</template>
<template #actions="{index,row}">
<div class="action-btn" @click="onView(row)">
<i class="fa fa-eye"></i>
<span>查看</span>
</div>
</template>
</table-list>
<!-- 详情弹出层 -->
<van-action-sheet v-model="showDetail" :title="currentItem.title">
<div class="detail-content">
<!-- 封面图片 -->
<div class="detail-cover" v-if="currentItem.cover">
<van-image :src="currentItem.cover" fit="cover" width="100%" height="200px"></van-image>
</div>
<!-- 内容 -->
<div class="detail-text" v-if="currentItem.content">
<div class="content-label">详细内容:</div>
<div class="content-html" v-html="currentItem.content"></div>
</div>
<!-- 外部链接 -->
<div class="detail-link" v-if="currentItem.link">
<van-button type="primary" block @click="openLink(currentItem.link)">
<van-icon name="link"></van-icon>
访问链接
</van-button>
</div>
<!-- 创建时间 -->
<div class="detail-info">
<div class="info-item">创建时间:{{ formatTime(currentItem.createdAt) }}</div>
<div class="info-item" v-if="currentItem.updatedAt !== currentItem.createdAt">更新时间:{{ formatTime(currentItem.updatedAt) }}</div>
</div>
</div>
</van-action-sheet>
</div>
<script>
@@ -39,12 +132,14 @@ layout("/layouts/platform_h5.html"){
delegationId: null,
roleId: null
},
showDetail: false,
currentItem: {}
}
},
methods: {
historyBack,
onReady(){
this.doSearch()
},
doSearch() {
this.$nextTick(() => {
@@ -52,6 +147,26 @@ layout("/layouts/platform_h5.html"){
this.pageForm.totalCount = 0
this.$refs.tableListRef.doSearch()
})
},
onView(row){
this.currentItem = row
this.showDetail = true
},
openLink(url) {
if (url) {
window.open(url, '_blank')
}
},
formatTime(timestamp) {
if (!timestamp) return ''
const date = new Date(timestamp)
return date.toLocaleString('zh-CN', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit'
})
}
}
})