Przeglądaj źródła

Merge branch 'qianxl'

xiao 3 lat temu
rodzic
commit
925d906115

+ 4 - 0
.gitignore

@@ -4,3 +4,7 @@ dist
 dist-ssr
 *.local
 
+/.idea/.gitignore
+/.idea/activity_manage.iml
+/.idea/modules.xml
+/.idea/vcs.xml

+ 48 - 0
src/components/TreeNav/api.js

@@ -0,0 +1,48 @@
+import request from '@/utils/request'
+
+export const org_list_tree = (data = {}) =>
+  request({
+    url: 'user/org/list_tree',
+    data,
+  })
+export const org_add = (data = {}) =>
+  request({
+    url: 'user/org/add',
+    data
+  })
+
+export const org_edit = (data = {}) =>
+  request({
+    url: 'user/org/edit',
+    data
+  })
+export const org_delete = (data = {}) =>
+  request({
+    url: 'user/org/delete',
+    data
+  })
+export const hdlx_list_tree = (data = {}) =>
+  request({
+    url: '/hdpb/hdlx/list_tree',
+    data,
+  })
+export const hdlx_add = (data = {}) =>
+  request({
+    url: 'hdpb/hdlx/add',
+    data
+  })
+
+export const hdlx_edit = (data = {}) =>
+  request({
+    url: 'hdpb/hdlx/edit',
+    data
+  })
+export const hdlx_delete = (data = {}) =>
+  request({
+    url: 'hdpb/hdlx/delete',
+    data
+  })
+
+export const addApi = () => request({})
+export const deleteApi = () => request({})
+export const editApi = () => request({})

+ 367 - 0
src/components/TreeNav/index.vue

