123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444 |
- <template>
- <div>
- <el-dialog
- title="用户选择"
- width="1000px"
- :close-on-click-modal="false"
- :append-to-body="true"
- draggable
- class="userDialog"
- v-model="visible">
- <el-container style="height: 500px">
- <el-aside width="200px">
- <el-card class="org">
- <div slot="header" class="clearfix">
- <el-input
- placeholder="请输入组织机构过滤"
- size="small"
- v-model="filterText">
- </el-input>
- </div>
- <el-tree
- :data="officeTreeData"
- :props="{
- value: 'id', // ID字段名
- label: 'name', // 显示名称
- children: 'children' // 子级字段名
- }"
- default-expand-all
- highlight-current
- node-key="id"
- :render-content="renderContent"
- :filter-node-method="filterNode"
- :expand-on-click-node="false"
- @node-click="handleNodeClick"
- ref="officeTree">
- </el-tree>
- </el-card>
- </el-aside>
- <el-container>
- <el-header style="text-align: left; font-size: 12px;height:30px">
- <el-form :inline="true" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
- <el-form-item prop="loginName">
- <el-input v-model="searchForm.loginName" placeholder="登录名" clearable></el-input>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="refreshList()" icon="el-icon-search">查询</el-button>
- <el-button @click="resetSearch()" icon="el-icon-refresh-right">重置</el-button>
- </el-form-item>
- </el-form>
- </el-header>
- <el-main>
- <el-table
- :data="dataList"
- v-loading="loading"
- size="small"
- border
- ref="userTable"
- @selection-change="selectionChangeHandle"
- @sort-change="sortChangeHandle"
- height="calc(100% - 40px)"
- style="width: 100%;">
- <el-table-column
- header-align="center"
- align="center"
- v-if="limit <= 1"
- width="50">
- <template #default="scope">
- <el-radio :label="scope.row.id" :value="dataListAllSelections[0]&&dataListAllSelections[0].id" @change.native="getTemplateRow(scope.$index,scope.row)"><span></span></el-radio>
- </template>
- </el-table-column>
- <el-table-column
- type="selection"
- header-align="center"
- v-if="limit > 1"
- align="center"
- width="50">
- </el-table-column>
- <el-table-column
- prop="photo"
- header-align="center"
- align="center"
- label="头像">
- <template #default="scope">
- <img :src="scope.row.photo === ''?'/static/img/avatar.png':scope.row.photo" style="height:35px"/>
- </template>
- </el-table-column>
- <el-table-column
- prop="loginName"
- header-align="center"
- align="center"
- sortable="custom"
- min-width="90"
- label="登录名">
- </el-table-column>
- <el-table-column
- prop="name"
- header-align="center"
- align="真实姓名"
- sortable="custom"
- min-width="90"
- label="用户名">
- </el-table-column>
- <el-table-column
- prop="companyDTO.name"
- header-align="center"
- align="center"
- sortable="custom"
- min-width="110"
- label="所属机构">
- </el-table-column>
- <el-table-column
- prop="officeDTO.name"
- header-align="center"
- align="center"
- sortable="custom"
- min-width="110"
- label="所属部门">
- </el-table-column>
- <el-table-column
- prop="loginFlag"
- header-align="center"
- align="center"
- min-width="100"
- label="状态">
- <template #default="scope">
- <el-tag v-if="scope.row.loginFlag === '1'" size="small" type="success">正常</el-tag>
- <el-tag v-else-if="scope.row.loginFlag === '0'" size="small" type="danger">禁用</el-tag>
- </template>
- </el-table-column>
- </el-table>
- <el-pagination
- @size-change="sizeChangeHandle"
- @current-change="currentChangeHandle"
- :current-page="pageNo"
- :page-sizes="[5, 10, 50, 100]"
- :page-size="pageSize"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper">
- </el-pagination>
- </el-main>
- </el-container>
- <el-aside width="200px">
- <el-tag
- :key="tag.id"
- v-for="tag in dataListAllSelections"
- closable
- :disable-transitions="false"
- @close="del(tag)">
- {{tag.name}}
- </el-tag>
- </el-aside>
- </el-container>
- <template #footer>
- <span class="dialog-footer">
- <el-button size="small" @click="visible = false" icon="el-icon-circle-close">关闭</el-button>
- <el-button size="small" type="primary" icon="el-icon-circle-check" @click="doSubmit()">确定</el-button>
- </span>
- </template>
- </el-dialog>
- </div>
- </template>
- <script>
- export default {
- data () {
- return {
- searchForm: {
- loginName: '',
- companyDTO: {
- id: ''
- },
- officeDTO: {
- id: ''
- },
- name: ''
- },
- filterText: '',
- dataListAllSelections: [], // 所有选中的数据包含跨页数据
- dataListSelections: [],
- idKey: 'id', // 标识列表数据中每一行的唯一键的名称(需要按自己的数据改一下)
- dataList: [],
- dynamicTags: [],
- officeTreeData: [],
- pageNo: 1,
- pageSize: 10,
- total: 0,
- orders: [],
- loading: false,
- visible: false
- }
- },
- props: {
- selectData: {
- type: Array,
- default: () => { return [] }
- },
- limit: {
- type: Number,
- default: 999999
- }
- },
- watch: {
- filterText (val) {
- this.$refs.officeTree.filter(val)
- }
- },
- methods: {
- init () {
- this.visible = true
- this.$nextTick(() => {
- this.dataListAllSelections = JSON.parse(JSON.stringify(this.selectData))
- this.refreshTree()
- this.resetSearch()
- })
- },
- renderContent (h, { node, data }) {
- return (
- <span class="custom-tree-node">
- {
- data.type === '1' ? <i class="fa fa-sitemap"></i> : <i class="fa fa-users"></i>
- }
- <span class="text">{node.label}</span>
- </span>
- )
- },
- getTemplateRow (index, row) { // 获取选中数据
- this.dataListSelections = [row]
- this.$nextTick(() => {
- this.changePageCoreRecordData()
- })
- },
- // 设置选中的方法
- setSelectRow () {
- if (!this.dataListAllSelections || this.dataListAllSelections.length <= 0) {
- this.$refs.userTable.clearSelection()
- return
- }
- // 标识当前行的唯一键的名称
- let idKey = this.idKey
- let selectAllIds = []
- this.dataListAllSelections.forEach(row => {
- selectAllIds.push(row[idKey])
- })
- this.$refs.userTable.clearSelection()
- for (var i = 0; i < this.dataList.length; i++) {
- if (selectAllIds.indexOf(this.dataList[i][idKey]) >= 0) {
- // 设置选中,记住table组件需要使用ref="table"
- this.$refs.userTable.toggleRowSelection(this.dataList[i], true)
- }
- }
- },
- // 记忆选择核心方法
- changePageCoreRecordData () {
- // 标识当前行的唯一键的名称
- let idKey = this.idKey
- let that = this
- // 如果总记忆中还没有选择的数据,那么就直接取当前页选中的数据,不需要后面一系列计算
- if (this.dataListAllSelections.length <= 0) {
- this.dataListSelections.forEach(row => {
- that.dataListAllSelections.push(row)
- })
- return
- }
- // 总选择里面的key集合
- let selectAllIds = []
- this.dataListAllSelections.forEach(row => {
- selectAllIds.push(row[idKey])
- })
- let selectIds = []
- // 获取当前页选中的id
- this.dataListSelections.forEach(row => {
- selectIds.push(row[idKey])
- // 如果总选择里面不包含当前页选中的数据,那么就加入到总选择集合里
- if (selectAllIds.indexOf(row[idKey]) < 0) {
- that.dataListAllSelections.push(row)
- }
- })
- let noSelectIds = []
- // 得到当前页没有选中的id
- this.dataList.forEach(row => {
- if (selectIds.indexOf(row[idKey]) < 0) {
- noSelectIds.push(row[idKey])
- }
- })
- noSelectIds.forEach(id => {
- if (selectAllIds.indexOf(id) >= 0) {
- for (let i = 0; i < that.dataListAllSelections.length; i++) {
- if (that.dataListAllSelections[i][idKey] === id) {
- // 如果总选择中有未被选中的,那么就删除这条
- that.dataListAllSelections.splice(i, 1)
- break
- }
- }
- }
- })
- },
- // 得到选中的所有数据
- getAllSelectionData () {
- // 再执行一次记忆勾选数据匹配,目的是为了在当前页操作勾选后直接获取选中数据
- this.changePageCoreRecordData()
- },
- filterNode (value, data) {
- if (!value) return true
- return data.name.indexOf(value) !== -1
- },
- del (tag) {
- this.dataListAllSelections.splice(this.dataListAllSelections.indexOf(tag), 1)
- this.$nextTick(() => {
- this.setSelectRow()
- })
- },
- // 获取数据列表
- refreshList () {
- if (this.commonJS.isEmpty(this.searchForm.officeDTO.id) && this.commonJS.isEmpty(this.searchForm.companyDTO.id)) {
- this.searchForm.selectAll = 'true'
- }
- this.loading = true
- this.$http({
- url: '/system-server/sys/user/list2',
- method: 'get',
- params: {
- 'current': this.pageNo,
- 'size': this.pageSize,
- 'orders': this.orders,
- ...this.searchForm
- }
- }).then((data) => {
- this.dataList = data.records
- this.total = data.total
- this.pageNo = data.current
- this.loading = false
- this.$nextTick(() => {
- this.setSelectRow()
- })
- })
- },
- refreshTree () {
- this.$http({
- url: `/system-server/sys/office/treeData`,
- method: 'get'
- }).then((data) => {
- this.officeTreeData = data
- })
- },
- // 每页数
- sizeChangeHandle (val) {
- this.pageSize = val
- this.pageNo = 1
- this.refreshList()
- this.$nextTick(() => {
- this.changePageCoreRecordData()
- })
- },
- // 当前页
- currentChangeHandle (val) {
- this.pageNo = val
- this.refreshList()
- this.$nextTick(() => {
- this.changePageCoreRecordData()
- })
- },
- // 多选
- selectionChangeHandle (val) {
- this.dataListSelections = val
- this.$nextTick(() => {
- this.changePageCoreRecordData()
- })
- },
- // 排序
- sortChangeHandle (column) {
- if (column.prop === 'officeDTO.name') {
- column.prop = 'o.name'
- }
- if (column.prop === 'companyDTO.name') {
- column.prop = 'c.name'
- }
- this.orders = []
- if (column.order != null) {
- this.orders.push({column: this.$utils.toLine(column.prop), asc: column.order === 'ascending'})
- }
- this.refreshList()
- },
- handleNodeClick (data) {
- if (data.type === '1') {
- this.searchForm.companyDTO.id = data.id
- this.searchForm.officeDTO.id = ''
- } else {
- this.searchForm.companyDTO.id = ''
- this.searchForm.officeDTO.id = data.id
- }
- this.refreshList()
- },
- resetSearch () {
- this.searchForm.companyDTO.id = ''
- this.searchForm.officeDTO.id = ''
- this.$refs.officeTree.setCurrentKey(null)
- this.$refs.searchForm.resetFields()
- this.refreshList()
- },
- doSubmit () {
- if (this.limit < this.dataListAllSelections.length) {
- this.$message.error(`你最多只能选择${this.limit}个用户`)
- return
- }
- this.visible = false
- this.$emit('doSubmit', this.dataListAllSelections)
- }
- }
- }
- </script>
- <style lang="scss">
- .org {
- height: 100%;
- .el-card__header {
- padding: 10px;
- }
- .el-card__body {
- padding: 10px;
- max-height: 520px;
- overflow: auto;
- }
- }
- .userDialog{
- .el-dialog__body {
- padding: 10px 0px 0px 10px;
- color: #606266;
- font-size: 14px;
- word-break: break-all;
- }
- .el-main {
- padding: 20px 20px 5px 20px;
- .el-pagination{
- margin-top: 5px;
- }
- }
- }
- </style>
|