Flask 菜品管理

web/templates/food/cat_set.html

{% extends "common/layout_main.html" %}
{% block content %}
{% include "common/tab_food.html" %}
<div class="row m-t  wrap_cat_set">
	<div class="col-lg-12">
		<h2 class="text-center">分类设置</h2>
		<div class="form-horizontal m-t m-b">
			<div class="form-group">
				<label class="col-lg-2 control-label">分类名称:</label>
				<div class="col-lg-10">
					<input type="text" name="name" class="form-control" placeholder="请输入分类名称~~" 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" name="weight" class="form-control" placeholder="请输入分类名称~~" value="{% if info and info.weight > 0 %}{
  { info.weight }}{% else %}1{% endif%}">
				</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="{
  { info.id }}">
					<button class="btn btn-w-m btn-outline btn-primary save">保存</button>
				</div>
			</div>
		</div>
	</div>
</div>
{% endblock %}
{% block js %}
<script src="{
  { buildStaticUrl('/js/food/cat_set.js') }}"></script>
{% endblock %}

这段代码是一个网页模板,使用了模板引擎语法。下面我将逐段解析代码的功能和作用:

  1. {% extends "common/layout_main.html" %}:这行代码表示该模板继承了名为"common/layout_main.html"的父模板。

  2. {% block content %}{% include "common/tab_food.html" %}:这两行代码定义了一个名为"content"的块,并在其中包含了"common/tab_food.html"模板。

  3. <div class="row m-t wrap_cat_set">:这行代码定义了一个带有样式类名的div元素。

  4. <div class="col-lg-12">:这行代码定义了一个带有样式类名的div元素。

  5. <h2 class="text-center">分类设置</h2>:这行代码定义了一个居中对齐的h2标题元素。

  6. <div class="form-horizontal m-t m-b">:这行代码定义了一个带有样式类名的div元素。

  7. <div class="form-group">:这行代码定义了一个带有样式类名的div元素。

  8. <label class="col-lg-2 control-label">分类名称:</label>:这行代码定义了一个带有样式类名的label元素。

  9. <div class="col-lg-10">:这行代码定义了一个带有样式类名的div元素。

  10. <input type="text" name="name" class="form-control" placeholder="请输入分类名称~~" value="{ { info.name }}">:这行代码定义了一个文本输入框元素,其中包含了一个名为"name"的属性和一个名为"info.name"的变量。

  11. <div class="hr-line-dashed"></div>:这行代码定义了一个带有样式类名的div元素,用于创建一条虚线。

  12. <div class="form-group">:这行代码定义了一个带有样式类名的div元素。

  13. <label class="col-lg-2 control-label">权重:</label>:这行代码定义了一个带有样式类名的label元素。

  14. <div class="col-lg-10">:这行代码定义了一个带有样式类名的div元素。

  15. <input type="text" name="weight" class="form-control" placeholder="请输入分类名称~~" value="{% if info and info.weight > 0 %}{ { info.weight }}{% else %}1{% endif%}">:这行代码定义了一个文本输入框元素,其中包含了一个名为"weight"的属性和一个名为"info.weight"的变量。

  16. <div class="hr-line-dashed"></div>:这行代码定义了一个带有样式类名的div元素,用于创建一条虚线。

  17. <div class="form-group">:这行代码定义了一个带有样式类名的div元素。

  18. <div class="col-lg-4 col-lg-offset-2">:这行代码定义了一个带有样式类名的div元素,并设置了偏移量。

  19. <input type="hidden" name="id" value="{ { info.id }}">:这行代码定义了一个隐藏的输入框元素,其中包含了一个名为"id"的属性和一个名为"info.id"的变量。

  20. <button class="btn btn-w-m btn-outline btn-primary save>保存</button>:这行代码定义了一个按钮元素,其中包含了一些样式类名。

以上是对代码的功能和作用的解析。这段代码主要是用于展示一个分类设置的表单页面,包含了分类名称、权重等输入框,并且有一个保存按钮。

web/static/js/cat_set.js

set.js里面写整个页面的一些操作

