Django 项目分析后得到的某些结论
项目下的 urls 篇
urlpatterns = [ ] 其中主要是包含有各个 app 的路由
示例: url(r'^users/', include('users.urls', namespace='users')), url(r'^admin/', admin.site.urls),
settings 中的基础知识
INSTALLED_APPS = [ ] 存放创建好的app名称(app注册) INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'users',
'创建好的app名称',
]
MIDDLEWARE = [] 中间件
TEMPLATES = [ ] 模板文件 TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': ['templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
] 'DIRS'可以修改为 'DIRS': [os.path.join(BASE_DIR, 'templates')],
DATABASES = { } 数据库 配置 DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '数据库',
'USER': '用户名',
'PASSWORD': '密码',
'CHARSET': '字符集',
'HOST': 'IP地址',
'PORT': '端口',
}
} DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'webshop',
'USER': 'root',
'PASSWORD': 'root',
'CHARSET': 'UTF-8',
'HOST': '127.0.0.1',
'PORT': '',
}
}
设置中文 LANGUAGE_CODE = 'zh-hans'
时间显示为北京时间 TIME_ZONE = 'Asia/Shanghai'
配置 static 静态目录 STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR,'static'),
)
暂时还没有接触到的点(慎用) SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer' # hash加密使用的盐值
SALT_KEY = "Hello" LOGIN_URL = '/users/login'
项目的 __init__ 文件中添加的内容 import pymysql pymysql.install_as_MySQLdb()
app 的urls(创建的.py文件) 导入 views from . import views urlpatterns = [
url(r'^login/$', views.user_login, name='user_login'),
url(r'^register/$', views.register, name='register'),
]
使用 (?P<views 中的函数参数名称>\d+) 获取传递进来的参数给 views 中函数的参数 urlpatterns = [
url(r'^(?P<s_id>\d+)/detail_store', views.detail_store, name='detail_store'),
url(r'^(?P<s_id>\d+)/(?P<status>\d+)/status_store', views.status_store, name='status_store'),
]
urlpatterns = [
url(r'^(?P<number>\d+)/(?P<goods_id>\d+)/shop_into/$', views.shop_into, name='shop_into'),
url(r'^list_car/$', views.list_car, name='list_car'),
url(r'^(?P<shopcar_id>\d+)/del_car/$', views.del_car, name='del_car'),
]
urlpatterns = [
url(r'^order_confirm/$', views.order_confirm, name='order_confirm'),
url(r'^order_pay/$', views.order_pay, name='order_pay'),
url(r'^order_done/$', views.order_done, name='order_done'),
url(r'^order_list/$', views.order_list, name='order_list'),
url(r'^(?P<order_id>\d+)/order_desc/$', views.order_desc, name='order_desc'), ]
url(r'^路由地址/$', views.函数名, name='名称'), url(r'^(?P<函数参数名称>\d+)/路径名/$', views.函数名, name='名称'),
关于路由系统,这里只是写出了最简单的写法,此处只是根据读程序获取到的部分知识
app 的 models,为 views 作基础,views在获取到urls中的请求后,会调用一些方法
创建主键 -> 1.11. 自动创建 id 列
在外键关联时,自动加上 _id 名称 id = models.AutoField(primary_key=True)
创建字符串 name 列 ,使用 models.CharField country = models.CharField(max_length=, default='中国',verbose_name='城市') area = models.CharField(max_length=, verbose_name='收货人县/区/')
使用 bool 类型 数据字段名称 = models.BooleanField(default=False, verbose_name='xxx') is_default = models.BooleanField(default=False, verbose_name='是否是默认地址')
int 类型 , 使用 models.IntegerField age = models.IntegerField(default='', verbose_name='用户年龄') status = models.IntegerField(default=0, verbose_name='店铺状态') goods_count = models.IntegerField(verbose_name='购买数量')
image 图片类型 使用 models.ImageField 变量名 = models.ImageField(upload_to='图片路径', default='图片名', verbose_name='名称')
变量名 = models.ImageField(upload_to='图片路径') logo = models.ImageField(upload_to='static/images/logo', default='static/images/logo/goods-style1.png', verbose_name='商品类型图标') path = models.ImageField(upload_to='static/images/goods', default='static/images/goods/default.jpg', verbose_name='商品图片') goods_image = models.ImageField(upload_to='static/images/goods') cover = models.ImageField(upload_to='static/images/store/', default='static/images/store/default.jpg', verbose_name='店铺封面') header = models.ImageField(upload_to='static/images/headers', default='static/images/headers/default.jpg', verbose_name='用户头像')
text 描述 使用 models.TextField
变量名 = models.TextField(verbose_name= '名称')
变量名 = models.TextField(null=True, blank=True,verbose_name= '名称') intro = models.TextField(verbose_name='商品类别描述') intro = models.TextField(null=True, blank=True, verbose_name='商品图片描述')
float 浮点数类型,使用 models.FloatField
变量名 = models.FloatField(verbose_name='名称')
变量名 = models.FloatField(default=0.00, verbose_name='名称') price = models.FloatField(verbose_name='商品价格') allMoney = models.FloatField(default=0.00, verbose_name='总计')
datetime 使用 models.DateTimeField
变量名 = models.DateTimeField(auto_now_add=True, verbose_name='名称') openTime = models.DateTimeField(auto_now_add=True, verbose_name='开店时间') 注:可以添加 datetime.now 用来在创建时,指定当前时间
foreignkey 外键 , 使用 models.ForeignKey 变量名 = models.ForeignKey(类名, null=True, blank=True, on_delete=models.CASCADE, verbose_name='名称') parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE, verbose_name='父级地址')
from app名称.models import 类名 变量名 = models.ForeignKey(类名, on_delete=models.CASCADE, verbose_name='名称')
注:类名可以是外部导入或本models.py中创建的类名 from users.models import User user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='地址所属')
一个models 类可以存在两个外键 goodsStore = models.ForeignKey(类名, on_delete=models.CASCADE, verbose_name='名称')
goodsType = models.ForeignKey(类名, on_delete=models.CASCADE, verbose_name='名称') from store.models import Store
goodsStore = models.ForeignKey(Store, on_delete=models.CASCADE, verbose_name='商品所属店铺')
goodsType = models.ForeignKey(GoodsType, on_delete=models.CASCADE, verbose_name='商品类型')
从 django.contrib.auth.models 导入 User from django.contrib.auth.models import User user = models.ForeignKey(User, on_delete=models.CASCADE)
一对一 使用 models.OneToOneField
变量名 = models.OneToOneField(User, on_delete=models.CASCADE) user = models.OneToOneField(User, on_delete=models.CASCADE)
在这里补充一点,字段还存在一对多和多对多
app 中的 views
def 函数名(request):
代码块
return 语句(是否存在参数) def 函数名(request,参数(一个或多个)):
代码块
return 语句(是否存在参数) @装饰器(一个或多个)
def 函数名(request):
代码块
return 语句(是否存在参数) @装饰器(一个或多个)
def 函数名(request,参数(一个或多个)):
代码块
return 语句(是否存在参数)
关于def 函数定义时,request 后面的参数
在进行路由分发时,使用
url(r'^(?P<g_id>\d+)/goods_detail/$', views.goods_detail, name='goods_detail'), 进行 get 请求传递进来的参数会给 g_id ,因此在 goods_detail 函数中要设置一个参数名为 g_id def goods_detail(request, g_id):
代码
注:有多少个?P<参数名> 就设置多少个参数,用来接收
代码块中可以使用到很多知识,此处只是该项目使用到的基础 request.method
判断进行的哪一种请求方式,GET还是POST if request.method == 'GET':
pass
elif request.method == 'POST':
pass
else:
pass
models.类名.objects.filter(表中字段(user)=request.user)
filter 主要是用来过滤,使用了filter 之后还可以继续使用 filter进行过滤 address_list = models.Address.objects.filter(user=request.user)
对于使用了 filter 方法 的对象,可以使用 len 进行判断,是否已经存在
sto = models.Store.objects.filter(name=name)
if len(sto) == 1:
return render(request, 'store/store_add.html', {"msg": "商铺名称已存在,请重新输入"})
获取 post 方式提交的数据
request.POST['名称'] recv_name = request.POST['recv_name'] html 中数据如下,让name的值于名称相对应即可
<input type="text" name="recv_name" id="recv_name" autocomplete="off">
name = request.POST['name'].strip()
在进行获取数据时,可以添加 strip 进行字符串操作
对于 filter 获取到的数据可以进行遍历
address_list = models.Address.objects.filter(user=request.user)
并且遍历的元素对象具有 save 方法 可以修改字段
Address 是类名,user , is_default 是 Address 表中的字段 from . import models address_list = models.Address.objects.filter(user=request.user)
for addr in address_list:
addr.is_default = False
addr.save()
使用 __in 时,可以直接写明在某一个变量中 [0,1]
stores = models.Store.objects.filter(user=request.user, status__in=[0, 1])
添加表的一行数据
括号中 = 前面的都是表中的字段,后面是对应的值
使用 save 进行保存 变量 = models.类名(字段1 = 值1, 字段2 = 值2, user=request.user)
变量 .save() address = models.Address(recv_name=recv_name, recv_tel=recv_tel, province=province, city=city, area=area,
street=street, desc=desc, is_default=True, user=request.user) address.save()
goods = models.Goods(name=name, price=price, stock=stock, desc=desc, goodSize=goodSize, goodsType=goodsType,goodsStore=store )
goods.save()
id 自增列不用添加
在使用 filter 获取数据后,使用 order_by 进行排序 from app名称.models import 类名
变量名 = 类名.objects.filter(user=request.user).order_by('名称') shop_cars = ShopCar.objects.filter(user=request.user).order_by('-createTime')
在 filter 中使用 =
变量名 = 类名.objects.filter(字段名=值) goods_type1 = GoodsType.objects.filter(pk=1001)
在 filter 中使用 __in
变量名 = 类名.objects.filter(字段名__in=值)
变量名 = 类名.objects.filter(字段名__in=值)[:2] goods1_list = Goods.objects.filter(goodsType__in=goods_type1_2)[:4]
在 filter 中使用 __isnull
变量名 = 类名.objects.filter(字段名__isnull=True) allGoodsType = GoodsType.objects.filter(parent__isnull=True)
文件 files , 具体请查阅更多资料 变量名 = request.FILES['名称'] path = request.FILES['path']
cover = request.FILES['cover']
cover 为 html 中的 name 值 <input name="cover" type="file" ... >
使用 .get 获取数据 变量 = 类名.objects.get(字段=变量或值) store_id = request.POST['goodsStore']
store = Store.objects.get(pk=store_id)
是否带有 models 主要看导入包的方式
from . import models type2 = request.POST['type2']
goodsType = models.GoodsType.objects.get(pk=type2)
利用获取到的对象的字段属性进行赋值 变量 = models.Goods.objects.get(字段名1=参数)
变量= goods.字段名2
store = models.类名.objects.get(字段名1=字段名2) goods = models.Goods.objects.get(pk=g_id)
goodsStore_id = goods.goodsStore_id
store = models.Store.objects.get(pk=goodsStore_id) 注:
字段名根据实际需要进行修改
获取所有数据 使用 all
变量名 = models.类名.objects.all() all_goods = models.Goods.objects.all()
获取 GET 参数
变量名1 = request.GET['名称'] parent_id = request.GET['parent_id'] 进行查找数据
变量名2 = models.类名.objects.filter(字段=变量名1) type2 = models.GoodsType.objects.filter(parent=parent_id)
使用 getlist 获取多个数据 变量 = request.POST.getlist('名称') shopcar_id_list = request.POST.getlist('buy_goods_id') 进行查找数据
变量2 = app名.models.类名.objects.filter(字段名__in=变量)
shopcar_list = shopcar.models.ShopCar.objects.filter(pk__in=shopcar_id_list)
关于字段中 user=request.user 的理解
MyOrder 中的 user 是 User 的外键,所以在使用时,要注意传递的属性还是一整个对象 my_order = models.MyOrder(user=request.user, address=addr, total=total) user = models.ForeignKey(User, on_delete=models.CASCADE)
使用 字段_set 可以获取到外键的表的字段,具体详情请查阅更多资料 此处仅给出部分示例 for sc_id in shopcar_list:
shopcart = shopcar.models.ShopCar.objects.get(pk=sc_id)
order_item = models.MyOrderItem(goods_image=shopcart.goods.goodsimage_set.first().path,
goods_name=shopcart.goods.name,
goods_price=shopcart.goods.price,
goods_count=shopcart.number,
goods_money=shopcart.allMoney,
my_order=my_order)
order_item.save()
total += shopcart.allMoney
my_order.total = total
my_order.save()
get 获取写法,比之前的更深入一些 @login_required
@require_GET
def shop_into(request, number, goods_id):
goods = Goods.objects.get(pk=goods_id)
user = request.user
try:
shop_car = models.ShopCar.objects.get(user=user, goods=goods)
shop_car.number += int(number)
shop_car.allMoney = shop_car.number*goods.price
shop_car.save()
except:
shop_car = models.ShopCar(goods=goods, number=number, user=user)
shop_car.allMoney = int(shop_car.number)*goods.price
shop_car.save()
return redirect(reverse('shopcar:list_car'))
在使用 get 方法时,其中的 = 左侧依旧为字段名,=右侧的为get 获取到的对象,user 为 request.user goods = Goods.objects.get(pk=goods_id)
user = request.user
shop_car = models.ShopCar.objects.get(user=user, goods=goods)
request.user 拥有 id 属性
使用 get 可以获取到字段进行参与表达式运算 shop_car.allMoney = shop_car.number*goods.price
删除数据 使用 delete()
shopcar = models.ShopCar(pk=shopcar_id, user=user)
shopcar.delete()
使用 int 进行转换 status = models.IntegerField(default=0, verbose_name='店铺状态') store = models.Store.objects.get(id=s_id)
store.status = int(status)
获取 session 使用 request.session 变量名 = request.session["名称"]
示例: if code.lower() != request.session["code"].lower():
return render(request, "users/user_login.html", {"msg": "验证码错误!!"})
使用 authenticate from django.contrib.auth import authenticate
user = authenticate(username=username, password=password1) password1 = utils.encryption(password) # 密码加密
def encryption(key):
pwd = hmac.new(key.encode('utf-8'), settings.SALT_KEY.encode('utf-8'), 'MD5')
return pwd.hexdigest()
此时的 user 拥有 is_active 属性,判断是否登录状态
if user is not None:
if user.is_active:
login(request, user)
try:
return redirect(next_url)
except:
return redirect("/")
else:
return render(request, "users/user_login.html", {"msg": "您的账号已被锁定,请联系管理员"})
else:
return render(request, "users/user_login.html", {"msg": "用户名或者密码错误"})
导入 User
from django.contrib.auth.models import User user = User.objects.create_user(username=username, password=password) user.save()
代码块介绍之后,进行return返回
return render(request, 'templates 下的文件夹名称/文件名.html', {'名称': 值}) return render(request, 'address/address_add.html', {'address_list': address_list})
可以存在多个参数,goods 为在app目录下templates 中的 goods 文件夹
return render(request, 'goods/goods_show.html', {'goods': goods, 'store': store, 'nums':nums})
return redirect(reverse('名称1:值1', kwargs={'参数名': 值}))
html 中的数据
<a href="{% url '名称1:值1' 空格 参数名 %}">内容</a> store_id = request.POST['goodsStore'] return redirect(reverse('store:detail_store', kwargs={'s_id': store_id})) 在这里 'store:detail_store' 为 反向解析 <a href="{% url 'store:detail_store' store.id %}">查看详情</a>
from django.core.serializers import serialize type1 = models.GoodsType.objects.filter(parent=parent_id)
return HttpResponse(serialize('json', type1))
#转换成json类型的字符串
return redirect(reverse('shopcar:list_car')) <a href="{% url 'shopcar:list_car'%}" style="border: none;color: #00b7ee;width: 100px;height: 40px" >返回购物车</a>
from io import BytesIO def code(request):
img, msg = utils.create_code()
f = BytesIO()
img.save(f, "PNG")
# 将验证码的值存储到session
request.session["code"] = msg
return HttpResponse(f.getvalue(), "image/png")
utils.py 文件,自己创建,如果需要可以复制粘贴
import hmac
import string
import random
from PIL import Image, ImageDraw, ImageFont
from django.conf import settings # 密码加密
def encryption(key):
pwd = hmac.new(key.encode('utf-8'), settings.SALT_KEY.encode('utf-8'), 'MD5')
return pwd.hexdigest() # 验证码
def getRandomChar(count=4):
# 生成随机字符串
# string模块包含各种字符串,以下为小写字母加数字
ran = string.ascii_lowercase + string.ascii_uppercase + string.digits
char = ''
for i in range(count):
char += random.choice(ran)
return char # 返回一个随机的RGB颜色
def getRandomColor():
return random.randint(50, 150), random.randint(50, 150), random.randint(50, 150) def create_code():
# 创建图片,模式,大小,背景色
img = Image.new('RGB', (120, 30), (255, 255, 255))
# 创建画布
draw = ImageDraw.Draw(img)
# 设置字体
font = ImageFont.truetype('ARIALUNI.TTF', 25) code = getRandomChar()
# 将生成的字符画在画布上
for t in range(4):
draw.text((25*t+7, 0), code[t], getRandomColor(), font) # 生成干扰点 增加识别的难度
for _ in range(random.randint(99, 110)):
# 位置,颜色
draw.point((random.randint(0, 120), random.randint(0, 30)), fill=getRandomColor())
# 生成干扰线 增加识别的难度
for _ in range(random.randint(8, 15)):
begin = random.randint(0, 120), random.randint(0, 50)
end = random.randint(0, 120), random.randint(0, 50)
draw.line([begin, end], fill=getRandomColor()) # 使用模糊滤镜使图片模糊
# img = img.filter(ImageFilter.BLUR)
return img, code
HTML 文件
此处只例举一些基本语句,具体用法请查阅相关资料
{% block 名称 %}{% endblock %}
进行继承模板
{% extends '名称.html' %}
{% csrf_token %} 服务器返回页面的同时向前端返回一串随机字符 post提交时服务器会验证这串字符来确保用户是在服务端返回的表单页面中提交的数据
<tbody>
{% for addr in address_list %}
<tr>
<td>{{addr.字段1}}</td>
<td>{{addr.字段2}}</td>
<td>{{addr.字段3}}</td>
<td>
{% if addr.is_default %}
默认地址
{% endif %}
</td>
</tr>
{% empty %}
<tr>提示信息</tr>
{% endfor %}
</tbody>
{% if request.user.username %}
html 语句
{% else %}
html 语句
{% endif %}
{{request.user.userinfo.nickname}}
<form action="{%url 'orders:order_done' %}" method="post">
<input type="hidden" name="sc" value="{{sc.id}}">
<span>{{shopcar.number}}</span>
下单时间:{{order.order_time|date:'Y-m-d G:i:s'}}<br>
{% if store.status == 0 %}
<span style="font-size: 16px">店铺状态:正在营业</span>
{% elif store.status == 1 %}
<span style="font-size: 16px">店铺休息</span>
{% endif %}
{{goods.desc|truncatechars:22}}
截取前22个字符
{% for t in type1 %}
<option value="{{t.id}}" >{{t.name}}</option>
{% endfor %}
html 下还有很多的用法,此处仅列举出了这些
django 项目获取链接
链接:https://pan.baidu.com/s/1oWcHHbSR0JHmqr9qCzZGwA
提取码:Hany
2020-07-24
Django 项目分析后得到的某些结论的更多相关文章
- django部署后样式加载不出来解决方案
django部署后样式加载不出来 1.html文件去掉<!DOCTYPE html> 2. location /static { alias /home/static/; } 3.STAT ...
- Django更新后的配置修改
问题: Django 升级至1.7.1后,出现urls配置错误. 解决方法总结: 修改urls: 1,加入admin.autodiscover()函数. 2,除了地址admin不做修改外,其余全部删除 ...
- 前台通过form表单向Django后台传输数据,Django处理后返回给前台
摘要:Django前后台数据传递 通过action将数据传输给apitest这个地址,使用get方法传递,此处需要传递name="request_method"的下拉列表值和nam ...
- Django搭建后篇——启动服务器及创建视图
开启服务器,Django开启服务器的方式有两种,一种是在Ubuntu在开启,另一种是直接在pycharm开启.就方便而言肯定是第二种,但由于pycharm版本的问题,可能有的人无法直接在pycharm ...
- 配置Django环境后,运行时报错
(背景)安装完Django,并配置完成. 在setting.py中设置了数据库时,出现的报错. 点击查看 数据库配置 DATABASES = { 'default': { # 'ENGINE': 'd ...
- django 项目分析
项目要点 一.功能制定 1.用户功能 #.登陆 #.权限组功能 2.数据展示功能 #.列表展示 #.详细信息展示 #.图标展示 3.资源管理功能 #远程管理 #对远程服务器上的进程具有 #开启 #关闭 ...
- 前端(以Vue为例)webpack打包后dist文件包如何部署到django后台中
由于现在前端使用的三大框架配合webpack可以实现快速打包,为部署到服务端提供了非常大的便利,那么在前端打包后,应该做些什么可以部署到django的后台中呢? 1.打包后文件包dist 进入到 di ...
- 08/27 Django admin相关
一.django-admin的简单回顾: admin: Django的后台数据管理的web版本 1.admin a:models.py - 创建表 b:admin.py - 注册表 admin. ...
- Rails 和 Django 的深度技术对比
我想以一个免责声明来开始下面的内容.我使用 Django开发网站已经有三年了,众所周知,我喜欢Django.我已经写了一个开源的应用程序( app),并且我已经将补丁发送到了Django.然而,我以尽 ...
随机推荐
- CSS居中对齐
CSS实现居中对齐的几种方式 页面布局中,居中对齐是我们经常遇到的场景,现在总结几个常用的方式供大家参考. 场景一:按钮文字居中对齐,line-height + text-align html代码: ...
- web页面弹出遮罩层,通过js或css禁止蒙层底部页面跟随滚动
场景概述 弹窗是一种常见的交互方式,而蒙层是弹窗必不可少的元素,用于隔断页面与弹窗区块,暂时阻断页面的交互.但是,在蒙层元素中滑动的时候,滑到内容的尽头时,再继续滑动,蒙层底部的页面会开始滚动,显然这 ...
- SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(五): 数据表设计、使用 jwt、redis、sms 工具类完善注册登录逻辑
(1) 相关博文地址: SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(一):搭建基本环境:https://www.cnblogs.com/l-y-h/p ...
- Linux常用命令-文件传输类
bye 功能说明:中断FTP连线并结束程序 语 法:bye 补充说明:在FTP模式下,输入bye即可中断正在执行的连线作业,并且结束FTP的执行 ftp(file transfer protocol) ...
- windows下的包管理器scoop
scoop(传送门) 安装 scoop是一个类似于linux下apt之类包管理器 安装scoop(Powershell 3+ and .NET Framework 4.5+) iex (new-ob ...
- JVM 专题十九:垃圾回收(三)垃圾回收相关概念
1. System.gc()的理解 在默认情況下,通过System.gc()或者Runtime. getRuntime().gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试 ...
- css换行后缩进,css缩进技巧
一般情况下像下图这样需要缩进的,一般都会外面一个div里面两块需要两个div然后用定位或者flex.table.浮动后设置宽度等来实现 已知宽度的情况下上面列的方法都适用 不知宽度的情况下可以用fle ...
- 01-flask虚拟环境
一.虚拟环境 每一个环境都相当于一个新的操作系统.你可以在这个新的环境里安装软件,保存资料.每一个虚拟环境可以安装不同版本的软件,在不同虚拟环境中运行不同版本的软件互不影响. 二.virtuale ...
- 用Canvas定时显示摄像头捕获的画像(HTML5)
需要实现一个功能,大意嘛,就是标题写的那个意思.虽然用户只要求在微信中实现即可,也就是可以用JSSDK.但是前端小哥哥脑袋一根筋,就想用原生的H5和JS实现. 网上铺天盖地的资料,可惜没有一个是可以用 ...
- Spring用到了那些注解?
一:@Autowired(按类型注入)1.1通过 @Autowired的使用来消除 set ,get方法.@Autowiredprivate Dao dao;这样就可以删除set ,get方法和spr ...