@@ -0,0 +1,367 @@
+<template>
+  <div class="left-tree">
+    <div class="btn-outer">
+      <el-button class="add-btn" type="success" icon="el-icon-plus" @click="addTreeNode" size="mini">新增</el-button>
+    </div>
+    <el-tree :data="treeData">
+      <template #default="{ node, data }">
+          <span class="custom-tree-node" :class="{'tree-node-checked': data.id === treeCheckedId}">
+            <span @click="renderTable(data)"><i class="el-icon-school"></i> {{ node.label }}</span>
+            <span class="tree-node-options">
+              <a @click="editNode(data)"><i class="el-icon-edit-outline"></i></a>
+              <el-popconfirm confirm-button-text='确定'
+                             cancel-button-text='取消'
+                             icon="el-icon-info"
+                             icon-color="red"
+                             title="确定删除此节点及其子节点吗?"
+                             @confirm="removeNode(node, data)">
+                <a slot="reference"><i class="el-icon-delete"></i></a>
+              </el-popconfirm>
+            </span>
+          </span>
+      </template>
+    </el-tree>
+
+    <el-dialog
+        :title="dialogTitle"
+        :visible.sync="dialogVisible"
+        :close-on-click-modal="false"
+        width="800px">
+      <el-form v-if="treeType==='zzjg'"
+               ref="zzjg_form"
+               :model="zzjg_form"
+               :rules="form_rules"
+               label-width="120px">
+        <el-row>
+          <el-col :span="24" v-if="dialogType === 'add'">
+            <el-form-item label="上级组织" prop="uo_pid">
+              <el-cascader
+                  :options="treeData"
+                  :props="{ checkStrictly: true }"
+                  clearable
+                  filterable
+                  v-model="zzjg_form.uo_pid"></el-cascader>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="机构名称" prop="uo_name">
+              <el-input v-model="zzjg_form.uo_name"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="机构排序" prop="uo_sort">
+              <el-input v-model.number="zzjg_form.uo_sort"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item>
+              <el-button type="primary" @click="onSubmit('zzjg_form')">提交</el-button>
+              <el-button v-if="dialogType==='add'" @click="onReset">重置</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+
+      <el-form v-if="treeType==='hdlxgl'"
+               ref="hdlxgl_form"
+               :model="hdlxgl_form"
+               :rules="form_rules"
+               label-width="120px">
+        <el-row>
+          <el-col :span="24" v-if="dialogType === 'add'">
+            <el-form-item label="上级组织" prop="hh_pid">
+              <el-cascader
+                  :options="treeData"
+                  :props="{ checkStrictly: true }"
+                  clearable
+                  filterable
+                  v-model="hdlxgl_form.hh_pid"></el-cascader>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="类型名称" prop="hh_name">
+              <el-input v-model="hdlxgl_form.hh_name"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="排序编号" prop="hh_sort">
+              <el-input v-model.number="hdlxgl_form.hh_sort"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item>
+              <el-button type="primary" @click="onSubmit('hdlxgl_form')">提交</el-button>
+              <el-button v-if="dialogType==='add'" @click="onReset">重置</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { org_list_tree, hdlx_list_tree, hdlx_add, hdlx_edit, org_add, org_edit, org_delete, hdlx_delete } from './api'
+
+export default {
+  props: {
+    treeType: {
+      type: String,
+      required: true
+    }
+  },
+  data() {
+    return {
+      treeCheckedId: '',
+      treeData: [
+        {id: '1', label: '教育和体育局', children: [],},
+        {id: '2', label: '专家库'},
+      ],
+      dialogVisible: false,
+      dialogType: 'add',
+      activeItem: {
+        id: '',
+        pid: ''
+      },
+      zzjg_form: {
+        uo_pid: '',
+        uo_name: '',
+        uo_sort: '',
+        // uo_user_ids: '',
+        // uo_path: '',
+        // uo_user_name: '',
+        // uo_display_name: '',
+        // uo_attrib: '',
+        // uo_level: '',
+        // uo_master_username: '',
+        // uo_master_realname: ''
+      },
+      hdlxgl_form: {
+        hh_pid: '',
+        hh_name: '',
+        hh_sort: '',
+        hh_user_ids: '',
+        hh_level: '',
+        hh_path: ''
+      },
+      form_rules: {
+        uo_pid: [
+          {required: true, message: '上级组织不可为空'},
+        ],
+        uo_name: [
+          {required: true, message: '组织名称不可为空'},
+        ],
+        uo_sort: [
+          {type: 'number', message: '排序必须为数字值'}
+        ],
+        hh_pid: [
+          {required: true, message: '上级组织不可为空'},
+        ],
+        hh_name: [
+          {required: true, message: '活动类型名称不可为空'},
+        ],
+        hh_sort: [
+          {type: 'number', message: '排序必须为数字值'}
+        ],
+      },
+    }
+  },
+  computed: {
+    dialogTitle() {
+      let before = '', after = ''
+      after = this.treeType === 'zzjg' ? '组织' : '活动类型'
+      before = this.dialogType === 'add' ? '新增' : '编辑'
+      return before + after
+    },
+    formData() {
+      const obj = {
+        'zzjg': this.zzjg_form,
+        'hdlxgl': this.hdlxgl_form
+      }
+      this.treeType === 'zzjg' ? obj.zzjg.uo_pid = obj.zzjg.uo_pid[obj.zzjg.uo_pid.length - 1] : null
+      this.treeType === 'hdlxgl' ?
+          obj.hdlxgl.hh_pid = obj.hdlxgl.hh_pid[obj.hdlxgl.hh_pid.length - 1] : null
+      return obj[this.treeType]
+    }
+  },
+  created() {
+    this.getTreeData()
+  },
+  methods: {
+    getTreeData() {
+      if (this.treeType === 'zzjg') {
+        org_list_tree()
+            .then(res => {
+              if (res.code == '1') {
+                this.treeData = res.data.one_info
+              }
+            })
+      } else if (this.treeType === 'hdlxgl') {
+        hdlx_list_tree()
+            .then(res => {
+              if (res.code == '1') {
+                this.treeData = res.data.one_info
+              }
+            })
+      }
+    },
+    addTreeNode() {
+      this.dialogType = 'add'
+      this.dialogVisible = true
+    },
+    renderTable(data) {
+      this.treeCheckedId = data.id
+      this.$emit('renderTable', {'msg': data})
+    },
+    editNode(data) {
+      // console.log(data)
+      this.dialogType = 'edit'
+      this.activeItem = {
+        id: data.id,
+        pid: data.pid
+      }
+      this.dialogVisible = true
+      if (this.treeType === 'zzjg') {
+        this.zzjg_form.uo_name = data.label
+        this.zzjg_form.uo_sort = data.sort * 1
+      }
+      if (this.treeType === 'hdlxgl') {
+        this.hdlxgl_form.hh_name = data.label
+        this.hdlxgl_form.hh_sort = data.sort * 1
+      }
+      // console.log(this.zzjg_form)
+    },
+    removeNode(node, data) {
+      console.log('删除节点')
+      // console.log(data)
+      const id = data.id
+      if (this.treeType === 'zzjg') {
+        org_delete({uo_id: id})
+            .then(res => {
+              if (res.code === '1') {
+                this.$message.success(res.msg)
+                this.getTreeData()
+              }
+            })
+      }
+      if (this.treeType === 'hdlxgl') {
+        hdlx_delete({hh_id: id})
+            .then(res => {
+              if (res.code === '1') {
+                this.$message.success(res.msg)
+                this.getTreeData()
+              }
+            })
+      }
+    },
+    onSubmit(formName) {
+      // console.log('提交表单')
+      // console.log(this.formData)
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          const paramObj = {
+            'zzjg': {
+              issubmit: 1,
+              user_org: this.formData
+            },
+            'hdlxgl': {
+              issubmit: 1,
+              hdpb_hdlx: this.formData
+            }
+          }
+          const obj = {
+            'zzjg': {
+              'add': org_add,
+              'edit': org_edit
+            },
+            'hdlxgl': {
+              'add': hdlx_add,
+              'edit': hdlx_edit
+            }
+          }
+          let paramsData = paramObj[this.treeType]
+          if (this.dialogType === 'edit' && this.treeType === 'zzjg') {
+            paramsData.uo_id = this.activeItem.id
+            paramsData.user_org.uo_pid = this.activeItem.pid
+          }
+
+          if (this.dialogType === 'edit' && this.treeType === 'hdlxgl') {
+            paramsData.hh_id = this.activeItem.id
+            paramsData.hdpb_hdlx.hh_pid = this.activeItem.pid
+          }
+          obj[this.treeType][this.dialogType](paramsData)
+              .then(res => {
+                if (res.code === '1') {
+                  this.$message.success('操作成功')
+                  this.getTreeData()
+                  this.dialogVisible = false
+                }
+              })
+        } else {
+          return false;
+        }
+      });
+
+    },
+    onReset() {
+      // console.log('重置表单')
+      const formName = this.treeType + '_form'
+      this.$refs[formName].resetFields();
+    }
+  }
+}
+</script>
+
+<style scoped>
+.btn-outer {
+  text-align: center;
+  padding: 10px 20px;
+}
+
+.add-btn {
+  width: 80%;
+}
+
+::v-deep .el-tree {
+  color: #666;
+  background-color: inherit;
+}
+
+
+::v-deep .el-cascader {
+  display: block;
+}
+
+.left-tree {
+  display: inline-block;
+  /*width: 280px;*/
+  width: 100%;
+  height: 733px;
+  background: #F9FBFC;
+  border-radius: 6px;
+  overflow: hidden;
+}
+
+.custom-tree-node {
+  width: 100%;
+  display: flex;
+  justify-content: space-between;
+}
+
+.tree-node-checked {
+  color: #265CD4;
+  background-color: #F4F8FE;
+}
+
+.custom-tree-node:hover {
+  background-color: #F4F8FE;
+}
+
+.tree-node-options {
+  display: none;
+}
+
+.custom-tree-node:hover > .tree-node-options {
+  display: inline-block;
+}
+</style>

