黔西南州住房和城乡建设局网站/网站服务公司
本章简介:
- Django 简介
- Django 基本配置
- Django url
- Django view
- Django 模板语言
- Django Form
Django 简介
Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的软件设计模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。
Django的主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”,敏捷开发和DRY法则(Don’t Repeat Yourself)。在Django中Python被普遍使用,甚至包括配置文件和数据模型。
优点:
- 完美的文档,Django的成功,我觉得很大一部分原因要归功于Django近乎完美的官方文档(包括Djangobook)。
- 全套的解决方案,Django象Rails一样,提供全套的解决方案(full-stackframework + batteries included),基本要什么有什么(比如:cache、session、feed、orm、geo、auth),而且全部Django自己造,开发网站应手的工具Django基本都给你做好了,因此开发效率是不用说的,出了问题也算好找,不在你的代码里就在Django的源码里。
- 强大的URL路由配置,Django让你可以设计出非常优雅的URL,在Django里你基本可以跟丑陋的GET参数说拜拜。
- 自助管理后台,admin interface是Django里比较吸引眼球的一项contrib,让你几乎不用写一行代码就拥有一个完整的后台管理界面。
缺点:
- 系统紧耦合,如果你觉得Django内置的某项功能不是很好,想用喜欢的第三方库来代替是很难的,比如下面将要说的ORM、Template。要在Django里用SQLAlchemy或Mako几乎是不可能,即使打了一些补丁用上了也会让你觉得非常非常别扭。
- Django自带的ORM远不如SQLAlchemy强大,除了在Django这一亩三分地,SQLAlchemy是Python世界里事实上的ORM标准,其它框架都支持SQLAlchemy了,唯独Django仍然坚持自己的那一套。
- Template功能比较弱,不能插入Python代码,要写复杂一点的逻辑需要另外用Python实现Tag或Filter。
Django流程介绍
Django采用MTV模式。所谓MVC就是把web应用分为模型(M),控制器©,视图(V)三层;他们之间以一种插件似的,松耦合的方式连接在一起。模型负责业务对象与数据库的对象(ORM),视图负责与用户的交互(页面),控制器©接受用户的输入调用模型和视图完成用户的请求。
- Django的MTV模式本质上与MVC模式没有什么差别,也是各组件之间为了保持松耦合关系,只是定义上有些许不同,Django的MTV分别代表:
- Model(模型):负责业务对象与数据库的对象(ORM)
- Template(模版):负责如何把页面展示给用户
- View(视图):负责业务逻辑,并在适当的时候调用Model和Template
- 此外,Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template
接下来就挨个说说每个模块来构成的Django
Django 基本配置
一、创建django程序
- 终端命令:django-admin startproject sitename
- IDE创建Django程序时,本质上都是自动执行上述命令
1、终端命令
# 查看django版本
$ python -m django --version# 创建项目,名为mysite
$ django-admin startproject mysite# 启动django
$ python manage.py runserver
$ python manage.py runserver 8080
$ python manage.py runserver 0.0.0.0:8000# 创建应用程序,确保和 manage.py 是同一目录
$ python manage.py startapp polls# 运行创造模型变化迁移
$ python manage.py makemigrations# 运行应用模型变化到数据库
$ python manage.py migrate# admin创建管理员用户
$ python manage.py createsuperuser
2、IDE创建(PyCharm为例)
File --> New Project --> 选择Django --> Appliocation Name 创建app
二、生成目录结构如下:
三、配置文件(settings)
1、刚创建django project时,开始写入程序,第一步先要在配置文件中注册app
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','app01', # 注册app
]
2、数据库连接
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME':'数据库名','USER': 'root','PASSWORD': 'xxx','HOST': '','PORT': '',}
}
注:由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替
如下设置放置的与project同名的配置的 init.py文件中
import pymysql
pymysql.install_as_MySQLdb()
3、静态文件配置
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),)
注:需要在project下创建static文件夹
Django url
URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。URL的家在是从配置文件中开始。
1、先写一个简单的世界你好吧
url文件
from django.conf.urls import url
from django.contrib import admin
from app01 import viewsurlpatterns = [url(r'^admin/', admin.site.urls),url(r'^index/', views.index),
]
views文件
from django.shortcuts import render
# Create your views here.def index(request):return render(request,'index.html')
templates文件夹下新建index.html文件
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>Hello 张岩林</h1>
</body>
</html>
2、路由正则
urlpatterns = [url(r '^index/(?P<pager>\d*)/,views.index,{'id':333}),
]
注:Django支持路由正则功能,同时想拿到值可以在view中的函数中把相对应得明明写入即可接收到,{‘id’:333}传入函数,通过key可以取到值
views中index函数
from django.shortcuts import render
# Create your views here.def index(request,pager,id):print(pager,id)return render(request,'index.html')
由此看出正则这块可以写分页功能
3、app对路由规则进行一次分类
需要在app01中新建一个urls文件,然后写入,project下urls配置
from django.conf.urls import url
from django.contrib import admin
from app01 import views
from django.conf.urls import includeurlpatterns = [url(r'^admin/', admin.site.urls),url(r'^buy/', include('app01.urls')),
]
app01下urls配置
#!/usr/bin/env python
# -*- coding:utf-8 -*-from django.conf.urls import url
from django.contrib import admin
from app01 import viewsurlpatterns = [url(r'^admin/', admin.site.urls),url(r'^index/', views.index),
]
访问url如下:
http://127.0.0.1/buy/index/
django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁。
Django views
http请求中产生两个核心对象:
-
http请求:HttpRequest对象
-
http响应:HttpResponse对象
一、HttpRequest对象
# 获取提交方式
request.method
if request.method == "POST":times = time.time()return render(request,'index.html')# 获取前端post提交的数据
request.POST.get('username')# 获取域名后路径
get_full_path()
例:http://127.0.0.1:8000/index33/?name=123 ,req.get_full_path()得到的结果就是/index33/?name=123
二、HttpResponse对象
def test(request):# 往前端写入字符串return HttpResponse("xxx") # 跳转路径return redirect('/index/')# 渲染HTML文件两种方式return render(reuqest, "test.html") return render_to_response('text.html')# 可以直接将函数中所有的变量传给模板return render(reuqest, "test.html",locals()) # 可以根据通过字典的方式往前端传值,取值输入key即可return render(reuqest, "test.html",{'zhang':'好帅'})
Django 模板语言
1、if/else
{% if %}标签计算一个变量值,如果是“true”,即它存在、不为空并且不是false的boolean值
系统则会显示{% if %}和{% endif %}间的所有内容:
{% if today_is_weekend %} <p>Welcome to the weekend!</p>
{% else %} <p>Get back to work.</p>
{% endif %}
2、{% for %}
标签允许你按顺序遍历一个序列中的各个元素,Python的for语句语法为for X in Y,X是用来遍历Y的变量 ,每次循环模板系统都会渲染{% for %}和{% endfor %}之间的所有内容
例如,显示给定athlete_list变量来显示athlete列表:
<ul>
{% for athlete in athlete_list %} <li>{{ athlete.name }}</li>
{% endfor %}
</ul>
forloop.counter # for循环个数
forloop.first # for循环第一个值
forloop.last # for循环最后一个值
3、母版,子版继承,导入
母板:{% block title %}{% endblock % }
子板:{% extends "base.html" %}{% block title %}{% endblock %}
4、自定义模板simple_tag
a、在app中创建templatetags模块
b、创建任意 .py 文件,如:xx.py
#!/usr/bin/env python
#coding:utf-8
from django import template
from django.utils.safestring import mark_safe
from django.template.base import resolve_variable, Node, TemplateSyntaxErrorregister = template.Library()@register.simple_tag
def my_simple_time(v1,v2,v3):return v1 + v2 + v3@register.simple_tag
def my_input(id,arg):result = "<input type='text' id='%s' class='%s' />" %(id,arg,)return mark_safe(result)
注:事例中变量名不能变,必须是固定写法
c、在使用自定义simple_tag的html文件中导入之前创建的 xx.py 文件名
{% load xx %}
d、使用simple_tag
{% my_simple_time 1 2 3%}
{% my_input 'id_username' 'hide'%}
Django Form
有时候我们需要在前台用 get 或 post 方法提交一些数据,所以自己写一个网页,用到 html 表单的知识。
一、基础form提交
比如写一个计算 a和 b 之和的简单应用,网页上这么写
<!DOCTYPE html>
<html>
<body>
<p>请输入两个数字</p><form action="/add/" method="POST"><input type="text" name="a"> <input type="text" name="b"> <input type="submit" value="提交">
</form>
</body>
</html>
把这些代码保存成一个index.html,放在 templates 文件夹中。
网页的值传到服务器是通过 或 标签中的 name 属性来传递的,在服务器端这么接收:
from django.http import HttpResponse
from django.shortcuts import renderdef index(request):return render(request, 'index.html')def add(request):a = request.POST.GET('a')b = request.POST.GET('b')a = int(a)b = int(b)return HttpResponse(str(a+b))
但是,比如用户输入的不是数字,而是字母,就出错了,还有就是提交后再回来已经输入的数据也会没了。
当然如果我们手动将输入之后的数据在 views 中都获取到再传递到网页,这样是可行的,但是很不方便,所以 Django 提供了更简单易用的 forms 来解决验证等这一系列的问题。
二、Django Forms应用
1、简单案例一
在app01下新建一个文件forms.py
from django import formsclass AddForm(forms.Form):a = forms.IntegerField()b = forms.IntegerField()
我们的视图函数 views.py 中
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from django.shortcuts import render,HttpResponse
from app01.forms import AddFormdef index(request):if request.method == 'POST':# 当提交表单时# form 包含提交的数据form = AddForm(request.POST) # 如果提交的数据合法if form.is_valid():a = form.cleaned_data['a']b = form.cleaned_data['b']return HttpResponse(str(int(a) + int(b)))# 当正常访问时else:form = AddForm()return render(request, 'index.html', {'form': form})
对应的模板文件 index.html
<form method='post'>
{% csrf_token %}
{{ form }}
<input type="submit" value="提交">
</form>
这个简单的案例,大家不知道有没有看出其中的蹊跷呢,仔细观察,form类给我做了验证,用户输入错了会弹出报错信息
2、进阶案例二
models.py
from django.db import models# Create your models here.class BookType(models.Model):caption = models.CharField(max_length=64)class Book(models.Model):name = models.CharField(max_length=64)pages = models.IntegerField()price = models.DecimalField(max_digits=10,decimal_places=2)pubdate = models.DateField()book_type = models.ForeignKey('BookType')
views.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from django.shortcuts import render
from app01.forms import Form1def form1(request):if request.method == 'POST':# 获取请求内容做验证f = Form1(request.POST)if f.is_valid():print(f.cleaned_data)else:print(type(f.errors),f.errors)return render(request,'form1.html',{'error':f.errors,'form':f})else:f = Form1()return render(request,'form1.html',{'form':f})
在app01下新建一个文件forms.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-from django import forms
from app01 import modelsclass Form1(forms.Form):# 用户名,给该标签添加一个class属性,还有空值的报错信息修改user = forms.CharField(widget=forms.TextInput(attrs={'class': 'c1'}),error_messages={'required': '用户名不能为空'},)# 密码定义最大长度和最小长度pwd = forms.CharField(max_length=4,min_length=2)# 邮箱定义错误信息,required为空值错误信息,invalid为邮箱匹配错误信息email = forms.EmailField(error_messages={'required': '邮箱不能为空', 'invalid': '邮箱格式错误'})# 生成多行文本编辑框memo = forms.CharField(widget=forms.Textarea())# 下拉菜单实时更新数据库user_type_choice = models.BookType.objects.values_list('id','caption')book_type = forms.CharField(widget=forms.widgets.Select(choices=user_type_choice,attrs={'class': "form-control"}))def __init__(self,*args, **kwargs):super(Form1, self).__init__(*args, **kwargs)self.fields['book_type'] = forms.CharField(widget=forms.widgets.Select(choices=models.BookType.objects.values_list('id','caption'),attrs={'class': "form-control"}))
前端form1.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>.input-group{position: relative;padding: 20px;width: 250px;}.input-group input{width: 200px;display: inline-block;}.input-group span{display: inline-block;position: absolute;height: 12px;font-size: 8px;border: 1px solid red;background-color: darksalmon;color: white;top: 41px;left: 20px;width: 202px;}</style>
</head>
<body><form action="/form1/" method="post"><div class="input-group">{{ form.user }}{% if error.user.0 %}<span>{{ error.user.0 }}</span>{% endif %}</div><div class="input-group">{{ form.pwd }}{% if error.pwd.0 %}<span>{{ error.pwd.0 }}</span>{% endif %}</div><div class="input-group">{{ form.email }}{% if error.email.0 %}<span>{{ error.email.0 }}</span>{% endif %}</div><div class="input-group">{{ form.memo }}{% if error.memo.0 %}<span>{{ error.memo.0 }}</span>{% endif %}</div><div class="input-group">{{ form.book_type }}{% if error.book_type.0 %}<span>{{ error.book_type.0 }}</span>{% endif %}</div><div><input type="submit" value="提交"></div>
</form></body>
</html>
View Code
相关文章:

Python学习笔记_进阶篇(二)_django知识(一)
本章简介: Django 简介Django 基本配置Django urlDjango viewDjango 模板语言Django Form Django 简介 Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的软件设计模式,即模型M,视图V和控制器C。它最初是被开发来…...

【hive】hive中row_number() rank() dense_rank()的用法
hive中row_number() rank() dense_rank()的用法 一、函数说明 主要是配合over()窗口函数来使用的,通过over(partition by order by )来反映统计值的记录。 rank() over()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)dense_rank() …...

