Thinkphp 模板中 if 嵌套层级过多的问题,嵌套3级就报错,取消层级限制
解决此问题有两种办法:1、第三层if换成eq或者原生<?php 'abc';> 2、修改Tp核心配置文件
1、第三层if换成eq或者原生<?php 'abc';>
如下图<eq name="uid" value="">未登录状态下<else />登录状态下 </eq>
name为条件 和value为值
2、修改TP核心配置文件,路径如下
thinkphp/ThinkPHP/Library/Think/Template/TagLib/Cx.class.php
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
namespace Think\Template\TagLib;
use Think\Template\TagLib;
/**
* CX标签库解析类
*/
class Cx extends TagLib
{
// 标签定义
protected $tags = array(
// 标签定义: attr 属性列表 close 是否闭合(0 或者1 默认1) alias 标签别名 level 嵌套层次
'php' => array(),
'volist' => array('attr' => 'name,id,offset,length,key,mod', 'level' => 3, 'alias' => 'iterate'),
'foreach' => array('attr' => 'name,item,key', 'level' => 3),
'if' => array('attr' => 'condition', 'level' => 2),
'elseif' => array('attr' => 'condition', 'close' => 0),
'else' => array('attr' => '', 'close' => 0),
'switch' => array('attr' => 'name', 'level' => 2),
'case' => array('attr' => 'value,break'),
'default' => array('attr' => '', 'close' => 0),
'compare' => array('attr' => 'name,value,type', 'level' => 3, 'alias' => 'eq,equal,notequal,neq,gt,lt,egt,elt,heq,nheq'),
'range' => array('attr' => 'name,value,type', 'level' => 3, 'alias' => 'in,notin,between,notbetween'),
'empty' => array('attr' => 'name', 'level' => 3),
'notempty' => array('attr' => 'name', 'level' => 3),
'present' => array('attr' => 'name', 'level' => 3),
'notpresent' => array('attr' => 'name', 'level' => 3),
'defined' => array('attr' => 'name', 'level' => 3),
'notdefined' => array('attr' => 'name', 'level' => 3),
'import' => array('attr' => 'file,href,type,value,basepath', 'close' => 0, 'alias' => 'load,css,js'),
'assign' => array('attr' => 'name,value', 'close' => 0),
'define' => array('attr' => 'name,value', 'close' => 0),
'for' => array('attr' => 'start,end,name,comparison,step', 'level' => 3),
);
/**
* php标签解析
* @access public
* @param array $tag 标签属性
* @param string $content 标签内容
* @return string
*/
public function _php($tag, $content)
{
$parseStr = '<?php ' . $content . ' ?>';
return $parseStr;
}
/**
* volist标签解析 循环输出数据集
* 格式:
* <volist name="userList" id="user" empty="" >
* {user.username}
* {user.email}
* </volist>
* @access public
* @param array $tag 标签属性
* @param string $content 标签内容
* @return string|void
*/
public function _volist($tag, $content)
{
$name = $tag['name'];
$id = $tag['id'];
$empty = isset($tag['empty']) ? $tag['empty'] : '';
$key = !empty($tag['key']) ? $tag['key'] : 'i';
$mod = isset($tag['mod']) ? $tag['mod'] : '2';
// 允许使用函数设定数据集 <volist name=":fun('arg')" id="vo">{$vo.name}</volist>
$parseStr = '<?php ';
if (0 === strpos($name, ':')) {
$parseStr .= '$_result=' . substr($name, 1) . ';';
$name = '$_result';
} else {
$name = $this->autoBuildVar($name);
}
$parseStr .= 'if(is_array(' . $name . ')): $' . $key . ' = 0;';
if (isset($tag['length']) && '' != $tag['length']) {
$parseStr .= ' $__LIST__ = array_slice(' . $name . ',' . $tag['offset'] . ',' . $tag['length'] . ',true);';
} elseif (isset($tag['offset']) && '' != $tag['offset']) {
$parseStr .= ' $__LIST__ = array_slice(' . $name . ',' . $tag['offset'] . ',null,true);';
} else {
$parseStr .= ' $__LIST__ = ' . $name . ';';
}
$parseStr .= 'if( count($__LIST__)==0 ) : echo "' . $empty . '" ;';
$parseStr .= 'else: ';
$parseStr .= 'foreach($__LIST__ as $key=>$' . $id . '): ';
$parseStr .= '$mod = ($' . $key . ' % ' . $mod . ' );';
$parseStr .= '++$' . $key . ';?>';
$parseStr .= $this->tpl->parse($content);
$parseStr .= '<?php endforeach; endif; else: echo "' . $empty . '" ;endif; ?>';
if (!empty($parseStr)) {
return $parseStr;
}
return;
}
/**
* foreach标签解析 循环输出数据集
* @access public
* @param array $tag 标签属性
* @param string $content 标签内容
* @return string|void
*/
public function _foreach($tag, $content)
{
$name = $tag['name'];
$item = $tag['item'];
$key = !empty($tag['key']) ? $tag['key'] : 'key';
$name = $this->autoBuildVar($name);
$parseStr = '<?php if(is_array(' . $name . ')): foreach(' . $name . ' as $' . $key . '=>$' . $item . '): ?>';
$parseStr .= $this->tpl->parse($content);
$parseStr .= '<?php endforeach; endif; ?>';
if (!empty($parseStr)) {
return $parseStr;
}
return;
}
/**
* if标签解析
* 格式:
* <if condition=" $a eq 1" >
* <elseif condition="$a eq 2" />
* <else />
* </if>
* 表达式支持 eq neq gt egt lt elt == > >= < <= or and || &&
* @access public
* @param array $tag 标签属性
* @param string $content 标签内容
* @return string
*/
public function _if($tag, $content)
{
$condition = $this->parseCondition($tag['condition']);
$parseStr = '<?php if(' . $condition . '): ?>' . $content . '<?php endif; ?>';
return $parseStr;
}
/**
* else标签解析
* 格式:见if标签
* @access public
* @param array $tag 标签属性
* @param string $content 标签内容
* @return string
*/
public function _elseif($tag, $content)
{
$condition = $this->parseCondition($tag['condition']);
$parseStr = '<?php elseif(' . $condition . '): ?>';
return $parseStr;
}
/**
* else标签解析
* @access public
* @param array $tag 标签属性
* @return string
*/
public function _else($tag)
{
$parseStr = '<?php else: ?>';
return $parseStr;
}
/**
* switch标签解析
* 格式:
* <switch name="a.name" >
* <case value="1" break="false">1</case>
* <case value="2" >2</case>
* <default />other
* </switch>
* @access public
* @param array $tag 标签属性
* @param string $content 标签内容
* @return string
*/
public function _switch($tag, $content)
{
$name = $tag['name'];
$varArray = explode('|', $name);
$name = array_shift($varArray);
$name = $this->autoBuildVar($name);
if (count($varArray) > 0) {
$name = $this->tpl->parseVarFunction($name, $varArray);
}
$parseStr = '<?php switch(' . $name . '): ?>' . $content . '<?php endswitch;?>';
return $parseStr;
}
/**
* case标签解析 需要配合switch才有效
* @access public
* @param array $tag 标签属性
* @param string $content 标签内容
* @return string
*/
public function _case($tag, $content)
{
$value = $tag['value'];
if ('$' == substr($value, 0, 1)) {
$varArray = explode('|', $value);
$value = array_shift($varArray);
$value = $this->autoBuildVar(substr($value, 1));
if (count($varArray) > 0) {
$value = $this->tpl->parseVarFunction($value, $varArray);
}
$value = 'case ' . $value . ': ';
} elseif (strpos($value, '|')) {
$values = explode('|', $value);
$value = '';
foreach ($values as $val) {
$value .= 'case "' . addslashes($val) . '": ';
}
} else {
$value = 'case "' . $value . '": ';
}
$parseStr = '<?php ' . $value . ' ?>' . $content;
$isBreak = isset($tag['break']) ? $tag['break'] : '';
if ('' == $isBreak || $isBreak) {
$parseStr .= '<?php break;?>';
}
return $parseStr;
}
/**
* default标签解析 需要配合switch才有效
* 使用: <default />ddfdf
* @access public
* @param array $tag 标签属性
* @param string $content 标签内容
* @return string
*/
public function _default($tag)
{
$parseStr = '<?php default: ?>';
return $parseStr;
}
/**
* compare标签解析
* 用于值的比较 支持 eq neq gt lt egt elt heq nheq 默认是eq
* 格式: <compare name="" type="eq" value="" >content</compare>
* @access public
* @param array $tag 标签属性
* @param string $content 标签内容
* @return string
*/
public function _compare($tag, $content, $type = 'eq')
{
$name = $tag['name'];
$value = $tag['value'];
$type = isset($tag['type']) ? $tag['type'] : $type;
$type = $this->parseCondition(' ' . $type . ' ');
$varArray = explode('|', $name);
$name = array_shift($varArray);
$name = $this->autoBuildVar($name);
if (count($varArray) > 0) {
$name = $this->tpl->parseVarFunction($name, $varArray);
}
if ('$' == substr($value, 0, 1)) {
$value = $this->autoBuildVar(substr($value, 1));
} else {
$value = '"' . $value . '"';
}
$parseStr = '<?php if((' . $name . ') ' . $type . ' ' . $value . '): ?>' . $content . '<?php endif; ?>';
return $parseStr;
}
public function _eq($tag, $content)
{
return $this->_compare($tag, $content, 'eq');
}
public function _equal($tag, $content)
{
return $this->_compare($tag, $content, 'eq');
}
public function _neq($tag, $content)
{
return $this->_compare($tag, $content, 'neq');
}
public function _notequal($tag, $content)
{
return $this->_compare($tag, $content, 'neq');
}
public function _gt($tag, $content)
{
return $this->_compare($tag, $content, 'gt');
}
public function _lt($tag, $content)
{
return $this->_compare($tag, $content, 'lt');
}
public function _egt($tag, $content)
{
return $this->_compare($tag, $content, 'egt');
}
public function _elt($tag, $content)
{
return $this->_compare($tag, $content, 'elt');
}
public function _heq($tag, $content)
{
return $this->_compare($tag, $content, 'heq');
}
public function _nheq($tag, $content)
{
return $this->_compare($tag, $content, 'nheq');
}
/**
* range标签解析
* 如果某个变量存在于某个范围 则输出内容 type= in 表示在范围内 否则表示在范围外
* 格式: <range name="var|function" value="val" type='in|notin' >content</range>
* example: <range name="a" value="1,2,3" type='in' >content</range>
* @access public
* @param array $tag 标签属性
* @param string $content 标签内容
* @param string $type 比较类型
* @return string
*/
public function _range($tag, $content, $type = 'in')
{
$name = $tag['name'];
$value = $tag['value'];
$varArray = explode('|', $name);
$name = array_shift($varArray);
$name = $this->autoBuildVar($name);
if (count($varArray) > 0) {
$name = $this->tpl->parseVarFunction($name, $varArray);
}
$type = isset($tag['type']) ? $tag['type'] : $type;
if ('$' == substr($value, 0, 1)) {
$value = $this->autoBuildVar(substr($value, 1));
$str = 'is_array(' . $value . ')?' . $value . ':explode(\',\',' . $value . ')';
} else {
$value = '"' . $value . '"';
$str = 'explode(\',\',' . $value . ')';
}
if ('between' == $type) {
$parseStr = '<?php $_RANGE_VAR_=' . $str . ';if(' . $name . '>= $_RANGE_VAR_[0] && ' . $name . '<= $_RANGE_VAR_[1]):?>' . $content . '<?php endif; ?>';
} elseif ('notbetween' == $type) {
$parseStr = '<?php $_RANGE_VAR_=' . $str . ';if(' . $name . '<$_RANGE_VAR_[0] || ' . $name . '>$_RANGE_VAR_[1]):?>' . $content . '<?php endif; ?>';
} else {
$fun = ('in' == $type) ? 'in_array' : '!in_array';
$parseStr = '<?php if(' . $fun . '((' . $name . '), ' . $str . ')): ?>' . $content . '<?php endif; ?>';
}
return $parseStr;
}
// range标签的别名 用于in判断
public function _in($tag, $content)
{
return $this->_range($tag, $content, 'in');
}
// range标签的别名 用于notin判断
public function _notin($tag, $content)
{
return $this->_range($tag, $content, 'notin');
}
public function _between($tag, $content)
{
return $this->_range($tag, $content, 'between');
}
public function _notbetween($tag, $content)
{
return $this->_range($tag, $content, 'notbetween');
}
/**
* present标签解析
* 如果某个变量已经设置 则输出内容
* 格式: <present name="" >content</present>
* @access public
* @param array $tag 标签属性
* @param string $content 标签内容
* @return string
*/
public function _present($tag, $content)
{
$name = $tag['name'];
$name = $this->autoBuildVar($name);
$parseStr = '<?php if(isset(' . $name . ')): ?>' . $content . '<?php endif; ?>';
return $parseStr;
}
/**
* notpresent标签解析
* 如果某个变量没有设置,则输出内容
* 格式: <notpresent name="" >content</notpresent>
* @access public
* @param array $tag 标签属性
* @param string $content 标签内容
* @return string
*/
public function _notpresent($tag, $content)
{
$name = $tag['name'];
$name = $this->autoBuildVar($name);
$parseStr = '<?php if(!isset(' . $name . ')): ?>' . $content . '<?php endif; ?>';
return $parseStr;
}
/**
* empty标签解析
* 如果某个变量为empty 则输出内容
* 格式: <empty name="" >content</empty>
* @access public
* @param array $tag 标签属性
* @param string $content 标签内容
* @return string
*/
public function _empty($tag, $content)
{
$name = $tag['name'];
$name = $this->autoBuildVar($name);
$parseStr = '<?php if(empty(' . $name . ')): ?>' . $content . '<?php endif; ?>';
return $parseStr;
}
public function _notempty($tag, $content)
{
$name = $tag['name'];
$name = $this->autoBuildVar($name);
$parseStr = '<?php if(!empty(' . $name . ')): ?>' . $content . '<?php endif; ?>';
return $parseStr;
}
/**
* 判断是否已经定义了该常量
* <defined name='TXT'>已定义</defined>
* @param <type> $attr
* @param <type> $content
* @return string
*/
public function _defined($tag, $content)
{
$name = $tag['name'];
$parseStr = '<?php if(defined("' . $name . '")): ?>' . $content . '<?php endif; ?>';
return $parseStr;
}
public function _notdefined($tag, $content)
{
$name = $tag['name'];
$parseStr = '<?php if(!defined("' . $name . '")): ?>' . $content . '<?php endif; ?>';
return $parseStr;
}
/**
* import 标签解析 <import file="Js.Base" />
* <import file="Css.Base" type="css" />
* @access public
* @param array $tag 标签属性
* @param string $content 标签内容
* @param boolean $isFile 是否文件方式
* @param string $type 类型
* @return string
*/
public function _import($tag, $content, $isFile = false, $type = '')
{
$file = isset($tag['file']) ? $tag['file'] : $tag['href'];
$parseStr = '';
$endStr = '';
// 判断是否存在加载条件 允许使用函数判断(默认为isset)
if (isset($tag['value'])) {
$varArray = explode('|', $tag['value']);
$name = array_shift($varArray);
$name = $this->autoBuildVar($name);
if (!empty($varArray)) {
$name = $this->tpl->parseVarFunction($name, $varArray);
} else {
$name = 'isset(' . $name . ')';
}
$parseStr .= '<?php if(' . $name . '): ?>';
$endStr = '<?php endif; ?>';
}
if ($isFile) {
// 根据文件名后缀自动识别
$type = $type ? $type : (!empty($tag['type']) ? strtolower($tag['type']) : null);
// 文件方式导入
$array = explode(',', $file);
foreach ($array as $val) {
if (!$type || isset($reset)) {
$type = $reset = strtolower(substr(strrchr($val, '.'), 1));
}
switch ($type) {
case 'js':
$parseStr .= '<script type="text/javascript" src="' . $val . '"></script>';
break;
case 'css':
$parseStr .= '<link rel="stylesheet" type="text/css" href="' . $val . '" />';
break;
case 'php':
$parseStr .= '<?php require_cache("' . $val . '"); ?>';
break;
}
}
} else {
// 命名空间导入模式 默认是js
$type = $type ? $type : (!empty($tag['type']) ? strtolower($tag['type']) : 'js');
$basepath = !empty($tag['basepath']) ? $tag['basepath'] : __ROOT__ . '/Public';
// 命名空间方式导入外部文件
$array = explode(',', $file);
foreach ($array as $val) {
if (strpos($val, '?')) {
list($val, $version) = explode('?', $val);
} else {
$version = '';
}
switch ($type) {
case 'js':
$parseStr .= '<script type="text/javascript" src="' . $basepath . '/' . str_replace(array('.', '#'), array('/', '.'), $val) . '.js' . ($version ? '?' . $version : '') . '"></script>';
break;
case 'css':
$parseStr .= '<link rel="stylesheet" type="text/css" href="' . $basepath . '/' . str_replace(array('.', '#'), array('/', '.'), $val) . '.css' . ($version ? '?' . $version : '') . '" />';
break;
case 'php':
$parseStr .= '<?php import("' . $val . '"); ?>';
break;
}
}
}
return $parseStr . $endStr;
}
// import别名 采用文件方式加载(要使用命名空间必须用import) 例如 <load file="__PUBLIC__/Js/Base.js" />
public function _load($tag, $content)
{
return $this->_import($tag, $content, true);
}
// import别名使用 导入css文件 <css file="__PUBLIC__/Css/Base.css" />
public function _css($tag, $content)
{
return $this->_import($tag, $content, true, 'css');
}
// import别名使用 导入js文件 <js file="__PUBLIC__/Js/Base.js" />
public function _js($tag, $content)
{
return $this->_import($tag, $content, true, 'js');
}
/**
* assign标签解析
* 在模板中给某个变量赋值 支持变量赋值
* 格式: <assign name="" value="" />
* @access public
* @param array $tag 标签属性
* @param string $content 标签内容
* @return string
*/
public function _assign($tag, $content)
{
$name = $this->autoBuildVar($tag['name']);
if ('$' == substr($tag['value'], 0, 1)) {
$value = $this->autoBuildVar(substr($tag['value'], 1));
} else {
$value = '\'' . $tag['value'] . '\'';
}
$parseStr = '<?php ' . $name . ' = ' . $value . '; ?>';
return $parseStr;
}
/**
* define标签解析
* 在模板中定义常量 支持变量赋值
* 格式: <define name="" value="" />
* @access public
* @param array $tag 标签属性
* @param string $content 标签内容
* @return string
*/
public function _define($tag, $content)
{
$name = '\'' . $tag['name'] . '\'';
if ('$' == substr($tag['value'], 0, 1)) {
$value = $this->autoBuildVar(substr($tag['value'], 1));
} else {
$value = '\'' . $tag['value'] . '\'';
}
$parseStr = '<?php define(' . $name . ', ' . $value . '); ?>';
return $parseStr;
}
/**
* for标签解析
* 格式: <for start="" end="" comparison="" step="" name="" />
* @access public
* @param array $tag 标签属性
* @param string $content 标签内容
* @return string
*/
public function _for($tag, $content)
{
//设置默认值
$start = 0;
$end = 0;
$step = 1;
$comparison = 'lt';
$name = 'i';
$rand = rand(); //添加随机数,防止嵌套变量冲突
//获取属性
foreach ($tag as $key => $value) {
$value = trim($value);
if (':' == substr($value, 0, 1)) {
$value = substr($value, 1);
} elseif ('$' == substr($value, 0, 1)) {
$value = $this->autoBuildVar(substr($value, 1));
}
switch ($key) {
case 'start':
$start = $value;
break;
case 'end':
$end = $value;
break;
case 'step':
$step = $value;
break;
case 'comparison':
$comparison = $value;
break;
case 'name':
$name = $value;
break;
}
}
$parseStr = '<?php $__FOR_START_' . $rand . '__=' . $start . ';$__FOR_END_' . $rand . '__=' . $end . ';';
$parseStr .= 'for($' . $name . '=$__FOR_START_' . $rand . '__;' . $this->parseCondition('$' . $name . ' ' . $comparison . ' $__FOR_END_' . $rand . '__') . ';$' . $name . '+=' . $step . '){ ?>';
$parseStr .= $content;
$parseStr .= '<?php } ?>';
return $parseStr;
}
}
Thinkphp 模板中 if 嵌套层级过多的问题,嵌套3级就报错,取消层级限制的更多相关文章
- Thinkphp 模板中直接对数据处理 模板中使用函数 中文字符串截取
1.Thinkphp 模板中直接对数据处理:{$data.name|substr=0,3} 2.中文字符串截取函数:mb_substr=0,14,'utf-8' 3.中文字符串统计:iconv_str ...
- thinkphp模板中foreach循环没数据的错误解决
从控制器方法中$this->assign();函数将值传递给html模板 但是模板不显示数据,直接出来的是代码,效果就和html中写了php代码不能解析一样. 原来是我将thinkphp框架的引 ...
- thinkPHP 模板中的语法知识 详细介绍(十二)
原文:thinkPHP 模板中的语法知识 详细介绍(十二) 本章节:介绍模板中的语法,详细的语法介绍 一.导入CSS和JS文件 ==>记住常量的是大写 1.css link .js sc ...
- ThinkPHP模板中如何操作session,以及如果session中保存的是数组的情况
在ThinkPHP的模板中操作session时,可以参考ThinkPHP参考文档中的“模板—>系统变量”部分,在默认模板引擎中,语法如下: {$Think.session.user} //输出s ...
- Thinkphp模板中使用自定义函数的方法
注意:自定义函数要放在项目应用目录/common/common.php中. 这里是关键. 模板变量的函数调用格式:{$varname|function1|function2=arg1,arg2,### ...
- thinkphp 模板中赋值
在项目开发的时候,有时候希望直接在模板中调用 一些自定义方法,或者内置方法来,处理获得一些数据,并且赋值给一个变量给后面调用,这个时候如果用原生Php 的方式调用如下:<?php $abc = ...
- thinkPHP 模板中变量的使用
一.变量输出 1.标量输出(普通) 2.数组输出 {$name[1]} {$name['k2'] ...
- Thinkphp模板中函数的使用
1.在模板中使用php函数 在thinkphp的html中,我们经常会遇到一些变量难以直接从php控制端直接处理,这些变量只有在模板中循环输出的时候处理比较合适,这个时候,我们就要在模板中使用函数 1 ...
- ThinkPHP模板中JS等带花括号处会被解析错误的解决办法
如下图,当本人在ThinkPHP框架的模板中写jQuery代码的时候,写了一些注释,并且注重是斜线和换括号{是连着一起的,这层语法上来时是没问题的,但是在ThinkPHP 的模板引擎解析下,会被解析掉 ...
随机推荐
- 集合系列 Map(十五):TreeMap
TreeMap 是 Map 集合的有序实现,其底层是基于红黑树的实现,能够早 log(n) 时间内完成 get.put 和 remove 操作. public class TreeMap<K,V ...
- Cocos Creator 资源加载流程剖析【六】——场景切换流程
这里讨论场景切换的完整流程,从我们调用了loadScene开始切换场景,到场景切换完成背后发生的事情.整个流程可以分为场景加载和场景切换两部分,另外还简单讨论了场景的预加载. 加载场景的流程 load ...
- 前端小白webpack学习(二)
前一篇写了自我总结的webpack定义:为JavaScript服务的静态模块打包器 和几大基本概念 entry.output.plugins.loaders等.指路前端小白webpack学习(一) 下 ...
- C#/.Net开发入门篇(3)——console类的输入输出
相信看了我上一篇文章的小伙伴们都知道console这个类的最基本的2个方法了吧,下去练习过的小伙伴应该能知道4个方法. 那么下面我们就来介绍一下上期没有介绍完的另外2个方法Console.WriteL ...
- Dynamics 365客户端编程示例:两个选项集字段的联动
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- CMake指南
版权申明: 本文原创首发于以下网站,您可以自由转载,但必须加入完整的版权声明 博客园:https://www.cnblogs.com/MogooStudio/ csdn博客:https://blog. ...
- solo升级以及自动化更新的方法
使用solo过程总涉及到更新问题,所以就在这里把solo更新的方法总结一下.希望能给小伙伴们一些帮助.如何选择更新方法主要是跟你的部署方式有关,如果你是通过 docker方式进行部署,那么你可以还可以 ...
- sql server编写脚本求解第1天1分钱之后每天两倍持续一个月的等比数列问题
一.问题 问题1 场景:如果你未来的丈母娘要求你,第1天给她1分钱,第2天给2分钱,第3天给4分钱,以此类推,每天给前一天的2倍,给1个月(按30天)算就行.问:第30天给多少钱,总共给多少钱? 问题 ...
- 07-Node.js学习笔记-路由
路由 http://localhost:3000/index http://localhost:3000/login //路由是指客户端请求地址与服务器端程序代码的对应关系.简单的说,就是请求什么响应 ...
- 关于ajax请求不到后台页面提示400 bad request的问题
解决方法一: 在contrller控制器中对应方法的 @RequestMapping注解中添加 method="RequestMethod.POST"属性