zoukankan      html  css  js  c++  java
  • ThinkPHP---案例1登录登出和添加部门

    配置文件分3类:系统配置文件,分组配置文件,应用配置文件

    ①系统配置文件ThinkPHP/Conf/convention.php;

    ②分组 / 模块 /平台配置文件Home/Conf/config.php;

    ③应用配置文件Common/Conf/config.php;

    (1)综合案例:实现OA系统的登录页面展示

     首先需要明确当前功能需要哪些条件MVC

    先说下VC

    ①首先是控制器C

    控制器:登录登出放到Public里,控制器名PublicController.class.php

    创建控制器文件,编写结构代码

    <?php
        //命名空间的声明
        namespace AdminController;
        //引入父类控制器
        use ThinkController;
        //声明控制器并继承父类
        class PublicController extends Controller{}    
        }
    ?>

    ②接下来是展示模板,这里就要设置方法

    方法:方法名login,编写方法login,展示模板文件login.html

    //登录页面展示
    public function login(){
        $this->display();
    }

    ③对应的模板文件login.html,V

    将模板文件复制到指定位置,具体位置浏览器报错已经提示,这里提示位置./Application/Admin/View/Public/login.html

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>登录</title>
    </head>
    <body>
    <from action='' method='post'>
        账号:<input type="text" name="name"><br/>
        密码:<input type="password" name="pwd"><br/>
        <input type="submit" value="登录">
    </from>
    </body>
    </html>

    ④将相应的静态资源文件js,css,images复制到指定位置

    位置:根目录下,与Application同级,/Public/Admin/css或者js或者images

    ⑤修改模板文件login.html中静态资源的引入路径

    这里因为上面自定义常量__ADMIN__ = __PUBLIC__/Admin,所以这里可以写成

    <link rel="stylesheet" type="text/css" href="__ADMIN__/login.css">

    等价于

    <link rel="stylesheet" type="text/css" href="__PUBLIC__/Admin/login.css">

    注意:新版PHP中即使不写方法,有时也可以展示模板。只要存在与方法同名的模板,即可渲染出结果。

    原理:有方法时会先访问方法,再用模板;没有方法时,会直接调取与方法名相同的模板;如果模板也不存在时报错

    .

    (2)后台首页

    控制器:indexController.class.php

    方法:index  home

    模板:index.html   home.html

    ①创建控制器文件indexController.class.php

    结构代码:

    <?php
        namespace AdminController;
        use ThinkController;
        class IndexController extends Controller{
        }
    ?>

    ②在控制器里增加方法index,home用来展示模板文件

    public function index(){
                $this->display();
            }
            public function home(){
                $this->display();
            }

    ③将模板文件index.html和home.html复制到指定位置

    ④修改静态文件引入路径

    <link rel="stylesheet" type="text/css" href="__PUBLIC__/Admin/home.css">

    ⑤纠正Home页面引入路径,因为home是index页面的iframe内联框架。改写为__CONTROLLER__/home

        或者使用U方法指定URL地址{:U(home)}

    (3)部门管理

     1. 设计二级导航效果

         ①实现前端二级下拉样式

         ②修改导航数目和跳转地址

     2. 实现部门添加功能

         控制器:DeptController.class.php

         方法:add

         模板文件add.html

    ①控制器中创建add方法,展示模板

    public function add(){
          $this->display();
    }

    ②复制模板文件add.html到指定位置View/Dept/add.html

    ③修改模板文件静态资源路径

    ④表单中提交按钮和清空按钮a标签编写的无效,修改为input后样式消失。所以通过jquery方法来提交

    <script type="text/javascript">
        $(function(){
            //提交按钮
            $('.confirm').on('click',function(){
                $('form').submit();
            });
            //清空按钮
            $('.clear').on('click',function(){
                $('form')[0].reset();//表单还原,
    //因为reset()是JS的语法,而$('form')是jquery对象,不能直接使用js。所以要进行转化,jquery对象转Dom对象两种方法①加下标;②.get(0)
    }) }) </script>

    ⑤展示上级部门信息

    在控制器DeptController.class.php里传递变量,然后在模板展示

    public function add(){
                //展示顶级部门
                $model = M('dept');//模型实例化
                $data = $model->where('pid = 0')->select();//条件查询
                $this->assign('data',$data);//变量分配传递到模板
                $this->display();
            }

    add.html模板遍历展示

    <table border="1" cellspacing="0">
        <tr>
            <td>id</td><td>name</td><td>pid</td><td>sort</td><td>remark</td>
        </tr>
        <volist name='data' id='vol'>
            <tr>
                <td>{$vol.id}</td>
                <td>{$vol.name}</td>
                <td>{$vol.pid}</td>
                <td>{$vol.sort}</td>
                <td>{$vol.remark}</td>
            </tr>
        </volist>
    </table>

    案例:下拉菜单

    <select>
        <option>上级部门:</option>
        <volist name='data' id='vol'>
            <option>{$vol.remark}</option>
        </volist>
    </select>

    ⑤处理表单信息的提交操作

    在控制器deptController.class.php里add方法判断是否是POST提交。若是则提交,否则展示

    扩展:

              1. 方法判断---------判断请求是否是post,之前用$_POST判断,但在ThinkPHP里系统封装了几个比较实用的常量,可以直接用常量来判断

                 IS_POST、IS_GET、IS_AJAX、IS_CGI、IS_PUT等

              2. 数据接收---------之前用$_POST接收数据,在ThinkPHP里使用I快速方法来接收数据。I方法可以接收任何类型输入post、get、request、put等。且系统默认自带防止SQL

    注入的方法(使用PHP内置函数htmlspecialchars,将预定义字符<,>转化为HTML实体字符)。因为$POST没有对数据进行过滤,还得手动过滤。所以推荐使用I方法接收数据

    自带过滤效果,防止SQL注入

             3.I 快速方法语法:I('变量类型.变量名',['默认值'],['过滤方法']),过滤方法可以自定义过滤

                接收整个数组:I('get');

    public function add(){
                //判断请求类型,若是post则提交,否则展示
                if (IS_POST) {
                    //处理表单请求
                    $post = I('post.');
                    //成功接收后,写入数据
                    $model = M('dept');//模型实例化
                    $result = $model->add($post);
                    //判断返回值
                    if ($result) {
                        $this->success('添加成功',U('showList'),3);
                    }else{
                        $this->error('添加失败');//默认跳到上一页
                    }
                }else{
                    $model = M('dept');//模型实例化
                    $data = $model->where('pid = 0')->select();//条件查询
                    $this->assign('data',$data);//变量分配传递到模板
                    $this->display();
                }
            }

    【四】后台登录

    (1)分析

    控制器:PublicController.class.php

    模板:login.html

    方法:login   captacha(验证码)  checkLogin(验证登录)

    下面按照步骤一次编写:

    (2)验证码

    ①控制器里创建captacha,用于创建验证码;

    //生成验证码
            public function captacha(){
                ob_clean();//去除Bom(编辑器加的UTF-8标签)
                //配置
                $cfg = array(
                    'fontSize'  =>  20,              // 验证码字体大小(px)
                    'useCurve'  =>  false,            // 是否画混淆曲线
                    'useNoise'  =>  false,            // 是否添加杂点
                    'length'    =>  4,               // 验证码位数
                    'fontttf'   =>  '',              // 验证码字体,不设置随机获取
                );
                //实例化验证码类
                $Verify = new ThinkVerify($cfg);
                //输出保存验证码图片
                $Verify->entry();
            }

    ②在模板文件login.html输出验证码;

    验证码:<img src="__CONTROLLER__/captacha">

    ③添加点击刷新验证码,给图片绑定点击事件

    验证码:<img onclick="this.src='__CONTROLLER__/captacha'" src="__CONTROLLER__/captacha">

    这样只在Chrome下生效,测试后在其他浏览器无效。为了兼容其他浏览器需要在地址后面加上随机数,最终代码

    验证码:<img onclick="this.src='__CONTROLLER__/captacha/t/'+Math.random()" src="__CONTROLLER__/captacha">

    打开浏览器测试生效,测试Network,会发现点击红藕每次都会发送新的请求,请求不一样。所以生效

    (3)验证登录前创建用户表

    表名:sp_user

    ①创建表,表结构

    //表结构
    create table sp_user(
        id int(11) not null auto_increment,
        username varchar(40) not null,
        password char(32) not null,
        nickname varchar(40) default null,
        truename varchar(40) default null,
        dept_id int(11) default null,
        sex varchar(10) not null,
        birthday date not null,
        tel varchar(11) not null,
        email varchar(50) not null,
        remark varchar(255) default null,
        addtime int(11) default null,
        role_id int(11) default null,
        primary key(id)
    )engine=myisam default charset=utf8;

    新增模拟数据:

    insert into sp_user values('1','admin','123456','admin','管理员','1','男','2017-01-06','10000','56@qq.com','石家庄','12345678','1');

     ②修改模板元素

         1. 添加form表单指定提交位置

    <form action="{:U(checkLogin)}" method='post'>
    代码块
    </form>

         2. 对于登录按钮,前端写好的样式为

    <a href='index.html' class='btn'>登录</a>

    这里改为href='javascript:;',阻止浏览器默认行为,防止点击完就跳页的行为

       3. 利用jquery实现表单提交

    $(document).ready(function(){
            $('.btn').on('click',function(){
                $('form').submit();//提交表单
            })
        })

    (4)编写checkLogin方法,验证用户登录

    验证顺序,先对验证码进行验证,因为只有验证码不会对服务器发送请求。验证码正确的话再去验证用户名和密码。

    具体注意事项在代码里做了介绍

    public function checkLogin(){
                //接收数据I方法可以过滤数据
                $post = I('post.');
                //校验验证码,因为校验验证码封装在了类Verify里,所以需要实例化类
                $verify = new ThinkVerify();//不用传参,因为传参是在生成验证码时配置验证码用的
                //验证操作,成功返回true
                $result = $verify->check($post['captcha']);
                //判断验证码是否正确
                if($result){
                    //验证码正确的话,开始验证用户名和密码,此时需要连接数据库
                    //连接数据库前,先实例化模型
                    $model = M('user');
                    //删除验证码元素,因为要查询,where里接收一维数组,而数据库没有验证码且此时验证码无效了.去掉后$post长度刚好为2
                    unset($post['captcha']);
                    //查询
                    $data = $model->where($post)->find();
                    //判断用户存在与否
                    if ($data) {
                        //存在的话1.用户信息持久化,保存session;2.跳转后台首页
                        session('id',$data['id']);
                        session('username',$data['username']);
                        session('role_id',$data['role_id']);
                        //跳转后台首页
                        $this->success('登录成功',U('Index/index'),3);
                    }else{
                        $this->error('用户名或密码错误');
                    }
                }else{
                    $this->error('验证码错误');
                }
            }

     (5)修改登录成功后的用户名

    {$Think.session.username}

    模板输出系统变量----模板读取session数据,

    {$Think.server.script_name} // 输出$_SERVER['SCRIPT_NAME']变量
    {$Think.session.user_id} // 输出$_SESSION['user_id']变量
    {$Think.get.pageNumber} // 输出$_GET['pageNumber']变量
    {$Think.cookie.name}  // 输出$_COOKIE['name']变量
    

    支持输出 $_SERVER$_ENV、 $_POST、 $_GET、 $_REQUEST$_SESSION和 $_COOKIE变量。

    【五】退出

    (1)控制器编写退出方法

    //退出方法
            public function logout(){
                //清除session
                // session_destroy();原生方法
                session(null);
                //跳转登录页面
                $this->success('登出成功',U('login'),3);
            }

    (2)修改跳转地址,先让其跳到Public/logout,清空session。然后跳到登录页

     注意:因为U方法和__PUBLIC、__CONTROLLER__等都是模板常量,只能在模板里使用。所以js文件里无法使用这些常量去跳转路径。除非将js直接写到模板文件里去,例如

    <script type="text/javascript">
        $(document).ready(function(){
            $('.logout').on('click',function(){
                var path= "__CONTROLLER__";
                alert(path);//这里便会提示出模板常量
            })
        })
    </script>

    或者在js里写,/表示从域名后开

    域名/入口文件/分组/控制器名/方法名
    window.location.href='/index.php/Admin/Public/logout';

    接下来的部门管理在后面文章视频学习笔录---ThinkPHP---案例2--部门管理功能

    .

  • 相关阅读:
    数据库_初学
    数据库—修改表的列
    做一个导航栏(bootstrap)
    几个比较常用的特效
    当、你想给一个目标挂上一个事件时
    图片轮播的几个小程序
    JS练习题 ( 下拉菜单;好友选中输入)
    Bootstrap 按钮和折叠插件
    Bootstrap 轮播插件
    Bootstrap 弹出框和警告框插件
  • 原文地址:https://www.cnblogs.com/fightjianxian/p/8660976.html
Copyright © 2011-2022 走看看