<template> <div class="createPost-container"> <el-form ref="postForm" :model="postForm" :rules="rules" class="form-container"> <sticky :class-name="'sub-navbar '+postForm.status"> <el-button v-loading="loading" style="margin-left: 10px;" type="success" @click="submitForm">保存 </el-button> </sticky> <div class="createPost-main-container"> <el-row :gutter="20"> <el-card class="box-card"> <div slot="header" class="clearfix"> <span>小组相关</span> </div> <el-row> <el-col :span="24"> <el-form-item style="margin-bottom: 20px;" prop="name"> <MDinput v-model="postForm.name" :maxlength="100" name="name" required> 小组名称 </MDinput> </el-form-item> <div class="postInfo-container"> <el-row> <el-col :span="8"> <el-form-item label-width="75px" label="明星称号:" class="postInfo-container-item"> <el-select v-model="star" :remote-method="getRemoteStarList" filterable remote multiple clearable reserve-keyword value-key="id" placeholder="搜索明星" style="width: 100%"> <el-option v-for="(item,index) in starListOptions" :key="item+index" :label="item" :value="item"/> </el-select> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label-width="75px" label="小组组长:" class="postInfo-container-item" prop="user"> <el-select v-model="user" :remote-method="getRemoteUserList" filterable remote clearable value-key="id" placeholder="搜索用户" style="width: 100%"> <el-option v-for="(item,index) in userListOptions" :key="item+index" :label="item" :value="item"/> </el-select> </el-form-item> </el-col> <el-col :span="8"> <el-form-item style="margin-bottom: 20px;" label-width="75px" label="组员数量:" prop="user_nums"> <el-input v-model="postForm.user_nums" type="number" placeholder="请输入内容" style="width: 230px;" disabled/> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="8"> <el-form-item style="margin-bottom: 20px;" label-width="75px" label="下线小组:"> <el-radio-group v-model="postForm.is_online"> <el-radio :label="0">是</el-radio> <el-radio :label="1">否</el-radio> </el-radio-group> </el-form-item> </el-col> <el-col :span="8"> <el-form-item style="margin-bottom: 20px;" label-width="75px" label="推荐小组:"> <el-radio-group v-model="postForm.is_recommend"> <el-radio :label="1">是</el-radio> <el-radio :label="0">否</el-radio> </el-radio-group> </el-form-item> </el-col> <el-col :span="8"> </el-col> </el-row> </div> </el-col> </el-row> <el-form-item style="margin-bottom: 20px;" label-width="75px" label="小组简介:"> <el-input :rows="1" v-model="postForm.description" type="textarea" class="article-textarea" autosize placeholder="请输入内容"/> <span v-show="contentShortLength" class="word-counter">{{ contentShortLength }}字</span> </el-form-item> <div style="margin-bottom: 20px;"> <el-form-item style="margin-bottom: 40px;" label-width="75px" label="小组头像:" prop="icon"> <span v-model="uploadType"></span> <Upload v-model="postForm.icon" :uploadType="uploadType"/> </el-form-item> </div> </el-card> </el-row> <el-row :gutter="20" style="margin-top:50px;"> <el-card class="box-card"> <div slot="header" class="clearfix"> <span>组员相关</span> </div> <div style="margin-bottom:50px;"> <div class="filter-container"> <el-select v-model="temp_user_ids" :remote-method="getRemoteUserList" filterable remote value-key="id" placeholder="用户" style="width: 220px"> <el-option v-for="(item,index) in userListOptions" :key="item+index" :label="item" :value="item"/> </el-select> <el-button v-waves class="filter-item" type="primary" icon="el-icon-edit" @click="appendUser">添加 </el-button> <el-button v-waves class="filter-item" type="primary" icon="el-icon-delete" @click="delUser">移除 </el-button> </div> <el-table :data="data" border fit highlight-current-row style="width: 100%" ref="multipleTable" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="76" align="center"></el-table-column> <el-table-column align="center" label="用户ID "> <template slot-scope="scope"> <router-link :to="'/user/edit/'+scope.row.user_id" class="link-type"> <span>{{ scope.row.user_id }}</span> </router-link> </template> </el-table-column> <el-table-column align="center" label="用户名"> <template slot-scope="scope"> <span>{{ scope.row.nick_name }}</span> </template> </el-table-column> <el-table-column align="center" label="联系电话"> <template slot-scope="scope"> <span>{{ scope.row.phone }}</span> </template> </el-table-column> <el-table-column align="center" label="发布帖子数"> <template slot-scope="scope"> <span>{{ scope.row.topic_nums }}</span> </template> </el-table-column> <el-table-column align="center" label="用户身份"> <template slot-scope="scope"> <span>{{ scope.row.user_identify }}</span> </template> </el-table-column> <!--<el-table-column align="center" label="组内身份" v-if="isEdit">--> <!--<template slot-scope="scope">--> <!--<span>{{ scope.row.group_identify }}</span>--> <!--</template>--> <!--</el-table-column>--> <el-table-column align="center" min-width="200px" label="组内身份" v-if="isEdit"> <template slot-scope="scope"> <template v-if="scope.row.edit"> <el-select v-model="scope.row.group_identify" :placeholder="'组内身份'" clearable class="filter-item edit-select" style="width: 160px"> <el-option v-for="item in GroupIndentify" :key="item.key" :label="item.display_name" :value="item.key"/> </el-select> <el-button class="cancel-btn" size="small" icon="el-icon-refresh" type="warning" @click="cancelEdit(scope.row)">取消 </el-button> </template> <span v-else>{{ scope.row.group_identify }}</span> </template> </el-table-column> <el-table-column align="center" label="操作"> <template slot-scope="scope"> <el-button v-if="scope.row.edit" type="success" size="small" icon="el-icon-circle-check-outline" @click="confirmEdit(scope.row)">确认 </el-button> <el-button v-else type="primary" size="small" icon="el-icon-edit" @click="scope.row.edit=!scope.row.edit">修改 </el-button> </template> </el-table-column> </el-table> <pagination v-show="total>0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" style="margin-left: 250px;" @pagination="getList"/> </div> </el-card> </el-row> </div> </el-form> </div> </template> <script> import MDinput from '@/components/MDinput' import Upload from '@/components/Upload/singleImage3' import Sticky from '@/components/Sticky' // 粘性header组件 import waves from '@/directive/waves' import Pagination from '@/components/Pagination' import {isInArray, removeByvale} from "@/utils"; import {createGroup, GroupDetail, fetchGroupRelateduser, GroupUserDetail, ModifyGroupIdentify} from '@/api/group' import {starSearch, userSearch} from '@/api/remoteSearch' const defaultForm = { status: 'draft', name: '', // 小组名称 description: '', // 小组简介 id: undefined, user_nums: 0, user: '', star: [], icon: '', is_online: 0, is_recommend: 0, group_users: [], } const GroupIndentify = [ {'key': 0, 'display_name': '创始人'}, {'key': 1, 'display_name': '长老'}, {'key': 2, 'display_name': '用户'}, {'key': 3, 'display_name': '访客'}, ]; const GroupTypeKeyValue = GroupIndentify.reduce((acc, cur) => { acc[cur.key] = cur.display_name return acc }, {}); export default { name: 'GroupDetail', components: {MDinput, Sticky, Pagination, Upload}, directives: {waves}, props: { isEdit: { type: Boolean, default: false } }, data() { const validateRequire = (rule, value, callback) => { if (value === '') { this.$message({ message: rule.field + '为必传项', type: 'error' }) callback(new Error(rule.field + '为必传项')) } else { callback() } } return { postForm: Object.assign({}, defaultForm), loading: false, rules: { name: [{validator: validateRequire, trigger: 'blur'}], icon: [{validator: validateRequire, trigger: 'blur'}], }, user: '', star: [], temp_user_ids: '', group_users: [], group_identify: '', tempRoute: {}, uploadType: 98, starListOptions: [], userListOptions: [], // 小组相关 list: null, tableData: [], del_list: [], total: 0, listLoading: true, multipleSelection: [], listQuery: { page: 0, limit: 10, filter: { value: '', key: '', }, }, GroupIndentify: GroupIndentify, } }, computed: { contentShortLength() { return this.postForm.description.length }, data() { return this.tableData.filter((d) => { let is_del = false; for (let i = 0; i < this.del_list.length; i++) { if (d.user_id == this.del_list[i].user_id) { is_del = true; break } } if (!is_del) { return d } }) } }, created() { if (this.isEdit) { const id = this.$route.params && this.$route.params.id this.fetchData(id) this.getList() } else { this.postForm = Object.assign({}, defaultForm) } this.tempRoute = Object.assign({}, this.$route) }, methods: { fetchData(id) { GroupDetail(id).then(response => { let rep = response.data.data this.postForm = response.data.data if (rep.creator.id && rep.creator.name){ this.user = rep.creator.id + ':' + rep.creator.name }else{ this.user = '' } for (let i = 0; i < rep.star.length; i++) { this.star.push(rep.star[i]['id'] + ':' + rep.star[i]['name']) } }).catch(err => { console.log(err) }) }, submitForm() { this.$refs.postForm.validate(valid => { if (valid) { this.loading = true if (this.user === '') { this.$message.error('小组组长必须填') this.loading = false; return false; } this.postForm.user = this.user this.postForm.star = JSON.stringify(this.star) this.postForm.group_users = JSON.stringify(this.group_users); createGroup(this.postForm).then(response => { this.$notify({ title: '成功', message: response.data.data.message, type: 'success', duration: 2000 }) setTimeout(() => { this.$router.push('/group/list') }, 1000) }).catch(err => { this.$notify({ title: '失败', message: '操作失败', type: 'danger', duration: 2000 }) }); this.postForm.status = 'published' this.loading = false } else { console.log('error submit!!') return false } }) }, // 添加组员相关 handleSelectionChange(val) { this.multipleSelection = val; }, handleSizeChange(val) { this.listQuery.limit = val this.getList() }, handleCurrentChange(val) { this.listQuery.page = val this.getList() }, appendUser() { if (this.temp_user_ids == "") { this.$message.error('还没输入用户呢~~') this.temp_user_ids = '' return false } let append_user_id = parseInt(this.temp_user_ids.split(':')[0]) for (let i = 0; i < this.tableData.length; i++) { if (append_user_id == this.tableData[i].user_id) { this.$message.error('存在同样数据, 请勿重复操作') this.temp_user_ids = '' return false; } } GroupUserDetail(this.temp_user_ids).then(response => { if (!response.data.data) return if (!response.data.data[0].user_id) { this.$message.error('这条数据错误, 请换条数据') return } this.tableData.push(...response.data.data) this.total = this.tableData.length this.group_users.push(this.temp_user_ids) this.temp_user_ids = '' }) }, delUser() { let origin_user_ids = []; var left_user_ids = []; let select_user_ids = [] for (let i = 0 ;i < this.multipleSelection.length ;i++){ if (this.multipleSelection[i].group_identify === '管理员'){ this.$message.error('请先更换管理员,在进行移除操作~') return false } } this.del_list.push(...this.multipleSelection) for (let i = 0; i < this.tableData.length; i++) { origin_user_ids.push(this.tableData[i].user_id + ':' + this.tableData[i].nick_name) } for (let i = 0; i < this.multipleSelection.length; i++) { select_user_ids.push(this.multipleSelection[i].user_id + ':' + this.multipleSelection[i].nick_name) } for (let i = 0; i < origin_user_ids.length; i++) { if (!isInArray(select_user_ids, origin_user_ids[i])) { left_user_ids.push(origin_user_ids[i]) } } this.group_users = left_user_ids; }, getList() { this.listLoading = true this.listQuery.id = this.$route.params && this.$route.params.id fetchGroupRelateduser(this.listQuery).then(response => { let rep = response.data.data.data this.total = response.data.data.total this.tableData = response.data.data.data.map(v => { this.$set(v, 'edit', false) v.original_group_identify = v.group_identify return v }) for (let i = 0; i < rep.length; i++) { this.group_users.push(rep[i].user_id + ':' + rep[i].nick_name) } this.listLoading = false }) }, // 远程搜索 getRemoteUserList(query) { userSearch(query).then(response => { if (!response.data.data.data) return this.userListOptions = response.data.data.data }) }, getRemoteStarList(query) { starSearch(query).then(response => { if (!response.data.data.data) return this.starListOptions = response.data.data.data }) }, cancelEdit(row) { row.group_identify = row.original_group_identify row.edit = false this.$message({ message: '取消成功', type: 'warning' }) }, confirmEdit(row) { row.edit = false row.original_group_identify = row.group_identify row.group_identify = GroupTypeKeyValue[row.group_identify] row.group_id = this.postForm.id this.$message({ message: '修改成功', type: 'success' }) ModifyGroupIdentify(row).then(response => { setTimeout(() => { this.$router.go(0) }, 1000) }).catch(err => { }) }, } } </script> <style rel="stylesheet/scss" lang="scss" scoped> @import "src/styles/mixin.scss"; .createPost-container { position: relative; .createPost-main-container { padding: 40px 45px 20px 50px; .postInfo-container { position: relative; @include clearfix; margin-bottom: 10px; .postInfo-container-item { float: left; } } .editor-container { min-height: 500px; margin: 0 0 30px; .editor-upload-btn-container { text-align: right; margin-right: 10px; .editor-upload-btn { display: inline-block; } } } } .word-counter { width: 40px; position: absolute; right: -10px; top: 0px; } } .edit-select { padding-right: 50px; } .cancel-btn { position: absolute; right: 15px; top: 10px; } </style>