+ 45 - 0
src/views/xtgl/hdlxgl/api.js

@@ -0,0 +1,45 @@
+import request from '@/utils/request'
+export const org_list_tree = (data={}) =>
+  request({
+    url: 'user/org/list_tree',
+    data,
+  })
+
+export const hdlx_list_tree = (data={}) =>
+  request({
+    url: 'hdpb/hdlx/list_tree',
+    data,
+  })
+export const hdlx_list = (data = {}) =>
+  request({
+    url: 'hdpb/hdlx/index',
+    data,
+  })
+export const hdlx_detail = (data = {}) =>
+  request({
+    url: 'hdpb/hdlx/detail',
+    data,
+  })
+export const hdlx_edit = (data = {}) =>
+  request({
+    url: 'hdpb/hdlx/edit',
+    data,
+  })
+export const hdlx_add = (data = {}) =>
+  request({
+    url: 'hdpb/hdlx/add',
+    data,
+  })
+export const user_list = (data = {}) =>
+  request({
+    url: 'user/main/index',
+    data,
+  })
+export const hdlx_members_manage = (data = {}) =>
+  request({
+    url: 'hdpb/hdlx/members',
+    data,
+  })
+export const addApi = () => request({})
+export const deleteApi = () => request({})
+export const editApi = () => request({})

+ 211 - 2
src/views/xtgl/hdlxgl/index.vue

@@ -1,13 +1,222 @@
 <template>
-    <div>hdlxgl</div>
+  <div>
+    <el-row>
+      <el-col :span="5">
+        <tree-nav @renderTable="updateDeptId" treeType="hdlxgl"></tree-nav>
+      </el-col>
+      <el-col :span="19">
+        <el-container>
+          <el-header>
+            <div>
+              <el-input placeholder="请输入搜索关键字" suffix-icon="el-icon-search" v-model="searchText"
+                        style="width: 200px;"></el-input>
+              <el-button type="primary" @click="tableParams.keyword = searchText">搜索</el-button>
+            </div>
+            <div>
+              <el-button type="info">导入类别</el-button>
+              <el-button type="warning" @click="delAdmin">批量删除</el-button>
+            </div>
+          </el-header>
+          <el-main>
+            <el-table
+                ref="multipleTable"
+                :data="tableData"
+                tooltip-effect="dark"
+                style="width: 100%"
+                @selection-change="val => this.activeTableChecked = val">
+              <el-table-column type="selection" width="55"></el-table-column>
+              <el-table-column label="姓名">
+                <template slot-scope="scope">{{ scope.row.user_name }}</template>
+              </el-table-column>
+              <el-table-column label="用户名">
+                <template slot-scope="scope">{{ scope.row.user_realname }}</template>
+              </el-table-column>
+              <el-table-column label="手机号">
+                <template slot-scope="scope">{{ scope.row.user_phone }}</template>
+              </el-table-column>
+              <el-table-column label="部门">
+                <template slot-scope="scope">
+                  {{
+                    scope.row.org.dept_full.reduce(function (path, data) {
+                      return path += '/' + data.dept_name || ''
+                    }, '')
+                  }}
+                </template>
+              </el-table-column>
+              <el-table-column label="操作" width="120">
+                <template slot-scope="scope">
+                  <el-link type="warning" @click="delSingleAdmin(scope.row)">删除</el-link>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-main>
+        </el-container>
+      </el-col>
+    </el-row>
+  </div>
 </template>
 
 <script>
+import TreeNav from '@/components/TreeNav/index.vue'
 
