图片 13

 

 截图中显得了有个别查询结果,基本没什么难点了。

主要:

 

svc.sql

 1 CREATE PROCEDURE [base].[BookTranslator#Insert](@json nvarchar(max), @bookID bigint)
 2 WITH ENCRYPTION
 3 AS
 4 BEGIN
 5 ...
 6 
 7         -- insert Translator
 8         insert    base._Author(Name)select value
 9         from    openjson(@json, '$.Translators') x
10         where    not exists(select 1 from base._Author p where p.Name=x.value);
11 
12         insert    base._BookTranslator(BookID, TranslatorID) select @bookID, x.ID
13         from    openjson(@json, '$.Translators') j join base.Author#Raw() x on x.Name=j.value
14 
15 ...
16 END

  代码达成

  1卡塔尔(قطر‎ 在Frame目录中创建Init.class.php文件,
将进口文件index中的代码复制实行改变为类

  【Frame/Init.class.php】

 1 <?php 2 /** 3  * 应用初始化操作类 4  * User: young 5  */ 6  7 class Init 8 { 9     protected static $frame = array('BaseController','BaseModel','Db','FactoryModel'); //Frame目录公共操作类10     public static function run()11     {12         //平台13         self::dispatch();14 15         //定义常量16         self::setConst();17 18         //自动加载类19         self::loadClass();20 21         $ctr = CTR."Controller";  //拼接控制器名称22 23         //实例化控制器24         $ctrObj = new $ctr();25         $a = ACTION;26         $ctrObj -> $a();27     }28     /**29      * 设置自动加载类方法30      */31     private static function loadClass()32     {33         spl_autoload_register('self::autoload');34     }35 36     /**37      * 实现自动加载38      * @param  string $className 类名39      */40     private static function autoload($className)41     {42         $upperClassName = strtoupper($className);43         if(in_array($className, static::$frame)) {44             require_once FRAME."$className.class.php";45         } elseif(substr($upperClassName, -5) == 'MODEL'){46             require_once MODEL."$className.class.php";47         } elseif(substr($upperClassName, -10) == 'CONTROLLER'){48             require_once CTRONLLER."$className.class.php";49         }50     }51 52     /**53      * 定义常量54      */55     private static function setConst()56     {57         define('DS', DIRECTORY_SEPARATOR); //目录分割符58         define('ROOT', getcwd().DS);59         define('FRAME', ROOT.'Frame'.DS);60         define('APP', ROOT.'App'.DS);61         define('PUB', ROOT.'Public'.DS);62         define('ADMIN', PUB.'Admin'.DS);63         define('HOME', PUB.'Home'.DS);64 65 66         define('MODEL', APP.'Model'.DS);67         define('VIEW', APP.'View'.DS.PLAT.DS.CTR.DS);68         define('CTRONLLER', APP.'Controller'.DS.PLAT.DS);69     }70 71     /**72      * 获取 p c a 的GET值,并设置为常量73      * @return void74      */75     private static function dispatch()76     {77         $p = !empty($_GET['p']) ? $_GET['p'] : 'Home';  //平台78         $c = !empty($_GET['c']) ? $_GET['c'] : 'User';  //控制器79         $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //动作80 81         define('PLAT', $p);82         define('CTR', $c);83         define('ACTION', $a);84     }85 }

2卡塔尔国 入口文件引入开端化类,并调用其艺术 【index.php】

1 <?php2 /**3  * 入口文件4  */5 6 require_once './Frame/Init.class.php';7 Init::run();

3卡塔尔 提交代码

1 $  git add -A2 $  git commit -m "优化入口文件,封装初始化类"
#!/usr/bin/env python
# coding=utf-8


### 数据库链接参数 ###
DB = {
    'db_host': '127.0.0.1',
    'db_port': 5432,
    'db_name': 'simple_db',
    'db_user': 'postgres',
    'db_pass': '123456'
}
# 是否将所有要执行的Sql语句输出到日志里
IS_OUTPUT_SQL = False

新增Action:Shelf_Init.sql

 1 CREATE PROCEDURE [base].[Publisher#Insert](@json nvarchar(max), @id int out)
 2 WITH ENCRYPTION
 3 AS
 4 BEGIN
 5 ...
 6 
 7         declare    @name nvarchar(100);
 8         select    @name=Publisher from openjson(@json, '$') with (Publisher nvarchar(100))
 9 
10         -- insert Publisher
11         insert    base._Publisher(Name)select @name
12         where    not exists(select 1 from base._Publisher p where p.Name=@name);
13 
14         select    @id=ID from base.Publisher#Raw() where Name=@name;
15 ...
16 END

  在config目录下开创db_config.py文件(有多少个库时,能够配备四个分歧的参数来援用)

Init.cshtml

上边要做的是显得Shelf中的Book音信,要等前天活干完才干继续写了。


 

翻开下DB有没有数据:

 

小结:

第生机勃勃完毕了 引进路线优化, 类的全自动加载, 封装优化进口文件,目录访谈限定

MVC微型框架到此基本形成。其实还恐怕有为数不菲要么得以三番五回增加,如

  1, 类文件命名此处都用了 .class.php结尾,
实质能够优化间接行使.php结尾

  2, 引进命名空间,更低价的加载类

3, 项目中冒出谬误,那个时候是一直展现在浏览器上的,
能够写叁个日志类,发生错误写入文件或数据库都可

  4, 数据库连接音讯此处是直接写在DB类和BaseModel中了, 是不安全的。
能够创立一个安顿目录,将这一个音信写入配置文件,再写二个加载配置文件的类。

  5. 此构造目录 ,是在C,V中分平台,如Controller/Home,
Controller/Admin; 实际也得以写成 平台下分MVC构造, 如Admin/Controller,
Admin/Model, Home/Controller,Home/View ..
这么些是相比较灵敏的,可以依据需求采纳越发合适的法子

  实际上线项目,依旧提出选取框架,安全飞快;
自个儿模仿定义的框架布局相符学习钻研选择,容易脱漏,形成安全隐患,操作困难等主题素材

下一步:依据博客前端模板,剖析创立数据表,
起始搭建博客后台程序,后续首先希图达成“分类模块”。既分类的显得,改过,增加,删除功效

  在筹算操作类时,大家供给观念多少个难题:

 1 CREATE PROCEDURE [svc].[Shelf$Init](@json nvarchar(max))
 2 WITH ENCRYPTION
 3 AS
 4 BEGIN
 5     SET    NOCOUNT    ON;
 6     SET XACT_ABORT ON;
 7     BEGIN TRY
 8         BEGIN    TRAN;
 9 
10         declare    @nickName nvarchar(20), @shelfName nvarchar(20);
11         select    @nickName=NickName,     @shelfName=ShelfName
12         from    openjson (@json, '$')
13         with (
14             NickName        nvarchar(20),
15             ShelfName        nvarchar(20)
16         );
17 
18         insert    core._Party(Type, Alias) select k._User, @nickName
19         from    core.Party#Type() k;
20         declare    @userID int=@@identity;
21 
22         
23         insert    core._Party(PID, Type, Alias) select @userID, k._Shelf, @shelfName
24         from    core.Party#Type() k;
25 
26         COMMIT    TRAN;
27     END TRY
28     BEGIN CATCH
29         if (xact_state() = -1) ROLLBACK TRAN; throw;
30     END CATCH
31 END

继续,插入BookNbr信息;

保山访谈项目目录

  2.它供给扶植with语句,当大家忘记关闭数据库游标和连接时,自动帮我们关闭(须要得以完毕__enter__()与__exit__()方法)

 1     using M = Shelf;
 2     public class InitModel : PageModel
 3     {
 4         private readonly IShelfRepo _shelfRepo;
 5         public InitModel(IShelfRepo shelfRepo)
 6         {
 7             _shelfRepo = shelfRepo;
 8         }
 9         [BindProperty]
10         public InitInputModel Input { get; set; }
11 
12         public void OnGet()
13         {
14 
15         }
16 
17         public async Task<IActionResult> OnPostAsync()
18         {
19             if (ModelState.IsValid)
20             {
21                 await _shelfRepo.InitAsync(new M.InitSpec
22                 {
23                     NickName = Input.NickName.Trim(),
24                     ShelfName = Input.ShelfName.Trim()
25                 });
26                 return RedirectToPage("New");
27             }
28             return Page();
29         }
30     }

继续,插入Publisher音讯(要求判断name空头支票才会insert),然后回来PublisherID;

优化进口文件

  3.由于类在加载时就曾经自行再三再四数据库了,所以在点子中无需打开展开数据库链接操作

Init.cshtml.cs

先是,作者急需成立一个Book Type的Matter;

  思路

  难点:
当时,项目中全数目录都以能够通过浏览器访谈的,如直接待上访谈Frame/Db.class.php文件
直接能够去查看数据库登陆消息,鲜明是不安全的。

  解决措施:

    方式1:
在能够访谈的文书早先处定义常量,访问是决断是还是不是定义常量defined,
未有概念内定常量则直接exit(‘Access Deny’卡塔尔;

    方式2: 开启分布式权限配置,编写.htaccess文件, 如防止访问,
将该公文放置在取缔访谈的目录中

    def open_conn(self):
        """连接数据库,并建立游标"""
        try:
            if not self.connect:
                self.connect = psycopg2.connect(database=self.db_name, user=self.db_user, password=self.db_pass, host=self.db_host, port=self.db_port)
            return self.connect
        except Exception as e:
            log_helper.error('连接数据库失败:' + str(e.args))
            return False

    def close_conn(self):
        """关闭postgresql数据库链接"""
        # 关闭游标
        try:
            if self.cursor:
                self.cursor.close()
        except Exception:
            pass
        # 关闭数据库链接
        try:
            if self.connect:
                self.connect.close()
        except Exception:
            pass

前边的书房开始化的前端音讯已经周密,所以今后启幕贯彻DB的Script部分。

查询DB,看看有未有数据进DB:

机动加载类

图片 1图片 2

1 CREATE SCHEMA [svc]
2     AUTHORIZATION [dbo];

 

  代码完成

1)操作步骤

图片 3图片 4

step 1: 在入口文件中定义所需要的常量step 2: 控制器中引入视图时, 使用常量进行优化 

操作步骤思路

2卡塔尔(قطر‎ 入口文件中定义常用路线常量 【index.php】

 1 <?php 2 /** 3  * 入口文件 4  */ 5 $p = !empty($_GET['p']) ? $_GET['p'] : 'Home';  //平台 6 $c = !empty($_GET['c']) ? $_GET['c'] : 'User';  //控制器 7 $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //动作 8  9 define('PLAT', $p);  //平台常量10 define('CTR', $c);  //控制器11 define('ACTION', $a); //动作12 13 14 define('DS', DIRECTORY_SEPARATOR); //目录分割符15 define('ROOT', getcwd;  //当前所在目录 项目目录16 define('FRAME', ROOT.'Frame'.DS);17 define('APP', ROOT.'App'.DS);18 define('PUB', ROOT.'Public'.DS);19 define('ADMIN', PUB.'Admin'.DS);20 define('HOME', PUB.'Home'.DS);21 22 //MVC目录23 define('MODEL', APP.'Model'.DS);24 define('VIEW', APP.'View'.DS.PLAT.DS.CTR.DS);25 define('CTRONLLER', APP.'Controller'.DS.PLAT.DS);26 27 $ctr = $c."Controller";28 29 require_once FRAME.'Db.class.php';  //数据库操作类30 require_once FRAME.'BaseModel.class.php';  //基础模型类31 require_once MODEL.'UserModel.class.php';  //用户模型类32 require_once FRAME.'FactoryModel.class.php';//模型工厂类33 require_once FRAME.'BaseController.class.php'; //基础控制器类34 require_once CTRONLLER.$ctr.'.class.php';35 36 37 //实例化控制器38 $userCtr = new $ctr();39 40 $userCtr -> $a();

2卡塔尔 常量的运用:

  后台首页调整器【App/Controller/Admin/IndexController.class.php】

图片 5图片 6

 1 <?php 2 /** 3  * IndexController控制器类 4  * 后台相关操作 5  * User: young 6  */ 7  8 class IndexController extends BaseController 9 {10     //展示后台首页11     public function index()12     {13         include VIEW.'index.html';14     }15 }

后台首页调控器引进视图路线改革

  客户调控器
登陆视图引进路线【App/Controller/Home/UserController.class.php】

图片 7图片 8

 1 <?php 2 /** 3  * UserController.class.php 用户控制器 4  */ 5  6 class UserController  extends  BaseController{ 7     /** 8      * 展示登录界面 9      * @access public10      */11     public function login()12     {13         include VIEW."login.html";14     }15 。。。16 。。。17 。。。

客商调控器登入视图引进路线

3)提交代码

$  git add -A$  git commit -m "常量使用"

   最后二个是记录超时sql语句到日志方法,这里作者将不仅0.1秒的sql语句都记录下来

图片 9

 1 CREATE PROCEDURE [svc].[Book$Init](@json nvarchar(max))
 2 WITH ENCRYPTION
 3 AS
 4 BEGIN
 5 ...
 6 
 7         declare    @stringID varchar(36), @userID int,  @shelfID int;
 8         select    @stringID=u.StringID,  @userID=u.ID, @shelfID=s.ID
 9         from    openjson (@json, '$') with (StringID varchar(36))
10         cross    apply core.User#For(StringID) u
11         join    core.Party#Raw() s on s.PID=u.ID;
12 
13         declare    @stateID int=(select BookCreated from core.Status#ID());
14 
15         -- init Matter
16         insert    core._Matter(Type, UserID, StateID)
17         select    k._Book, @userID, @stateID from core.Matter#Type() k;
18         declare    @matterID int=@@identity;
19 
20         -- init FileBank
21         insert    base._FileBank(Type, Url)
22         select    k._BookImage, ImageUrl
23         from    openjson(@json, '$') with (ImageUrl varchar(200))
24         cross    apply base.FileBank#Type() k;
25         declare    @imageID int=@@identity;
26         
27         -- insert Publisher
28         declare    @publisherID int;
29         exec    base.Publisher#Insert @json=@json, @id=@publisherID out;
30         
31         -- insert Binding
32         declare    @bindingID int;
33         exec    base.Binding#Insert @json=@json, @id=@bindingID out;
34 
35         -- insert Book
36         insert    base._Book(ID, Title, PublisherID, BindingID, ImageID)
37         select    @matterID, Title, @publisherID, @bindingID, @imageID
38         from    openjson(@json, '$') with (Title nvarchar(100));
39         
40         -- insert BookInfo
41         insert    base._BookInfo(ID, OriginTitle, PageCnt, Pubdate, SubTitle)
42         select    @matterID, OriginTitle, Pages, Pubdate, SubTitle
43         from    openjson(@json, '$')
44         with (
45             Pages       int, 
46             Pubdate     char(10), 
47             SubTitle    nvarchar(150), 
48             OriginTitle nvarchar(150)
49         );
50         
51         -- insert BookNbr
52         insert    base._BookNbr(ID, Type, Number)
53         select    @matterID, k._ISBN13, Isbn13
54         from    base.BookNbr#Type() k, openjson(@json, '$') with (Isbn13 char(13));
55         
56         insert    base._BookNbr(ID, Type, Number)
57         select    @matterID, k._ISBN10, Isbn10
58         from    base.BookNbr#Type() k, openjson(@json, '$') with (Isbn10 char(10));
59         
60         -- insert BookSupplement
61         insert    base._BookSupplement(ID, Type, Supplement)
62         select    @matterID, k._AuthorIntro, AuthorIntro
63         from    base.BookSupplement#Type() k, openjson(@json, '$') with (AuthorIntro nvarchar(max));
64         
65         insert    base._BookSupplement(ID, Type, Supplement)
66         select    @matterID, k._Summary, Summary
67         from    base.BookSupplement#Type() k, openjson(@json, '$') with (Summary nvarchar(max));
68         
69         insert    base._BookSupplement(ID, Type, Supplement)
70         select    @matterID, k._Catalog, Catalog
71         from    base.BookSupplement#Type() k, openjson(@json, '$') with (Catalog nvarchar(max));
72 
73         -- insert BookTag
74         exec    base.BookTag#Insert @json=@json, @bookID=@matterID;
75         
76         -- insert BookAuthor
77         exec    base.BookAuthor#Insert @json=@json, @bookID=@matterID;
78 
79         -- insert BookTranslator
80         exec    base.BookTranslator#Insert @json=@json, @bookID=@matterID;
81         
82         -- insert ShelfBook
83         insert    base._ShelfBook(BookID, ShelfID) values(@matterID, @shelfID);
84 
85 ...
86 END

  代码完毕

  1) 入口文件贯彻类的电动加载

 1 <?php 2 /** 3  * 入口文件 4  */ 5 $p = !empty($_GET['p']) ? $_GET['p'] : 'Home';  //平台 6 $c = !empty($_GET['c']) ? $_GET['c'] : 'User';  //控制器 7 $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //动作 8  9 define('PLAT', $p);  //平台常量10 define('CTR', $c);  //控制器11 define('ACTION', $a); //动作12 13 14 define('DS', DIRECTORY_SEPARATOR); //目录分割符15 define('ROOT', getcwd;  //当前所在目录 项目目录16 define('FRAME', ROOT.'Frame'.DS);17 define('APP', ROOT.'App'.DS);18 define('PUB', ROOT.'Public'.DS);19 define('ADMIN', PUB.'Admin'.DS);20 define('HOME', PUB.'Home'.DS);21 22 //MVC目录23 define('MODEL', APP.'Model'.DS);24 define('VIEW', APP.'View'.DS.PLAT.DS.CTR.DS);25 define('CTRONLLER', APP.'Controller'.DS.PLAT.DS);26 27 $ctr = $c."Controller";28 29 spl_autoload_register('autoload'); //注册自动加载函数30 //自动加载类31 /**32  * 实自动加载类文件33  * @param  string $className 类名34  */35 function autoload($className)36 {37     $upperClassName = strtoupper($className);38     $frame = array('BaseController','BaseModel','Db','FactoryModel');39     if(in_array($className, $frame)) {  //加载公共Frame目录中的类文件40         require_once FRAME."$className.class.php";41     } elseif(substr($upperClassName, -5) == 'MODEL'){  //加载模型Model目录中的类文件42         require_once MODEL."$className.class.php";43     } elseif(substr($upperClassName, -10) == 'CONTROLLER'){  //加载控制器目录中的类文件44         require_once CTRONLLER."$className.class.php";45     }46 }47 48 //实例化控制器49 $userCtr = new $ctr();50 $userCtr -> $a();

2) 提交代码

1 $  git add -A2 $  git commit -m "自动加载类完成"

View Code

 

 

  思路

  难题: 入口文件中曾经require_once
引进6个类,既充实二个急需引进叁个,轻巧脱漏,重复和失误。

  化解办法:自动加载类文件

     情势1: 使用机关加载类函数__autoload(State of Qatar能够达成活动加载
  格局2: 实际项目中,几人付出,依据实用性,越多的是选用sql_autoload_register(卡塔尔国注册函数自动加载

  依据目录的特点实现全自动加载
  Model类文件特点,以Model结尾的类名 substr($className,-5State of Qatar
  Controller文件特点: 以Controller结尾的类名, substr($class,-10卡塔尔国

    公共类:
类名未有统雷同式,能够将Fame下的公共类归入到数组中,然后判定类是不是在数组中,
进而自动加载该目录下的类公事

# 使用with方法,初始化数据库连接
with db_helper.PgHelper(db_config.DB, db_config.IS_OUTPUT_SQL) as db:
    # 设置sql执行语句
    sql = """insert into product (name, code) values (%s, %s) returning id"""
    # 设置提交参数
    vars = ('zhangsan', '201807251234568')
    # 生成sql语句,并打印到控制台
    print(db.get_sql(sql, vars))

页面内容也亟需改进一下form部分

 1 CREATE PROCEDURE [base].[BookAuthor#Insert](@json nvarchar(max), @bookID bigint)
 2 WITH ENCRYPTION
 3 AS
 4 BEGIN
 5 ...
 6 
 7         -- insert Author
 8         insert    base._Author(Name)select value
 9         from    openjson(@json, '$.Authors') x
10         where    not exists(select 1 from base._Author p where p.Name=x.value);
11 
12         insert    base._BookAuthor(BookID, AuthorID) select @bookID, x.ID
13         from    openjson(@json, '$.Authors') j join base.Author#Raw() x on x.Name=j.value
14 
15 ...
16 END

  实现

  1)使用上述格局2的花样来落实,
站点配置中参与意气风发项(景况搭建时已经到场了): 详细见:
PHP源码搭建博客1-条件搭建

  apache配置文件httpd-vhosts.conf 中站点布局

1  #允许分布式权限配置2   AllowOverride All

  2) 重启apache后,编写 .htaccess文件, 该文件内容:

deny from all

  3) 将.htaccess文件放置禁绝访问的目录中。 如App/ , Frame/
目录下。只用放在第意气风发层就可以,内层目录自动差别意直接访问。

图片 10

  4State of Qatar 访谈测量试验

图片 11

 

….

继续,插入BookInfo的信息;

  思路

  1)把常用的目录路线定义成常量。如 模型目录,调控器目录等
 2)引进类应用定义的常量代替部分路径。 如 include
FRAME.BaseModel.class.php
3) 载入视图使用常量替代部分路径 如 include VIEW.’login.html’ 轻松款式

  通过重写内置__enter__()与__exit__(State of Qatar方法,来得以达成with语句调用本类时,会自行对类举行伊始化操作,自动创造数据库连接。现代码执行完结后(程序退出with语句时),程序会活动调用对应的法子,将游标与数据库连接的关门,制止手动操作时,忘记关闭连接出现相当。

填写不动书房的新闻:

图片 12

上意气风发篇中,提议4个难题待消除,本篇集中国化学工业进出口总公司解那4个难点,最后产生完全的微型MVC框构造造,
后续博客项目,或别的连串,均能够一向利用该框架布局举行开荒学习。

  那是项目原db_helper.py代码

图片 13

继续,插入BookAuthor信息;

  思路

  难题:
那时候,入口文件代码零碎增加,随着后续代码的扩展,入口文件会越来越肥胖复杂,不易管理

  化解办法:
封装入口文件中的操作称为一个类,那样只需求在输入文件调用类的诀窍就可以

    创建Init.class.php类文件,放入到Frame中
   将进口文件全数操作封装成类方法
loadClass(State of Qatar 设置自动加载函数
autoload(卡塔尔(قطر‎自动加载类
setConst(State of Qatar 定义常量
dispatch(卡塔尔 前端分发器

  完成的db_helper.py代码

好了,我去试试前端能还是无法起始化音信进DB

 

下载查看该品种源码:

  接下去,大家来挨门挨户达成地方的相继艺术

在测验在此之前,大家要求完成一下Init Razor Pages代码:

 1 CREATE PROCEDURE [base].[Binding#Insert](@json nvarchar(max), @id int out)
 2 WITH ENCRYPTION
 3 AS
 4 BEGIN
 5 ...
 6 
 7         declare    @name nvarchar(100);
 8         select    @name=Binding from openjson(@json, '$') with (Binding nvarchar(100))
 9 
10         -- insert Binding
11         insert    base._Binding(Name)select @name
12         where    not exists(select 1 from base._Binding p where p.Name=@name);
13 
14         select    @id=ID from base.Binding#Raw() where Name=@name;
15 
16 ...
17 END
--------------文件结构:--------------------------------------blog
├─App
│ ├─Model 模型
│ │ └─UserModel.class.php 用户模型类 
│ ├─View 视图
│ │ ├─Back后台
│ │ │ └─Index
│ │ │ └─index.html 后台首页面
│ │ └─Home前台
│ │ └─User 用户视图目录
│ │ └─login.html 登录表单页面
│ ├─Controller 控制器
│ │ ├─Back后台
│ │ │ └─IndexController.class.php 后台首页控制器
│ │ └─Home前台
│ │ └─UserController.class.php 用户控制器
├─Public 静态公共文件(js,css,images)
│ ├─Plugins 插件
│ │ └─layui 前端框架插件
│ ├─Back后台
│ │ ├─js/ js文件
│ │ ├─css/ css样式文件
│ │ └─image img图片 
│ └─Home前台
│ ├─js/ js文件
│ ├─css/ css样式文件
│ └─image img图片 
├─Frame 公共使用的类
│ ├─BaseModel.class.php 数据库连接类
│ ├─BaseController.class.php 控制器公共操作(设置编码,信息跳转)
│ ├─FactoryModel.class.php 模型工厂类
│ ├─Init.class.php 初始化应用类
│ └─MySQLDB.class.php 数据库操作工具类
└─index.php 入口文件-----------------------------------------------------------------

 

 点击Save按键提交,OK,平常提交了并跳转了。

然后,将图片路线保存到FileBank中,并重临FileBankID;

常量优化路线

预备: 创建分支

1 $ git checkout master2 $ git checkout -b "MVC"
    def commit(self):
        """提交事务"""
        try:
            if self.connect:
                self.connect.commit()
                self.close_conn()
        except Exception as e:
            log_helper.error('提交事务失败:' + str(e.args))
admin

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注