;
var food_cat_set_ops = {
    init:function(){
        this.eventBind();
    },
    eventBind:function(){
        $(".wrap_cat_set .save").click(function(){
            var btn_target = $(this);
            if( btn_target.hasClass("disabled") ){
                common_ops.alert("正在处理!!请不要重复提交~~");
                return;
            }

            var name_target = $(".wrap_cat_set input[name=name]");
            var name = name_target.val();

            var weight_target = $(".wrap_cat_set input[name=weight]");
            var weight = weight_target.val();

            if( name.length < 1 ){
                common_ops.tip( "请输入符合规范的分类名称~~",name_target );
                return false;
            }

            if( parseInt( weight ) < 1 ){
                common_ops.tip( "请输入符合规范的权重,并且至少要大于1~~",weight_target );
                return false;
            }

            btn_target.addClass("disabled");

            var data = {
                name: name,
                weight: weight,
                id:$(".wrap_cat_set input[name=id]").val()
            };

            $.ajax({
                url:common_ops.buildUrl( "/food/cat-set" ),
                type:'POST',
                data:data,
                dataType:'json',
                success:function( res ){
                    btn_target.removeClass("disabled");
                    var callback = null;
                    if( res.code == 200 ){
                        callback = function(){
                            window.location.href = common_ops.buildUrl("/food/cat");
                        }
                    }
                    common_ops.alert( res.msg,callback );
                }
            });


        });
    }
};

$(document).ready( function(){
    food_cat_set_ops.init();
} );

这段代码是一个Python Flask应用中的一个接口函数,用于处理/cat-set接口的GET请求和POST请求。下面是对代码的解释:

  1. 引用中的代码是一个HTML模板文件,其中使用了{%block js %}和{% endblock %}来引入一个JavaScript文件。这个JavaScript文件的路径是通过buildStaticUrl函数生成的。

  2. 引用中的代码是一个Python蓝图(Blueprint)中的一个路由函数,用于处理/cat-set接口的请求。这个函数首先判断请求的方法是GET还是POST,然后根据不同的方法执行不同的逻辑。

  3. 如果请求的方法是GET,那么函数会获取请求参数中的id,并根据id查询数据库中对应的FoodCat对象。然后将查询到的对象和当前的cat(可能是一个全局变量)放入resp_data字典中。

  4. 最后,函数会调用ops_render函数渲染一个HTML模板文件(food/cat_set.html),并将resp_data作为参数传入。

  5. 在JavaScript代码中,food_cat_set_ops是一个对象,其中包含了一个init方法和一个eventBind方法。init方法用于初始化页面,eventBind方法用于绑定事件。

这段代码是一个jQuery的事件处理函数,当点击".wrap_cat_set .save"元素时触发。下面是对代码各部分的解释:

  1. var btn_target = $(this);:将当前点击的元素保存到变量btn_target中。

  2. if( btn_target.hasClass("disabled") ){...}:判断btn_target元素是否有类名为"disabled",如果有,则弹出提示信息并返回。

  3. var name_target = $(".wrap_cat_set input[name=name]");:选取类名为"wrap_cat_set"的元素下的name属性为"name"的input元素,并将其保存到变量name_target中。

  4. var name = name_target.val();:获取name_target元素的值,并将其保存到变量name中。

  5. var weight_target = $(".wrap_cat_set input[name=weight]");:选取类名为"wrap_cat_set"的元素下的name属性为"weight"的input元素,并将其保存到变量weight_target中。

  6. var weight = weight_target.val();:获取weight_target元素的值,并将其保存到变量weight中。

  7. if( name.length < 1 ){...}:判断name的长度是否小于1,如果是,则弹出提示信息并返回。

  8. if( parseInt( weight ) < 1 ){...}:将weight转换为整数,并判断是否小于1,如果是,则弹出提示信息并返回。

  9. btn_target.addClass("disabled");:给btn_target元素添加类名"disabled"。

  10. var data = {...};:创建一个对象data,包含name、weight和id属性,分别对应输入框的值和隐藏域的值。

这段代码的功能是在点击保存按钮时,获取输入框中的值,并进行一些验证,然后将获取到的数据保存到data对象中。

web/templates/food/cat.html

{% extends "common/layout_main.html" %}
{% block content %}
{% include "common/tab_food.html" %}
<div class="row">
    <div class="col-lg-12">
        <form class="form-inline wrap_search">
            <div class="row  m-t p-w-m">
                <div class="form-group">
                    <select name="status" class="form-control inline">
                        <option value="-1">请选择状态</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>
            <hr>
            <div class="row">
                <div class="col-lg-12">
                    <a class="btn btn-w-m btn-outline btn-primary pull-right"
                       href="{
  { buildUrl('/food/cat-set') }}">
                        <i class="fa fa-plus"></i>分类
                    </a>
                </div>
            </div>

        </form>
        <table class="table table-bordered m-t">
            <thead>
            <tr>
                <th>序号</th>
                <th>分类名称</th>
                <th>状态</th>
                <th>权重</th>
                <th>操作</th>
            </tr>
            </thead>
            <tbody>
            {% if list %}
                {% for item in list %}
            <tr>
                <td>{
  { item.id }}</td>
                <td>{
  { item.name }}</td>
                <td>{
  { item.status_desc }}</td>
                <td>{
  { item.weight }}</td>
                <td>

                     {%  if item.status == 1 %}
                    <a class="m-l" href="{
  { buildUrl('/food/cat-set') }}?id={
  {  item.id }}">
                        <i class="fa fa-edit fa-lg"></i>
                    </a>

                    <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="5">暂无数据</td></tr>
            {% endif %}
            </tbody>
        </table>
    </div>