-export default {
+import {
+  hdlx_list_tree,
+  org_list_tree,
+  hdlx_members_manage,
+  user_list,
+  hdlx_list,
+  hdlx_edit,
+  hdlx_add,
+  hdlx_detail
+} from './api'
 
+export default {
+  components: {
+    TreeNav
+  },
+  watch: {
+    // 监听传参改变
+    tableParams: {
+      handler(newData, oldData) {
+        this.renderTable(newData)
+      },
+      immediate: true,
+      deep: true
+    }
+  },
+  data() {
+    return {
+      deptOptions: [], // 部门组织级联
+      hdlxOptions: [], // 活动类型级联
+      searchText: '',
+      tableData: [],
+      // total_rows: 0,
+      userDialogVisible: false,
+      user_org: {
+        uo_user_name: ''
+      },
+      tableParams: {
+        hh_id: '',
+        keyword: ''
+      },
+      activeUserId: '',
+      activeTableChecked: [],
+      dialogType: ''
+    }
+  },
+  created() {
+    this.loadingCascadeData()
+  },
+  methods: {
+    loadingCascadeData() {
+      org_list_tree()
+          .then(res => {
+            if (res.code === '1') {
+              const list = res.data.one_info
+              this.deptOptions = list
+            }
+          })
+      hdlx_list_tree()
+          .then(res => {
+            if (res.code === '1') {
+              const list = res.data.one_info
+              this.hdlxOptions = list
+            }
+          })
+    },
+    updateDeptId(data) {
+      this.activeDeptName = data.msg.label
+      this.tableParams.hh_id = data.msg.id
+    },
+    renderTable(data = this.tableParams) {
+      hdlx_detail(data)
+          .then(res => {
+            if (res.code === '1') {
+              this.tableData = res.data.one_info.members
+              // this.total_rows = res.data.total_rows * 1
+            }
+          })
+    },
+    // 获取用户多选列表
+    getCheckedUsers() {
+      const checkedDatas = this.activeTableChecked
+      if (checkedDatas.length <= 0) {
+        this.$message.info('请勾选需要操作的用户')
+        return false
+      }
+      let user_id_list = []
+      checkedDatas.forEach(item => {
+        item.user_id ?
+            user_id_list.push(item.user_id) :
+            null
+      })
+      return user_id_list
+    },
+    delAdmin() {
+      let user_id_list = this.getCheckedUsers()
+      if (user_id_list) {
+        this.$confirm('此操作将删除多个管理员, 是否继续?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          const data = {
+            hh_id: this.tableParams.hh_id,
+            type: 'del',
+            user_ids: this.getCheckedUsers().toString()
+          }
+          hdlx_members_manage(data)
+              .then(res => {
+                if (res.code === '1') {
+                  this.$message.success('删除成功')
+                  this.renderTable()
+                }
+              })
+        }).catch(() => {
+          this.$message({
+            type: 'info',
+            message: '已取消删除'
+          });
+        });
+      }
+    },
+    delSingleAdmin(row) {
+      console.log(row)
+      this.$confirm(`此操作将删除\"管理员\"${row.user_realname}, 是否继续?`, '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        const data = {
+          hh_id: this.tableParams.hh_id,
+          type: 'del',
+          user_ids: row.user_id
+        }
+        hdlx_members_manage(data)
+            .then(res => {
+              if (res.code === '1') {
+                this.$message.success('删除成功')
+                this.renderTable()
+              }
+            })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '已取消删除'
+        });
+      });
+    }
+  }
 }
 </script>
 
 <style lang="scss" scoped>
+header {
+  display: flex;
+  justify-content: space-between;
+}
+
+::v-deep .el-cascader {
+  display: block;
+}
 </style>

+ 65 - 1
src/views/xtgl/rzgl/index.vue

@@ -1,13 +1,77 @@
 <template>
-    <div>rzgl</div>
+  <div>
+    <el-container>
+      <el-header>
+        <el-row>
+          <el-col :span="18">
+            <el-tabs v-model="activeTab" @tab-click="handleTabClick">
+              <el-tab-pane label="所有" name="all"></el-tab-pane>
+              <el-tab-pane label="今天" name="today"></el-tab-pane>
+              <el-tab-pane label="昨天" name="yesterday"></el-tab-pane>
+              <el-tab-pane label="本周" name="week"></el-tab-pane>
+              <el-tab-pane label="上周" name="lastWeek"></el-tab-pane>
+              <el-tab-pane label="本月" name="month"></el-tab-pane>
+              <el-tab-pane label="上月" name="lastMonth"></el-tab-pane>
+            </el-tabs>
+          </el-col>
+          <el-col :span="6">
+            <el-select v-model="chosenTime" placeholder="选择时间"></el-select>
+          </el-col>
+
+        </el-row>
+
+        <div>
+          <el-input placeholder="请输入搜索关键字" suffix-icon="el-icon-search" v-model="searchText"
+                    style="width: 200px;"></el-input>
+          <el-button type="primary">搜索</el-button>
+        </div>
+      </el-header>
+
+      <el-main>
+        <el-table :data="tableData" style="width: 100%">
+          <el-table-column prop="option" label="操作"></el-table-column>
+          <el-table-column prop="date" label="时间" width="200"></el-table-column>
+        </el-table>
+      </el-main>
+
+      <el-footer style="text-align: right">
+        <el-pagination background layout="prev, pager, next" :total="1000"></el-pagination>
+      </el-footer>
+    </el-container>
+
+  </div>
 </template>
 
 <script>
 
 export default {
+  data() {
+    return {
+      activeTab: 'all',
+      chosenTime: '',
+      searchText: '',
+      tableData: [
+        {
+          option: '王小虎操作操作了什么什么什么什么什么什么的',
+          date: '2016-05-02',
+        }
+      ]
+    }
+  },
+  methods: {
+    handleTabClick() {
 
+    }
+  }
 }
 </script>
 
 <style lang="scss" scoped>
+header{
+  display: flex;
+  justify-content: space-between;
+}
+::v-deep .el-tabs__nav-wrap::after {
+  display: none;
+}
 </style>

+ 25 - 0
src/views/xtgl/zdb/api.js

