从头到尾实现一个用TP开发的个人站点【二】

从这一章我们开始后台的开发,上一章我们说了先从栏目进行开始,那么,我们明确栏目了吗?

从上一章的截图得知栏目如下图:


大家要明确一个网站一般会有有哪些页面?

答:首页、列表页【文字列表、图片列表、图文列表】、内容页

我这个站的页面就是首页、列表页、内容页

根据以上图片的栏目显示除了展会新闻、行业新闻是列表页外,其他的都是单页


栏目需求明确后台,那么我先设计一下数据库


注先声明一点:我做的这个站点本来是中英双语的,教程是以中文为主


栏目表名:tp_channel表 字段如下

id ID自增

cname 栏目名称

keys 关键字

des 描述

is_list  是否列表 0:单页 1:列表  默认值是:0

thumb 缩略图

content 内容 【主要针对单页实现】

sort 排序

pid 父ID 默认值:0


数据表设计好,那么我们开始做后台的栏目开发了

第一步:把TP3.2.3解压在你的站点根目录中

第二步:在Application目录中添加一个Admin的目录,在Admin目录下再添加Controller和Model以及View目录,这个手动创建;

              或者在跟目录下的index.php加上define('BIND_MODULE','Admin');这行代码,运行会自动创建Admin模块下的Controller、Model、View等等文件或者文件夹;切记生成后要把这代码删除或者注释掉


第三步:在Application\Admin\Controller目录下创建ChannelController.class.php文件【控制器】。每个功能都是有增删改查的。那么代码如下:

<?php
namespace Admin\Controller;
use Think\Controller;
class ChannelController extends Controller{
// 列表    
public function index(){
	$this->display();
}

// 添加
public function add(){}

// 修改
public function edit(){}

// 删除
public function del(){}
}

1、我们先来实现添加栏目功能,先看一下效果图


注:效果图中的所属类型有参观登记、参展登记和外链,在此教程中我们是不做的,但是你们可以作为教程以外的练习,还有一点,在我的项目当中都是以ajax进行数据传输,这块我就不多说了。现在的教程都是以后端实现为主,很少降到前端的知识。