</div>
{% endblock %}
{% block js %}
<script src="{
  { buildStaticUrl('/js/food/cat.js') }}"></script>
{% endblock %}

web/static/js/food/cat.js

;
var food_cat_ops = {
    init:function(){
        this.eventBind();
    },
    eventBind:function(){
        var that = this;

        $(".wrap_search select[name=status]").change(function(){
            $(".wrap_search").submit();
        });

        $(".remove").click( function(){
            that.ops( "remove",$(this).attr("data") );
        } );

        $(".recover").click( function(){
            that.ops( "recover",$(this).attr("data") );
        } );
    },
    ops:function( act,id ){
        var callback = {
            'ok':function(){
                $.ajax({
                    url:common_ops.buildUrl( "/food/cat-ops" ),
                    type:'POST',
                    data:{
                        act:act,
                        id:id
                    },
                    dataType:'json',
                    success:function( res ){
                        var callback = null;
                        if( res.code == 200 ){
                            callback = function(){
                                window.location.href = window.location.href;
                            }
                        }
                        common_ops.alert( res.msg,callback );
                    }
                });
            },
            'cancel':null
        };
        common_ops.confirm( ( act == "remove" ? "确定删除?":"确定恢复?" ), callback );
    }

};

$(document).ready( function(){
    food_cat_ops.init();
} );

web/controllers/food/Food.py

# -*- coding: utf-8 -*-
from flask import Blueprint,request,jsonify,redirect
from common.libs.Helper import ops_render,getCurrentDate,iPagination,getDictFilterField
from application import  app,db
from common.models.food.Food import Food
from common.models.food.FoodCat import FoodCat
from common.models.food.FoodStockChangeLog import FoodStockChangeLog
from common.libs.UrlManager import UrlManager
from common.libs.food.FoodService import FoodService
from decimal import Decimal
from sqlalchemy import  or_
route_food = Blueprint( 'food_page',__name__ )

@route_food.route( "/index" )
def index():
    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():
    resp_data = {}
    req = request.args
    id = int(req.get("id", 0))
    reback_url = UrlManager.buildUrl("/food/index")

    if id < 1:
        return redirect( reback_url )

    info = Food.query.filter_by( id =id ).first()
    if not info:
        return redirect( reback_url )

    stock_change_list = FoodStockChangeLog.query.filter( FoodStockChangeLog.food_id == id )\
        .order_by( FoodStockChangeLog.id.desc() ).all()

    resp_data['info'] = info
    resp_data['stock_change_list'] = stock_change_list
    resp_data['current'] = 'index'
    return ops_render( "food/info.html",resp_data )


@route_food.route( "/set" ,methods = [ 'GET','POST'] )
def set():
    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" )
def cat():
    resp_data = {}
    req = request.values
    query = FoodCat.query

    if 'status' in req and int( req['status'] ) > -1:
        query = query.filter( FoodCat.status == int( req['status'] ) )

    list = query.order_by( FoodCat.weight.desc(),FoodCat.id.desc() ).all()
    resp_data['list'] = list
    resp_data['search_con'] = req
    resp_data['status_mapping'] = app.config['STATUS_MAPPING']
    resp_data['current'] = 'cat'
    return ops_render( "food/cat.html",resp_data )

@route_food.route( "/cat-set",methods = [ "GET","POST" ] )
def catSet():
    if request.method == "GET":
        resp_data = {}
        req = request.args
        id = int(req.get("id", 0))
        info = None
        if id:
            info = FoodCat.query.filter_by( id = id ).first()
        resp_data['info'] = info
        resp_data['current'] = 'cat'
        return ops_render( "food/cat_set.html" ,resp_data )

    resp = {'code': 200, 'msg': '操作成功~~', 'data': {}}
    req = request.values

    id = req['id'] if 'id' in req else 0
    name = req['name'] if 'name' in req else ''
    weight = int( req['weight'] ) if ( 'weight' in req  and  int( req['weight']) > 0 ) else 1

    if name is None or len( name ) < 1:
        resp['code'] = -1
        resp['msg'] = "请输入符合规范的分类名称~~"
        return jsonify( resp )

    food_cat_info = FoodCat.query.filter_by( id = id ).first()
    if food_cat_info:
        model_food_cat = food_cat_info
    else:
        model_food_cat = FoodCat()
        model_food_cat.created_time = getCurrentDate()
    model_food_cat.name = name
    model_food_cat.weight = weight
    model_food_cat.updated_time = getCurrentDate()
    db.session.add(model_food_cat)
    db.session.commit()
    return jsonify( resp )

