为了毕业设计喵!
这次后台选取了Django(因为有完整的后台Admin和Basic Auth验证,可以帮我稍微干掉一些生产环境的坑。)话不多说,先在Windows下开发。
一:环境搭建
其实这个得注意一件事情:环境变量的配置
1.python 安装(我已经备好Py3.5)
2.pip install django (注意下版本 我1.9)
3.pycharm偷懒。直接创建一个Django项目
二:目录解释
你在创建项目之后在项目模块下面会有两个文件夹:

emmm,上面那个文件夹,掌控雷电,控制着项目的配置和对外输出 其中的初始化文件则是在运行的时候就会加载,而setting则是项目的一些配置,urls里面包含了对外输出的一些路径配置
那个templates 就是传说中模板,用于页面
底下的那个文件夹,包括了admin(就是Admin功能的模块管理) apps注册器,models在我认知里和java的Mapper一样,但更为生猛,serializers我创建的为了json输出的序列化文件, tests顾名思义测试用类 view...可以理解为Service吧 migrantinons里面便是model的管理初始化。
三:ORM
不跟你多说,起手创建mapper啊,奥不,创建模型啊:
# Create your models here.
# Response Body Models in Here
from django.db import models
from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styles
#顶上这俩import用于代码高亮的,我导进来发现没什么用 xd..
class product(models.Model):
id = models.AutoField(primary_key=True)
no = models.CharField(max_length=20,blank=False) #no
name = models.CharField(max_length=60,blank=True)
comment = models.CharField(max_length=512,blank=True)
code = models.CharField(max_length=256,blank=False)
updateTime = models.DateTimeField(auto_now=True)
creatTime = models.DateTimeField(auto_now_add=True)
对了,这里的Field类型很容易理解的,摸摸就搞定了->
好 创建好模型之后记得在Setting里填一下你的app名字,不然后面会告诉你出问题的:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# USE OWN PART
'tools',
]
完事之后配置下DB :
# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
# Django the default Database is SQLite,So I use MySQL
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# local DB perproties:
'ENGINE': 'django.db.backends.mysql',
'NAME':'qrcode',
'USER': 'root',
'PASSWORD': '699307',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
因为py3 用MySQL会import出错,记得在项目初始化的时候填一句:
import pymysql # to site py2-3 pymysql.install_as_MySQLdb()
搞定这些之后可以打开pycharm的terminal: python mange.py
python manage.py makemigrations python manage.py migrate
然后就会生成本项目相关的表,也会创建好你model里面class对应的DB
其实此刻你已经可以去view写你的操作了,但是因为毕设的需求,我需要管理员去做这个事情:遂改造Admin:
#Regist in
@admin.register(product)
class ProductAdmin(admin.ModelAdmin):
list_display = ('id','no','name','comment','code','updateTime')
list_per_page = 20
list_editable = ['name']
list_display_links = ('id', 'no')
ordering = ('-id',)
search_fields =('name','id')
#Set User Pro
def get_readonly_fields(self, request, obj=None):
""" READ ONLY """
if request.user.is_superuser:
self.readonly_fields = []
return self.readonly_fields
readonly_fields = ('id', 'no', 'code', 'updateTime', 'creatTime')
#when inner new product
def save_model(self, request, obj, form, change):
if change:
pass
else:
nos = views.GET_GOOD_NO()
codes = views.GET_MD5_CODE(nos)
obj.no = nos
obj.code = codes
super(ProductAdmin, self).save_model(request, obj, form, change)
我这样写的目的是让普通只有读写权限的人可操作的字段减少,于此同时在增删改查的时候必须通过登陆来做事,而且我里面有两列是自动生成的,所以就写成这样了。
完成这些之后 创建一个超级用户,登陆进去,再添加一个普通用户,赋予他对product的操作权限,但取消他作为组管理的权限,到此该部分结束,根据毕设要求我得有一个展示页面:
页面核心:
<tbody>
{% load pagination_tags %}
{% autopaginate products 10 %}
{% for product in products %}
<tr>
<td class="uk-table-small ">{{product.id}}</td>
<td class="uk-table-link">{{product.name}}</td>
<td class="uk-text-truncate">{{product.comment}}</td>
<td class="uk-text-nowrap">{{product.creatTime}}</td>
<td class="uk-table-small uk-text-right">
<a class="uk-margin-small-right uk-button uk-button-secondary " href="#modal-media-image" uk-toggle>
<span uk-icon="icon: image"></span> Open QR-Code</a>
</td>
</tr>
<div id="modal-media-image" class="uk-flex-top" uk-modal>
<div class="uk-modal-dialog uk-width-auto uk-margin-auto-vertical">
<button class="uk-modal-close-outside" type="button" uk-close></button>
<img src="qrcode/{{ product.code }}" alt="">
</div>
</div>
{% endfor %}
{% paginate %}
</tbody>
在这里我做了一下分页,通过安装插件完成,前端继续使用我们最好的 朋友UIKIT3
最后配置URL:
url(r'^admin/', admin.site.urls), #QR_CODE --index url(r'^product/qrcode/(.+)$', views.generate_qrcode, name='qrcode'), url(r'^product/index.html', views.index, name='index'),
到此基础数据的增删改查已经OK