zoukankan      html  css  js  c++  java
  • 二.4vue展示用户数据及用户组操作以及给用户组添加额外字段

    一.用户列表

     1.新建(1)views/users/index.vue:

    <template>
      <div class="user-list-container">
        用户列表
      </div>
    </template>
    
    <script>
      import { getUserList } from '@/api/users'
      export default {
        data() {
          return {
            userList: []
          }
        },
        created() {
          this.fetchData()
        },
        methods: {
          fetchData() {
            getUserList(this.params).then(res => {
              console.log(res)
            })
          }
        }
      }
    
    </script>

    (2)views/users/groups.vue:

    2.配置路由src/router/index.js

      {
        path: '/users',
        component: Layout,
        name: '用户管理',
        meta: { title: '用户管理', icon: 'example' },
        children: [
          {
            path: 'list',
            name: '用户列表',
            component: () => import('@/views/users/index'),
            meta: { title: '用户列表' }
          }
        ]
      },

    3.src/views/login/index.vue

     4.写api接口sr/api/users.js

    import request from '@/utils/request'
    
    export function getUserList(params) {
      return request({
        url: '/users/',
        method: 'get',
        params
      })
    }

    效果如下图拿到数据了:

     6.让数据在页面展示views/users/index.vue

    <template>
      <div class="user-list-container">
        {{ userList }}
      </div>
    </template>
    
    <script>
      import { getUserList } from '@/api/users'
      export default {
        data() {
          return {
            userList: []
          }
        },
        created() {
          this.fetchData()
        },
        methods: {
          fetchData() {
            getUserList(this.params).then(res => {
              this.userList = res.results
            })
          }
        }
      }
    
    </script>

    7.让数据格式化展示及分页views/users/index.vue:

    (1)https://element.eleme.io/#/zh-CN/component/table  拿带边框tablle模版代码

    (2)https://element.eleme.io/#/zh-CN/component/pagination#slot 拿带背景的分页

    (3)实现点击某页码时出现对应页面数据--事件

    <template>
      <div class="user-list-container">
        <el-table
          :data="userList"
          border
          style=" 100%">
          <el-table-column
            prop="id"
            label="id">
          </el-table-column>
          <el-table-column
            prop="username"
            label="姓名">
          </el-table-column>
          <el-table-column
            prop="email"
            label="邮件地址">
          </el-table-column>
        </el-table>
        <center>
        <el-pagination
          background
          layout="prev, pager, next"
          @current-change="handleCurrentChange"
          :total="totalNum">
        </el-pagination>
        </center>
      </div>
    </template>
    
    <script>
      import { getUserList } from '@/api/users'
      export default {
        data() {
          return {
            userList: [],
            totalNum: 0,
            params: {
              page: 1
            }
          }
        },
        created() {
          this.fetchData()
        },
        methods: {
          fetchData() {
            getUserList(this.params).then(res => {
              this.userList = res.results
              this.totalNum = res.count
            })
          },
          handleCurrentChange(val) {
            this.params.page = val
            this.fetchData()
          }
        }
      }
    
    </script>

    这样就实现效果了,如下图

     二.用户页增加搜索功能

     1.devops/apps/users/filters.py:

    import django_filters
    from django.contrib.auth import get_user_model
    User = get_user_model()
    
    class UserFilter(django_filters.FilterSet):
        username = django_filters.CharFilter(field_name="username", lookup_expr='contains')
    
        class Meta:
            model = User
            fields = ['username']

    2.src/views/users/index.vue

    定义一变量保存用户搜索的内容,并给搜索一事件.

    给搜索加回车事件.

    https://element.eleme.io/#/zh-CN/component/input拿复合型输入框

    <template>
      <div class="user-list-container">
        <div>
          <el-col :span="6">
            <el-input placeholder="搜索" v-model="params.username" @keyup.enter.native="searchClick">
              <el-button slot="append" icon="el-icon-search" @click="searchClick"></el-button>
            </el-input>
          </el-col>
        </div>
        <el-table
          :data="userList"
          border
          style=" 100%">
          <el-table-column
            prop="id"
            label="id">
          </el-table-column>
          <el-table-column
            prop="username"
            label="姓名">
          </el-table-column>
          <el-table-column
            prop="email"
            label="邮件地址">
          </el-table-column>
        </el-table>
        <center>
        <el-pagination
          background
          layout="prev, pager, next"
          @current-change="handleCurrentChange"
          :total="totalNum">
        </el-pagination>
        </center>
      </div>
    </template>
    
    <script>
      import { getUserList } from '@/api/users'
      export default {
        data() {
          return {
            userList: [],
            totalNum: 0,
            params: {
              page: 1,
              username: ''
            }
          }
        },
        created() {
          this.fetchData()
        },
        methods: {
          fetchData() {
            getUserList(this.params).then(res => {
              this.userList = res.results
              this.totalNum = res.count
            })
          },
          handleCurrentChange(val) {
            this.params.page = val
            this.fetchData()
          },
          searchClick() {
            this.params.page = 1
            this.fetchData()
          }
        }
      }
    </script>

    效果如图

     三.创建用户组

    1.创建用户组后端实现:

    (python36env) [vagrant@CentOS apps]$ django-admin startapp groups

    (1)settings.py

    ...
    'groups.apps.UsersConfig',
    ..

    (2)序列化groups/serilaizers.py

    from django.contrib.auth.models import Group
    from rest_framework import serializers
    
    class GroupSerializer(serializers.ModelSerializer):
        class Meta:
            model = Group
            fields = ("id", "name")

    (3)group/views.py

    from rest_framework import viewsets
    from django.contrib.auth.models import Group
    from .serializers import GroupSerializer
    
    
    class GroupViewset(viewsets.ModelViewSet):
        queryset = Group.objects.all()
        serializer_class = GroupSerializer

    (4)apps/groups/router.py:

    在groups app下建一router文件(作用是把此app下所有的viewset全部作了一映射),

    from rest_framework.routers import DefaultRouter
    from .views import GroupViewset
    
    group_router = DefaultRouter()
    group_router.register(r'Groups', GroupViewset, basename="Groups")

    (5)devops/urls.py:把app下的router关联进来

    from groups.router import group_router
    route.registry.extend(group_router.registry)

    效果如图,并手动创建几条数据

     (6)给它做搜索groups/fileter.py

    import django_filters
    from django.contrib.auth.models import Group
    
    class GroupFilter(django_filters.FilterSet):
        name = django_filters.CharFilter(lookup_expr="icontains")
        class Meta:
            model = Group
            fields = ["name"]

    views.py中引入:

    from rest_framework import viewsets
    from django.contrib.auth.models import Group
    from .serializers import GroupSerializer
    from .filter import GroupFilter
    
    class GroupViewset(viewsets.ModelViewSet):
        queryset = Group.objects.all()
        serializer_class = GroupSerializer
        filter_class = GroupFilter
        filter_fields = ("name",)

    2.用户组前端对接--用户组的查询

    (1)src/api/groups.js

    import request from '@/utils/request'
    
    // 获取用户组列表
    export function getGroupList(params) {
      return request({
        url: '/Groups/',
        method: 'get',
        params
      })
    }

    (2)src/views/users/groups.vue

    <template>
      <div class="group-list-container">
        <div>
          <el-col :span="6">
            <el-input placeholder="搜索" v-model="params.name" @keyup.enter.native="searchClick">
              <el-button slot="append" icon="el-icon-search" @click="searchClick"></el-button>
            </el-input>
          </el-col>
        </div>
        <el-table
          :data="groupList"
          border
          style=" 100%">
          <el-table-column
            prop="id"
            label="id">
          </el-table-column>
          <el-table-column
            prop="name"
            label="姓名">
          </el-table-column>
        </el-table>
        <center>
          <el-pagination
            background
            layout="prev, pager, next"
            @current-change="handleCurrentChange"
            :total="totalNum">
          </el-pagination>
        </center>
      </div>
    </template>
    
    <script>
      import { getGroupList } from '@/api/groups'
      export default {
        data() {
          return {
            groupList: [],
            totalNum: 0,
            params: {
              page: 1,
              name: ''
            }
          }
        },
        created() {
          this.fetchData()
        },
        methods: {
          fetchData() {
            getGroupList(this.params).then(res => {
              this.groupList = res.results
              this.totalNum = res.count
            })
          },
          handleCurrentChange(val) {
            this.params.page = val
            this.fetchData()
          },
          searchClick() {
            this.params.page = 1
            this.fetchData()
          }
        }
      }
    </script>

    效果如下:

     3.实现用户组的添加--增加数据需要用到模态框

     https://element.eleme.io/#/zh-CN/component/dialog拿自定义框(打开嵌套表单的 Dialog)模版

    https://element.eleme.io/#/zh-CN/component/button拿基础button

    https://element.eleme.io/#/zh-CN/component/form  form表单

    https://element.eleme.io/#/zh-CN/component/pagination--显示总数

    (1)views/users/groups.vue

    (2)加表单验证用于提交添加的用户组数据

    <template>
      <div class="group-list-container">
        <div>
          <el-col :span="8">
            <el-input placeholder="搜索" v-model="params.name" @keyup.enter.native="searchClick">
              <el-button slot="append" icon="el-icon-search" @click="searchClick"></el-button>
            </el-input>
          </el-col>
          <el-col :span="16" style="text-align: right">
            <el-button type="primary" @click="handleAddGroupBtn">添加用户组</el-button>
          </el-col>
        </div>
        <el-table
          :data="groupList"
          border
          style=" 100%">
          <el-table-column
            prop="id"
            label="id">
          </el-table-column>
          <el-table-column
            prop="name"
            label="组名">
          </el-table-column>
        </el-table>
        <center>
          <el-pagination
            background
            layout="total, prev, pager, next, jumper"
            @current-change="handleCurrentChange"
            :total="totalNum">
          </el-pagination>
        </center>
        <el-dialog title="添加用户组" :visible.sync="addGroupFormVisible">
          <el-form :model="addGroupForm" :rules="addGroupFormRule" ref="addGroupFormRule" >
            <el-form-item label="组名" :label-width="addGroupFormLabelWidth" prop="name">
              <el-input v-model="addGroupForm.name" autocomplete="off"></el-input>
            </el-form-item>
          </el-form>
          <div slot="footer" class="dialog-footer">
            <el-button @click="addGroupFormVisible = false">取 消</el-button>
            <el-button type="primary" @click="handleAddGroupSubmit">确 定</el-button>
          </div>
        </el-dialog>
      </div>
    </template>
    
    <script>
      import { getGroupList, createGroup } from '@/api/groups'
      export default {
        data() {
          return {
            groupList: [],
            totalNum: 0,
            params: {
              page: 1,
              name: ''
            },
            addGroupFormVisible: false,
            addGroupFormLabelWidth: '120px',
            addGroupForm: {
              name: ''
            },
            addGroupFormRule: {
              name: [
                { required: true, message: '请输入活动名称', trigger: 'blur' },
                { min: 3, max: 30, message: '长度在 3 到 30 个字符', trigger: 'blur' }
              ]
            }
          }
        },
        created() {
          this.fetchData()
        },
        methods: {
          fetchData() {
            getGroupList(this.params).then(res => {
              this.groupList = res.results
              this.totalNum = res.count
            })
          },
          handleCurrentChange(val) {
            this.params.page = val
            this.fetchData()
          },
          searchClick() {
            this.params.page = 1
            this.fetchData()
          },
          handleAddGroupBtn() {
            this.addGroupFormVisible = true
          },
          handleAddGroupSubmit() {
            createGroup(this.addGroupForm).then(res => {
              this.$message({
                message: '创建用户组成功',
                type: 'success'
              })
              this.addGroupFormVisible = false
              this.$refs['addGroupForm'].resetFields()
              this.fetchData()
            })
          }
        }
      }
    </script>

    (3)src/api/groups.js

    import request from '@/utils/request'
    
    // 获取用户组列表
    export function getGroupList(params) {
      return request({
        url: '/Groups/',
        method: 'get',
        params
      })
    }
    
    // 创建用户组
    export function createGroup(data) {
      return request({
        url: '/Groups/',
        method: 'post',
        data
      })
    }

    效果如下

     4.实现用户组的修改与删除

     (1)src/api/groups.js

    import request from '@/utils/request'
    
    // 获取用户组列表
    export function getGroupList(params) {
      return request({
        url: '/Groups/',
        method: 'get',
        params
      })
    }
    
    // 创建用户组
    export function createGroup(data) {
      return request({
        url: '/Groups/',
        method: 'post',
        data
      })
    }
    
    // 修改用户组
    export function updateGroup(id, data) {
      return request({
        url: '/Groups/' + id + '/',
        method: 'patch',
        data
      })
    }
    
    // 删除用户组
    export function deleteGroup(id) {
      return request({
        url: '/Groups/' + id + '/',
        method: 'delete'
      })
    }

    (2)src/views/users/groups.vue

    https://element.eleme.io/#/zh-CN/component/button并给button加事件

    <template>
      <div class="user-group-container">
        <div>
          <el-col :span="8">
            <el-input placeholder="搜索" v-model="params.name" @keyup.enter.native="searchClick">
              <el-button slot="append" icon="el-icon-search" @click="searchClick"></el-button>
            </el-input>
          </el-col>
          <el-col :span="16" style="text-align: right">
            <el-button type="primary" @click="handleAddGroupBtn">添加用户组</el-button>
          </el-col>
        </div>
        <el-table
          :data="groupList"
          border
          style=" 100%">
          <el-table-column
            prop="id"
            label="id">
          </el-table-column>
          <el-table-column
            prop="name"
            label="用组">
          </el-table-column>
          <el-table-column
            label="操作">
            <template slot-scope="scope">
              <el-button type="warning" icon="el-icon-edit" circle @click="handleModifyGroupClick(scope.row)"></el-button>
              <el-button type="danger" icon="el-icon-delete" circle @click="handleDeleteGroupClick(scope.row.id)"></el-button>
            </template>
          </el-table-column>
        </el-table>
        <center>
          <el-pagination
            background
            layout="total, prev, pager, next, jumper"
            @current-change="handleCurrentChange"
            :total="totalNum">
          </el-pagination>
        </center>
    
        <el-dialog title="添加用户组" :visible.sync="addGroupFormVisible">
          <el-form  :model="addGroupForm" :rules="addGroupFormRule" ref="addGroupForm" >
            <el-form-item label="用户组" :label-width="addGroupFormLabelWidth" prop="name">
              <el-input v-model="addGroupForm.name" auto-complete="off"></el-input>
            </el-form-item>
          </el-form>
          <div slot="footer" class="dialog-footer">
            <el-button @click="addGroupFormVisible = false">取 消</el-button>
            <el-button type="primary" @click="handleAddGroupSubmit" >确 定</el-button>
          </div>
        </el-dialog>
    
        <el-dialog title="修改用户组" :visible.sync="groupModifyFormVisible">
          <el-form  :model="groupModifyForm" :rules="addGroupFormRule" ref="groupModifyForm" >
            <el-form-item label="用户组" :label-width="addGroupFormLabelWidth" prop="name">
              <el-input v-model="groupModifyForm.name" auto-complete="off"></el-input>
            </el-form-item>
          </el-form>
          <div slot="footer" class="dialog-footer">
            <el-button @click="groupModifyFormVisible = false">取 消</el-button>
            <el-button type="primary" @click="handleGroupModifySubmit" >确 定</el-button>
          </div>
        </el-dialog>
    
      </div>
    </template>
    
    <script>
      import { getGroupList, createGroup, updateGroup, deleteGroup } from '@/api/groups'
      export default {
        data() {
          return {
            groupList: [],
            totalNum: 0,
            params: {
              page: 1,
              name: ''
            },
            addGroupFormVisible: false,
            addGroupFormLabelWidth: '120px',
            addGroupForm: {
              name: ''
            },
            addGroupFormRule: {
              name: [
                { required: true, message: '请输入活动名称', trigger: 'blur' },
                { min: 3, max: 30, message: '长度在 3 到 30 个字符', trigger: 'blur' }
              ]
            },
            groupModifyFormVisible: false,
            groupModifyForm: {
              id: 0,
              name: ''
            }
          }
        },
        created() {
          this.fetchData()
        },
        methods: {
          fetchData() {
            getGroupList(this.params).then(res => {
              this.groupList = res.results
              this.totalNum = res.count
            })
          },
          handleCurrentChange(val) {
            this.params.page = val
            this.fetchData()
          },
          searchClick() {
            this.params.page = 1
            this.fetchData()
          },
          handleAddGroupBtn() {
            this.addGroupFormVisible = true
          },
          handleAddGroupSubmit() {
            createGroup(this.addGroupForm).then(res => {
              this.$message({
                message: '创建用户组成功',
                type: 'success'
              })
              this.addGroupFormVisible = false
              this.$refs['addGroupForm'].resetFields()
              this.fetchData()
            })
          },
          handleModifyGroupClick(obj) {
            this.groupModifyForm = obj
            this.groupModifyFormVisible = true
          },
          handleGroupModifySubmit() {
            updateGroup(this.groupModifyForm.id, this.groupModifyForm).then(res => {
              this.$message({
                message: '修改用户组成功',
                type: 'success'
              })
              this.groupModifyFormVisible = false
              this.$refs['groupModifyForm'].resetFields()
              this.fetchData()
            })
          },
          handleDeleteGroupClick(id) {
            this.$confirm('是否确认删除用户组?', '提示', {
              confirmButtonText: '确定',
              cancelButtonText: '取消',
              type: 'warning'
            }).then(() => {
              deleteGroup(id).then(() => {
                this.$message({
                  message: '删除成功',
                  type: 'success'
                })
                this.fetchData()
              })
            }).catch(() => {
              this.$message({
                type: 'info',
                message: '已取消删除'
              })
            })
          }
        }
      }
    
    </script>

    效果如图:

     5.给用户组添加额外字段

    给用户组加一用户组的成员数,如下图用户组接口中只有两字段

     (1)后端apps/groups/serilaizers.py:

    from django.contrib.auth.models import Group
    from rest_framework import serializers
    
    class GroupSerializer(serializers.ModelSerializer):
        def to_representation(self, instance):
            ret = super(GroupSerializer, self).to_representation(instance)
            ret["users"] = instance.user_set.count()
            return ret
        class Meta:
            model = Group
            fields = ("id", "name")

     (2)前端中添加views/users/groups.vue

     效果如图:

  • 相关阅读:
    一步一步学数据结构之(动态申请二维数组)
    运维自动化
    oracle查看登录到oracle服务器的客户端ip
    权限
    windows下使用SQLPLUS制作BAT执行SQL文件
    rsyslog传输type
    C经典实例
    mysql导出数据库数据及表结构
    解决oracle11g无法导出空表问题
    opennebula onenebula
  • 原文地址:https://www.cnblogs.com/dbslinux/p/13206246.html
Copyright © 2011-2022 走看看