栏目添加功能的代码如下:

    // 添加栏目
    public function add(){
        if(IS_POST){
            $data = I('post.');
            if(!$data['cname']){
                return show(0, '栏目名称不能为空');
            }
            $data['lang'] = $_SESSION['adminUser']['lang'];//这个是登录的时候判断是中文,还是英文

            $res = D('Channel')->addChannel($data);//自定义的一个模型进行数据
            if($res){
                return show(1,'添加成功');
            }else{
                return show(0,'添加失败');
            }
        }else{
            $where = array('lang'=>$_SESSION['adminUser']['lang']);
            $list = D('Channel')->getAllChannel($where);
            vendor('Tree.Category');//这个是我自己写了一个树形类文件
            $cate = new \Category;
            $cate = $cate->unlimitedForLevelSelect($list);
            $this->assign('list',$cate);
            $this->display();
        }


那么我们的模型放在那里呢?

相信很多人都是独立模块放在独立模块中,例如:Admin\Model\目录下写相关的模型

但是,我个人的想法是这样的,前后台都是要用到向对应的模型,所以,我会把模型放到Application\Common目录下创建一个Model模型目录

在Application\Common\Model下创建ChannelModel.class.php模型文件,代码如下:

<?php
/**
 * @Author: 穆沂华
 * @Date:   2017/10/6 23:12
 * @Web: http://www.dengmuhua.cn
 * @Email: woody_deng@163.com
 * @Last Modified by:   穆沂华
 * @Last Modified time: 2017/10/6 23:12
 */
namespace Common\Model;
use Think\Model;

class ChannelModel extends Model {

    private $_db = '';
    public function __construct(){
        $this->_db = M('channel');
    }

    /**
     * @param $where 根据条件进行查找所有的栏目分类
     */
    public function getAllChannel($where){
        $res = $this->_db->where($where)->order('sort ASC')->select();
        return $res;
    }

    /**
     * 查询一条栏目数据
     * @param $where 查询的条件
     * @return mixed
     */
    public function getOneChannel($where){
        $res = $this->_db->where($where)->find();
        return $res;
    }

    /**
     * 添加栏目
     * @param array $data 数据
     */
    public function addChannel($data=array()){
        if(!$data || !is_array($data)){
            throw_exception('数据有误');
        }
        $res = $this->_db->add($data);
        return $res;
    }

    /**
     * 修改栏目
     * @param array $data 更新的数据
     * @param $where 更新的条件
     * @return mixed
     */
    public function editChannel($data=array(), $where){
        if(!$data || !is_array($data)){
            throw_exception('数据有误');
        }
        $res = $this->_db->where($where)->setField($data);
        return $res;
    }

    /**
     * 删除栏目
     * @param $where
     * @return mixed
     */
    public function delChannel($where){
        $res = $this->_db->where($where)->delete();
        return $res;
    }
}
注:以上的代码已经包含了对数据库的增删改查,往后对应的栏目列表,修改,删除功能对应的模型就不贴代码了


2、栏目列表,效果图如下:



在控制器文件中添加如下代码【Application\Admin\Controller\ChannelController.class.php】

// 栏目列表
    public function index(){
        $where = array('lang'=>$_SESSION['adminUser']['lang']);
        $list = D('Channel')->getAllChannel($where);
        vendor('Tree.Category');
        $cate = new \Category;
        $cate = $cate->unlimitedForLevel($list);
        $this->assign('list',$cate);
        $this->display();
    }

3、栏目修改,效果图如下:


在控制器上添加如下代码

// 修改栏目
    public function edit(){
        if(IS_POST){
            $data = I('post.');
            if(!is_numeric($data['id'])){
                return show(0, 'ID不合法');
            }
            if(!$data['cname']){
                return show(0, '栏目名称不能为空');
            }
            $where =array(
                'id' => $data['id'],
                'lang' => $_SESSION['adminUser']['lang']
            );
            $data = array(
                'cname' => $data['cname'],
                'thumb' => $data['thumb'],
                'pid' => $data['pid'],
                'is_list'=> $data['is_list']
            );
            $row = D('Channel')->editChannel($data, $where);
            if($row){
                return show(1,'修改成功');
            }else{
                return show(0,'修改失败');
            }
        }else{
            $id = I('get.id');
            $where['lang'] = $_SESSION['adminUser']['lang'];
            $list = D('Channel')->getAllChannel($where);
            vendor('Tree.Category');
            $cate = new \Category;
            $cate = $cate->unlimitedForLevelSelect($list);
            $this->assign('list',$cate);
            $where['id'] = $id;
            $row = D('Channel')->getOneChannel($where);
            $this->assign('info', $row);
            $type = C('ISCHANNELTYPE');
            $this->assign('type', $type);
            $this->display();
        }
    }


注:在控制上的代码出现了show(),unlimitedForLevelSelect()等函数方法,这些是函数文件,以及类文件

show()方法的实现,在Aplication\Common\Common\function.php文件中,进行添加,代码如下:

/**
 * 以json格式返回数据
 * @param  [type] $status 状态码  [description]
 * @param  [type] $message 提示信息 [description]
 * @param  array  $data 数据    [description]
 * @return [type]          [description]
 */
function show($status, $message, $data=array()){
	$result = array(
		'status' => $status,
		'message' => $message,
		'data' => $data
	);
	exit(json_encode($result));
}

unlimitedForLevelSelect()的实现,是在ThinkPHP\Library\Vendor\Tree\Category.php,代码如下

<?php
/**
 * 无限级分类递归方法类
 * @Author: 穆沂华
 * @Date:   2017/10/6 22:39
 * @Web: http://www.dengmuhua.cn
 * @Email: woody_deng@163.com
 * @Last Modified by:   穆沂华
 * @Last Modified time: 2017/10/6 22:39
 */

class Category {

    /**
     * 组合一维数组[在添加选择]
     * @param  [type]  $cate  [description]
     * @param  string  $html  [description]
     * @param  integer $pid   [description]
     * @param  integer $level [description]
     * @return [type]         [description]
     */
    static public function unlimitedForLevelSelect1($cate, $html = '|--', $pid = 0, $level = 0){
        $arr = array();
        foreach ($cate as $v) {
            if ($v['pid'] == $pid) {
                $v['level'] = $level + 1;
                $v['html'] = str_repeat($html,$level);
                $arr[] = $v;
                $arr = array_merge($arr, self::unlimitedForLevelSelect1($cate, $html, $v['id'], $level + 1));
            }
        }
        return $arr;
    }

    /**
     * 组合一维数组[在添加选择]
     * @param  [type]  $cate  [description]
     * @param  string  $html  [description]
     * @param  integer $pid   [description]
     * @param  integer $level [description]
     * @return [type]         [description]
     */
    static public function unlimitedForLevelSelect($cate, $html = '├', $pid = 0, $level = 0){
        $arr = array();
        foreach ($cate as $v) {
            if ($v['pid'] == $pid) {
                $v['level'] = $level + 1;
                $v['html'] = str_repeat($html,$level);
                $arr[] = $v;
                $arr = array_merge($arr, self::unlimitedForLevelSelect($cate, $html, $v['id'], $level + 1));
            }
        }
        return $arr;
    }

    /**
     * 组合一维数组【在列表显示,专用于公司部门显示】
     * @param  [type]  $cate  [description]
     * @param  string  $html  [description]
     * @param  integer $pid   [description]
     * @param  integer $level [description]
     * @return [type]         [description]
     */
    static public function departmentLevel($cate, $html = '<img src="/Public/admin/img/line.gif">', $pid = 0, $level = 0){
        $arr = array();
        foreach ($cate as $v) {
            if ($v['parent_id'] == $pid) {
                $v['level'] = $level + 1;
                $v['html'] = str_repeat($html,$level);
                $arr[] = $v;
                $arr = array_merge($arr, self::departmentLevel($cate, $html, $v['id'], $level + 1));
            }
        }
        return $arr;
    }

    /**
     * 组合一维数组【在列表显示】
     * @param  [type]  $cate  [description]
     * @param  string  $html  [description]
     * @param  integer $pid   [description]
     * @param  integer $level [description]
     * @return [type]         [description]
     */
    static public function unlimitedForLevel($cate, $html = '<img src="/Public/admin/img/line.gif">', $pid = 0, $level = 0){
        $arr = array();
        foreach ($cate as $v) {
            if ($v['pid'] == $pid) {
                $v['level'] = $level + 1;
                $v['html'] = str_repeat($html,$level);
                $arr[] = $v;
                $arr = array_merge($arr, self::unlimitedForLevel($cate, $html, $v['id'], $level + 1));
            }
        }
        return $arr;
    }

    /**
     * 组合多维数组
     * @param  [type]  $cate [description]
     * @param  string  $name [description]
     * @param  integer $pid  [description]
     * @return [type]        [description]
     */
    static public function unlimitedForLayer($cate, $name = 'child', $pid = 0){
        $arr = array();
        foreach ($cate as $v) {
            if ($v['pid'] == $pid) {
                $v[$name] = self::unlimitedForLayer($cate, $name, $v['id']);
                $arr[] = $v;
            }
        }
        return $arr;
    }

    /**
     * 传递一个子分类返回所有的父级Id
     * @param  [type] $cate [description]
     * @param  [type] $id   [description]
     * @return [type]       [description]
     */
    static public function getParentsId($cate, $id){
        $arr = array();
        foreach ($cate as $v) {
            if ($v['id'] == $id) {
                $arr[] = $v['id'];
                $arr = array_merge(self::getParentsId($cate, $v['pid']), $arr);
            }
        }
        return $arr;
    }

    /**
     * 传递一个子分类返回所有的父级分类
     * @param  [type] $cate [description]
     * @param  [type] $id   [description]
     * @return [type]       [description]
     */
    static public function getParents($cate, $id){
        $arr = array();
        foreach ($cate as $v) {
            if ($v['id'] == $id) {
                $arr[] = $v;
                $arr = array_merge(self::getParents($cate, $v['pid']), $arr);
            }
        }
        return $arr;
    }

    /**
     * 传递一个父级分类返回所有的子级Id
     * @param  [type] $cate [description]
     * @param  [type] $pid  [description]
     * @return [type]       [description]
     */
    static public function getChildrenId($cate, $pid){
        $arr = array();
        foreach ($cate as $v) {
            if ($v['pid'] == $pid) {
                $arr[] = $v['id'];
                $arr = array_merge($arr, self::getChildrenId($cate, $v['id']));
            }
        }
        return $arr;
    }

    /**
     * 传递一个父级分类返回所有的子级分类
     * @param  [type] $cate [description]
     * @param  [type] $pid  [description]
     * @return [type]       [description]
     */
    static public function getChildren($cate, $pid){
        $arr = array();
        foreach ($cate as $v) {
            if ($v['pid'] == $pid) {
                $arr[] = $v;
                $arr = array_merge($arr, self::getChildrenId($cate, $v['id']));
            }
        }
        return $arr;
    }
}


以上的就是栏目的增删改查,还有一个删除的功能,留给你们自己完成


有什么不明白可以通过以下的方法进行沟通了解

QQ:2363536014


待续~~~~~







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

woody_deng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值