first commit

This commit is contained in:
2026-09-20 15:46:34 +08:00
parent 72fb5eae10
commit e558339dcc
3340 changed files with 671310 additions and 251 deletions
@@ -0,0 +1,784 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.w-e-text-container {
height: 200px !important;
}
input[type="file"] {
display: none
}
</style>
<div id="app" v-cloak>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
v-model="pageForm.searchKeyword">
<el-select placeholder="查询类型" slot="prepend" style="width: 120px;"
v-model="pageForm.searchName">
<el-option label="协会名称" value="club.name"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-button @click="doSearch" icon="el-icon-search" type="primary"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<!--#if(@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')){#-->
<el-button @click="openAdd" icon="el-icon-plus">创建协会</el-button>
<!--#}#-->
</div>
</el-row>
<el-row class="el-table-container">
<el-table :data="tableData" @sort-change="pageOrder" row-key="id" style="width: 100%"
v-loading="tabloading">
<el-table-column align="center" header-align="center" label="序号" type="index">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="协会名称"
prop="name" width="300px"></el-table-column>
<el-table-column align="center" header-align="center" label="成立时间" prop="create_time" show-overflow-tooltip
sortable
width="100px"></el-table-column>
<el-table-column align="center" header-align="center" label="主要负责人" prop="fzrname" show-overflow-tooltip
sortable></el-table-column>
<el-table-column align="center" header-align="center" label="负责人单位" prop="fzr_unit_name"
show-overflow-tooltip
sortable></el-table-column>
<el-table-column align="center" header-align="center" label="负责人电话" prop="fzr_mobile"
show-overflow-tooltip></el-table-column>
<el-table-column align="center" header-align="center" label="负责人邮箱" prop="fzr_email"
show-overflow-tooltip></el-table-column>
<el-table-column align="center" header-align="center" label="协会人数" prop="cynum" show-overflow-tooltip
sortable
width="100px"></el-table-column>
<el-table-column align="center" header-align="center" label="状态" prop="isjs" show-overflow-tooltip
sortable
width="100px">
<template slot-scope="scope">
<el-tooltip content="正常" placement="top" v-if="!scope.row.isjs">
<i class="fa fa-circle text-success ml5"></i>
</el-tooltip>
<el-tooltip content="已解散" placement="top" v-else>
<i class="fa fa-circle text-danger ml5"></i>
</el-tooltip>
</template>
</el-table-column>
<!--#if(@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')){#-->
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="300px">
<template slot-scope="scope">
<el-button @click="openDetail(scope.row.id)" size="mini">查看</el-button>
<el-button @click="openEdit(scope.row.id)" size="mini" type="primary" v-if="!scope.row.isjs">编辑
</el-button>
<el-button @click="doDelete(scope.row.id)" size="mini" type="danger">删除</el-button>
<el-button @click="doDissolve(scope.row.id)" size="mini" type="danger" v-if="!scope.row.isjs">解散
</el-button>
</template>
</el-table-column>
<!--#}else if(@shiro.hasRole('D02')){#-->
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="200px">
<template slot-scope="scope">
<el-button @click="openDetail(scope.row.id)" size="mini">查看</el-button>
<el-button @click="openEdit(scope.row.id)" size="mini" type="primary" v-if="!scope.row.isjs">编辑
</el-button>
</template>
</el-table-column>
<!--#}#-->
</el-table>
</el-row>
<el-row class="el-pagination-container">
<el-pagination
:current-page="pageForm.pageNumber"
:page-size="pageForm.pageSize"
:page-sizes="[10, 20, 30, 50]"
:total="pageForm.totalCount"
@current-change="pageNumberChange"
@size-change="pageSizeChange"
layout="total, sizes, prev, pager, next">
</el-pagination>
</el-row>
<el-dialog
:close-on-click-modal="false"
:visible.sync="addDialogVisible"
title="创建协会" top="3%" width="60%">
<el-divider content-position="left"><span style="color: rgb(121, 187, 255)">请填写以下协会信息</span>
</el-divider>
<el-form :model="formData" :rules="formRules" label-position="top" label-width="120px" ref="addForm"
size="small"
style="padding: 0 30px">
<el-row gutter="30">
<el-col :span="12">
<el-form-item label="协会名称" prop="name">
<el-input maxlength="100" placeholder="请输入协会名称" type="text"
v-model="formData.name"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="协会类型" prop="type">
<el-select placeholder="请选择协会类型" style="width: 100%"
v-model="formData.type">
<el-option
:key="item.id"
:label="item.name"
:value="item.code"
v-for="item in typeOptions">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="30">
<el-col :span="12">
<el-form-item label="协会负责人" prop="fzr">
<el-select
:loading="userLoading"
:remote-method="userRemoteMethod"
@change="fzrChange"
filterable
placeholder="请输入姓名或工号查找"
remote
reserve-keyword
style="width: 100%"
v-model="formData.fzr">
<el-option
:key="item.id"
:label="item.username+'('+item.loginname+')'"
:value="item.id"
v-for="item in userOptions">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="负责人单位" prop="fzr_unit_name">
<el-input disabled placeholder="" v-model="formData.fzr_unit_name"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="30">
<el-col :span="12">
<el-form-item label="负责人电话" prop="fzr_mobile">
<el-input placeholder="请填写负责人电话" v-model="formData.fzr_mobile"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :rules="[
{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }
]" label="负责人邮箱" prop="fzr_email">
<el-input placeholder="请填写负责人邮箱" type="email" v-model="formData.fzr_email"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="协会介绍" prop="stjs">
<div id="stjsEditor"></div>
</el-form-item>
<el-form-item label="协会章程" prop="stzc">
<div id="stzcEditor"></div>
</el-form-item>
<el-form-item label="附件上传" prop="accessory">
<el-upload
:auto-upload="false"
:file-list="fileList"
:on-change="handleChange"
:on-remove="handleRemove"
action="**"
limit="1"
name="file"
ref="upload">
<el-button size="small" type="primary">选择文件</el-button>
</el-upload>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button :disabled="subDis" @click="doAdd" type="primary">确 定</el-button>
</span>
</el-dialog>
<el-dialog
:close-on-click-modal="false"
:visible.sync="editDialogVisible"
title="修改协会信息" top="3%" width="60%">
<el-divider content-position="left"><span style="color: rgb(121, 187, 255)">请填写以下协会信息</span>
</el-divider>
<el-form :model="formData" :rules="formRules" label-position="top" label-width="120px" ref="editForm"
size="small"
style="padding: 0 30px">
<el-row gutter="30">
<el-col :span="12">
<el-form-item label="协会名称" prop="name">
<el-input maxlength="100" placeholder="请输入协会名称" type="text"
v-model="formData.name"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="协会类型" prop="type">
<el-select placeholder="请选择协会类型" style="width: 100%"
v-model="formData.type">
<el-option
:key="item.id"
:label="item.name"
:value="item.code"
v-for="item in typeOptions">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="30">
<el-col :span="12">
<el-form-item disabled label="协会负责人" prop="fzrname">
<el-input disabled placeholder="" v-model="formData.fzrname"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="负责人单位" prop="fzr_unit_name">
<el-input disabled placeholder="" v-model="formData.fzr_unit_name"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="30">
<el-col :span="12">
<el-form-item label="负责人电话" prop="fzr_mobile">
<el-input placeholder="请填写负责人电话" v-model="formData.fzr_mobile"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :rules="[
{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }
]" label="负责人邮箱" prop="fzr_email">
<el-input placeholder="请填写负责人邮箱" type="email" v-model="formData.fzr_email"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="协会介绍" prop="stjs">
<div id="stjsEditor2"></div>
</el-form-item>
<el-form-item label="协会章程" prop="stzc">
<div id="stzcEditor2"></div>
</el-form-item>
<el-form-item label="附件上传" prop="accessory">
<el-upload
:auto-upload="false"
:file-list="fileList"
:on-change="handleChange"
:on-exceed="function(files, fileList){
$notify({
title: '警告',
message: '最多可选择一个文件!',
type: 'warning'
});
}"
:on-remove="handleRemove"
action="**"
limit="1"
name="file" ref="upload">
<el-button size="small" type="primary">选择文件</el-button>
</el-upload>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="editDialogVisible = false">取 消</el-button>
<el-button :disabled="subDis" @click="doEdit" type="primary">确 定</el-button>
</span>
</el-dialog>
<el-dialog
:close-on-click-modal="false"
:visible.sync="viewDialogVisible"
custom-class="ViewDialogClass" title="详细信息" top="3%" width="60%">
<el-collapse accordion v-model="activeName">
<el-collapse-item name="1" title="协会详细信息">
<table class="tabInfo">
<tr>
<td class="title" colspan="4" style="font-size: 18px;">{{detailData.name}}</td>
</tr>
<tr>
<td class="title">协会负责人</td>
<td class="content">{{detailData.fzrname}}</td>
<td class="title">负责人单位</td>
<td class="content">{{detailData.fzr_unit_name}}</td>
</tr>
<tr>
<td class="title">负责人电话</td>
<td class="content">{{detailData.fzr_mobile}}</td>
<td class="title">负责人邮箱</td>
<td class="content">{{detailData.fzr_email}}</td>
</tr>
<tr>
<td class="title">成立时间</td>
<td class="content">{{detailData.create_time}}</td>
<td class="title">协会人数</td>
<td class="content">{{detailData.cynum}}</td>
</tr>
<tr>
<td class="title" colspan="4">协会介绍</td>
</tr>
<tr>
<td class="content" colspan="4">
<div class="textareaDiv" v-html="detailData.stjs"></div>
</td>
</tr>
<tr>
<td class="title" colspan="4">协会章程</td>
</tr>
<tr>
<td class="content" colspan="4">
<div class="textareaDiv" v-html="detailData.stzc"></div>
</td>
</tr>
</table>
</el-collapse-item>
<el-collapse-item name="2" title="协会成员列表">
<el-table :data="detailData.clubuser" :header-cell-style="{background:'#F5F5F5',color:'#606266'}" border
size="small">
<el-table-column align="center" header-align="center" label="人员身份" prop="sf" width="150px">
<template slot-scope="scope">
<el-lable v-if="scope.row.sf==1">负责人</el-lable>
<el-lable v-if="scope.row.sf==2">成员</el-lable>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="工号" prop="loginname"
width="150px"></el-table-column>
<el-table-column align="center" header-align="center" label="姓名" prop="username"
width="150px"></el-table-column>
<el-table-column align="center" header-align="center" label="性别" prop="sex"
width="150px"></el-table-column>
<el-table-column align="center" header-align="center" label="电话" prop="mobile"
width="150px"></el-table-column>
<el-table-column align="center" header-align="center" label="所属单位"
prop="unitname"></el-table-column>
<el-table-column align="center" header-align="center" label="是否缴费" prop="isjf"
width="150px">
<template slot-scope="scope">
<span class="text-success" v-if="scope.row.isjf">已缴费</span>
<span class="text-danger" v-else>未缴费</span>
</template>
</el-table-column>
</el-table>
</el-collapse-item>
</el-collapse>
<span class="dialog-footer" slot="footer">
<el-button @click="viewDialogVisible = false">关 闭</el-button>
</span>
</el-dialog>
</div>
<script>
var E = window.wangEditor
const vue = new Vue({
el: '#app',
data() {
return {
activeName: ['1'],
detailData: {clubuser: []},
typeOptions: [],
addDialogVisible: false,
editDialogVisible: false,
viewDialogVisible: false,
tabloading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "club.name",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
formRules: {
name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
type: [{required: false, message: '必填', trigger: ['blur', 'change']}],
fzr: [{required: true, message: '必填', trigger: ['blur', 'change']}],
fzr_unit_name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
fzrname: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
subDis: false,
userOptions: [],
userLoading: false,
fileList: [],
delFiles: [],
}
},
methods: {
openDetail(id) {
$.get(base + "/platform/sys/club/mange/findOne", {id}, (data) => {
if (data.code == 0) {
this.detailData = data.data
this.activeName = ['1']
this.viewDialogVisible = true
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
doDissolve(id) {
this.$confirm('确定要解散该协会吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: (a, b) => {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/club/mange/dissolve", {id: id}, (data) => {
if (data.code == 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData();
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
doDelete(id) {
this.$confirm('确定要删除该协会吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: (a, b) => {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/club/mange/delete", {id: id}, (data) => {
if (data.code == 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData();
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
doEdit() {
this.$refs["editForm"].validate((valid) => {
if (valid) {
var formdata = new FormData();
for (let key in this.formData) {
formdata.append(key, this.formData[key] ? this.formData[key] : '');
}
this.fileList.forEach(function (val) {
if (val.status === 'ready') {
formdata.append("files", val.raw, val.raw.name);
}
});
formdata.append("delFiles", this.delFiles)
this.subDis = true
const loading = this.$loading({
lock: true,
text: '数据提交中...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
$.ajax({
url: "/platform/sys/club/mange/doEdit",
type: "post",
data: formdata,
processData: false,
contentType: false,
success: (data) => {
this.subDis = false
loading.close()
if (data.code === 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData();
this.editDialogVisible = false;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
},
error: data => {
this.subDis = false
loading.close()
this.$message({
message: data.msg,
type: 'error'
});
}
});
}
});
},
openEdit(id) {
this.fileList = []
this.delFiles = []
this.userOptions = []
this.formData = {}
$.get(base + "/platform/sys/club/mange/findOne", {id}, (data) => {
if (data.code == 0) {
this.formData = data.data
//files
data.data.files.forEach(v => {
this.fileList.push({id: v.id, name: v.filename, url: v.filepath, status: 'success'})
})
this.editDialogVisible = true
this.$nextTick(() => {
$("#stjsEditor2").html("")
$("#stzcEditor2").html("")
var stjsEditor = new E("#stjsEditor2")
stjsEditor.config.onchange = (html) => {
this.formData.stjs = html
}
var stzcEditor = new E("#stzcEditor2")
stzcEditor.config.onchange = (html) => {
this.formData.stzc = html
}
stjsEditor.create()
stzcEditor.create()
stjsEditor.txt.html(data.data.stjs)
stzcEditor.txt.html(data.data.stzc)
})
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
doAdd() {
this.$refs["addForm"].validate((valid) => {
if (valid) {
var formdata = new FormData();
for (let key in this.formData) {
formdata.append(key, this.formData[key] ? this.formData[key] : '');
}
this.fileList.forEach(function (val) {
formdata.append("files", val.raw, val.raw.name);
});
this.subDis = true
const loading = this.$loading({
lock: true,
text: '数据提交中...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
$.ajax({
url: "/platform/sys/club/mange/doAdd",
type: "post",
data: formdata,
processData: false,
contentType: false,
success: (data) => {
this.subDis = false
loading.close()
if (data.code === 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData();
this.addDialogVisible = false;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
},
error: data => {
this.subDis = false
loading.close()
this.$message({
message: data.msg,
type: 'error'
});
}
});
}
});
},
handleRemove(file, fileList) {
this.fileList = fileList;
if (file.status === "success") {
this.delFiles.push(file.id);
}
},
handleChange(file, fileList) {
const delFile = () => {
for (let i = 0; i < fileList.length; i++) {
if (file === fileList[i]) {
fileList.splice(i, 1);
}
}
}
if (this.size === 0) {
this.$message.warning("您选择的是空文件!");
delFile()
}
if (!uploadFileType.includes(file.name.split('.')[1])) {
this.$message.warning("文件格式不支持!");
delFile()
}
this.fileList = fileList;
},
fzrChange(id) {
const user = this.userOptions.find(v => {
return v.id == id
})
this.$set(this.formData, 'fzr_unit_name', user.unitname)
this.$set(this.formData, 'fzr_mobile', user.mobile)
this.$set(this.formData, 'fzr_email', user.email)
},
async userRemoteMethod(query) {
if (query) {
this.userOptions = []
this.userLoading = true
this.userOptions = await searchUser(query)
this.userLoading = false
}
},
openAdd() {
this.fileList = []
this.delFiles = []
this.userOptions = []
this.formData = {}
this.addDialogVisible = true;
this.$nextTick(() => {
$("#stjsEditor").html("")
$("#stzcEditor").html("")
var stjsEditor = new E("#stjsEditor")
stjsEditor.config.onchange = (html) => {
this.formData.stjs = html
}
var stzcEditor = new E("#stzcEditor")
stzcEditor.config.onchange = (html) => {
this.formData.stzc = html
}
stjsEditor.create()
stzcEditor.create()
})
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
},
doSearch() {
this.tabKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
}
,
pageOrder(column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
}
,
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
}
,
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
}
,
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
this.tabloading = true
$.post(base + "/platform/sys/club/mange/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
this.tabloading = false
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
,
},
async created() {
this.typeOptions = await getClubType()
this.pageData();
}
})
</script>
<!--#
}
#-->