【云原生】【k8s】Kubernetes+EFK构建日志分析安装部署
目录 EFK安装部署 一、环境准备(所有主机) 1、主机初始化配置 2、配置主机名并绑定hosts,不同主机名称不同 3、主机配置初始化 4、部署docker环境 二、部署kubernetes集群 1、组件介绍 2、配置阿里云yum源 3、安装kubelet kubeadm …...

计算实数数组中所有元素的绝对值 numpy.fabs()
【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 计算实数数组中所有元素的绝对值 numpy.fabs() [太阳]选择题 请问关于以下代码表述错误的是? iimport numpy as np a np.array([-1,-3]) b np.array([-1,34j]) print("【显…...

深入浅出Pytorch函数——torch.nn.init.orthogonal_
分类目录:《深入浅出Pytorch函数》总目录 相关文章: 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...

ORACLE中UNION、UNION ALL、MINUS、INTERSECT学习
1、UNION和UNION ALL的使用与区别 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字。union的作用是将多个结果合并在一起显示出来。 union和union all的区别是union会自动压缩多个结果集合中的重复结果ÿ…...

【k8s、云原生】基于metrics-server弹性伸缩
第四阶段 时 间:2023年8月18日 参加人:全班人员 内 容: 基于metrics-server弹性伸缩 目录 一、Kubernetes部署方式 (一)minikube (二)二进制包 (三)Kubeadm 二…...

回归预测 | MATLAB实现WOA-SVM鲸鱼算法优化支持向量机多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现WOA-SVM鲸鱼算法优化支持向量机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现WOA-SVM鲸鱼算法优化支持向量机多输入单输出回归预测(多指标,多图)效果一览基本介绍程…...

VSCode快捷键
CtrlShiftP,F1:显示命令面板 CtrlP:快速打开 CtrlShiftN:新窗口/实例 CtrlShiftW:关闭窗口/实例 CtrlX:剪切行 CtrlC:复制行 ALT↑/↓:上下移动 ShiftAlt↓/↑:向…...

贪心算法求数组中能组成三角形的最大周长
题目:三角形的最大周长 给定由一些正数(代表长度)组成的数组arr,返回由其中三个长度组成的、面积不为零的三角形的最大周长。 如果不能形成任何面积不为零的三角形,返回0。 分析: 对数组排序,再从大到小选择三个数,再…...

VMWare Workstation 17 Pro 网络设置 桥接模式 网络地址转换(NAT)模式 仅主机模式
文章目录 网络模式配网要求CentOSDHCP虚拟网络桥接模式默认配置测试手动配置测试 网络地址转发模式 (NAT)还原配置虚拟网络配置默认配置测试手动配置测试 仅主机模式 网络模式 桥接模式: 主机与虚拟机对等, 虚拟机注册到主机所在的局域网, 会占用该网络的IP该局域网内的所有机…...

拒绝摆烂!C语言练习打卡第四天
🔥博客主页:小王又困了 📚系列专栏:每日一练 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、选择题 📝1.第一题 📝2.第二题 Ὅ…...

KubeSphere 社区双周报 | Java functions framework 支持 SkyWalking | 2023.8.4-8.17
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为:2023.08.04-2023.…...

【学习笔记之java】使用RestTemplate调用第三方接口
1.首先需要导入依赖 <!-- RestTemplate使用导入的依赖--><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency>2.跟启动类同级创建…...

数据集成革新:去中心化微服务集群的无限潜能
在当今数据密集型的业务环境下,传统的集中式架构已经难以满足高可用性和高并发性的要求。而去中心化微服务集群则通过分散式的架构,将系统划分为多个小型的、独立部署的微服务单元,每个微服务负责特定的业务功能,实现了系统的高度…...

后端返回可下载的xlsx文件,但是前端接收下载后为乱码
我的接收数据进行处理的代码为: download_signal_list() {return new Promise((resolve, reject) > {get_download_signal({project_id: this.projectId,version_id: this.versionId}).then(response > {const url window.URL.createObjectURL(new Blob([res…...

提升资源管理效率必备工具推荐
一、数据传输 1、Textify(PC) 作为一名技术人员,需要经常研究各种技术,因此,复制粘贴的操作十分常见。 Textify可以快速复制各种控件中的文本,包括浏览器中当前页面的标题、聊天窗口中各个部分的文字、桌…...

HJ23 删除字符串中出现次数最少的字符
描述 实现删除字符串中出现次数最少的字符,若出现次数最少的字符有多个,则把出现次数最少的字符都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。 数据范围:输入的字符串长度满足 1≤n≤20 1≤n≤20 &…...

文心一言 VS 讯飞星火 VS chatgpt (76)-- 算法导论7.3 1题
一、如果用go语言,为什么我们分析随机化算法的期望运行时间,而不是其最坏运行时间呢? 文心一言: 在分析算法的性能时,期望运行时间是一个重要的指标,它描述了算法在平均情况下的表现。期望运行时间考虑了所有可能的…...

Leetcode - 滑动窗口
文章目录 1. 滑动窗口2. 举例2.1 无重复字符的最长子串2.2 长度最小的子数组2.3 滑动窗口最大值2.4 最小覆盖子串2.5 删除有序数组中的重复项 1. 滑动窗口 滑动窗口的大概思想如下: 可以通过两个指针来标识窗口的边界。窗口的长度是可以固定的,也可以是…...

如何保证数据传输的安全?
要确保数据传输的安全,您可以采取以下措施: 使用加密协议:使用安全的传输协议,如HTTPS(HTTP over SSL/TLS)或其他安全协议,以保护数据在传输过程中的安全性。加密协议可以有效防止数据被窃听或篡改。 强化身份验证&…...

政务、商务数据资源有效共享:让数据上“链”,记录每一个存储过程!
数据上链是目前“区块链”最常见的场景。因为链上所有参与方都分享了统一的事实来源,所有人都可以即时获得最新的信息,数据可用不可见。因此,不同参与方之间的协作效率得以大幅提高。同时,因为区块链上的数据难以篡改,…...

xml转map工具类
背景:最近遇到接口返回是xml,所以需要整一个转换的工具类,方便后续其他xml处理。 依赖引入: <dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.1</versi…...

C++并发多线程--std::future_status、std::shared_future和std::atomic的使用
1--std::future_status的使用 std::future_status成员函数含有三种状态:timeout(执行超时)、ready(执行完毕)和deferred(延迟执行),其中 deferred 状态需要用 std::launch::deferred…...

Redis在Java中的基本使用
本片将介绍 Redis 在 Java 中的基本使用 文章目录 1、使用jedis操作redis1.1、Jedis简介1.2、引入jedis的Maven依赖1.2、获取连接1.3、使用实例 2、对于JedisPooled的使用2.1、使用JedisPooled2.2、关于连接池 3、SpringBoot下使用Redis3.1、引入Maven依赖3.2、配置Redis连接3.…...

4.2 C++ Boost 内存池管理库
Boost 库是一个由C/C语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量、可移植、高效的C应用程序。Boost库可以作为标准C库的后备,通常被称为准标准库,是C标准化进程的重要开发引擎之一。…...

Django模型基础
文章目录 一、models字段类型概述属性命名限制使用方式逻辑删除和物理删除常用字段类型 二、常用字段参数常用字段选项(通过字段选项,可以实现对字段的约束) 实践创建模型执行迁移命令 并 创建超级用户登录admin后台添加文件和图片字段定义模型字段和约束及在Admin后…...

导读-Linux简介
Linux简介 总所周知,计算机系统包含硬件和软件两部分。硬件部分被称为裸机,主要包括中央处理器(CPU)、内存、外存和各种外部设备。软件部分主要包括系统软件和应用软件两部分。系统软件包括操作系统、汇编语言、编译程序、数据…...
判断平面中两射线是否相交的高效方法
1. 简介 最近在工作中遇到判断平面内两射线是否相交的问题。 对于这个问题的解决,常规的方法是将两条射线拓展为直线,计算直线的交点,而后判断交点是否在射线上。 这种方法,在思路上较为直观,也易于理解。然后,该方法在计算量上相对较大。对于少量射线间的交点计算尚可…...

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)八:自定义组件封装上
一、本章内容 本章实现一些自定义组件的封装,包括数据字典组件的封装、下拉列表组件封装、复选框单选框组件封装、单选框组件封装、文件上传组件封装、级联选择组件封装、富文本组件封装等。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 ![在这里插入图…...