Vue-dvadmin-d2-crud-plus-自定义后台菜单-添加页面

文章目录

    • 1.新建数据模型
    • 2.新建数据序列类
    • 3.新建数据视图
    • 4.配置路由
    • 5.前端新建View组件
    • 6.配置后台
    • 7.总结

django-vue-admin是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。
🧑‍🤝‍🧑前端采用D2Admin 、Vue、ElementUI。
👭后端采用 Python 语言 Django 框架以及强大的 Django REST Framework。
👫权限认证使用Django REST Framework SimpleJWT,支持多终端认证系统。
👬支持加载动态权限菜单,多方式轻松权限控制。
💏特别鸣谢:D2Admin 、Vue-Element-Admin。
在这里插入图片描述
这套系统需要Django的基础知识,REST Framework框架的基础理解以及D2Admin的基础理解。本文从头开始简易说明如何用dvadmin管理一张数据表。

1.新建数据模型

处理数据是计算机最初开始的地方。在Django中,称为数据模型。声明如下:

class UserIPStatistics(CoreModel):#CoreModel 是dvadmin的核心字段,含用户信息ip = models.CharField(max_length=255, verbose_name='IP', help_text="IP")num = models.IntegerField( verbose_name='完成次数', help_text="完成次数", blank=True, default=0)class Meta:db_table = table_prefix + "UserStatistics"verbose_name = '用户使用次数'verbose_name_plural = verbose_nameordering = ('-create_datetime',)

2.新建数据序列类

将用户ID转为用户名,方便在前端显示。

#用户统计序列化
class UserIPStatisticsSerializer(serializers.ModelSerializer):#自定义字段creator = serializers.SerializerMethodField();zl_user=serializers.CharField(source="creator");#自定义字段#转为用户名def get_creator(self, obj):try:rlt=obj.creator.username;return rlt;except Exception as e:return ""class Meta:model = UserIPStatisticsfields = '__all__'read_only_fields = ('id', 'zl_user')

3.新建数据视图

指明查询集,序列化类和权限验证类。与文章开始的图保持一致。

# IP统计数据
class UserIPStatisticsViewSet(viewsets.ModelViewSet):queryset = UserIPStatistics.objects.all()serializer_class = UserIPStatisticsSerializerpermission_classes = (permissions.IsAuthenticated,)

4.配置路由

如果在应用中,需要将应用的路由包含到Project中urls中,这里假设读者具备这方面的基础知识。

router = routers.SimpleRouter()
router.register(r'useripstatistics', UserIPStatisticsViewSet)urlpatterns += router.urls
urlpatterns = format_suffix_patterns(urlpatterns)

注意:模型数据一般放在models文件中,序列类可以放在views文件中,也可以放在单独的serializers文件中,数据视图类放在views文件中。

执行以下命令进行数据的迁移。

python.exe manage.py makemigrations
python.exe manage.py migrate
python.exe manage.py init

---------------------------------------------------------至此,后台配置完成-------------------------------------------------------

5.前端新建View组件

在src/views目标下新建UserIPStatistics文件夹,并新建api.js + crud.js +index.vue 三个文件。
在这里插入图片描述
api.js文件内容:

import { request } from '@/api/service' //系统封装好的请求后端数据export const urlPrefix = '/colorlabel/useripstatistics/' //该组件访问的后端restful接口/*** 列表查询*/
export function GetList (query) {query.limit = 999return request({url: urlPrefix,method: 'get',params: query})
}/*** 新增*/
export function createObj (obj) {return request({url: urlPrefix,method: 'post',data: obj})
}/*** 修改*/
export function UpdateObj (obj) {return request({url: urlPrefix + obj.id + '/',method: 'put',data: obj})
}/*** 删除*/
export function DelObj (id) {return request({url: urlPrefix + id + '/',method: 'delete',data: { id }})
}

crud.js文件内容:
主要是表格显示参数的配置。

