为了毕业设计喵!
这次后台选取了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