@@ -0,0 +1,25 @@
+import request from '@/utils/request'
+
+export const sjzi_list = (data = {}) =>
+  request({
+    url: 'common/sjzd/index',
+    data,
+  })
+export const sjzi_add = (data = {}) =>
+  request({
+    url: 'common/sjzd/add',
+    data,
+  })
+export const sjzi_edit = (data = {}) =>
+  request({
+    url: 'common/sjzd/edit',
+    data,
+  })
+export const sjzi_detail = (data = {}) =>
+  request({
+    url: 'common/sjzd/detail',
+    data,
+  })
+export const addApi = () => request({})
+export const deleteApi = () => request({})
+export const editApi = () => request({})

+ 145 - 1
src/views/xtgl/zdb/index.vue

@@ -1,13 +1,157 @@
 <template>
-    <div>zdb</div>
+  <div>
+    <el-container>
+      <el-header>
+        <el-button type="success" icon="el-icon-plus" @click="add_sjzd">新建字典表</el-button>
+        <div>
+          <el-input placeholder="请输入搜索关键字" suffix-icon="el-icon-search" v-model="searchText"
+                    style="width: 200px;"></el-input>
+          <el-button type="primary">搜索</el-button>
+        </div>
+      </el-header>
+      <el-main>
+        <el-table :data="tableData" style="width: 100%;margin-bottom: 20px;" row-key="id" default-expand-all
+                  :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
+          <el-table-column prop="cs_name" label="字典名称"></el-table-column>
+          <el-table-column prop="cs_code" label="字典编码"></el-table-column>
+          <el-table-column prop="option" label="操作" width="120">
+            <template slot-scope="scope" v-if="!scope.row.children">
+              <el-link type="primary" @click="edit_sjzd">编辑</el-link>
+              <span style="color: #409eff;margin: 0 10px;">|</span>
+              <el-link type="primary">删除</el-link>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-main>
+    </el-container>
+
+
+    <el-dialog
+        :title="dialogType==='add'?'新建字典表':'编辑字典表'" width="700px"
+        :visible.sync="csDialogVisible">
+      <el-form class="sjzd_form" ref="common_sjzd" :model="common_sjzd" label-width="80px">
+        <el-form-item label="上级编号" prop="cs_pid">
+          <el-input v-model="common_sjzd.cs_pid"></el-input>
+        </el-form-item>
+        <el-form-item label="字典名称" prop="cs_name">
+          <el-input v-model="common_sjzd.cs_name"></el-input>
+        </el-form-item>
+        <el-form-item label="字典编码" prop="cs_code">
+          <el-input v-model="common_sjzd.cs_code"></el-input>
+        </el-form-item>
+        <el-form-item label="排序编号" prop="cs_sort">
+          <el-input v-model="common_sjzd.cs_sort"></el-input>
+        </el-form-item>
+        <el-form-item label="字典层级" prop="cs_level">
+          <el-input v-model="common_sjzd.cs_level"></el-input>
+        </el-form-item>
+        <el-form-item label="字典路径" prop="cs_path">
+          <el-input v-model="common_sjzd.cs_path"></el-input>
+        </el-form-item>
+        <el-form-item label="字典类型" prop="cs_zdlx">
+          <el-input v-model="common_sjzd.cs_zdlx"></el-input>
+        </el-form-item>
+        <el-form-item label="是否启用" prop="cs_sfqy">
+          <el-input v-model="common_sjzd.cs_sfqy"></el-input>
+        </el-form-item>
+        <el-form-item label="数据类型" prop="cs_sjlx">
+          <el-input v-model="common_sjzd.cs_sjlx"></el-input>
+        </el-form-item>
+        <el-form-item label="数据长度" prop="cs_sjcd">
+          <el-input v-model="common_sjzd.cs_sjcd"></el-input>
+        </el-form-item>
+        <el-form-item label="备注" prop="cs_bz" class="grid_1_3">
+          <el-input v-model="common_sjzd.cs_bz"></el-input>
+        </el-form-item>
+        <el-form-item class="grid_1_3">
+          <el-button type="primary" @click="onSubmit">提交</el-button>
+          <el-button v-if="dialogType==='add'" @click="onReset">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+  </div>
 </template>
 
 <script>
+import { sjzi_list } from './api'
 
 export default {
+  data() {
+    return {
+      searchText: '',
+      tableData: [
+        {
+          id: 1,
+          cs_name: '王小虎',
+          children: [{
+            id: 11,
+            cs_code: '2016-05-02',
+            cs_name: '王小虎',
+          }, {
+            id: 12,
+            cs_code: '2016-05-02',
+            cs_name: '王小虎',
+          }]
+        }],
+      csDialogVisible: false,
+      dialogType: 'add',
+      common_sjzd: {
+        cs_name: '',
+        cs_code: ''
+      }
+    }
+  },
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      sjzi_list()
+          .then(res => {
+            console.log(res)
+          })
+    },
+    add_sjzd() {
+      console.log('添加字典表')
+      this.dialogType = 'add'
+      this.csDialogVisible = true
+    },
+    edit_sjzd(){
+      console.log('编辑字典表')
+      this.dialogType = 'edit'
+      this.csDialogVisible = true
+    },
+    onSubmit() {
+      console.log('提交字典')
+      console.log(this.common_sjzd)
+    },
+    onReset() {
+      console.log('重置表单')
+      this.$refs['common_sjzd'].resetFields();
+    }
+  }
 
 }
 </script>
 
 <style lang="scss" scoped>
