main.py
$!globalPort$!callback.setFileName("${tableInfo.name}Main.py")$!callback.setSavePath($tool.append($tableInfo.savePath, "/$tableInfo.obj.name"))#if(!$tableInfo.pkColumn.isEmpty())    #set($pk = $tableInfo.pkColumn.get(0))#end# -*- coding: utf-8 -*-import loggingimport threadingimport webbrowserfrom DBUtil import DBUtilfrom LogUtil import getLoggerfrom flask import Flask, render_templatefrom flask import requestfrom flask_cors import CORS# html同级app = Flask(__name__, template_folder=".")# flask日志输出级别log = logging.getLogger('werkzeug')log.setLevel(logging.ERROR)# 项目日志logger = getLogger("log")CORS(app, resources='/*')# 数据库db = DBUtil("$tableInfo.obj.getParent().getPresentableText()")# 表名tableName = "$tableInfo.obj.name"app.jinja_env.variable_start_string = '{['app.jinja_env.variable_end_string = ']}'def request_parse():    if request.method == 'POST' or request.method == 'PUT':        return request.json    elif request.method == 'GET' or request.method == 'DELETE':        return request.args@app.route('/getList', methods=['GET'])def getList():    # region 参数    data = request_parse()    pageNum = data.get("pageNum")    pageSize = data.get("pageSize")    parmOrder = data.get("parmOrder")    parmColumn = data.get("parmColumn")#foreach($column in $tableInfo.fullColumn)    ${column.obj.name} = data.get("${column.obj.name}")#end    # endregion    # region 计算分页    if not pageNum:        pageNum = 1    else:        pageNum = int(pageNum)    if not pageSize:        pageSize = 10    else:        pageSize = int(pageSize)    if pageNum < 0:        pageNum = 0    # 起始位置    selectIndex = (pageNum - 1) * pageSize    if selectIndex < 0:        selectIndex = 0    # endregion    sql = "select * from {} where 1=1 ".format(tableName)    countWhereSql = " where 1=1 "#foreach($column in $tableInfo.fullColumn)    if ${column.obj.name}:        sql += " and ${column.obj.name} like '%{}%' ".format(${column.obj.name})        countWhereSql += " and ${column.obj.name} like '%{}%'".format(${column.obj.name})#end    if parmOrder:        orderSql = " order by {} {} ".format(parmColumn, parmOrder)        sql += "{} limit {},{}".format(orderSql, selectIndex, pageSize)        countWhereSql += orderSql    else:        sql += "limit {},{}".format(selectIndex, pageSize)    logger.info("getList()----sql: {}".format(sql))    logger.info("getList()----countWhereSql: {}".format(countWhereSql))    result_data = db.select(sql)    for i in range(len(result_data)):#foreach($column in $tableInfo.fullColumn)#if($column.type.equals("java.util.Date"))        result_data[i]["$column.obj.name"] = str(result_data[i]["$column.obj.name"])#end#end        pass    count = db.selectCount(tableName, countWhereSql)    return {        "resultCode":200,        "rows": result_data,        "total": count    }@app.route('/getOne', methods=['GET'])def getOne():    data = request_parse()    $pk.obj.name = data.get("$pk.obj.name")    sql = "select * from {} where $pk.obj.name = '{}'".format(tableName,$pk.obj.name)    logger.info("getOne()----sql: {}".format(sql))    oneData = db.select(sql)    if oneData:#foreach($column in $tableInfo.fullColumn)#if($column.type.equals("java.util.Date"))        oneData[0]["$column.obj.name"] = str(oneData[0]["$column.obj.name"])#end#end        return {"resultCode": 200, "data": oneData[0]}    else:        return {"resultCode": 404, "msg": "没有找到此记录"}@app.route('/update', methods=['PUT'])def update():    data = request_parse()#foreach($column in $tableInfo.fullColumn)    ${column.obj.name} = data.get("${column.obj.name}")#end    sql = "update {} set ".format(tableName)#foreach($column in $tableInfo.otherColumn)    if ${column.obj.name}:        sql += " ${column.obj.name} = '{}' ,".format(${column.obj.name})#end    sql = sql.strip(",")    sql += " where $pk.obj.name = '{}'".format($pk.obj.name)    logger.info("update()----sql: {}".format(sql))    db.execute(sql)    return {"resultCode": 200}@app.route('/delete', methods=['DELETE'])def delete():    data = request_parse()    ${pk.obj.name}s = data.getlist("${pk.obj.name}s[]")    for ${pk.obj.name} in ${pk.obj.name}s:        sql = "delete from {} where $pk.obj.name = '{}'".format(tableName,$pk.obj.name)        logger.info("delete()----sql: {}".format(sql))        db.execute(sql)    return {"resultCode": 200}@app.route('/add', methods=['POST'])def add():    data = request_parse()    # 移除主键    if '$pk.obj.name' in  data.keys():        del data['$pk.obj.name']    logger.info("add()----数据: {}".format(data))    db.insertOne(data,tableName)    return {"resultCode": 200}@app.route("/")def index():    return render_template('index.html')def openUrl(port):    webbrowser.open("http://127.0.0.1:{}".format(port), new=0)@app.errorhandler(Exception)def error_handler(e):    logger.error("全局异常捕获: {}".format(e))    data = {        "resultCode": 500,        "msg": str(e)    }    return dataif __name__ == '__main__':    port = $port    if not os.environ.get('WERKZEUG_RUN_MAIN'):        th = threading.Thread(target=openUrl, args=(port,))        th.start()    else:        print("热加载")    app.run(port=port, debug=True)
index.html
$!globalPort$!callback.setFileName("index.html")$!callback.setSavePath($tool.append($tableInfo.savePath, "/$tableInfo.obj.name"))#if(!$tableInfo.pkColumn.isEmpty())    #set($pk = $tableInfo.pkColumn.get(0))#end<!DOCTYPE html><html lang="zh"><head>    <meta charset="UTF-8">#if(!$tableInfo.comment)    <title>$tableInfo.obj.name</title>#else    <title>$tableInfo.comment</title>#end    <link rel="stylesheet" href="static/css/element.css">    <script src="static/js/vue-2.6.12.js"></script>    <script src="static/js/element.js"></script>    <script src="static/js/axios.min.js"></script>    <link rel="shortcut icon" href="static/favicon.ico" type="image/x-icon"/></head><style>    /*body {        width: 80%;        margin: auto;        margin-top: 20px;    }*/</style><body><div id="app">    <div class="app-container">        <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">#foreach($column in $tableInfo.fullColumn)#if(!$column.comment)            <el-form-item label="$column.obj.name" prop="$column.obj.name">#else            <el-form-item label="$column.comment" prop="$column.obj.name">#end                            <el-input                    v-model.trim="queryParams.${column.obj.name}"#if(!$column.comment)                    placeholder="请输入$column.obj.name"#else                    placeholder="请输入$column.comment"#end                                         clearable                    size="small"                    @keyup.enter.native="handleQuery"/>            </el-form-item>            #end            <el-form-item>                <el-pagination                        background                        :current-page.sync="queryParams.pageNum"                        :page-sizes="[10, 20, 30, 50, 400]"                        :page-size.sync="queryParams.pageSize"                        layout="total, sizes, prev, pager, next"                        @size-change="getList"                        @current-change="getList"                        :total="total">                </el-pagination>            </el-form-item>            <el-form-item>                <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>                <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>            </el-form-item>        </el-form>        <el-row :gutter="10">            <el-col :span="1.5">                <el-button                        type="primary"                        icon="el-icon-plus"                        size="mini"                        @click="handleAdd"                >新增                </el-button>            </el-col>            <el-col :span="1.5">                <el-button                        type="success"                        icon="el-icon-edit"                        size="mini"                        :disabled="single"                        @click="handleUpdate"                >修改                </el-button>            </el-col>            <el-col :span="1.5">                <el-button                        type="danger"                        icon="el-icon-delete"                        size="mini"                        :disabled="multiple"                        @click="handleDelete"                >删除                </el-button>            </el-col>        </el-row>        <el-table v-loading="loading" :data="${tableInfo.obj.name}List" @sort-change="handleSortChange" @selection-change="handleSelectionChange">            <el-table-column type="selection" width="55" align="center"></el-table-column>#foreach($column in $tableInfo.fullColumn)#if(!$column.comment)            <el-table-column label="${column.obj.name}" align="center" sortable prop="${column.obj.name}"></el-table-column>#else            <el-table-column label="${column.comment}" align="center" sortable prop="${column.obj.name}"></el-table-column>#end  #end            <el-table-column label="操作" align="center" class-name="small-padding fixed-width">                <template slot-scope="scope">                    <el-button                            size="mini"                            type="text"                            icon="el-icon-edit"                            @click="handleUpdate(scope.row)"                    >修改                    </el-button>                    <el-button                            size="mini"                            type="text"                            icon="el-icon-delete"                            @click="handleDelete(scope.row)"                    >删除                    </el-button>                </template>            </el-table-column>        </el-table>        <!-- 添加或修改对话框 -->        <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>            <el-form ref="form" :model="form" :rules="rules" label-width="80px">#foreach($column in $tableInfo.otherColumn)#if(!$column.comment)            <el-form-item label="${column.obj.name}" prop="${column.obj.name}">#if($column.type.equals("java.util.Date"))                <el-date-picker clearable size="small" style="width: 200px"                              v-model="form.${column.obj.name}"                              type="date"                              value-format="yyyy-MM-dd"                              placeholder="选择${column.obj.name}">                </el-date-picker>#else                <el-input v-model="form.${column.obj.name}" placeholder="请输入${column.obj.name}"/>#end            </el-form-item>#else            <el-form-item label="${column.comment}" prop="${column.obj.name}">#if($column.type.equals("java.util.Date"))                <el-date-picker clearable size="small" style="width: 200px"                              v-model="form.${column.obj.name}"                              type="date"                              value-format="yyyy-MM-dd"                              placeholder="选择${column.comment}">                </el-date-picker>#else                <el-input v-model="form.${column.obj.name}" placeholder="请输入${column.comment}"/>#end            </el-form-item>#end #end            </el-form>            <div slot="footer" class="dialog-footer">                <el-button type="primary" @click="submitForm">确 定</el-button>                <el-button @click="cancel">取 消</el-button>            </div>        </el-dialog>    </div></div></body><script>    baseUrl = "http://127.0.0.1:$port"    new Vue({        el: '#app',        data() {            return {                // 遮罩层                loading: true,                // 选中数组                ids: [],                // 非单个禁用                single: true,                // 非多个禁用                multiple: true,                // 总条数                total: 0,                // $tableInfo.obj.name表格数据                ${tableInfo.obj.name}List: [],                // 弹出层标题                title: "",                // 是否显示弹出层                open: false,                // 查询参数                queryParams: {                    pageNum: 1,                    pageSize: 10,#foreach($column in $tableInfo.fullColumn)                    ${column.obj.name}:undefined,#end                    parmOrder: undefined,                    parmColumn: undefined                },                // 表单参数                form: {},                // 表单校验                rules: {#foreach ($column in $tableInfo.otherColumn)#if(!$column.comment)                    ${column.obj.name}: [ { required: true, message: "$column.obj.name不能为空", trigger: "blur" } ],#else                    ${column.obj.name}: [ { required: true, message: "$column.comment不能为空", trigger: "blur" } ],#end#end                }            };        },        created() {            this.getList();        },        methods: {            // 查询列表            getList() {                this.loading = true;                axios({                    method: 'get',                    url: baseUrl + '/getList',                    params:this.queryParams,                }).then(res => {                    const response = res.data;                    const resultCode = response.resultCode                    if (resultCode === 200) {                        this.${tableInfo.obj.name}List = response.rows;                        this.total = response.total;                        this.loading = false;                    } else {                        this.$message({                            message: '查询失败,' + response.msg,                            type: 'error'                        });                    }                }).catch(function (error) {                    console.log(error);                });            },            // 取消按钮            cancel() {                this.open = false;                this.reset();            },            // 表单重置            reset() {                this.form = {#foreach ($column in $tableInfo.otherColumn)                    $column.obj.name: undefined,#end                };            },            /** 搜索按钮操作 */            handleQuery() {                this.queryParams.pageNum = 1;                this.getList();            },            /** 重置按钮操作 */            resetQuery() {                this.$refs.queryForm.resetFields();                this.handleQuery();            },            // 多选框选中数据            handleSelectionChange(selection) {                this.ids = selection.map(item => item.${pk.obj.name})                this.single = selection.length!=1                this.multiple = !selection.length            },            // 排序            handleSortChange(column) {                let parmOrder = column.order === "ascending" ? "asc" : "desc"                this.queryParams.parmColumn = column.prop                this.queryParams.parmOrder = parmOrder                if (column.order == null) {                    this.queryParams.parmColumn = undefined                    this.queryParams.parmOrder = undefined                }                this.getList()            },            /** 新增按钮操作 */            handleAdd() {                this.reset();                this.open = true;                this.title = "添加";            },            /** 修改按钮操作 */            handleUpdate(row) {                this.reset();                const ${pk.obj.name} = row.${pk.obj.name} || this.ids[0]                axios({                    method: 'get',                    url: baseUrl + '/getOne',                    params:{"${pk.obj.name}":${pk.obj.name}},                }).then(res => {                    if (res.data.resultCode === 200) {                        this.form = res.data.data;                        this.open = true;                        this.title = "修改";                    }else{                        this.getList();                        this.$message({                            message: "查询失败:" + res.data.msg,                            type: 'error'                        });                    }                }).catch(function (error) {                    console.log(error);                });            },            /** 提交按钮 */            submitForm: function() {                this.#[[$]]#refs["form"].validate(valid => {                    if (valid) {                        if (this.form.${pk.obj.name} != undefined) {                            axios({                                method: 'put',                                url: baseUrl + '/update',                                data:this.form,                            }).then(res => {                                if (res.data.resultCode === 200) {                                    this.$message({                                      message: '修改成功',                                      type: 'success'                                    });                                    this.open = false;                                    this.getList();                                }else{                                    this.getList();                                    this.$message({                                        message: "修改失败:" + res.data.msg,                                        type: 'error'                                    });                                }                            }).catch(function (error) {                                console.log(error);                            });                        } else {                            axios({                                method: 'post',                                url: baseUrl + '/add',                                data:this.form,                            }).then(res => {                                if (res.data.resultCode === 200) {                                    this.$message({                                      message: '新增成功',                                      type: 'success'                                    });                                    this.open = false;                                    this.getList();                                }else{                                    this.getList();                                    this.$message({                                        message: "新增失败:" + res.data.msg,                                        type: 'error'                                    });                                }                            }).catch(function (error) {                                console.log(error);                            });                        }                    }                });            },            /** 删除按钮操作 */            handleDelete(row) {                const ${pk.obj.name}s = row.${pk.obj.name} ? [row.${pk.obj.name}] : this.ids                this.$confirm('是否确认删除编号为"' + ${pk.obj.name}s + '"的数据项?', "警告", {                    confirmButtonText: "确定",                    cancelButtonText: "取消",                    type: "warning"                }).then(() => {                    axios({                        method: 'delete',                        url: baseUrl + '/delete',                        params:{"${pk.obj.name}s":${pk.obj.name}s},                    }).then(res => {                        if (res.data.resultCode === 200) {                            this.$message({                              message: '删除成功',                              type: 'success'                            });                            this.open = false;                            this.getList();                        }else{                            this.getList();                            this.$message({                                message: "删除失败:" + res.data.msg,                                type: 'error'                            });                        }                    });                }).catch(() => {                });            },        }    })</script></html>
Global Config
globalPort
#set($port = 666)