一个单入口访问不同的项目分组

        ThinkPHP可以用单入口对应一个项目应用,如前台用index.php对应 Index项目应用,而用admin.php对应后台的Admin项目应用,这样通过index.php和admin.php访问不同的网页。

        不过这种方法对于代码的管理不是很好,不利于代码共享。即在Index下的代码,在Admin就用不了了,而要将代码重新再写一次。

        其实ThinkPHP还可以通过分组部署配置,只用一个单入口index.php,只有一个项目应用Application,但通过应用分组,在这个项目下的Module文件夹下,建立前台和后台两个应用模块。然后通过配置,默认访问是前台,后台则通过加/Admin之类的参数即可访问。独立分组是在config.php配置

	//'开启应用分组
	'APP_GROUP_LIST' => 'Index,Admin',
	'DEFAULT_GROUP' => 'Index',
	//开启独立分组
	'APP_GROUP_MODE' => 1,
	//独立分组文件夹名称
	'APP_GROUP_PATH' => 'Modules',
         这样做的好处是,前后台的代码可以共享,它们的公共配置是Application/Conf/config.php,公共函数是Application/Common/common.php。而在它们各自的应用模块下,有各自的Conf、Action等文件夹。或者用Application/Common/Index/function.php作为Index应用模块的单独可用函数亦可。如下图所示:

图片1.png

        不得不提的是一个常量:GROUP_NAME,当用到U函数时,在这种独立分组配置用此常量写跳转URL非常方便。


验证码:

        ThinkPHP3.1的生成图像验证码的函数buildImageVerify在ThinkPHP/Extend/Library/ORG/Util/Image.class.php里面,要生成验证码时,只需在比如是LoginAction类文件中定义一个这样的函数:

	public function verify(){
		import('ORG.Util.Image');
		Image::buildImageVerify(1,5,'png',60,30);
	}
         这样访问此地址,即可返回一个验证码图片,长为60px,宽为30px,图片是PNG格式。

<tr>
	<th>验证码:</th>
	<td>
		<input type="code" class="len250" name="code"/> <img src="<{:U('Admin/Login/verify')}>" id="code"/> <a href="javascript:void(change_code(this));">看不清</a>
	</td>
</tr>
         这里有个JS,用来点击“看不清”这几个字时,刷新id为code的src,如下:

function change_code(obj){
	$("#code").attr("src",verifyURL+'/' + Math.random());
	return false;
}
        上面的verifyURL是在验证码的html文件中设置的,用<script type="text/javascript">var verifyURL="<{:U('Admin/Login/verify','','')}>";</script>给JS传递verifyURL。

        下面是ThinkPHP的buildImageVerify原代码:

    /**
     * 生成图像验证码
     * @static
     * @access public
     * @param string $length  位数
     * @param string $mode  类型
     * @param string $type 图像格式
     * @param string $width  宽度
     * @param string $height  高度
     * @return string
     */
    static function buildImageVerify($length=4, $mode=1, $type='png', $width=48, $height=22, $verifyName='verify') {
        import('ORG.Util.String');
        $randval = String::randString($length, $mode);
        session($verifyName, md5($randval));
        $width = ($length * 10 + 10) > $width ? $length * 10 + 10 : $width;
        if ($type != 'gif' && function_exists('imagecreatetruecolor')) {
            $im = imagecreatetruecolor($width, $height);
        } else {
            $im = imagecreate($width, $height);
        }
        $r = Array(225, 255, 255, 223);
        $g = Array(225, 236, 237, 255);
        $b = Array(225, 236, 166, 125);
        $key = mt_rand(0, 3);

        $backColor = imagecolorallocate($im, $r[$key], $g[$key], $b[$key]);    //背景色(随机)
        $borderColor = imagecolorallocate($im, 100, 100, 100);                    //边框色
        imagefilledrectangle($im, 0, 0, $width - 1, $height - 1, $backColor);
        imagerectangle($im, 0, 0, $width - 1, $height - 1, $borderColor);
        $stringColor = imagecolorallocate($im, mt_rand(0, 200), mt_rand(0, 120), mt_rand(0, 120));
        // 干扰
        for ($i = 0; $i < 10; $i++) {
            imagearc($im, mt_rand(-10, $width), mt_rand(-10, $height), mt_rand(30, 300), mt_rand(20, 200), 55, 44, $stringColor);
        }
        for ($i = 0; $i < 25; $i++) {
            imagesetpixel($im, mt_rand(0, $width), mt_rand(0, $height), $stringColor);
        }
        for ($i = 0; $i < $length; $i++) {
            imagestring($im, 5, $i * 10 + 5, mt_rand(1, 8), $randval{$i}, $stringColor);
        }
        Image::output($im, $type);
    }