您的位置:首页 > 编程语言 > PHP开发

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

2017-12-20 09:39 363 查看
从这一章我们开始后台的开发,上一章我们说了先从栏目进行开始,那么,我们明确栏目了吗?

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



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

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

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

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

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

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

栏目表名: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、我们先来实现添加栏目功
bba1
能,先看一下效果图



注:效果图中的所属类型有参观登记、参展登记和外链,在此教程中我们是不做的,但是你们可以作为教程以外的练习,还有一点,在我的项目当中都是以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

待续~~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: