二.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="width: 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="">
<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="width: 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="">
<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="width: 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="">
<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="" style="text-align: right">
<el-button type="primary" @click="handleAddGroupBtn">添加用户组</el-button>
</el-col>
</div>
<el-table
:data="groupList"
border
style="width: 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="">
<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="" style="text-align: right">
<el-button type="primary" @click="handleAddGroupBtn">添加用户组</el-button>
</el-col>
</div>
<el-table
:data="groupList"
border
style="width: 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

效果如图:

二.4vue展示用户数据及用户组操作以及给用户组添加额外字段的更多相关文章
- 04: Form 验证用户数据 & 生成html
目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...
- 在已有数据的表中添加id字段并且自增
各位大牛,小弟在开发过程中,遇到了这样一个问题,由于新功能的增加需要使原有的一张表的结构作出调整,需要添加一个id主键字段,但是因为表里有很多数据了,所以,怎样才能添加这个字段,并且使原有的数据也能够 ...
- Entity Framework 程序设计入门二 对数据进行CRUD操作和查询
前一篇文章介绍了应用LLBL Gen生成Entity Framework所需要的类型定义,用一行代码完成数据资料的读取, <LLBL Gen + Entity Framework 程序设计入门& ...
- 一、JDBC的概述 二、通过JDBC实现对数据的CRUD操作 三、封装JDBC访问数据的工具类 四、通过JDBC实现登陆和注册 五、防止SQL注入
一.JDBC的概述###<1>概念 JDBC:java database connection ,java数据库连接技术 是java内部提供的一套操作数据库的接口(面向接口编程),实现对数 ...
- MYSQL初级学习笔记二:数据表相关操作及MySQL存储引擎!(视频序号:初级_5,7-22|6)
知识点三:数据表相关操作(5,7-22) --------------------------------整型--------------------------------- --测试整型 CREA ...
- Saiku设置展示table数据不隐藏空的行数据信息(二十六)
Saiku设置展示table数据不隐藏空的行数据信息 saiku有个 非空的字段 按钮,点击这个后,会自动的把空的行数据信息给隐藏掉,这里我们来设置一下让其行数据不隐藏,为空的就为空. 主要更改两个文 ...
- Saiku控制页面展示的数据过长自动换行(二十四)
Saiku控制页面展示的数据过长自动换行 目前用到saiku来展示数据,发现数据文本过长也不会自动换行,然而用户那边又需要换行(会好看些),所以就来改一改源码啦 首先我们使用谷歌浏览器 inspect ...
- python操作三大主流数据库(14)python操作redis之新闻项目实战②新闻数据的展示及修改、删除操作
python操作三大主流数据库(14)python操作redis之新闻项目实战②新闻数据的展示及修改.删除操作 项目目录: ├── flask_redis_news.py ├── forms.py ├ ...
- [Swift实际操作]七、常见概念-(10)使用UserDefaults和归档方式存取用户数据实际操作
在项目开发之中,你会经常需要将一些数据存储在本地,以便记录用户生产的数据或操作习惯.在项目文件夹上带点击鼠标右键.弹出右键菜单.本文将为你演示,存储用户数据的两种常用方式. 选择菜单中的创建新文件选项 ...
随机推荐
- Java实现 LeetCode 131 分割回文串
131. 分割回文串 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab" 输出: [ ["aa ...
- Python API自动化测试实操
废话不多说,直接上代码截图: 我们首先来看看整个工程的目录结构,这样以便于了解项目的调用关系:config #这里是配置包 -- base_url.py 具体配置了被测系统的url and pat ...
- 搭建手机web服务器-----内网穿透(无需Root)
搭建手机web服务器-----内网穿透(无需Root) 一.内网穿透部分 前言: 网上内网穿透的方法很多,像花生壳.Ngrok.Frp等等,但是大多都需要获取手机root权限 本文使用的软件是Term ...
- Action的三种实现方式,struts.xml配置的详细解释及其简单执行过程(二)
勿以恶小而为之,勿以善小而不为--------------------------刘备 劝诸君,多行善事积福报,莫作恶 上一章简单介绍了Struts2的'两个蝴蝶飞,你好' (一),如果没有看过,请观 ...
- Python大神编程常用4大工具,你用过几个?
摘要:Python是一种跨平台的编程语言,能够在所有主要的操作系统上,运行你编写的任何Python程序.今天介绍几款常见的工具:Python自带的解释器.文本编辑器(Geany.Sublime Tex ...
- [apue] sysconf 的四种返回状态
众所周知,sysconf 用来返回某种常量的定义或者资源的上限,前者用于应用动态的判断系统是否支持某种标准或能力.后者用于决定资源分配的尺寸. 但是你可能不知道的是,sysconf 可以返回四种状态: ...
- Python实现DPABI当中“DICOM Sorted”功能
1. 前言 在对DICOM数据预处理之前很重要的一步是将扫描得到的文件按照不同的扫描序列区分开来.DPABI和PANDA工具包中已经提供了相应的功能模块.但由于是集成的模块,不容易及逆行扩展和调整.这 ...
- Clear Writer v1.8 更新
拖更了这么久之后,Clear Writer 诈尸啦(bushi 下载链接:https://linhongping.lanzous.com/ikF2Udmf7if Clear Writer v1.8 更 ...
- 私有云nextcloud、seafile、syncthing的比较
可选 nextcloud.seafile.syncthing 1. seafile https://www.jianshu.com/p/43f570118e63 https://www.jianshu ...
- python批量发邮件
如果有一天,老板过来给你一个很大的邮箱列表,要你给每个人发邮件,你该如何去做,最简单的就是写一个 python 程序 # coding:utf-8import smtplibfrom email.mi ...