// eslint-disable-next-line no-unused-vars
// import { request } from '@/api/service'
// eslint-disable-next-line no-unused-vars
// import { BUTTON_STATUS_NUMBER } from '@/config/button'
// eslint-disable-next-line no-unused-vars
// import { urlPrefix as bookPrefix } from './api'export const crudOptions = (vm) => {return {pageOptions: {compact: true},options: {tableType: 'vxe-table',rowKey: true, // 必须设置,true or falserowId: 'id',height: '100%', // 表格高度100%, 使用toolbar必须设置highlightCurrentRow: false},rowHandle: {//操作按钮行的配置width: 140,view: {thin: true,text: '',disabled () {return !vm.hasPermissions('Retrieve')}},edit: {thin: true,text: '',disabled () {return false//return !vm.hasPermissions('Update')},show: false},remove: {thin: true,text: '',hidden: true,disabled () {return false//return !vm.hasPermissions('Delete')},show: false}},indexRow: { // 或者直接传true,不显示title,不居中title: '序号',align: 'center',width: 100},viewOptions: {componentType: 'form'},formOptions: {defaultSpan: 24, // 默认的表单 spanwidth: '35%'},columns: [{//每一列的字段指定title: '关键词',key: 'search',show: false,disabled: true,search: {disabled: false},form: {disabled: true,component: {props: {clearable: true},placeholder: '请输入关键词'}},view: { // 查看对话框组件的单独配置disabled: true}},{title: 'ID',key: 'id',//与返回json数据的key对应show: false,disabled: true,width: 90,form: {disabled: true}},{title: '用户名',key: 'creator',sortable: true,treeNode: true,search: {disabled: false,component: {props: {clearable: true}}},type: 'input',form: {editDisabled: true,rules: [ // 表单校验规则{ required: true, message: '编码必填项' }],component: {props: {clearable: true},placeholder: '请输入编码'},itemProps: {class: { yxtInput: true }}}},{title: 'IP',key: 'ip',sortable: true,treeNode: true,search: {disabled: false,component: {props: {clearable: true}}},type: 'input',form: {editDisabled: true,rules: [ // 表单校验规则{ required: true, message: '编码必填项' }],component: {props: {clearable: true},placeholder: '请输入编码'},itemProps: {class: { yxtInput: true }}}},{title: '次数',key: 'num',sortable: true,search: {disabled: false,component: {props: {clearable: true}}},type: 'number',form: {rules: [ // 表单校验规则{ required: true, message: '显示值必填项' }],component: {props: {clearable: true},placeholder: '请输入显示值'},itemProps: {class: { yxtInput: true }}}}]//.concat(vm.commonEndColumns())}
}

index.vue 文件内容:

<template><d2-container :class="{ 'page-compact': crud.pageOptions.compact }"><d2-crud-x ref="d2Crud" v-bind="_crudProps" v-on="_crudListeners"><div slot="header"><crud-search ref="search" :options="crud.searchOptions" @submit="handleSearch" /><crud-toolbar :search.sync="crud.searchOptions.show" :compact.sync="crud.pageOptions.compact" :columns="crud.columns" @refresh="doRefresh()" @columns-filter-changed="handleColumnsFilterChanged"/></div></d2-crud-x></d2-container>
</template><script>
import * as api from './api'
import { crudOptions } from './crud'
import { d2CrudPlus } from 'd2-crud-plus'export default {name: 'useripstatistics',mixins: [d2CrudPlus.crud],data () {return {}},methods: {getCrudOptions () {return crudOptions(this)},pageRequest (query) {return api.GetList(query)},/*addRequest (row) {d2CrudPlus.util.dict.clear()return api.createObj(row)},updateRequest (row) {d2CrudPlus.util.dict.clear()return api.UpdateObj(row)},delRequest (row) {return api.DelObj(row.id)},*/// 授权createPermission (scope) {this.$router.push({name: 'menuButton',params: { id: scope.row.id },query: { name: scope.row.name }})}}
}
</script><style lang="scss">.yxtInput {.el-form-item__label {color: #49a1ff;}}
</style>

注意如果是上传文件,应该使用file-uploader类型。并在valueResolve (row, key) 方法中修改值为文件名,否则报错。

valueBuilder (row, key)//在返回之后,填入界面之前进行
{// 某些组件传入的value值可能是一个复杂对象,而row中的单个属性的值不合适传入// 则需要在打开编辑对话框前将row里面多个字段组合成组件需要的value对象// 例如:国际手机号(mobileValue为此column的key)// 示例 http://preview.d2-crud-plus.docmirror.cn/D2CrudPlusExample/#/demo/form/phone// row.mobileValue = { phoneNumber: row.phone, callingCode: row.code, countryCode: row.country }// valueBuilder将会在pageRequest成功返回数据后执行
},
valueResolve (row, key)//在上传序列化之前进行
{// 组件中传回的值也需要分解成row中多个字段的值,用于提交给后台。// 例如:// if (row.mobileValue != null) {//  row.phone = row.mobileValue.phoneNumber//  row.code = row.mobileValue.callingCode//  row.country = row.mobileValue.countryCode// }// valueResolve 将会在//   addRequest(解析添加表单的值)//   updateRequest(解析编辑表单的值)//   pageRequest(解析查询参数)// 之前执行
}

6.配置后台

添加菜单,配置如下,需要改成自己的配置。
在这里插入图片描述
配置访问方式
在这里插入图片描述
点击按钮配置,按restful api方式添加增删查改的路由路径。
在这里插入图片描述
在这里插入图片描述
刷新以下后台,菜单界面就是显示出来最终结果:
在这里插入图片描述

7.总结

dvadmin 能够以简易快捷的方式构建一套后台管理系统,能够快速进行后台表格的管理,十分友好便捷,缺点就是文档,不是很全面,遇到bug需要自己诊断一下源码,找出问题所在。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/118647.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux网络流量监控iftop

在 Linux 系统下即时监控服务器的网络带宽使用情况&#xff0c;有很多工具&#xff0c;比如 iptraf、nethogs 等等&#xff0c;但是推荐使用小巧但功能很强大的 iftop 工具【官网&#xff1a;http://www.ex-parrot.com/~pdw/iftop/】。iftop 是 Linux 系统一个免费的网卡实时流…

Path Gain and Channel Capacity for HAP-to-HAP Communications

文章目录 摘要实验仿真场景一&#xff1a; 距离变化对同海拔高度HAP的影响场景二&#xff1a;距离变化对不同海拔高度HAP通信的影响。场景三&#xff1a;平台高度和频率对HAP通信的影响四 信道容量 摘要 在这项研究中&#xff0c;我们重点分析了HAP之间的信道模型&#xff0c;…

HeidiSQL数据库管理工具使用教程

HeidiSQL数据库管理工具使用教程 功能介绍1. 下载使用2. 连接mysql3. SQL编辑器4. 数据导入和导出5. 批量操作6. 备份和恢复 功能介绍 HeidiSQL&#xff08;HeidiSQL数据库管理工具&#xff09;是一个开源的数据库管理工具&#xff0c;通常用于连接和管理关系型数据库系统。它…

边缘计算:云计算的延伸

云计算已经存在多年&#xff0c;并已被证明对大大小小的企业都有好处&#xff1b;然而&#xff0c;直到最近边缘计算才变得如此重要。它是指发生在网络边缘的一种数据处理&#xff0c;更接近数据的来源地。 这将有助于提高效率并减少延迟以及设备和云之间的数据传输成本。边缘…

EtherNet Ip工业RFID读写器与欧姆龙PLC 配置示例说明

一、准备阶段 POE交换机欧姆龙PLC 支持EtherNet Ip协议CX-Programmer 9.5配置软件 二、配置读卡器 1、打开软件 2、选择网卡&#xff0c;如果多网卡的电脑请注意对应所接的网卡&#xff0c;网卡名一般为“Network adapter Realtek PCIe GBE Family” 3、点击“选择网卡”&…

douyin ios 六神参数学习记录

玩那么久安卓了&#xff0c;也终于换一换ios终端分析分析&#xff0c;还是熟悉的x-gorgon&#xff0c;x-argus&#xff0c;x-medusa那些参数。 随便抓个抖音 ios版本的接口&#xff1a; 像评论接口&#xff1a; https://api26-normal-hl.amemv.com/aweme/v2/comment/list/?…

机器学习之查准率、查全率与F1

文章目录 查准率&#xff08;Precision&#xff09;&#xff1a;查全率&#xff08;Recall&#xff09;&#xff1a;F1分数&#xff08;F1 Score&#xff09;&#xff1a;实例P-R曲线F1度量python实现 查准率&#xff08;Precision&#xff09;&#xff1a; 定义&#xff1a; …

低概率Bug,研发敷衍说复现不到

测试工作中&#xff0c;经常会遇到一些低概率出现的问题&#xff0c;如果再是个严重问题&#xff0c;那测试人员的压力无疑是很大的&#xff0c;一方面是因为低概率难以复现&#xff0c;另一面则是来自项目组的压力。 如何在测试时减少此类问题的重复投入&#xff0c;我的思考如…

自研框架跻身全球 JS 框架榜单,排名紧随 React、Angular 之后!

前言 终于实现了一个重要目标&#xff01;我独立研发的 JavaScript 框架 Strve&#xff0c;最近发布了重大版本 6.0.2。距离上次大版本发布已经接近两个月&#xff0c;期间进行了大量的优化&#xff0c;使得框架性能和稳定性都得到了大幅度的提升。在上次的大版本更新中&#…

css 两栏布局的实现

目录 前言 1. 浮动布局 用法 代码示例 理解 2. Flex布局 用法 代码示例 理解 3. Grid布局 用法 代码示例 理解 高质量的设计 前言 两栏布局是一种常见的网页设计模式&#xff0c;它将页面分为两个主要区域&#xff1a;主内容区域和侧边栏。这种布局方式不仅能够提…

在docker环境下从头搭建openvslam/orb_slam3的流程记录以及问题总结

文章目录 0. 前言1. MobaXterm软件2. docker操作2.1. 拉一个ubuntu镜像2.2. 修改名字&#xff08;可选&#xff09;2.3. 删除之前的docker镜像&#xff08;可选&#xff09; 3. openvslam搭建流程3.1. 起容器3.2. 前置包的安装3.3. 安装Eigen3.4. 安装opencv3.5. 安装DBoW23.6.…

MySQL——九、SQL编程

MySQL 一、触发器1、触发器简介2、创建触发器3、一些常见示例 二、存储过程1、什么是存储过程或者函数2、优点3、存储过程创建与调用 三、存储函数1、存储函数创建和调用2、修改存储函数3、删除存储函数 四、游标1、声明游标2、打开游标3、使用游标4、关闭游标游标案例 一、触发…

Flutter extended_image库设置内存缓存区大小与缓存图片数

ExtendedImage ExtendedImage 是一个Flutter库&#xff0c;用于提供高级图片加载和显示功能。这个库使用了 image 包来进行图片的加载和缓存。如果你想修改缓存大小&#xff0c;你可以通过修改ImageCache的配置来实现。 1. 获取ImageCache实例: 你可以通过PaintingBinding…

超级强大!送你几款Linux 下终极SSH客户端

更多IT技术&#xff0c;请关注微信公众号:“运维之美” 超级强大&#xff01;送你几款Linux 下终极SSH客户端 1.MobaXterm2.Xshell3.SecureCRT4.PuTTY5.FinalShell6.Termius7.WindTerm 安全外壳协议&#xff08;Secure Shell&#xff0c;简称 SSH&#xff09;是一种网络连接协议…

【Gensim概念】02/3 NLP玩转 word2vec

第二部分 句法 六、句法模型&#xff08;类对象和参数&#xff09; 6.1 数据集的句子查看 classgensim.models.word2vec.BrownCorpus(dirname) Bases: object 迭代句子 Brown corpus (part of NLTK data). 6.2 数据集的句子和gram classgensim.models.word2vec.Heapitem(c…

【Docker】Docker数据的存储

默认情况下&#xff0c;在运行中的容器里创建的文件&#xff0c;被保存在一个可写的容器层里&#xff0c;如果容器被删除了&#xff0c;则对应的数据也随之删除了。 这个可写的容器层是和特定的容器绑定的&#xff0c;也就是这些数据无法方便的和其它容器共享。 Docker主要提…

智能井盖监测系统功能,万宾科技传感器效果

智能井盖传感器的出现是高科技产品的更新换代&#xff0c;同时也是智慧城市建设中的需求。在智慧城市建设过程之中&#xff0c;高科技产品的应用数不胜数&#xff0c;智能井盖传感器的出现&#xff0c;解决了城市道路安全保护着城市地下生命线&#xff0c;改善着传统井盖带来的…

责任链模式应用案例

前几天系统商品折扣功能优化&#xff0c;同事采用了责任链模式重构了代码&#xff0c;现整理如下。 一、概念 责任链模式是为请求创建一个处理者对象的链条&#xff0c;所有处理者&#xff08;除最末端&#xff09;都含有下一个对象的引用从而形成一条处理链&#xff0c;该模…

10月最新H5自适应樱花导航网站源码SEO增强版

10月最新H5自适应樱花导航网源码SEO增强版。非常强大的导航网站亮点就是对SEO优化比较好。 开发时PHP版本&#xff1a;7.3开发时MySQL版本&#xff1a;5.7.26 懂前端和PHP技术想更改前端页面的可以看&#xff1a;网站的前端页面不好看&#xff0c;你可以查看index目录&#x…

二、W5100S/W5500+RP2040树莓派Pico<DHCP>

文章目录 1 前言2 简介2 .1 什么是DHCP&#xff1f;2.2 为什么要使用DHCP&#xff1f;2.3 DHCP工作原理2.4 DHCP应用场景 3 WIZnet以太网芯片4 DHCP网络设置示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言 …