+header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+::v-deep .el-table__row--level-0 {
+  background-color: #F7FAFF;
+}
+
+.sjzd_form {
+  display: grid;
+  grid-template-columns: repeat(2, 1fr);
+}
+
+.grid_1_3 {
+  grid-column-start: 1;
+  grid-column-end: 3;
+}
 </style>

+ 75 - 0
src/views/xtgl/zzjg/api.js

@@ -0,0 +1,75 @@
+import request from '@/utils/request'
+export const export_all = (data={}) =>
+  request({
+    url: 'user/org/index',
+    data,
+    method: 'GET'
+  })
+export const list_tree = (data={}) =>
+  request({
+    url: 'user/org/list_tree',
+    data,
+  })
+export const hdlx_list_tree = (data={}) =>
+  request({
+    url: 'hdpb/hdlx/list_tree',
+    data,
+  })
+export const org_user_list = (data = {}) =>
+  request({
+    url: 'user/org/index',
+    data,
+  })
+export const org_user_detail = (data = {}) =>
+  request({
+    url: 'user/org/detail',
+    data,
+  })
+export const org_user_edit = (data = {}) =>
+  request({
+    url: 'user/org/edit',
+    data,
+  })
+export const org_user_add = (data = {}) =>
+  request({
+    url: 'user/org/add',
+    data,
+  })
+export const user_list = (data = {}) =>
+  request({
+    url: 'user/main/index',
+    data,
+  })
+export const user_add = (data = {}) =>
+  request({
+    url: 'user/main/add',
+    data,
+  })
+export const user_delete = (data = {}) =>
+  request({
+    url: 'user/main/delete',
+    data,
+  })
+export const user_role = (data = {}) =>
+  request({
+    url: 'user/role/index',
+    data,
+  })
+export const user_edit = (data = {}) =>
+  request({
+    url: 'user/main/edit',
+    data,
+  })
+export const user_set_access = (data = {}) =>
+  request({
+    url: 'user/main/set_access',
+    data,
+  })
+export const hdlx_members_manage = (data = {}) =>
+  request({
+    url: 'hdpb/hdlx/members',
+    data,
+  })
+export const addApi = () => request({})
+export const deleteApi = () => request({})
+export const editApi = () => request({})

+ 498 - 2
src/views/xtgl/zzjg/index.vue

@@ -1,13 +1,509 @@
 <template>
-    <div>zzjg</div>
+  <div>
+    <el-row>
+      <el-col :span="5">
+        <tree-nav @renderTable="updateDeptId" treeType="zzjg"></tree-nav>
+      </el-col>
+      <el-col :span="19">
+        <el-container>
+          <el-header>
+            <div>
+              <el-input placeholder="请输入搜索关键字" suffix-icon="el-icon-search" v-model="searchText"
+                        style="width: 200px;"></el-input>
+              <el-button type="primary" @click="tableParams.keyword = searchText">搜索</el-button>
+            </div>
+            <div>
+              <el-button type="info" @click="exportAll">导出机构与用户</el-button>
+              <el-upload
+                  class="upload-demo"
+                  :action="import_url"
+                  :show-file-list="false"
+                  :data="import_data"
+                  :on-success="import_success"
+                  style="display: inline-block;margin: 0 10px;">
+                <el-button type="primary">导入机构与用户</el-button>
+              </el-upload>
+              <el-button type="info" @click="showDialog('add')">新增用户</el-button>
+              <el-button type="primary" @click="hdlxglDialogShow">设为活动管理</el-button>
+              <el-button type="warning" @click="delUser">批量删除</el-button>
+            </div>
+          </el-header>
+          <el-main>
+            <el-table
+                ref="multipleTable"
+                :data="tableData"
+                tooltip-effect="dark"
+                style="width: 100%"
+                @selection-change="changeChecked">
+              <el-table-column type="selection" width="55"></el-table-column>
+              <el-table-column label="姓名">
+                <template slot-scope="scope">{{ scope.row.user_name }}</template>
+              </el-table-column>
+              <el-table-column label="部门">
+                <template slot-scope="scope">
+                  {{
+                    scope.row.org_info.dept_full.reduce(function (path, data) {
+                      return path += '/' + data.dept_name || ''
+                    }, '')
+                  }}
+                </template>
+              </el-table-column>
+              <el-table-column label="角色">
+                <template slot-scope="scope">{{ scope.row.user_role_name }}</template>
+              </el-table-column>
+              <el-table-column label="管理活动类型">
+                <template slot-scope="scope">
+                  {{ scope.row.glhdlx }}
+                </template>
+              </el-table-column>
+              <el-table-column label="账号类型">
+                <template slot-scope="scope">
+                  {{ scope.row.user_level === '1' ? '普通账号' : '临时账号' }}
+                </template>
+              </el-table-column>
+              <el-table-column label="操作" width="120">
+                <template slot-scope="scope">
+                  <el-link type="primary" @click="showAccessDialog(scope.row)">权限</el-link>
+                  <span style="color: #409eff;margin: 0 10px;">|</span>
+                  <el-link type="primary" @click="showDialog('edit', scope.row)">编辑</el-link>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-main>
+          <el-footer style="text-align: right">
+            <el-pagination
+                background
+                hide-on-single-page
+                layout="prev, pager, next"
+                :page-size="tableParams.limit"
+                :total="total_rows"
+                @current-change="pageChange"></el-pagination>
+          </el-footer>
+        </el-container>
+      </el-col>
+    </el-row>
+    <!--  用户信息  -->
+    <el-dialog
+        :title="dialogType==='add'?'新增用户':'编辑用户'"
+        :visible.sync="userDialogVisible"
+        :close-on-click-modal="false"
+        @closed="resetDialog('user_main')"
+        width="700px">
+      <el-form ref="user_main" :model="user_main" :rules="form_rules" label-width="120px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="用户名" prop="user_name">
+              <el-input v-model="user_main.user_name"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="密码" prop="user_password">
+              <el-input v-model="user_main.user_password"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="用户姓名" prop="user_realname">
+              <el-input v-model="user_main.user_realname"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="账号类型" prop="user_level">
+              <el-select v-model="user_main.user_level" placeholder="请选择">
+                <el-option label="临时账号" value="0"></el-option>
+                <el-option label="普通账号" value="1"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="部门" prop="dept_id">
+              <el-cascader
+                  :options="deptOptions"
+                  :props="{ checkStrictly: true }"
+                  clearable
+                  filterable
+                  v-model="user_main.dept_id"></el-cascader>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="手机号" prop="user_phone">
+              <el-input v-model="user_main.user_phone"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="用户角色" prop="user_role_id">
+              <el-select v-model="user_main.user_role_id" placeholder="请选择">
+                <el-option v-for="role in roleList" :label="role.role_name" :value="role.role_id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item>
+              <el-button type="primary" @click="onSubmit('user_main')">提交</el-button>
+              <el-button @click="onReset('user_main')">重置</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-dialog>
+    <!--  权限信息  -->
+    <el-dialog
+        :title="activeUserName+'的权限修改'"
+        :visible.sync="accessDialogVisible"
+        width="300px">
+      <el-switch
+          v-model="accessSwitch"
+          @change="changeAccess"
+          active-text="部门管理员">
+      </el-switch>
+    </el-dialog>
+    <!--  活动类型选择  -->
+    <el-dialog
+        title="活动类型选择"
+        :visible.sync="hdlxxzDialogVisible"
+        width="700px"
+        :close-on-click-modal="false">
+      <el-cascader
+          :options="hdlxOptions"
+          :props="{ checkStrictly: true }"
+          placeholder="请选择活动类型"
+          clearable
+          filterable
+          v-model="hdlxCheckedId"></el-cascader>
+      <el-divider></el-divider>
+      <el-button type="primary" @click="addHdlxAdmin">提交设置</el-button>
+    </el-dialog>
+  </div>
 </template>
 
 <script>
