创建TPL自定义模板
创建初始模板所需要的文件和文件夹
设置初始化模板信息(template.inc.php),入口文件(index.php)载入模板信息文件。
在Template.class.php类文件中的构造方法来验证各个必须的文件夹(模板文件夹,编译文件夹,缓存文件夹)是否存在,不存在则新建文件夹,在入口文件中创建Template类对象。
注:载入类文件语句:require 'includes/Template.class.php';也可以定义__autoload函数,实例化对象的时候会自动载入:
在templates文件下的index.tpl文件中添加模板内容(先添加一个普通的变量,以后在慢慢在增加需要解析的标签)
在Template.class.php类文件中创建display()方法,用来载入.tpl文件,在入口文件index.php中调用该方法,载入模板index.tpl内容。
在浏览器中输入:http://localhost/tpl/index.php
注:我们尽量设置php文件和tpl文件名字是一样的,这样载入的时候我们就不需要通过参数传递指定文件的名字,直接就用当前执行的文件名字的模板文件就可以了,php文件的名字是index,我们的tpl文件也设置为index。
在载入模板前要先判断模板文件是否存在!
相关函数解释:
basename(path,suffix):返回路径中的文件名部分。suffix参数可选,规定文件扩展名,如果文件有suffix,则不输出该扩展。
$_SERVER['SCRIPT_FILENAME']:当前执行脚本的绝对路径及文件名
__FILE__:原始文件的绝对路径及文件名
在这个项目中,我们是在index.php中执行display函数,所以用$_SERCRE[SCRIPT_FILENAME]的值为:ROOT_PATH.'index.php';用__FILE__的值为ROOT_PATH.'/includes/Template.class.php',我们所执行的php文件不同,模板文件相对应不同,所以我们用$_SERVER['SCRIPT_FILENAME']
上图中的$_fileName为:index.tpl
在Template.class.php类文件中创建assign()方法,用来接收index.php传过来的变量,用于以后变量的解析使用。在display函数中将传过来的变量打印出来,测试是否传递成功
在index.php中加入三个变量分别调用该方法。
在浏览器中输入:http://localhost/tpl/index.php
在profile.xml中设置几个系统变量。
因为系统变量是整个网站都适用的,所以我们要放在构造函数中对其进行获取并赋值保存在私有变量中便于以后解析使用。在display函数中将传过来的变量打印出来,测试是否传递成功
在浏览器中输入:http://localhost/tpl/index.php
注:$this->_config["$_tag->name"] = "$_tag->value"中$_tag->name必须加引号(必须是双引号,因为单引号不可以解析变量),因为$_tag->name不是字符串,而是一个对象,如果不加引号会报错:Illegal offset type。$_tag->value的引号可加可不加。
在Parser.class.php类文件中创建解析变量和其他动态标签的函数,然后将解析完的内容保存到解析文件中
在Templates类中实例化解析类对象,调用compile()函数完成模板解析
在主文件中定义是否开启缓存
如果缓存开启则生成缓存文件,如果缓存文件和解析文件存在,并且是这几个文件(php文件,模板文件,解析文件,缓存文件,系统配置文件)最后修改的,则直接载入缓存文件,因为缓存文件是存的HTML代码,所以提高了加载效率。以下是完整的display()函数代码:
完善解析普通变量函数parVar()
在浏览器中输入:http://localhost/tpl/index.php
完善解析if标签函数parIf()
完善解析foreach标签函数parForeach()
完善解析include语句函数parInclude()
完善解析注释语句函数parCommon()
完善解析系统变量函数parConvar()
建立后台管理系统1)新建admin文件夹2)新建admin.php文件3)新建index.php4)在template目录下建立后台模板admin.tpl
注:(1)后台首页定义为admin.php 但是如果我们想要进入后台页面,需要在浏览器中输入http://localhost/tpl/admin/admin.php,系统默认的页面是index.php,所以我们新建index.php文件,添加语句:header('location:admin.php');将默认的页面导向admin.php,这样,当我们想要进入后台主页的时候,直接在浏览器中输入http://localhost/tpl/admin就可以了。(2)dirname()函数返回路径中的目录部分,dirname(__FILE__)表示当前文件的目录,即当前文件路径的上一层,也就是当前文件所在文件夹,如果再加一层dirname即dirname(dirname(__FILE__))则表示文件所在文件夹所在的目录,即文件所在文件夹的上层文件夹路径
配置信息转移。1)将定义模板文件目录部分放在profile文件夹中的profile.inc.php,在template.inc.php文件中引入此文件,注意要在定义根目录之后。2)将引入Template.class.php类文件和创建Template类实例的语句放在template.inc.php文件中,这样以后之后的文件就不需要重复引入重复创建,直接用global关键字就可以了。3)将template.inc.php文件改名为init.inc.php,意思是系统初始化文件
分离缓存设置。因为后台我们不需要生成缓存文件,前台后台我们需要分别对缓存进行设置,所以我们要在前台和后台都要新建缓存设置文件cache.inc.php,然后在系统初始化文件init.inc.php中引入缓存设置文件。
建立前台后台页面框架(这里直接盗用别人的代码)
前台首页
列表页:
后台
头尾分离(头尾分离要用到include标签,不仅仅要将该语句进行解析,解析文件还要将引入的文件内容中的变量进行解析,所以我们可以将include标签解析为引入文件对于的文件内容,然后再进行解析,此时parser.class.php中的compile函数中要将解析include标签的函数在最开始调用)
新建管理员列表和管理员登记表,添加几条数据
查询数据库,得到管理员列表
将连接数据库和清理数据句柄和结果集封装到DB.class.php中,在init.inc.php中引入该类文件
注意:unDB 函数的参数要按地址传递才可以将对象真正销毁
将数据库配置内容转移到配置文件中
从数据表中获得所有管理员列表和管理员等级信息,通过解析(优化解析foreach标签的代码,可以解析对象),然后通过foreach循环在页面中显示出来
在根目录创建model目录,用于存放所有的实体类,实体类里存放的是所有模块的数据层操作,比如:查询,新增,删除,修改等。将管理员的查询放在model下的Manage.class.php文件中,然后在manage.php引入该文件,直接调用函数
在管理员管理页面上添加增加,修改,删除管理员模块,通过超链接信息来指定你需要调用哪张页面
获取$_GET['action']参数,通过模板注入每张页面的变量,通过解析{if}来指定对应的页面。
完善增加管理员用户的页面
实现新增管理员业务逻辑
注意:添加用户时,获取的值要加引号!!!
实现修改管理员业务逻辑,然后将变量注入到模板中
完善修改管理员页面,用js来动态显示管理员的等级
修改管理员列表的显示。1)按id排序。2)注册时间格式用date的格式显示
实现修改管理员业务逻辑
实现删除管理员业务逻辑
创建Tool.class.php工具类,用于各种频繁的常规操作。
完善管理员的增删改操作,添加返回值表示是否操作成功,然后做出不同的反应
删除管理员要增加一个弹出框,避免意外删除
将业务流程放在manages.class.php中,其中的$manage要改为$this,$_tpl要修改为$this->_tpl。简化入口文件
在model文件夹下新建模型基类model.class.php,存放数据的正删改查模型,manage类继承model,用parent直接调用父类函数
注意:在入口文件要引入基类文件model.class.php
新建控制器文件夹,将实体类的业务流程控制器部分,分离到ManageAction.class.php中去。
1.新建一个属性$_model用来存放manage类实例,将业务流程中的$this换成$this->_model
2.将增删改查业务流程分别封装到函数中,直接用self调用
3.在manage入口文件中引入该控制器文件:ManageAction.class.php
4.在manage入口文件中直接实例化ManageAction对象
新建控制器基类Action,最常用的两个对象句柄放到基类中,让子类ManageAction继承调用。同时在入口文件中要进入该基类文件(注意引入文件的顺序)
注意:两个对象句柄要修改为protected才可以被子类调用!
程序瘦身,将所有的引入类文件都在系统初始化中实现,通过__autoload()函数自动引入
使用js设计子导航
注意:
1.因为修改管理员需要传用户id,所以只能从列表页进去,那么只有在修改管理员页面才会显示修改管理员的这个子导航
2.在哪个页面,相对于那个子导航应该要有不同的样式,并且不可以点击
3.不可以点击需要实现两点,没有手型和没有href属性。
删除多余的代码
manage.php页面的删除页面可以删除,因为有了二级导航,那个列表页面下方的增加管理员和修改管理员与增加管理员页面的返回列表都可以删除
将列表页的list修改为show
新建删除记录的函数
1.增加一个属性$table用来存放表名,之后就不需要传表名这个参数了
2.修改记录仅需要传入表名和条件就可以了,表名用$this->table表示即可,鉴于有多条件也有单条件,所以我们传入两个参数,一个是条件的字段名(字符串),一个是条件的值(数组),如果之前的语句中已经有了where关键字则不需要加where而是and
3.sql语句中的条件连接在查询修改时都需要,所以封装成一个私有函数调用
新建修改记录的函数(同时原来的增删改模型可以删除了)
新建增加记录的函数
修改查找单个数据模型
修改查找多个数据模型(关联其他表时需要新建关联模型,然后调用)
修改管理员控制模型
如果增删改模型参数传错了,有时候会返回-1也是添加失败,但是-1也是真,所以要修改成功的条件是必须返回值必须等于1
用同样的方法,增加等级管理的页面!将管理员的代码修改一下即可。
注意:
1.删除cms_level中的level字段,以后可以直接用id表示就可以了,那么获取管理员列表的时候关联两个表的条件就要做出相应修改
2.在查询管理员数据中涉及到了一个时间的问题,等级列表里面是没有的,这个获取多个数据模型要稍微修改一下,要加一个判断避免出错!按理来说是模型基类是不应该存在固定字段的,这个以后再优化!
将增加和修改管理员页面中的等级从数据库中获取
新建验证类,验证增加和修改管理员时,用户名和密码输入是否满足要求
1.修改管理员前台页面,增加密码确认输入框
2.增加验证类,增加两个函数,一个验证长度是否满足,一个验证两个数据是否相等
3.在增加和修改管理员之前要验证
4.当修改管理员时,如果密码没有输入,则不修改密码,而不是密码设置为空
对等级的增加和修改进行验证
前台使用js验证表单
在增加等级或者管理员之前检查之前是否已经存在!修改等级和管理员的获得单个数据模型的函数,将字段和条件都定位参数,这样检查是否已经存在就可以直接调用这些函数!
防止误删等级。在删除等级之前检测该等级是否有用户
如果等级名字可以修改,那我们在修改前需要判断新修改名字之前是否存在
注:判断之前查询出的数据要检查是不是当前记录,如果不是当前记录才会提示登记名已经存在!
创建分页1(建立框架)
分析:
1.创建分页我们需要两个参数传递,数据总条数(从数据库中查询)和每页显示记录的条数
2.分页需要知道当前内容分页的总页数,由数据总条数和每页显示记录得到
3.分页需要知道当前分页内容的路径,在点击其他页码的链接有用
4.分页的显示需要知道当前页面,方便上一页和下一页的点击链接
5.需要一个变量可以限制显示每一页记录内容
创建分页2(增加查询记录总条数模型,然后分别创建查询管理员和等级总条数的函数)
创建分页3(修改getPage和getUrl函数)
创建分页4(修改首页,上一页,下一页,尾页,数字页码函数)
创建分页5(修改获取所有管理员和所有等级的函数,增加limit参数)
创建分页6(将page注入前台页面显示)
创建分页7(增加一个属性,表示每一个显示的页码数,可以传参数,也可以使用默认的参数,当内容过多时,页码太多,不能全部显示,所以需要设置显示多少个页码)
创建分页8(优化分页的显示)
分析:
1.当当前页为第一页时,首页和上一页就不需要了,当当前页为最后一页时,尾页和下一页也不需要,所以可以直接把上一页和首页放在一起,当当前页不是第一页时显示,把下一页和尾页放在一起,当当前页不是最后一页时显示。
2.当规定的每页要显示的页码数比总页数还多时,显示所有的页码数
3.例:当一共有10页,每页显示5个页码时,如果当前页是1,2,3时,那显示的第一个页码是1,当当前页是8,9,10时,显示的页码第一个页码是6,其他情况下显示的第一个页码是当前页-2,结尾页是当前页+4
创建分页9(将每页显示的记录条数定义为常量放在系统配置文件中)
创建分页10(在等级列表页也加上分页)
创建验证码类
<?php class ValidateCode {private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789';private $code = '';private $image;private $width;private $height;private $strlen;public function __construct($width,$height,$strlen=4){header('Content-Type:image/png');$this->height = $height;$this->width = $width;$this->strlen = $strlen;}private function creatBg(){$this->image = imagecreatetruecolor($this->width,$this->height);$color = imagecolorallocate($this->image, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255));imagefill($this->image, 0, 0, $color);}private function creatCode(){$len = strlen($this->charset)-1;for( $i=0;$i<$this->strlen;$i++ ) {$this->code .= $this->charset[mt_rand(0,$len)];} }private function addCode(){$x = $this->width/$this->strlen;for( $i=0;$i<$this->strlen;$i++ ){$color = imagecolorallocate($this->image, mt_rand(0, 157), mt_rand(0, 157), mt_rand(0, 157));imagestring($this->image, 5, $x*$i+5, 8, $this->code[$i], $color);}}private function addLine(){for( $i=0;$i<3;$i++){$color = imagecolorallocate($this->image,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));imageline($this->image, mt_rand(1,$this->width/2), mt_rand(1, $this->height), mt_rand($this->width/2,$this->width), mt_rand(1, $this->height), $color);}for( $i=0;$i<50;$i++){$color = imagecolorallocate($this->image,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));imagestring($this->image, 1, mt_rand(0, $this->width), mt_rand(0, $this->height), '.', $color);} }private function outImg(){imagepng($this->image);imagedestroy($this->image);}public function getCode(){$this->creatBg();$this->creatCode();$this->addLine();$this->addCode();$this->outImg();} }
后台登陆页面
注:要实现验证码点击刷新功能
保存验证码便于以后验证
1.验证码类中增加获取验证码的方法(不区分大小写)
2.调用方法获得验证码保存到session中
3.在使用session之前必须要开始session
验证登陆(服务器)
1.验证用户名长度
2.验证密码长度
3.验证验证码长度
4.验证验证码是否正确
5.验证账号密码是否正确
6.注:增加语句:$show = true,是表示如果输入不是add或者delete或者update,都默认的是管理员列表页面
验证登陆(前台js)
将session注入到top页面,登陆成功之后的后台页面要显示当前登陆的用户
后台登陆限制(session检测)
1.admin,top,main页面需要检测
2.manage页面也需要,但是当action=login时不需要,所以要分开写
3.level所有页面都需要检测,所以可以放在构造函数中
退出登陆
页面输出过滤
数据库输入过滤
在登陆成功之后进入主页之前要修改登陆管理员的登陆次数,登陆ip,登陆时间的信息
注意:对登陆次数的修改要特殊处理
查询单个或者多个数据模型结束后如果之前有关联其他数据表的话要解除该关联(不然在上一步查询的时候还关联着另一个数据表)
特殊处理,登陆时间和注册时间
将分页配置放到action基类中
注意:
1.调用分页类只需要传入记录总条数即可
2.在分页类中将分页的限制(limit)保存到Model基类的字段中
3.Model的子类(管理员和级别)直接就可以调用$this->limit.
优化编号(因为记录会删除,所以编号不连续,我们要修改为连续的编号)
1.在page方法中注入一个变量
2.修改解析foreach标签,使得内部可以进行加法运算
3.在模板类中修改编号的显示,因为要进行运算,所以采用js代码
优化增,删,改记录的用户体验
1.增加的时候要返回到最后一页,这样用户可以看到新增加的记录(返回连接为page=-1,定义获取的页码为负数时显示最后一页),当然也可以在显示列表的时候倒序排序。
2.删除成功返回到上一页
3修改成功之后返回到修改页面的上一页,可以在进入修改页面之前将修改页面的上一页保存起来,然后在通过POST获取
建立导航内容模块
1.新建表格cms_nav
2.在sidebarn.html文件中修改添加导航链接
3.新建nav.php,NavAction.class.php,admin_nav.js,NavModel.class.php,nav.tpl五个文件,内容都有相应的等级文件中复制粘贴过来
4.将上面四个文件中的Level全部修改为Nav,level全部修改为nav,‘等级’全部修改为‘导航’
5.与等级不同的是,在删除等级时是要检查该等级下是否有管理员,而删除导航之前要检查该导航下面是否有子导航
6.优化列表的显示,当没有记录的时候不显示分页,提示没有记录(导航页面,管理员页面和等级页面都要修改)
优化增加导航记录(新增导航的sort默认应该是和id一样的,我们通过SHOW TABLE STATUS来获得下一个记录的id)
注意:SHOW TABLE STATUS LIKE ‘table’,table一定要加引号!!!
优化增删改查模型
1.将查询多条记录,查询单条记录,查询记录总条数,查询增加记录ID中相同的代码分离出来
2.将增加记录,删除记录,修改记录中相同的代码分离出来
添加查看和增加子导航内容
1.nav.tpl添加showchild和addchild模块(复制show和add模块),addchild模块和add模块都要添加一个隐藏域名,用来存放pid,show模块要添加一列增加和查看子导航的入口
2.修改导航,增加子导航,子导航列表都要增加修改导航增加子导航和子导航列表的入口
3.NavAction.class.php文件中也要添加showchild和addchild模块
4.修改增加导航函数add,使得也适用于增加子导航
5.修改导航列表函数show,使得也适用于查看子导航(添加条件,通过pid查看)
6.修改导航,子导航列表和增加子导航模板文件中有相同的入口,可以优化一下
7.当修改导航,增加子导航,查看子导航列表时,如果不是从主页进入获取的id然后传id过去,而是字节在url中收入输入id,那我们就需要检查id是否有效
8.同样关于修改管理员等级之前也需要增加验证
9.既然考虑到我们可能直接手动在url中输入网址,那我们的上一页内容就有可能获取不到,所以我们需要处理,当上一页url获取不到时,设置为空
10.优化增加子导航和子导航列表,增加显示上级导航
使用LoginAction来控制登录
1.新建LoginAction.class,php,采用ManageAction.class.php中登陆和退出的方法,将检查session放在login方法之前
<?php class LoginAction extends Action {public function __construct(&$_tpl){parent::__construct($_tpl,new ManageModel());$this->action();$this->_tpl->display(); }//业务流程控制器private function action(){$_GET['action']= isset($_GET['action']) ? $_GET['action'] : 'login';switch($_GET['action']){case 'login':self::login();break;case 'loginout':self::loginout();break;default:break;} }//退出登陆private function loginout(){Tool::unSession();Tool::alertLocation('退出成功!', 'login.php');}//验证登陆private function login(){if(isset($_SESSION['login'])) Tool::alertLocation('已登陆成功,点击确定自动为您跳转到主页!', 'admin.php');if(isset($_POST['send']) && $_POST['send']=='登录'){Validate::checkLength($_POST['username'],2,20,'用户名必须在2到20位之间!');Validate::checkLength($_POST['password'],6,null,'密码不得小于6位!');Validate::checkLength($_POST['code'], 4, 4,'验证码必须为4位!');Validate::checkEquals(strtolower($_POST['code']), $_SESSION['code'], '验证码不正确!');if(!!$name = $this->_model->getLoginManage('username,name','username=? and password=?',array($_POST['username'],$_POST['password']))){$_SESSION['login']['username'] = $name->username;$_SESSION['login']['level'] = $name->name;$this->_model->setManage($name->username);Tool::alertLocation($_POST['username'].'恭喜你,登陆成功!', 'admin.php');}else{Tool::alertBack('用户名或者密码错误!');}}} }
2.修改login.php文件
3.删除Manage.class,php文件中login和loginout相关的删除,将验证session代码放在构造函数中
4.修改top.tpl和login.tpl。将manage.php修改为login.php
修改架构。为了使前台也可以调用,我们将登陆验证和action,display放在php文件中,而不是构造函数中
前台显示主导航
1.将缓存配置文件cache.inc.php修改为common.inc.php,然后修改在init.inc.php中引入文件时文件的名字,因为我们在common.inc.php文件中可能会用到$_tpl对象,所以我们要放在实例化对象的后面引入
2.在NavAction.class.php中增加前台显示主导航的方法(必须是共有方法),因为前台只需要id和name就可以了,所以需要修改控制器中的方法,将查询字段作为参数
3.显示导航并且点击导航可以进入相应的列表页面(点击首页进入主页,即index.php)
4.前台实例化NavAction对象调用frontshow方法,可以增加显示的条数(定义常量)
导航排序
1.查询导航结果要显示字段sort并且按字段sort排序
2.nav.tpl后台页面显示要添加sort,除了要显示排序,还有实现重新排序的功能,所以要添加form表单,注意:除了要提交新的排序还需要一个隐藏字段保存原本的排序,方便以后判断要不要更新排序
3.添加修改排序模块,更新修改导航的方法
显示列表页
1.列表页不设计某一个固定的model,所以修改Action.class.php构造函数,model参数不提供时默认为null
2.列表页显示导航和子导航
3.用js来动态显示当前列表页是的导航是什么(字体为红色)
4.当列表页是二级导航时,导航名字前面显示父级导航
5.如果想要正确显示,需要修改对变量的解析,也可以解析变量对象(同foreach中的对象)
6.既然我们可以解析对象变量,那我们在修改记录的时候直接传递对象就可以了,没必要将对象中的每个字段都分别取出保存成变量传递
、7.将网址参数传到文件名,生成不同的编译和缓存文件(如果没有参数,那么所有的缓存文件将都是一个,不会切换)
文档模块
1.点击查看文档列表进入文章列表页
2.新建content.php,content.tpl,ContentAction.class,php,ContentMdel.class.php文件,内容先复制之前的导航相应的文件,然后把文中所以的导航都修改为文档,Nav修改为Content,nav修改为content。还要新建admin_content.js直接复制admin_nav前面的代码即可。
3.修改content.tpl文件,删除原本增删改查的内容,重新修改增加文档的内容
增加文档页面
4.嵌入ckeditor在线编辑器(网上下载,复制粘贴到项目根目录下),然后修改content.tpl,然后删除不相关的内容。
创建文件上传类
1.粗略增加文件上传模块(注意:文件路径!)
2.修改文件上传类,验证上传文件
3.验证成功之后开始上传(上传之前要生成一个上传文件的路径)要创建一个函数返回图片的链接路径
4.将路径返回给表单,显示图片
5.处理文件过大导致数据丢失的情况
6.ckeditor编辑器上传图片
1)删除图像信息预览中的默认内容
打开ckeditor/plugins/image/dialogs/image.js文件,搜索“b.config.image_previewText”,(b.config.image_previewText||'')单引号中的内容全删了
2)默认没有上传功能,所以我们需要手动开启上传功能
在ckeditor/config.js中配置中加入:config.filebrowserImageUploadUrl = '../config/ckeup.php?type=img';"ckeup.php"是请求的URL,也就是点击这个按钮就会post到ckeup.php文件进行处理,可以自定义文件名字
3)创建一个ckeup.php文件,用于接收上传,并且通过系统自定义的JS回调,把图片存放如编辑器中。
window.parent.CKEDITOR.tools.callFunction(CKEditorFuncNum,图片路径,返回信息);
创建TPL自定义模板相关推荐
- 24章 创建TPL自定义模板(1)
鼓励分离 促进分工 smarty强大的模板引擎 自己开发可以深入了解模板引擎原理,并且简化(安全性,兼容性和功能不如开源的模板引擎) 流程图 转载于:https://www.cnblogs.com/z ...
- 转:【图文教程】创建Xcode自定义模板
参考:http://www.cocoachina.com/bbs/read.php?tid-6209.html 转载于:https://www.cnblogs.com/ygm900/archive/2 ...
- 可以自定义模板的ide_将IDE检查应用于自定义Java批注
可以自定义模板的ide J2SE 5中注释的引入改变了我们编写和处理Java的方式. 除了Java SE的预定义注释外 ,框架,IDE和工具包还引入了自己的自定义注释 . Checker框架提供了一些 ...
- 如何在PowerPoint中将自定义模板设置为默认模板
Microsoft PowerPoint allows users to set a custom template as the default theme when creating a new ...
- 二、AEM中自定义模板和页面
文章目录 自定义模板和页面 repo安装 cygwin安装 IDEA中安装repo工具 在WKND中自定义模板和页面 部署WKND示例到author实例 自定义模板 模板编辑的三种模式 Structu ...
- 使用.Net Core CLI命令dotnet new创建自定义模板
文章起源来自一篇博客:使用 .NET CORE 创建 项目模板,模板项目,Template - DeepThought - 博客园 之前使用Abp的时候就很认同Abp创建模板项目的方式.想不到.Net ...
- Xcode 创建自定义模板
背景 在团队进行项目开发的时候,一般都会统一代码风格,以方便代码的维护. 比如在以 Swift 为主的工程中,并不存在头文件的概念,声明与实现都是放在同一个文件,如果不对代码按一定规则进行分割,那在较 ...
- 如何创建和自定义SQL Server模板
SQL Server Templates are SQL scripts, containing SQL code, frequently used by developers and DBAs in ...
- 如何在PowerPoint中创建自定义模板
PowerPoint provides extremely useful resources called templates that automatically construct the fou ...
- dataflow_Apache Beam,Google Cloud Dataflow和使用Python创建自定义模板
dataflow 阿帕奇光束 (Apache Beam) Apache Beam(Batch + Stream) is a unified programming model that defines ...
最新文章
- ORACLE11g中创建裸设备
- DTCC 2020 | 阿里云张鑫:阿里云云原生异地多活解决方案
- java treemap_Java TreeMap size()方法与示例
- Zend Framework学习之Zend_Mail
- php 检测编码函数,自己写了一个php检测文件编码的函数
- Java中使用队列Queue
- [leetcode]从中序与后序/前序遍历序列构造二叉树
- 重度使用Flutter研发模式下的页面性能优化实践
- 前沿 | 张钹院士畅谈清华大学如何办人工智能专业
- 光盘安装linux16.04,cobbler安装ubuntu 16.04巨慢
- 中国水灭火器行业市场供需与战略研究报告
- 洛谷 P2414 [NOI2011] 阿狸的打字机 题解
- defy+me525+android2.3.6官方镜像包,V大DEFY/DEFY+ ME525 ME525+ 2.3.6巅峰优化版0.86(红头)...
- 心情随笔:工作篇(半夜无眠,写与自己共勉)
- Unity3D面经以及我个人对游戏研发学习路径的一些理解
- 论文Express | 谷歌DeepMind最新动作:使用强化对抗学习,理解绘画笔触
- ASP.NET MVC #8211; 视图
- python 声音强度检测_python检测音频中的静音
- Quartus Primer 17.0 下载和安装
- Python 常用的标准库以及第三方库有哪些?
热门文章
- adobe acrobat pro dc 无法打开PDF_pdf怎样转成word格式
- Java生成简单的验证码图片
- cdr添加节点快捷键_CorelDRAW快捷键大全(学习CDR必备)
- java开源商城 java搭建直播商城 微服务商城 百万千万级商城 分布式商城 VR全景商城 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城 商家入驻商城
- 0805,1206等封装尺寸
- 【论文阅读】Speicher: Securing LSM-based Key-Value Stores using Shielded Execution
- 基于php的在线问卷调查系统
- 阿铭Linux_公有云学习笔记20190116
- 古体字与简体字对照表_简体字与繁体字对照表大全.pdf
- ADOBE PS镜像某个图层