python学习
@@ -1,24 +1,150 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from flask import Blueprint,request,jsonify
|
||||
from flask import Blueprint,request,jsonify,redirect
|
||||
from common.models.food.Food import Food
|
||||
from common.libs.Helper import ops_render
|
||||
from common.models.food.FoodCat import FoodCat
|
||||
from application import app,db
|
||||
from common.libs.Helper import getCurrentDate
|
||||
|
||||
from common.libs.Helper import getCurrentDate,iPagination,getDictFilterField
|
||||
from common.libs.food.FoodService import FoodService
|
||||
from common.libs.UrlManager import UrlManager
|
||||
from decimal import Decimal
|
||||
from sqlalchemy import or_
|
||||
route_food = Blueprint( 'food_page',__name__ )
|
||||
|
||||
@route_food.route( "/index" )
|
||||
def index():
|
||||
return ops_render( "food/index.html" )
|
||||
resp_data = {}
|
||||
req = request.values
|
||||
page = int(req['p']) if ('p' in req and req['p']) else 1
|
||||
query = Food.query
|
||||
if 'mix_kw' in req:
|
||||
rule = or_(Food.name.ilike("%{0}%".format(req['mix_kw'])), Food.tags.ilike("%{0}%".format(req['mix_kw'])))
|
||||
query = query.filter( rule )
|
||||
|
||||
if 'status' in req and int( req['status'] ) > -1 :
|
||||
query = query.filter( Food.status == int( req['status'] ) )
|
||||
|
||||
if 'cat_id' in req and int( req['cat_id'] ) > 0 :
|
||||
query = query.filter( Food.cat_id == int( req['cat_id'] ) )
|
||||
|
||||
page_params = {
|
||||
'total':query.count(),
|
||||
'page_size': app.config['PAGE_SIZE'],
|
||||
'page':page,
|
||||
'display':app.config['PAGE_DISPLAY'],
|
||||
'url': request.full_path.replace("&p={}".format(page),"")
|
||||
}
|
||||
|
||||
pages = iPagination( page_params )
|
||||
offset = ( page - 1 ) * app.config['PAGE_SIZE']
|
||||
list = query.order_by( Food.id.desc() ).offset( offset ).limit( app.config['PAGE_SIZE'] ).all()
|
||||
|
||||
cat_mapping = getDictFilterField( FoodCat,FoodCat.id,"id",[] )
|
||||
resp_data['list'] = list
|
||||
resp_data['pages'] = pages
|
||||
resp_data['search_con'] = req
|
||||
resp_data['status_mapping'] = app.config['STATUS_MAPPING']
|
||||
resp_data['cat_mapping'] = cat_mapping
|
||||
resp_data['current'] = 'index'
|
||||
return ops_render( "food/index.html",resp_data )
|
||||
|
||||
|
||||
@route_food.route( "/info" )
|
||||
def info():
|
||||
return ops_render( "food/info.html" )
|
||||
|
||||
|
||||
@route_food.route( "/set" )
|
||||
@route_food.route( "/set" ,methods = [ 'GET','POST'] )
|
||||
def set():
|
||||
return ops_render( "food/set.html" )
|
||||
if request.method == "GET":
|
||||
resp_data = {}
|
||||
req = request.args
|
||||
id = int(req.get('id', 0))
|
||||
info = Food.query.filter_by(id=id).first()
|
||||
if info and info.status != 1:
|
||||
return redirect(UrlManager.buildUrl("/food/index"))
|
||||
|
||||
cat_list = FoodCat.query.all()
|
||||
resp_data['info'] = info
|
||||
resp_data['cat_list'] = cat_list
|
||||
resp_data['current'] = 'index'
|
||||
return ops_render("food/set.html", resp_data)
|
||||
|
||||
resp = {'code': 200, 'msg': '操作成功~~', 'data': {}}
|
||||
req = request.values
|
||||
id = int(req['id']) if 'id' in req and req['id'] else 0
|
||||
cat_id = int(req['cat_id']) if 'cat_id' in req else 0
|
||||
name = req['name'] if 'name' in req else ''
|
||||
price = req['price'] if 'price' in req else ''
|
||||
main_image = req['main_image'] if 'main_image' in req else ''
|
||||
summary = req['summary'] if 'summary' in req else ''
|
||||
stock = int(req['stock']) if 'stock' in req else ''
|
||||
tags = req['tags'] if 'tags' in req else ''
|
||||
|
||||
if cat_id < 1:
|
||||
resp['code'] = -1
|
||||
resp['msg'] = "请选择分类~~"
|
||||
return jsonify(resp)
|
||||
|
||||
if name is None or len(name) < 1:
|
||||
resp['code'] = -1
|
||||
resp['msg'] = "请输入符合规范的名称~~"
|
||||
return jsonify(resp)
|
||||
|
||||
if not price or len( price ) < 1:
|
||||
resp['code'] = -1
|
||||
resp['msg'] = "请输入符合规范的售卖价格~~"
|
||||
return jsonify(resp)
|
||||
|
||||
price = Decimal(price).quantize(Decimal('0.00'))
|
||||
if price <= 0:
|
||||
resp['code'] = -1
|
||||
resp['msg'] = "请输入符合规范的售卖价格~~"
|
||||
return jsonify(resp)
|
||||
|
||||
if main_image is None or len(main_image) < 3:
|
||||
resp['code'] = -1
|
||||
resp['msg'] = "请上传封面图~~"
|
||||
return jsonify(resp)
|
||||
|
||||
if summary is None or len(summary) < 3:
|
||||
resp['code'] = -1
|
||||
resp['msg'] = "请输入图书描述,并不能少于10个字符~~"
|
||||
return jsonify(resp)
|
||||
|
||||
if stock < 1:
|
||||
resp['code'] = -1
|
||||
resp['msg'] = "请输入符合规范的库存量~~"
|
||||
return jsonify(resp)
|
||||
|
||||
if tags is None or len(tags) < 1:
|
||||
resp['code'] = -1
|
||||
resp['msg'] = "请输入标签,便于搜索~~"
|
||||
return jsonify(resp)
|
||||
food_info = Food.query.filter_by(id=id).first()
|
||||
before_stock = 0
|
||||
if food_info:
|
||||
model_food = food_info
|
||||
before_stock = model_food.stock
|
||||
else:
|
||||
model_food = Food()
|
||||
model_food.status = 1
|
||||
model_food.created_time = getCurrentDate()
|
||||
|
||||
model_food.cat_id = cat_id
|
||||
model_food.name = name
|
||||
model_food.price = price
|
||||
model_food.main_image = main_image
|
||||
model_food.summary = summary
|
||||
model_food.stock = stock
|
||||
model_food.tags = tags
|
||||
model_food.updated_time = getCurrentDate()
|
||||
|
||||
db.session.add(model_food)
|
||||
ret = db.session.commit()
|
||||
|
||||
FoodService.setStockChangeLog(model_food.id, int(stock) - int(before_stock), "后台修改")
|
||||
return jsonify(resp)
|
||||
|
||||
|
||||
@route_food.route( "/cat" )
|
||||
|
||||
91
web/controllers/upload/Upload.py
Normal file
@@ -0,0 +1,91 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from flask import Blueprint,request,jsonify
|
||||
from application import app
|
||||
import re,json
|
||||
from common.libs.UploadService import UploadService
|
||||
from common.libs.UrlManager import UrlManager
|
||||
from common.models.Image import Image
|
||||
route_upload = Blueprint('upload_page', __name__)
|
||||
|
||||
'''
|
||||
参考文章:https://segmentfault.com/a/1190000002429055
|
||||
'''
|
||||
|
||||
@route_upload.route("/ueditor",methods = [ "GET","POST" ])
|
||||
def ueditor():
|
||||
|
||||
req = request.values
|
||||
action = req['action'] if 'action' in req else ''
|
||||
|
||||
if action == "config":
|
||||
root_path = app.root_path
|
||||
config_path = "{0}/web/static/plugins/ueditor/upload_config.json".format( root_path )
|
||||
with open( config_path,encoding="utf-8" ) as fp:
|
||||
try:
|
||||
config_data = json.loads( re.sub( r'\/\*.*\*/' ,'',fp.read() ) )
|
||||
except:
|
||||
config_data = {}
|
||||
return jsonify( config_data )
|
||||
|
||||
if action == "uploadimage":
|
||||
return uploadImage()
|
||||
|
||||
if action == "listimage":
|
||||
return listImage()
|
||||
|
||||
return "upload"
|
||||
|
||||
@route_upload.route("/pic",methods = [ "GET","POST" ])
|
||||
def uploadPic():
|
||||
file_target = request.files
|
||||
upfile = file_target['pic'] if 'pic' in file_target else None
|
||||
callback_target = 'window.parent.upload'
|
||||
if upfile is None:
|
||||
return "<script type='text/javascript'>{0}.error('{1}')</script>".format( callback_target,"上传失败" )
|
||||
|
||||
ret = UploadService.uploadByFile(upfile)
|
||||
if ret['code'] != 200:
|
||||
return "<script type='text/javascript'>{0}.error('{1}')</script>".format(callback_target, "上传失败:" + ret['msg'])
|
||||
|
||||
return "<script type='text/javascript'>{0}.success('{1}')</script>".format(callback_target,ret['data']['file_key'] )
|
||||
|
||||
def uploadImage():
|
||||
resp = { 'state':'SUCCESS','url':'','title':'','original':'' }
|
||||
file_target = request.files
|
||||
upfile = file_target['upfile'] if 'upfile' in file_target else None
|
||||
if upfile is None:
|
||||
resp['state'] = "上传失败"
|
||||
return jsonify(resp)
|
||||
|
||||
ret = UploadService.uploadByFile( upfile )
|
||||
if ret['code'] != 200:
|
||||
resp['state'] = "上传失败:" + ret['msg']
|
||||
return jsonify(resp)
|
||||
|
||||
resp['url'] = UrlManager.buildImageUrl( ret['data']['file_key'] )
|
||||
return jsonify( resp )
|
||||
|
||||
def listImage():
|
||||
resp = { 'state':'SUCCESS','list':[],'start':0 ,'total':0 }
|
||||
|
||||
req = request.values
|
||||
|
||||
start = int( req['start']) if 'start' in req else 0
|
||||
page_size = int( req['size']) if 'size' in req else 20
|
||||
|
||||
query = Image.query
|
||||
if start > 0:
|
||||
query = query.filter( Image.id < start )
|
||||
|
||||
list = query.order_by( Image.id.desc() ).limit( page_size ).all()
|
||||
images = []
|
||||
|
||||
if list:
|
||||
for item in list:
|
||||
images.append( { 'url': UrlManager.buildImageUrl( item.file_key ) } )
|
||||
start = item.id
|
||||
resp['list'] = images
|
||||
resp['start'] = start
|
||||
resp['total'] = len( images )
|
||||
return jsonify( resp )
|
||||
|
||||
@@ -150,7 +150,11 @@ var common_ops = {
|
||||
}
|
||||
return url + _paramUrl;
|
||||
},
|
||||
|
||||
buildPicUrl:function( img_key ){
|
||||
var domain = $(".hidden_layout_wrap input[name=domain]").val();
|
||||
var prefix_url = $(".hidden_layout_wrap input[name=prefix_url]").val();
|
||||
return domain + prefix_url + img_key;
|
||||
}
|
||||
};
|
||||
|
||||
$(document).ready( function() {
|
||||
|
||||
BIN
web/static/upload/20190802/1ed32d7ec80f4fee91b56065ebc6687f.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
web/static/upload/20190802/23fa0d93ffea4a1fadd6c924bc54da39.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
web/static/upload/20190802/245bc835a2514d0e9c1aaa12a5c8672e.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
web/static/upload/20190802/57cf16593a3c4398a9503cb80c924da9.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
web/static/upload/20190802/6d6d7c6f3af7493f9af856d6c65dd3d9.png
Normal file
|
After Width: | Height: | Size: 6.2 KiB |
BIN
web/static/upload/20190802/80c3611a2d5541998e97bc3d9e282b36.png
Normal file
|
After Width: | Height: | Size: 6.2 KiB |
BIN
web/static/upload/20190802/8b6113a5bfd1486f9756d99d0f6612ab.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
web/static/upload/20190802/92081b8b866d47959666cc6306a3ab64.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
web/static/upload/20190802/9d86635022eb430da950f1069665186f.png
Normal file
|
After Width: | Height: | Size: 6.2 KiB |
BIN
web/static/upload/20190802/a0704e7fdbf74dc3a98169a9602e22b8.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
web/static/upload/20190802/ced439416a7d49b6a694dd0c44cf04f4.png
Normal file
|
After Width: | Height: | Size: 6.2 KiB |
BIN
web/static/upload/20190802/ea3743a978504fa0988fed9b2b3686a0.png
Normal file
|
After Width: | Height: | Size: 6.2 KiB |
BIN
web/static/upload/20190802/f732e82251b141a798f6225718b65639.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
1
web/static/upload/readme.md
Normal file
@@ -0,0 +1 @@
|
||||
上传目录upload
|
||||
@@ -104,6 +104,10 @@
|
||||
{% block content %}{% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="hidden hidden_layout_wrap">
|
||||
<input name="domain" value="{{ config.APP.domain }}">
|
||||
<input name="prefix_url" value="{{ config.UPLOAD.prefix_url }}">
|
||||
</div>
|
||||
|
||||
<script src="{{ buildStaticUrl('/plugins/jquery-2.1.1.js') }}"></script>
|
||||
<script src="{{ buildStaticUrl('/bootstrap/bootstrap.min.js') }}"></script>
|
||||
|
||||
@@ -1,19 +1,6 @@
|
||||
{% extends "common/layout_main.html" %}
|
||||
{% block content %}
|
||||
<div class="row border-bottom">
|
||||
<div class="col-lg-12">
|
||||
<div class="tab_title">
|
||||
<ul class="nav nav-pills">
|
||||
<li class="current">
|
||||
<a href="{{ buildUrl('/food/index') }}">美食列表</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{ buildUrl('/food/cat') }}">分类列表</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% include "common/tab_food.html" %}
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<form class="form-inline wrap_search">
|
||||
@@ -21,19 +8,23 @@
|
||||
<div class="form-group">
|
||||
<select name="status" class="form-control inline">
|
||||
<option value="-1">请选择状态</option>
|
||||
<option value="1">正常</option>
|
||||
<option value="0">已删除</option>
|
||||
{% for tmp_key in status_mapping %}
|
||||
<option value="{{ tmp_key }}" {% if tmp_key == search_con['status'] %} selected {% endif %}>{{ status_mapping[ tmp_key ] }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<select name="cat_id" class="form-control inline">
|
||||
<option value="0">请选择分类</option>
|
||||
<option value="1">111</option>
|
||||
{% for tmp_key in cat_mapping %}
|
||||
<option value="{{ tmp_key }}" {% if tmp_key|string == search_con['cat_id'] %} selected {% endif %} >{{ cat_mapping[ tmp_key].name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="input-group">
|
||||
<input type="text" name="mix_kw" placeholder="请输入关键字" class="form-control" value="">
|
||||
<input type="text" name="mix_kw" placeholder="请输入关键字" class="form-control" value="{{ search_con['mix_kw'] }}">
|
||||
<input type="hidden" name="p" value="{{ search_con['p'] }}">
|
||||
<span class="input-group-btn">
|
||||
<button type="button" class="btn btn-primary search">
|
||||
<i class="fa fa-search"></i>搜索
|
||||
@@ -64,35 +55,44 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% if list %}
|
||||
{% for item in list %}
|
||||
<tr>
|
||||
<td>小鸡炖蘑菇</td>
|
||||
<td>东北菜</td>
|
||||
<td>0.02</td>
|
||||
<td>27</td>
|
||||
<td>好吃</td>
|
||||
<td>{{ item.name }}</td>
|
||||
<td>{{ cat_mapping[ item.cat_id].name }}</td>
|
||||
<td>{{ item.price }}</td>
|
||||
<td>{{ item.stock }}</td>
|
||||
<td>{{ item.tags }}</td>
|
||||
<td>
|
||||
<a href="{{ buildUrl('/food/info') }}">
|
||||
<a href="{{ buildUrl('/food/info') }}?id={{ item.id }}">
|
||||
<i class="fa fa-eye fa-lg"></i>
|
||||
</a>
|
||||
<a class="m-l" href="{{ buildUrl('/food/set') }}">
|
||||
{% if item.status == 1 %}
|
||||
<a class="m-l" href="{{ buildUrl('/food/set') }}?id={{ item.id }}">
|
||||
<i class="fa fa-edit fa-lg"></i>
|
||||
</a>
|
||||
|
||||
<a class="m-l remove" href="javascript:void(0);" data="3">
|
||||
<a class="m-l remove" href="javascript:void(0);" data="{{ item.id }}">
|
||||
<i class="fa fa-trash fa-lg"></i>
|
||||
</a>
|
||||
{% else %}
|
||||
<a class="m-l recover" href="javascript:void(0);" data="{{ item.id }}">
|
||||
<i class="fa fa-rotate-left fa-lg"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<tr><td colspan="6">暂无数据~~</td></tr>
|
||||
{% endif %}
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<span class="pagination_count" style="line-height: 40px;">共1条记录 | 每页50条</span>
|
||||
<ul class="pagination pagination-lg pull-right" style="margin: 0 0 ;">
|
||||
<li class="active"><a href="javascript:void(0);">1</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!--分页代码已被封装到统一模板文件中-->
|
||||
{% include 'common/pagenation.html' %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block js %}
|
||||
<script src="{{ buildStaticUrl('/js/food/index.js') }}"></script>
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,19 +1,6 @@
|
||||
{% extends "common/layout_main.html" %}
|
||||
{% block content %}
|
||||
<div class="row border-bottom">
|
||||
<div class="col-lg-12">
|
||||
<div class="tab_title">
|
||||
<ul class="nav nav-pills">
|
||||
<li class="current">
|
||||
<a href="{{ buildUrl('/food/index') }}">美食列表</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{ buildUrl('/food/cat') }}">分类列表</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% include "common/tab_food.html" %}
|
||||
<div class="row mg-t20 wrap_food_set" style="">
|
||||
<div class="col-lg-12" style="">
|
||||
<h2 class="text-center">设置</h2>
|
||||
@@ -24,7 +11,9 @@
|
||||
<select name="cat_id" class="form-control select2-hidden-accessible" tabindex="-1"
|
||||
aria-hidden="true">
|
||||
<option value="0">请选择分类</option>
|
||||
<option value="8">111</option>
|
||||
{% for item in cat_list %}
|
||||
<option value="{{ item.id }}" {% if item.id == info.cat_id %} selected {% endif %}>{{ item.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
@@ -32,14 +21,14 @@
|
||||
<div class="form-group">
|
||||
<label class="col-lg-2 control-label">名称:</label>
|
||||
<div class="col-lg-10">
|
||||
<input type="text" class="form-control" placeholder="请输入名称" name="name" value="">
|
||||
<input type="text" class="form-control" placeholder="请输入名称" name="name" value="{{ info.name }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="hr-line-dashed"></div>
|
||||
<div class="form-group">
|
||||
<label class="col-lg-2 control-label">价格:</label>
|
||||
<div class="col-lg-10">
|
||||
<input type="text" class="form-control" placeholder="请输入售价" name="price" value="">
|
||||
<input type="text" class="form-control" placeholder="请输入售价" name="price" value="{{ info.price }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="hr-line-dashed"></div>
|
||||
@@ -51,6 +40,12 @@
|
||||
<i class="fa fa-upload fa-2x"></i>
|
||||
<input type="file" name="pic" accept="image/png, image/jpeg, image/jpg,image/gif">
|
||||
</div>
|
||||
{% if info and info.main_image %}
|
||||
<span class="pic-each">
|
||||
<img src="{{ buildImageUrl( info.main_image ) }}"/>
|
||||
<span class="fa fa-times-circle del del_image" data="{{ info.main_image }}"></span>
|
||||
</span>
|
||||
{% endif %}
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -58,32 +53,50 @@
|
||||
<div class="form-group" style="">
|
||||
<label class="col-lg-2 control-label">描述:</label>
|
||||
<div class="col-lg-10">
|
||||
<textarea id="editor" name="summary" style="height: 300px;"></textarea>
|
||||
<textarea id="editor" name="summary" style="height: 300px;">{{ info.summary }}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hr-line-dashed"></div>
|
||||
<div class="form-group">
|
||||
<label class="col-lg-2 control-label">库存:</label>
|
||||
<div class="col-lg-2">
|
||||
<input type="text" name="stock" class="form-control" value="1">
|
||||
<input type="text" name="stock" class="form-control" value="{{ info.stock }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="hr-line-dashed"></div>
|
||||
<div class="form-group">
|
||||
<label class="col-lg-2 control-label">标签:</label>
|
||||
<div class="col-lg-10">
|
||||
<input type="text" class="form-control" name="tags" value="">
|
||||
<input type="text" class="form-control" name="tags" value="{{ info.tags }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="hr-line-dashed"></div>
|
||||
<div class="form-group">
|
||||
<div class="col-lg-4 col-lg-offset-2">
|
||||
<input type="hidden" name="id" value="0">
|
||||
<input type="hidden" name="id" value="{{ info.id }}">
|
||||
<button class="btn btn-w-m btn-outline btn-primary save">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<iframe name="upload_file" class="hide"></iframe>
|
||||
{% endblock %}
|
||||
{% block css %}
|
||||
<link href="{{ buildStaticUrl( '/plugins/select2/select2.min.css' ) }}" rel="stylesheet">
|
||||
<link href="{{ buildStaticUrl( '/plugins/tagsinput/jquery.tagsinput.min.css' ) }}" rel="stylesheet">
|
||||
{% endblock %}
|
||||
{% block js %}
|
||||
<script src="{{ buildStaticUrl( '/plugins/ueditor/ueditor.config.js' ) }}"></script>
|
||||
<script src="{{ buildStaticUrl( '/plugins/ueditor/ueditor.all.min.js' ) }}"></script>
|
||||
<script src="{{ buildStaticUrl( '/plugins/ueditor/lang/zh-cn/zh-cn.js' ) }}"></script>
|
||||
|
||||
<script src="{{ buildStaticUrl( '/plugins/select2/select2.pinyin.js' ) }}"></script>
|
||||
<script src="{{ buildStaticUrl( '/plugins/select2/zh-CN.js' ) }}"></script>
|
||||
<script src="{{ buildStaticUrl( '/plugins/select2/pinyin.core.js' ) }}"></script>
|
||||
|
||||
<script src="{{ buildStaticUrl( '/plugins/tagsinput/jquery.tagsinput.min.js' ) }}"></script>
|
||||
|
||||
|
||||
<script src="{{ buildStaticUrl( '/js/food/set.js' ) }}"></script>
|
||||
{% endblock %}
|
||||