@route_food.route("/cat-ops",methods = [ "POST" ])
def catOps():
    resp = {'code': 200, 'msg': '操作成功~~', 'data': {}}
    req = request.values

    id = req['id'] if 'id' in req else 0
    act = req['act'] if 'act' in req else ''
    if not id :
        resp['code'] = -1
        resp['msg'] = "请选择要操作的账号~~"
        return jsonify(resp)

    if  act not in [ 'remove','recover' ] :
        resp['code'] = -1
        resp['msg'] = "操作有误,请重试~~"
        return jsonify(resp)

    food_cat_info = FoodCat.query.filter_by( id= id ).first()
    if not food_cat_info:
        resp['code'] = -1
        resp['msg'] = "指定分类不存在~~"
        return jsonify(resp)

    if act == "remove":
        food_cat_info.status = 0
    elif act == "recover":
        food_cat_info.status = 1

        food_cat_info.update_time = getCurrentDate()
    db.session.add( food_cat_info )
    db.session.commit()
    return jsonify(resp)

@route_food.route("/ops",methods=["POST"])
def ops():
    resp = { 'code':200,'msg':'操作成功~~','data':{} }
    req = request.values

    id = req['id'] if 'id' in req else 0
    act = req['act'] if 'act' in req else ''

    if not id :
        resp['code'] = -1
        resp['msg'] = "请选择要操作的账号~~"
        return jsonify(resp)

    if act not in [ 'remove','recover' ]:
        resp['code'] = -1
        resp['msg'] = "操作有误,请重试~~"
        return jsonify(resp)

    food_info = Food.query.filter_by( id = id ).first()
    if not food_info:
        resp['code'] = -1
        resp['msg'] = "指定美食不存在~~"
        return jsonify(resp)

    if act == "remove":
        food_info.status = 0
    elif act == "recover":
        food_info.status = 1

    food_info.updated_time = getCurrentDate()
    db.session.add(food_info)
    db.session.commit()
    return jsonify( resp )

