|
@@ -1,50 +1,87 @@
|
|
|
<template>
|
|
<template>
|
|
|
<div class="page-container">
|
|
<div class="page-container">
|
|
|
<div class="page-header">
|
|
<div class="page-header">
|
|
|
- <h2 class="page-title">分组管理</h2>
|
|
|
|
|
- <el-button type="primary" icon="el-icon-plus" @click="showDialog = true">新建分组</el-button>
|
|
|
|
|
|
|
+ <div class="header-left">
|
|
|
|
|
+ <h2 class="page-title">分组管理</h2>
|
|
|
|
|
+ <el-select v-model="curClassId" placeholder="请选择班级" @change="loadGroups" style="width:200px; margin-left: 16px">
|
|
|
|
|
+ <el-option v-for="item in classes" :key="item.id" :label="item.name" :value="item.id" />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="header-right">
|
|
|
|
|
+ <el-button type="primary" icon="el-icon-plus" @click="showCreateDialog = true">新建分组</el-button>
|
|
|
|
|
+ <el-button type="success" icon="el-icon-refresh" @click="showRedistributeDialog = true">按签到重分</el-button>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <el-table :data="list" v-loading="loading" border stripe style="width:100%">
|
|
|
|
|
|
|
+ <el-table :data="groupRows" v-loading="loading" border stripe style="width:100%">
|
|
|
|
|
+ <el-table-column type="expand">
|
|
|
|
|
+ <template slot-scope="props">
|
|
|
|
|
+ <div style="padding: 10px 20px">
|
|
|
|
|
+ <el-table :data="props.row.members" border size="mini">
|
|
|
|
|
+ <el-table-column prop="name" label="姓名" />
|
|
|
|
|
+ <el-table-column prop="phone" label="手机" />
|
|
|
|
|
+ <el-table-column label="操作" width="100">
|
|
|
|
|
+ <template slot-scope="{ row }">
|
|
|
|
|
+ <el-button size="mini" type="danger" @click="handleRemoveMember(props.row, row)">移出</el-button>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ </el-table>
|
|
|
|
|
+ <div v-if="!props.row.members || props.row.members.length === 0" style="text-align: center; color: #999; padding: 10px">
|
|
|
|
|
+ 该组暂无成员
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
<el-table-column prop="id" label="ID" width="80" />
|
|
<el-table-column prop="id" label="ID" width="80" />
|
|
|
- <el-table-column prop="groupId" label="组ID" width="90" />
|
|
|
|
|
- <el-table-column prop="groupName" label="组名" min-width="120" />
|
|
|
|
|
|
|
+ <el-table-column prop="name" label="组名" min-width="120" />
|
|
|
<el-table-column prop="slogan" label="口号" min-width="160" />
|
|
<el-table-column prop="slogan" label="口号" min-width="160" />
|
|
|
- <el-table-column prop="groupTotal" label="组总分" width="90" />
|
|
|
|
|
- <el-table-column prop="memberTotal" label="成员分" width="90" />
|
|
|
|
|
- <el-table-column prop="memberCount" label="人数" width="70" />
|
|
|
|
|
- <el-table-column label="操作" width="120" fixed="right">
|
|
|
|
|
|
|
+ <el-table-column label="人数" width="80">
|
|
|
|
|
+ <template slot-scope="{ row }">
|
|
|
|
|
+ {{ row.memberCount }} 人
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ <el-table-column label="发言人" width="120">
|
|
|
<template slot-scope="{ row }">
|
|
<template slot-scope="{ row }">
|
|
|
- <el-button size="mini" type="primary" @click="openSetSpokesperson(row)">设置发言人</el-button>
|
|
|
|
|
|
|
+ {{ getSpokespersonName(row.spokespersonUid) }}
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ <el-table-column label="操作" width="300" fixed="right">
|
|
|
|
|
+ <template slot-scope="{ row }">
|
|
|
|
|
+ <el-button size="mini" @click="openSetSpokesperson(row)">设发言人</el-button>
|
|
|
|
|
+ <el-button size="mini" type="primary" @click="openAddMember(row)">调入</el-button>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
</el-table>
|
|
</el-table>
|
|
|
|
|
|
|
|
- <el-dialog title="新建分组" :visible.sync="showDialog" width="450px" @close="resetForm">
|
|
|
|
|
- <el-form :model="form" :rules="rules" ref="form" label-width="80px">
|
|
|
|
|
|
|
+ <!-- 新建分组 -->
|
|
|
|
|
+ <el-dialog title="新建分组" :visible.sync="showCreateDialog" width="450px" @close="resetCreateForm">
|
|
|
|
|
+ <el-form :model="createForm" :rules="createRules" ref="createForm" label-width="80px">
|
|
|
<el-form-item label="班级ID" prop="classId">
|
|
<el-form-item label="班级ID" prop="classId">
|
|
|
- <el-input-number v-model="form.classId" :min="1" />
|
|
|
|
|
|
|
+ <el-input :value="curClassId" disabled />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
<el-form-item label="组名" prop="name">
|
|
<el-form-item label="组名" prop="name">
|
|
|
- <el-input v-model="form.name" placeholder="如:飞鸟队" />
|
|
|
|
|
|
|
+ <el-input v-model="createForm.name" placeholder="如:飞鸟队" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
<el-form-item label="口号">
|
|
<el-form-item label="口号">
|
|
|
- <el-input v-model="form.slogan" placeholder="选填" />
|
|
|
|
|
|
|
+ <el-input v-model="createForm.slogan" placeholder="选填" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-form>
|
|
</el-form>
|
|
|
<div slot="footer">
|
|
<div slot="footer">
|
|
|
- <el-button @click="showDialog = false">取消</el-button>
|
|
|
|
|
- <el-button type="primary" @click="handleSubmit" :loading="submitting">确定</el-button>
|
|
|
|
|
|
|
+ <el-button @click="showCreateDialog = false">取消</el-button>
|
|
|
|
|
+ <el-button type="primary" @click="handleCreateGroup" :loading="submitting">确定</el-button>
|
|
|
</div>
|
|
</div>
|
|
|
</el-dialog>
|
|
</el-dialog>
|
|
|
|
|
|
|
|
|
|
+ <!-- 设置发言人 -->
|
|
|
<el-dialog title="设置发言人" :visible.sync="showSpokespersonDialog" width="400px">
|
|
<el-dialog title="设置发言人" :visible.sync="showSpokespersonDialog" width="400px">
|
|
|
<el-form label-width="70px">
|
|
<el-form label-width="70px">
|
|
|
- <el-form-item label="组ID">
|
|
|
|
|
- <el-input :value="spokespersonForm.groupId" disabled />
|
|
|
|
|
|
|
+ <el-form-item label="组名">
|
|
|
|
|
+ <el-input :value="spokespersonForm.groupName" disabled />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="用户ID">
|
|
|
|
|
- <el-input-number v-model="spokespersonForm.uid" :min="1" />
|
|
|
|
|
|
|
+ <el-form-item label="成员">
|
|
|
|
|
+ <el-select v-model="spokespersonForm.uid" placeholder="请选择成员" style="width:100%">
|
|
|
|
|
+ <el-option v-for="m in currentGroupMembers" :key="m.id" :label="m.name" :value="m.id" />
|
|
|
|
|
+ </el-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-form>
|
|
</el-form>
|
|
|
<div slot="footer">
|
|
<div slot="footer">
|
|
@@ -52,59 +89,157 @@
|
|
|
<el-button type="primary" @click="handleSetSpokesperson" :loading="spokespersonSubmitting">确定</el-button>
|
|
<el-button type="primary" @click="handleSetSpokesperson" :loading="spokespersonSubmitting">确定</el-button>
|
|
|
</div>
|
|
</div>
|
|
|
</el-dialog>
|
|
</el-dialog>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 调入成员 -->
|
|
|
|
|
+ <el-dialog title="调入成员" :visible.sync="showAddMemberDialog" width="400px">
|
|
|
|
|
+ <el-form label-width="70px">
|
|
|
|
|
+ <el-form-item label="目标组">
|
|
|
|
|
+ <el-input :value="addMemberForm.groupName" disabled />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ <el-form-item label="选择学员">
|
|
|
|
|
+ <el-select v-model="addMemberForm.uid" placeholder="请选择未分组学员" style="width:100%">
|
|
|
|
|
+ <el-option v-for="u in unassignedUsers" :key="u.id" :label="u.name + ' (' + u.phone + ')'" :value="u.id" />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-form>
|
|
|
|
|
+ <div slot="footer">
|
|
|
|
|
+ <el-button @click="showAddMemberDialog = false">取消</el-button>
|
|
|
|
|
+ <el-button type="primary" @click="handleAddMember" :loading="addMemberSubmitting">确定</el-button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </el-dialog>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 按签到重分 -->
|
|
|
|
|
+ <el-dialog title="按签到重分" :visible.sync="showRedistributeDialog" width="400px">
|
|
|
|
|
+ <div style="margin-bottom: 20px">
|
|
|
|
|
+ 当前班级:<strong>{{ currentClassName }}</strong>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <el-form label-width="100px">
|
|
|
|
|
+ <el-form-item label="每组人数">
|
|
|
|
|
+ <el-input-number v-model="redistributeForm.perGroup" :min="1" />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-form>
|
|
|
|
|
+ <div slot="footer">
|
|
|
|
|
+ <el-button @click="showRedistributeDialog = false">取消</el-button>
|
|
|
|
|
+ <el-button type="primary" @click="handleRedistribute" :loading="redistributeSubmitting">开始重分</el-button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </el-dialog>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
<script>
|
|
|
-import { createGroup, setSpokesperson } from '@/api/group'
|
|
|
|
|
-import { statsScoreboard } from '@/api/stats'
|
|
|
|
|
|
|
+import { createGroup, setSpokesperson, addGroupMember, removeGroupMember } from '@/api/group'
|
|
|
|
|
+import { classList, classDetail, redistributeByCheckin } from '@/api/class'
|
|
|
|
|
+import { userList } from '@/api/user'
|
|
|
|
|
|
|
|
export default {
|
|
export default {
|
|
|
name: 'Groups',
|
|
name: 'Groups',
|
|
|
data: function () {
|
|
data: function () {
|
|
|
return {
|
|
return {
|
|
|
- list: [],
|
|
|
|
|
|
|
+ classes: [],
|
|
|
|
|
+ curClassId: '',
|
|
|
|
|
+ currentClassName: '',
|
|
|
|
|
+ groupRows: [],
|
|
|
|
|
+ allUsers: [],
|
|
|
loading: false,
|
|
loading: false,
|
|
|
- showDialog: false,
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // Create Group
|
|
|
|
|
+ showCreateDialog: false,
|
|
|
submitting: false,
|
|
submitting: false,
|
|
|
- form: { classId: 1, name: '', slogan: '' },
|
|
|
|
|
- rules: {
|
|
|
|
|
- classId: [{ required: true, message: '请输入班级ID', trigger: 'blur' }],
|
|
|
|
|
|
|
+ createForm: { classId: '', name: '', slogan: '' },
|
|
|
|
|
+ createRules: {
|
|
|
name: [{ required: true, message: '请输入组名', trigger: 'blur' }]
|
|
name: [{ required: true, message: '请输入组名', trigger: 'blur' }]
|
|
|
},
|
|
},
|
|
|
|
|
+
|
|
|
|
|
+ // Spokesperson
|
|
|
showSpokespersonDialog: false,
|
|
showSpokespersonDialog: false,
|
|
|
- spokespersonForm: { groupId: 0, uid: 0 },
|
|
|
|
|
- spokespersonSubmitting: false
|
|
|
|
|
|
|
+ spokespersonSubmitting: false,
|
|
|
|
|
+ spokespersonForm: { groupId: 0, groupName: '', uid: '' },
|
|
|
|
|
+ currentGroupMembers: [],
|
|
|
|
|
+
|
|
|
|
|
+ // Add Member
|
|
|
|
|
+ showAddMemberDialog: false,
|
|
|
|
|
+ addMemberSubmitting: false,
|
|
|
|
|
+ addMemberForm: { groupId: 0, groupName: '', uid: '' },
|
|
|
|
|
+
|
|
|
|
|
+ // Redistribute
|
|
|
|
|
+ showRedistributeDialog: false,
|
|
|
|
|
+ redistributeSubmitting: false,
|
|
|
|
|
+ redistributeForm: { perGroup: 5 }
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
mounted: function () {
|
|
mounted: function () {
|
|
|
- this.fetchList()
|
|
|
|
|
|
|
+ this.initClasses()
|
|
|
|
|
+ },
|
|
|
|
|
+ computed: {
|
|
|
|
|
+ unassignedUsers: function () {
|
|
|
|
|
+ return this.allUsers.filter(u => !u.groupId)
|
|
|
|
|
+ }
|
|
|
},
|
|
},
|
|
|
methods: {
|
|
methods: {
|
|
|
- fetchList: function () {
|
|
|
|
|
|
|
+ initClasses: function () {
|
|
|
var self = this
|
|
var self = this
|
|
|
- self.loading = true
|
|
|
|
|
- statsScoreboard().then(function (res) {
|
|
|
|
|
- self.list = res.data || []
|
|
|
|
|
|
|
+ classList().then(function (res) {
|
|
|
|
|
+ self.classes = res.data || []
|
|
|
|
|
+ if (self.classes.length > 0) {
|
|
|
|
|
+ self.curClassId = self.classes[0].id
|
|
|
|
|
+ self.currentClassName = self.classes[0].name
|
|
|
|
|
+ self.loadGroups()
|
|
|
|
|
+ }
|
|
|
}).catch(function () {
|
|
}).catch(function () {
|
|
|
- self.$message.error('获取分组列表失败')
|
|
|
|
|
|
|
+ self.$message.error('获取班级列表失败')
|
|
|
|
|
+ })
|
|
|
|
|
+ },
|
|
|
|
|
+ loadGroups: function () {
|
|
|
|
|
+ var self = this
|
|
|
|
|
+ if (!self.curClassId) return
|
|
|
|
|
+ self.loading = true
|
|
|
|
|
+
|
|
|
|
|
+ // 1. Load Class Detail (Groups)
|
|
|
|
|
+ classDetail(self.curClassId).then(function (res) {
|
|
|
|
|
+ var data = res.data || {}
|
|
|
|
|
+ self.currentClassName = data.clazz ? data.clazz.name : ''
|
|
|
|
|
+ var groups = data.groups || []
|
|
|
|
|
+ self.groupRows = groups.map(function (g) {
|
|
|
|
|
+ return { ...g, memberCount: 0, members: [] }
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ // 2. Load Users to populate members
|
|
|
|
|
+ return userList({ classId: self.curClassId })
|
|
|
|
|
+ }).then(function (res) {
|
|
|
|
|
+ var users = res.data || []
|
|
|
|
|
+ self.allUsers = users
|
|
|
|
|
+
|
|
|
|
|
+ // Group users into groupRows
|
|
|
|
|
+ self.groupRows.forEach(function (row) {
|
|
|
|
|
+ row.members = users.filter(function (u) { return u.groupId === row.id })
|
|
|
|
|
+ row.memberCount = row.members.length
|
|
|
|
|
+ })
|
|
|
|
|
+ }).catch(function (err) {
|
|
|
|
|
+ console.error(err)
|
|
|
|
|
+ self.$message.error('加载分组数据失败')
|
|
|
}).finally(function () {
|
|
}).finally(function () {
|
|
|
self.loading = false
|
|
self.loading = false
|
|
|
})
|
|
})
|
|
|
},
|
|
},
|
|
|
- resetForm: function () {
|
|
|
|
|
- this.form = { classId: 1, name: '', slogan: '' }
|
|
|
|
|
|
|
+ getSpokespersonName: function (uid) {
|
|
|
|
|
+ if (!uid) return '未设置'
|
|
|
|
|
+ var user = this.allUsers.find(u => u.id === uid)
|
|
|
|
|
+ return user ? user.name : '未知用户'
|
|
|
|
|
+ },
|
|
|
|
|
+ resetCreateForm: function () {
|
|
|
|
|
+ this.createForm = { classId: this.curClassId, name: '', slogan: '' }
|
|
|
},
|
|
},
|
|
|
- handleSubmit: function () {
|
|
|
|
|
|
|
+ handleCreateGroup: function () {
|
|
|
var self = this
|
|
var self = this
|
|
|
if (self.submitting) return
|
|
if (self.submitting) return
|
|
|
- self.$refs.form.validate(function (valid) {
|
|
|
|
|
|
|
+ self.$refs.createForm.validate(function (valid) {
|
|
|
if (!valid) return
|
|
if (!valid) return
|
|
|
self.submitting = true
|
|
self.submitting = true
|
|
|
- createGroup(self.form).then(function () {
|
|
|
|
|
|
|
+ var payload = { ...self.createForm, classId: self.curClassId }
|
|
|
|
|
+ createGroup(payload).then(function () {
|
|
|
self.$message.success('创建成功')
|
|
self.$message.success('创建成功')
|
|
|
- self.showDialog = false
|
|
|
|
|
- self.fetchList()
|
|
|
|
|
|
|
+ self.showCreateDialog = false
|
|
|
|
|
+ self.loadGroups()
|
|
|
}).catch(function () {
|
|
}).catch(function () {
|
|
|
self.$message.error('创建失败')
|
|
self.$message.error('创建失败')
|
|
|
}).finally(function () {
|
|
}).finally(function () {
|
|
@@ -113,22 +248,95 @@ export default {
|
|
|
})
|
|
})
|
|
|
},
|
|
},
|
|
|
openSetSpokesperson: function (row) {
|
|
openSetSpokesperson: function (row) {
|
|
|
- this.spokespersonForm = { groupId: row.groupId, uid: 0 }
|
|
|
|
|
|
|
+ this.spokespersonForm = {
|
|
|
|
|
+ groupId: row.id,
|
|
|
|
|
+ groupName: row.name,
|
|
|
|
|
+ uid: row.spokespersonUid || ''
|
|
|
|
|
+ }
|
|
|
|
|
+ this.currentGroupMembers = row.members || []
|
|
|
this.showSpokespersonDialog = true
|
|
this.showSpokespersonDialog = true
|
|
|
},
|
|
},
|
|
|
handleSetSpokesperson: function () {
|
|
handleSetSpokesperson: function () {
|
|
|
var self = this
|
|
var self = this
|
|
|
if (self.spokespersonSubmitting) return
|
|
if (self.spokespersonSubmitting) return
|
|
|
|
|
+ if (!self.spokespersonForm.uid) return self.$message.warning('请选择成员')
|
|
|
|
|
+
|
|
|
self.spokespersonSubmitting = true
|
|
self.spokespersonSubmitting = true
|
|
|
- setSpokesperson(self.spokespersonForm).then(function () {
|
|
|
|
|
|
|
+ setSpokesperson({
|
|
|
|
|
+ groupId: self.spokespersonForm.groupId,
|
|
|
|
|
+ uid: self.spokespersonForm.uid
|
|
|
|
|
+ }).then(function () {
|
|
|
self.$message.success('设置成功')
|
|
self.$message.success('设置成功')
|
|
|
self.showSpokespersonDialog = false
|
|
self.showSpokespersonDialog = false
|
|
|
- self.fetchList()
|
|
|
|
|
|
|
+ self.loadGroups()
|
|
|
}).catch(function () {
|
|
}).catch(function () {
|
|
|
self.$message.error('设置失败')
|
|
self.$message.error('设置失败')
|
|
|
}).finally(function () {
|
|
}).finally(function () {
|
|
|
self.spokespersonSubmitting = false
|
|
self.spokespersonSubmitting = false
|
|
|
})
|
|
})
|
|
|
|
|
+ },
|
|
|
|
|
+ openAddMember: function (row) {
|
|
|
|
|
+ this.addMemberForm = {
|
|
|
|
|
+ groupId: row.id,
|
|
|
|
|
+ groupName: row.name,
|
|
|
|
|
+ uid: ''
|
|
|
|
|
+ }
|
|
|
|
|
+ this.showAddMemberDialog = true
|
|
|
|
|
+ },
|
|
|
|
|
+ handleAddMember: function () {
|
|
|
|
|
+ var self = this
|
|
|
|
|
+ if (self.addMemberSubmitting) return
|
|
|
|
|
+ if (!self.addMemberForm.uid) return self.$message.warning('请选择学员')
|
|
|
|
|
+
|
|
|
|
|
+ self.addMemberSubmitting = true
|
|
|
|
|
+ addGroupMember({
|
|
|
|
|
+ groupId: self.addMemberForm.groupId,
|
|
|
|
|
+ uid: self.addMemberForm.uid
|
|
|
|
|
+ }).then(function () {
|
|
|
|
|
+ self.$message.success('调入成功')
|
|
|
|
|
+ self.showAddMemberDialog = false
|
|
|
|
|
+ self.loadGroups()
|
|
|
|
|
+ }).catch(function () {
|
|
|
|
|
+ self.$message.error('调入失败')
|
|
|
|
|
+ }).finally(function () {
|
|
|
|
|
+ self.addMemberSubmitting = false
|
|
|
|
|
+ })
|
|
|
|
|
+ },
|
|
|
|
|
+ handleRemoveMember: function (group, user) {
|
|
|
|
|
+ var self = this
|
|
|
|
|
+ this.$confirm('确定将 ' + user.name + ' 移出分组吗?', '提示', {
|
|
|
|
|
+ confirmButtonText: '确定',
|
|
|
|
|
+ cancelButtonText: '取消',
|
|
|
|
|
+ type: 'warning'
|
|
|
|
|
+ }).then(function () {
|
|
|
|
|
+ removeGroupMember({ uid: user.id, groupId: group.id }).then(function () {
|
|
|
|
|
+ self.$message.success('移出成功')
|
|
|
|
|
+ self.loadGroups()
|
|
|
|
|
+ }).catch(function () {
|
|
|
|
|
+ self.$message.error('移出失败')
|
|
|
|
|
+ })
|
|
|
|
|
+ }).catch(function () {
|
|
|
|
|
+ // cancel
|
|
|
|
|
+ })
|
|
|
|
|
+ },
|
|
|
|
|
+ handleRedistribute: function () {
|
|
|
|
|
+ var self = this
|
|
|
|
|
+ if (self.redistributeSubmitting) return
|
|
|
|
|
+ self.redistributeSubmitting = true
|
|
|
|
|
+ redistributeByCheckin({
|
|
|
|
|
+ classId: self.curClassId,
|
|
|
|
|
+ perGroup: self.redistributeForm.perGroup
|
|
|
|
|
+ }).then(function (res) {
|
|
|
|
|
+ var d = res.data || {}
|
|
|
|
|
+ // 后端返回 {classId, checkedIn, totalUsers, groupCount, groups}
|
|
|
|
|
+ self.$message.success('重分完成:已签到 ' + d.checkedIn + ' 人,分配到 ' + d.groupCount + ' 组')
|
|
|
|
|
+ self.showRedistributeDialog = false
|
|
|
|
|
+ self.loadGroups()
|
|
|
|
|
+ }).catch(function () {
|
|
|
|
|
+ self.$message.error('重分失败')
|
|
|
|
|
+ }).finally(function () {
|
|
|
|
|
+ self.redistributeSubmitting = false
|
|
|
|
|
+ })
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -142,6 +350,11 @@ export default {
|
|
|
margin-bottom: 16px;
|
|
margin-bottom: 16px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+.header-left {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
.page-title {
|
|
.page-title {
|
|
|
margin: 0;
|
|
margin: 0;
|
|
|
font-size: 18px;
|
|
font-size: 18px;
|