+import TreeNav from '@/components/TreeNav/index.vue'
+import axios from "axios";
+import { useUserStore } from '@/stores/user'
+const { token } = useUserStore()
 
-export default {
+import {
+  list_tree,
+  user_list,
+  user_add,
+  user_delete,
+  user_role,
+  user_edit,
+  user_set_access,
+  hdlx_list_tree,
+  hdlx_members_manage,
+  export_all,
+  org_user_list,
+  org_user_add,
+  org_user_detail,
+  org_user_edit
+} from "./api";
 
+export default {
+  components: {
+    TreeNav
+  },
+  data() {
+    return {
+      roleList: [],  // 角色列表
+      deptOptions: [], // 部门组织级联
+      hdlxOptions: [], // 活动类型级联
+      searchText: '',
+      tableData: [],
+      total_rows: 0,
+      userDialogVisible: false,
+      accessDialogVisible: false,
+      accessSwitch: false,
+      user_main: {
+        user_name: '',
+        user_password: '',
+        user_realname: '',
+        dept_id: '',
+        user_level: '',
+        user_phone: '',
+        user_role_id: ''
+      },
+      form_rules: {
+        user_name: [
+          {required: true, message: '请输入用户名', trigger: 'blur'}
+        ],
+        // user_password: [
+        //   {required: true, message: '请输入密码', trigger: 'blur'}
+        // ],
+        user_realname: [
+          {required: true, message: '请输入用户姓名', trigger: 'blur'}
+        ],
+        user_level: [
+          {required: true, message: '请选择账号类型', trigger: 'change'}
+        ],
+        dept_id: [
+          {required: true, message: '请选择部门', trigger: 'change'}
+        ]
+      },
+      activeDeptName: '',
+      activeTableChecked: [],
+      activeUserId: '',
+      activeUserName: '',
+      tableParams: {
+        page: 1,
+        limit: 10,
+        dept_id: '',
+        keyword: ''
+      },
+      dialogType: '',
+      hdlxxzDialogVisible: false,
+      hdlxCheckedId: [],
+      import_url: import.meta.env.VITE_APP_BASE_API + 'user/org/import',
+      import_data : {
+        api: 'json',
+        token: token
+      }
+    }
+  },
+  created() {
+    this.loadingUserRolesData()
+    this.loadingCascadeData()
+  },
+  watch: {
+    // 监听传参改变
+    tableParams: {
+      handler(newData, oldData) {
+        this.renderTable(newData)
+      },
+      immediate: true,
+      deep: true
+    }
+  },
+  methods: {
+    loadingUserRolesData() {
+      user_role()
+          .then(res => {
+            if (res.code === '1') {
+              this.roleList = res.data.page_data
+            }
+          })
+    },
+    loadingCascadeData() {
+      list_tree()
+          .then(res => {
+            if (res.code === '1') {
+              const list = res.data.one_info
+              this.deptOptions = list
+            }
+          })
+      hdlx_list_tree()
+          .then(res => {
+            if (res.code === '1') {
+              const list = res.data.one_info
+              this.hdlxOptions = list
+            }
+          })
+    },
+    updateDeptId(data) {
+      this.activeDeptName = data.msg.label
+      this.tableParams.dept_id = data.msg.id
+    },
+    // 渲染列表
+    renderTable(data) {
+      user_list(data)
+          .then(res => {
+            if (res.code === '1') {
+              this.tableData = res.data.page_data
+              this.total_rows = res.data.total_rows * 1
+            }
+          })
+    },
+    pageChange(page) {
+      this.tableParams.page = page
+    },
+    showDialog(type, data) {
+      let _this = this
+      if (data) {
+        this.activeUserId = data.user_id
+        data.dept_id = data.org_info.dept_id
+        Object.keys(data).forEach(function (key) {
+          if (_this.user_main.hasOwnProperty(key)) {
+            _this.user_main[key] = data[key]
+          }
+        });
+      }
+      this.dialogType = type
+      this.userDialogVisible = true
+    },
+    showAccessDialog(row) {
+      this.activeUserId = row.user_id
+      this.activeUserName = row.user_name
+      this.accessSwitch = row.org_info.is_master === '1' ? true : false
+      this.accessDialogVisible = true
+    },
+    changeAccess(val) {
+      let data = {}
+      data.user_id = this.activeUserId
+      data.access = {
+        dept_master: val ? 1 : 0
+      }
+      user_set_access(data)
+          .then(res => {
+            if (res.code === '1') {
+              this.$message.success(res.msg)
+            }
+          })
+    },
+    changeChecked(val) {
+      this.activeTableChecked = val
+    },
+    delUser() {
+      let user_id_list = this.getCheckedUsers()
+      if (user_id_list) {
+        this.$confirm('此操作将永久删除多个用户, 是否继续?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          user_delete({user_id: user_id_list})
+              .then(res => {
+                console.log(res)
+                if (res.code === '1') {
+                  this.$message({
+                    type: 'success',
+                    message: '删除成功!'
+                  });
+                  this.renderTable(this.tableParams)
+                }
+              })
+        }).catch(() => {
+          this.$message({
+            type: 'info',
+            message: '已取消删除'
+          });
+        });
+      }
+    },
+    onSubmit(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          let user_main = this.user_main
+          user_main.dept_id = user_main.dept_id[user_main.dept_id.length - 1]
+          let data = {}
+          data.issubmit = 1
+          data.user_main = user_main
+          if (this.dialogType === 'add') {
+            user_add(data)
+                .then(res => {
+                  if (res.code === '1') {
+                    this.$message({
+                      showClose: true,
+                      message: res.msg,
+                      type: 'success'
+                    });
+                    this.userDialogVisible = false
+                    this.renderTable(this.tableParams)
+                  }
+                })
+          } else if (this.dialogType === 'edit') {
+            data.user_id = this.activeUserId
+            user_edit(data)
+                .then(res => {
+                  if (res.code === '1') {
+                    this.$message({
+                      showClose: true,
+                      message: res.msg,
+                      type: 'success'
+                    });
+                    this.userDialogVisible = false
+                    this.renderTable(this.tableParams)
+                  }
+                })
+          }
+        } else {
+          return false;
+        }
+      });
+    },
+    onReset(formName) {
+      this.$refs[formName].resetFields();
+    },
+    resetDialog(formData) {
+      this.user_main = {
+        user_name: '',
+        user_password: '',
+        user_realname: '',
+        dept_id: '',
+        user_level: '',
+        user_phone: '',
+        user_role_id: ''
+      }
+      this.$refs[formData].clearValidate()
+    },
+    // 获取用户多选列表
+    getCheckedUsers() {
+      const checkedDatas = this.activeTableChecked
+      if (checkedDatas.length <= 0) {
+        this.$message.info('请勾选需要操作的用户')
+        return false
+      }
+      let user_id_list = []
+      checkedDatas.forEach(item => {
+        item.user_id ?
+            user_id_list.push(item.user_id) :
+            null
+      })
+      return user_id_list
+    },
+    // 添加为活动管理
+    hdlxglDialogShow() {
+      let user_id_list = this.getCheckedUsers()
+      if (user_id_list) {
+        this.hdlxxzDialogVisible = true
+      }
+    },
+    addHdlxAdmin() {
+      const hh_id = this.hdlxCheckedId
+      const data = {
+        hh_id: hh_id[hh_id.length - 1],
+        type: 'add',
+        user_ids: this.getCheckedUsers().toString()
+      }
+      console.log(data)
+      hdlx_members_manage(data)
+          .then(res => {
+            if (res.code === '1') {
+              this.$message.success('添加成功')
+              this.hdlxxzDialogVisible = false
+            }
+          })
+    },
+    exportAll() {
+      axios.get('https://hdpb.dev.bozedu.net/user/org/index', {
+        params: {
+          api: 'xls',
+          output_way: 2
+        }
+      }).then(res => {
+        if (res.status === 200 && res.data.code === '1') {
+          const data = res.data.data
+          const download_url = data.download_url
+          let tagA = document.createElement('a')
+          tagA.download = download_url
+          tagA.href = download_url
+          tagA.click()
+        }
+      })
+    },
+    import_success() {
+      this.$message.success('导入成功')
+      this.renderTable()
+    }
+  }
 }
 </script>
 
 <style lang="scss" scoped>
+header {
+  display: flex;
+  justify-content: space-between;
+}
+
+::v-deep .el-cascader {
+  display: block;
+}
 </style>