@route_food.route(/set", methods=["GET","POST"])

这段代码是一个Flask路由函数,用于处理GET和POST请求。根据请求的方法不同,函数会执行不同的逻辑。

对于GET请求,函数会首先获取请求参数中的id,并根据id查询数据库中对应的食品信息。如果查询到的信息存在且状态不为1,则会重定向到食品列表页面。接着,函数会查询所有的食品分类,并将查询结果和食品信息添加到响应数据中。最后,函数会渲染并返回"food/set.html"模板页面。

对于POST请求,函数会首先获取请求参数中的id、cat_id、name、price、main_image、summary和stock。接着,函数会根据这些参数进行相应的处理。最后,函数会返回一个包含操作结果的JSON响应。

这段代码是一个条件判断的示例,根据不同的条件返回不同的结果。具体来说,它首先检查请求中是否存在’tags’字段,如果存在则将其赋值给变量tags,否则将tags赋值为空字符串。然后,它依次检查cat_id、name、price、main_image、summary和stock这些变量的取值是否符合规范,如果不符合规范,则返回一个包含错误代码和错误消息的JSON响应。

这段代码的作用是对请求中的一些字段进行验证,确保它们的取值符合要求。如果有任何一个字段的取值不符合要求,就会返回一个包含错误信息的JSON响应。

这段代码是一个后端接口的实现,用于处理前端传递过来的数据并进行相应的操作。具体来说,这段代码实现了以下功能:

  1. 判断是否传入了标签,如果没有传入或者标签长度小于1,则返回错误信息。
  2. 根据传入的id查询食品信息,如果存在则更新该食品的信息,如果不存在则创建一个新的食品。
  3. 更新食品的分类id、名称、价格、主图、摘要、库存和标签,并更新更新时间。
  4. 将食品信息添加到数据库中,并提交事务。
  5. 调用FoodService的setStockChangeLog方法,记录库存变动日志。
  6. 返回处理结果。

这段代码的主要作用是处理食品信息的增加或修改,并记录库存变动日志。在前端接收到支付链接后,可以调用这个接口来更新食品信息。

问题1: id = int( req.get('id',0) ) 中的0代表什么意思

在代码 id = int( req.get('id',0) ) 中, 0 是一个默认值。如果 req 字典中不存在键为 'id' 的值,或者该值无法转换为整型,那么 id 变量将被赋值为 0。这样做的目的是在获取 'id' 值时,如果出现错误或者缺失,可以提供一个默认值以避免程序出错。

问题2: 为什么将字典 resp_data 中的键 'current' 的值设置为字符串 'index'?

问题3: Decimal()的作用是什么?

这段代码的作用是将变量price的值转换为Decimal类型,并将其保留两位小数。具体解析如下:

price = Decimal(price).quantize(Decimal('0.00'))
  1. Decimal(price):将变量price转换为Decimal类型。Decimal是Python中用于处理精确小数运算的模块。
  2. .quantize(Decimal('0.00')):使用quantize方法对转换后的Decimal对象进行舍入操作,保留两位小数。参数Decimal(‘0.00’)表示要保留的小数位数。

例如,如果price的值为10.5678,经过上述代码处理后,price的值将变为10.57。

common/libs/food/FoodService.py

# -*- coding: utf-8 -*-
from application import app,db
from common.models.food.FoodStockChangeLog import FoodStockChangeLog
from common.models.food.Food import Food
from common.libs.Helper import getCurrentDate
class FoodService():

    @staticmethod
    def setStockChangeLog( food_id = 0,quantity = 0,note = '' ):

        if food_id < 1:
            return False

        food_info = Food.query.filter_by( id = food_id ).first()
        if not food_info:
            return False

        model_stock_change = FoodStockChangeLog()
        model_stock_change.food_id = food_id
        model_stock_change.unit = quantity
        model_stock_change.total_stock = food_info.stock
        model_stock_change.note = note
        model_stock_change.created_time = getCurrentDate()
        db.session.add(model_stock_change)
        db.session.commit()
        return True


可视化编辑操作:Ueditor

包含3个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>

Ueditor是一款基于JavaScript的富文本编辑器,它提供了丰富的功能和插件,可以方便地嵌入到网页中,用于编辑和管理文本内容。根据你提供的引用内容,我可以为你介绍一下如何在Ueditor中进行一些自定义修改。

  1. 在ueditor\ueditor.all.js文件中,找到editorui[“simpleupload”] = function (editor){}这一行代码后面,添加你想要的自定义代码。例如:
    editorui["simpleupload"] = function (editor){
        // 自定义代码
        console.log("这是我的自定义代码");
    }

  2. 在ueditor\ueditor.all.js文件中,找到UE.plugins[‘defaultfilter’]这一行代码后面,新增你想要的自定义代码。例如:
    UE.plugins['defaultfilter'] = function(){
        // 自定义代码
        return ;
    }

    请注意,以上只是示例代码,你可以根据自己的需求进行相应的修改和扩展。

相关推荐

  1. Flask 管理

    2024-01-07 13:30:04       28 阅读
  2. flask 与小程序 详情和分享功能

    2024-01-07 13:30:04       39 阅读
  3. 新增——后端SpringBoot

    2024-01-07 13:30:04       11 阅读
  4. 苍穹外卖--在redis中缓存数据,加快查询速度

    2024-01-07 13:30:04       35 阅读

最近更新

  1. AWS EKS上GPU工作负载自动扩缩容的异常排查指南

    2024-01-07 13:30:04       0 阅读
  2. 深入WebKit内核:揭秘HTML与XML的识别之谜

    2024-01-07 13:30:04       0 阅读
  3. shell脚本实现mysql 数据库备份

    2024-01-07 13:30:04       1 阅读
  4. 数据结构第11节: B树

    2024-01-07 13:30:04       1 阅读
  5. Spring Boot与RSocket的集成

    2024-01-07 13:30:04       1 阅读
  6. 责任链模式

    2024-01-07 13:30:04       1 阅读

热门阅读

  1. 怎么给服务器再额外附加一个 IP ?

    2024-01-07 13:30:04       36 阅读
  2. 嵌入式Linux之Ubuntu学习笔记(压缩与解压缩)

    2024-01-07 13:30:04       36 阅读
  3. 一个人能不能快速搭建一套微服务环境

    2024-01-07 13:30:04       57 阅读
  4. C++关联容器

    2024-01-07 13:30:04       39 阅读
  5. MySQL学习笔记1: 数据库的简单介绍

    2024-01-07 13:30:04       39 阅读
  6. vue 使用 splice 删除元素UI视图不同步怎么办?

    2024-01-07 13:30:04       32 阅读
  7. Linux C语言 46-正则表达式

    2024-01-07 13:30:04       30 阅读