【一】准备工作

(1)数据表sp_knowledge

SQL语句:知识管理数据表结构
create table sp_knowledge(
id int(11) not null auto_increment,
title varchar(50) not null comment'标题',
thumb varchar(255) default null comment'缩略图',
picture varchar(255) default null comment'图片',
description varchar(255) default null comment'描述',
content text comment'公文内容',
author varchar(40) not null comment'作者',
addtime int(11) default null comment'添加时间',
primary key(id)
)engine=myisam auto_increment=1 default charset=utf8;
注意:auto_increment=1表示从1开始自增

(2)导航菜单

修改模板文件Index/index.html,创建导航菜单。并修改连接地址,将{:U('Doc/showList')}改为{:U('Konwledge/showList')}

        <li>
<a href="javascript:;" class="knowManage">知识管理</a>
<ul>
<li><a href="{:U('Knowledge/showList')}" class="documentManage">知识列表</a></li>
<li><a href="{:U('Knowledge/add')}" class="documentManage">添加知识</a></li>
</ul>
</li>

(3)创建控制器KnowledgeController.class.php

<?php
namespace Admin\Controller;
use Think\Controller;
class KnowledgeController extends Controller{
}
?>

【二】开始实现添加功能

分析

控制器:KnowledgeController.class.php

方法:add(二合一,将模板展示和数据保存放到一个方法里)

模板文件:add.html

分布操作

第一步:创建方法add,展示模板文件add.html

<?php
namespace Admin\Controller;
use Think\Controller;
class KnowledgeController extends Controller{
public function add(){
$this->display();
}
}
?>

第二步:将模板文件add.html复制到指定位置Application\Admin\View\Knowledge\add.html,并替换静态资源路径

第三步:检查表单

①如果有文件上传则需要enctype属性;

②要求文件域是file类型;

③请求类型是post

<form action="" method="post" enctype="multipart/form-data">
<fieldset>
<legend>添加公文</legend>
<p><label for="title">标题:</label><input type="text" name="title" id="title"></p>
<p><label for="thumb">缩略图:</label><input type="file" name="thumb" id="thumb"></p>
<p><label for="author">作者:</label><input type="text" name="author" id="author"></p>
<p><label for="description">描述:</label><textarea id="description" name="description"></textarea></p>
<p><label for="content">内容:</label><textarea id="content" name="content"></textarea></p>
<div>
<a href="javascript:;" id="submitBtn">提交</a>
<a href="javascript:;" id="resetBtn">清空</a>
</div>
</fieldset>
</form>

第四步:改写add方法,处理表单提交数据的保存

先判断请求类型,如果是post请求则处理提交数据,否则展示模板

将数据分两部分进行处理表单数据和附件file两部分,表单数据的操作放到控制器,而file附件的保存则放到模型里

<?php
namespace Admin\Controller;
use Think\Controller;
class KnowledgeController extends Controller{
public function add(){
if(IS_POST){
$post = I('post.');
//实例化自定义模型
$model = D('Konwledge');
//数据保存
$result = $model->addData($post,$_FILES['thumb']);//注意传参
//判断结果
if ($result) {
$this->success('添加成功',U('showList'),3);
}else{
$this->error('添加失败');
}
}else{ }
$this->display();
}
}
?>

第五步:创建模型KnowledgeModel.class.php,并编写自定义模型代码,这里先将架构写出来

<?php
namespace Admin\Model;
use Think\Model;
class KnowledgeModel extends Model{
//addData方法
public function addData($post,$file){
//判断是否有文件上传
if($file['error'] == '0'){
          
}
// 补全字段addtime
$post['addtime'] = time();
//添加操作
return $this->add($post);
}
}
?>

然后填写具体方法:

①定义/配置上传路径:将带盘符的路径进行拆分,拆分为工作路径和上传根目录

// 1. 配置数组,定义配置------配置上传路径
$cfg = array('rootPath' => WORKING_PATH . UPLOAD_ROOT_PATH);

②实例化上传类

//2. 实例化上传类,将上传路径配置传递过来,进行实例化
$upload = new \Think\Upload($cfg);

③上传操作,并接受上传结果。这里输出验证下,若成功则会返回一维数组(长度为9)

//3. 上传操作,并接受上传结果
$info = $upload->uploadOne($file);
dump($info);die;
array(9) {
["name"] => string(6) "02.png"
["type"] => string(9) "image/png"
["size"] => int(126610)
["key"] => int(0)
["ext"] => string(3) "png"
["md5"] => string(32) "8e84dd457f7510bdb327afff6402f2e2"
["sha1"] => string(40) "6bff934ad0884689e43dabaf2039d18812e96e19"
["savename"] => string(17) "5ac348494cc4c.png"
["savepath"] => string(11) "2018-04-03/"
}

④接下来判断上传结果,如果上传成功则补全字段。否则不用处理

if ($info) {//成功后补全字段
//原图路径
$post['picture'] = UPLOAD_ROOT_PATH . $info['savepath'] . $info['savename'];
//缩略图
}else{
}

图像处理具体在下面介绍,分析后可以归纳出缩略图的制作步骤实例化构造函数→打开图片→处理图片生成缩略图→保存图片

⑤缩略图处理

注意:因为在图形处理类中,所有的执行方法返回值都是$this,说明两点:1. 可以进行连贯操作;2. 没有办法判断图形处理是否成功

//addData方法
public function addData($post,$file){
//判断是否有文件上传
if($file['error'] == '0'){
//1. 配置数组,定义配置
$cfg = array(
//配置上传路径
'rootPath' => WORKING_PATH . UPLOAD_ROOT_PATH
);
//2. 实例化上传类
$upload = new \Think\Upload($cfg);
//3. 上传操作,并接受上传结果
$info = $upload->uploadOne($file);
if ($info) {//成功后补全字段
//原图路径
$post['picture'] = UPLOAD_ROOT_PATH . $info['savepath'] . $info['savename'];
//缩略图制作
//1. 实例化类
$image = new \Think\Image();
//2. 打开图片,传递图片路径.统一使用根路径
$imgPath = WORKING_PATH.$post['picture'];
$image->open($imgPath);
//3. 制作缩略图,等比缩放
$image->thumb(100,100);
//4. 保存图片,传入路径--完整路径(绝对路径目录+文件名)
$image->save(WORKING_PATH.UPLOAD_ROOT_PATH.$info['savepath'].'thumb_'.$info['savename']);
//5. 补全thumb字段
$post['thumb'] = UPLOAD_ROOT_PATH.$info['savepath'].'thumb_'.$info['savename'];
}else{
}
}
// 补全字段addtime
$post['addtime'] = time();
dump($post);die;
//添加操作
return $this->add($post);
}

打印$post,输出结果为:

array(7) {
["title"] => string(0) ""
["author"] => string(3) "啥"
["description"] => string(0) ""
["content"] => string(0) ""
["picture"] => string(43) "/Public/Upload/2018-04-03/5ac363470e90b.jpg"
["thumb"] => string(49) "/Public/Upload/2018-04-03/thumb_5ac363470e90b.jpg"
["addtime"] => int(1522754375)
}

总结:1. 实现上传;2. 制作缩略图;3. 保存

【三】实现知识列表功能

分析

控制器:KnowledgeController.class.php

方法:showList

模板文件:showList.html

下面分步:

第一步:创建方法showList,获取展示数据和展示模板

//showList方法
public function showList(){
//实例化模型,获取数据
$data = M('Knowledge')->select();
//传递给模板
$this->assign('data',$data);
//展示模板
$this->display();
}

第二步:复制模板文件showList.html到指定位置Application\Admin\View\Konwledge\showList.html,并替换静态资源路径

第三步:数据展示

注意:①缩略图是展示为img,所以应该用img,里面加路径;②对内容和标题进行截取显示;③时间格式转换

<table border="1" cellspacing="0" cellpadding="10">
<thead>
<tr><td>序号</td><td>标题</td><td>缩略图</td><td>内容</td><td>作者</td><td>添加时间</td><td>操作</td>></tr>
</thead>
<volist name="data" id="vol">
<tr>
<td>{$vol.id}</td>
<td>{$vol.title|msubstr=###,0,10}</td>
<td><img src="{$vol.thumb}"></td>
<td>{$vol.content|msubstr=###,0,20}</td>
<td>{$vol.author}</td>
<td>{$vol.addtime|date='Y-m-d H:i:s',###}</td>
<td>
<a href="__CONTROLLER__/edit/id/{$vol.id}" class="editBtn">查看</a>
</td>
</tr>
</volist>
</table>

效果图:对比后让我想起来之前做项目时,有一个原本同城微信平台项目。当时的后台并没有做这样的处理,所有样式还得由我一一调整,不知道是不是漏了。以后做项目注意下,可以很方便统一处理,还不用考虑浏览器的兼容

第四步:实现图片下载

需要先判断有无图片,可以通过<notempty>标签来判断是否有图片

<td>
<img src="{$vol.thumb}">
<notempty name="vol.picture"><a href="__CONTROLLER__/download/id/{$vol.id}">【下载】</a></notempty>
</td>

第五步:控制器里编写下载方法download

        //下载方法
public function download(){
//接收id
$id = I('get.id');
//查询数据
$data = M('Knowledge') -> find($id);
//下载代码,主要需要的是路径,接下来拼接路径
$file = WORKING_PATH . $data['picture'];
//输出文件
header("Content-type: application/octet-stream");//文件流,告诉浏览器输出的东西是文件流
header('Content-Disposition: attachment; filename="' . basename($file) . '"');//文件名
header("Content-Length: ". filesize($file));//文件大小
//输出缓冲区
readfile($file);
}

ThinkPHP功能之------图像处理类)

【拓展】写缩略图功能,需要用到图像处理类功能

缩略图的制作需要用到的功能类Image.class.php(图像处理类),针对图像的处理还有水印、缩放(缩略图)、裁减、图像添加文字等

注意: 必须先开启GD2扩展库,默认开启;

Image.class.php图像处理类文件的位置ThinkPHP\Library\Think\Image.class.php

(1)下面分析下源码:

1. 构造函数:分析后得知,形参都是可选的还有默认值,与其他功能类实例化时不同,图片处理类实例化不用传任何参数

     /* 构造方法,用于实例化一个图片处理对象;@param string $type 要使用的类库,默认使用GD库*/
public function __construct($type = self::IMAGE_GD, $imgname = null){...}

2. open方法:打开图片,一般情况下参数是图片路径,建议使用绝对路径

     /* 打开一幅图像---@param  string $imgname 图片路径;@return Object  当前图片处理库对象*/
public function open($imgname){
$this->img->open($imgname);
return $this;
}

3. save方法:保存图片,参数也是图片路径,建议用绝对路径

public function save($imgname, $type = null, $quality=80,$interlace = true){
$this->img->save($imgname, $type, $quality,$interlace);
return $this;
}

4. crop裁减图片、thumb缩略图、water水印、text添加文字

//裁减图片
public function crop($w, $h, $x = 0, $y = 0, $width = null, $height = null){...}
//缩略图
public function thumb($width, $height, $type = self::IMAGE_THUMB_SCALE){...}
//水印
public function water($source, $locate = self::IMAGE_WATER_SOUTHEAST,$alpha=80){...}
//添加文字
public function water($source, $locate = self::IMAGE_WATER_SOUTHEAST,$alpha=80){...}

(2)分析源码后得知缩略图thumb方法,必传参数为宽高(遵守等比缩放原则,所以会有下面这种情况

(3)图片处理顺序:实例化构造函数→open打开→thumb处理→save保存

ThinkPHP---案例--实现知识管理功能的更多相关文章

  1. [.NET领域驱动设计实战系列]专题七:DDD实践案例:引入事件驱动与中间件机制来实现后台管理功能

    一.引言 在当前的电子商务平台中,用户下完订单之后,然后店家会在后台看到客户下的订单,然后店家可以对客户的订单进行发货操作.此时客户会在自己的订单状态看到店家已经发货.从上面的业务逻辑可以看出,当用户 ...

  2. DDD实践案例:引入事件驱动与中间件机制来实现后台管理功能

    DDD实践案例:引入事件驱动与中间件机制来实现后台管理功能 一.引言 在当前的电子商务平台中,用户下完订单之后,然后店家会在后台看到客户下的订单,然后店家可以对客户的订单进行发货操作.此时客户会在自己 ...

  3. [转]Web3.0时代,企业知识管理新趋势

    [转自http://www.amt.com.cn/html/ManageFront/AMTPoint0/2014/0716/1370.html] Web3.0时代,企业知识管理新趋势 2014-07- ...

  4. Atitit 知识管理的重要方法 数据来源,聚合,分类,备份,发布 搜索

    Atitit 知识管理的重要方法 数据来源,聚合,分类,备份,发布 搜索 1.1. Rss 简易信息聚合(也叫聚合内容 Really Simple Syndication1 1.1. Rss 简易信息 ...

  5. Atitit 团队建设的知识管理

    Atitit 团队建设的知识管理 1.1. 要遵循"知识积累--创造--应用--形成知识平台--再积累--再创造--再应用--形成新的知识平台"的循环过程.1 1.2. 显性知识包 ...

  6. 深圳共创力“研发管理&知识管理”高端研讨交流会在深圳举办!

    2017/4/8,由深圳市共创力企业管理咨询公司举办的“研发管理&知识管理”高端研讨会在深圳市南山区圣淘沙国际酒店(翡翠店)隆重召开.此次研讨会由共创力总经理.首席顾问杨学明先生主持.研讨会先 ...

  7. Spring 简单而强大的事务管理功能

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

  8. Mobox 知识管理平台助推市长质量奖

    Mobox 知识管理平台助推市长质量奖 引言: 在过去的十多年中,国际上在管理领域出现两股浪潮:一是许多国家和地区采取设立政府质量奖的方式,来改善企业管理绩效,提升区域整体竞争力:二是这些国家和地区的 ...

  9. .Net Core MVC 网站开发(Ninesky) 2.2、栏目管理功能-System区域添加

    在asp或asp.net中为了方便网站的结构清晰,通常把具有类似功能的页面放到一个文件夹中,用户管理功能都放在Admin文件夹下,用户功能都放在Member文件夹下,在MVC中,通常使用区域(Area ...

随机推荐

  1. 【智能家居篇】wifi网络结构(下)

    转载请注明出处:http://blog.csdn.net/Righthek 谢谢. 因为WIFI网络具有移动性,同一时候WIFI以无线电波作为传输媒介,这样的媒介本质上是开放的,且easy被拦截,不论 ...

  2. 服务器无法处理请求。 ---> 未将对象引用设置到对象的实例

    服务器无法处理请求. ---> 未将对象引用设置到对象的实例. 简短说下我遇到的问题.webservice部署到服务器上后,访问方法报上面的错误,最终原因为改方法需要操作文件夹,加上了相应的权限 ...

  3. 一起talk C栗子吧(第七回:C语言实例--进制转换)

    各位看官们.大家好,从今天開始.我们讲大型章回体科技小说 :C栗子,也就是C语言实例. 闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们.上一回中咱们说的是生成随机数的样例.这一回咱们说的 ...

  4. 蓝桥 ADV-230 算法提高 12-1三角形 【数学公式】

      算法提高 12-1三角形   时间限制:1.0s   内存限制:256.0MB      问题描述 为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体.分别设计独立的函数计算三角形的 ...

  5. go3--常量和类型转换

    /* Go中不存在隐式转换,所有类型转换必须显式声明 转换只能发生在两种相互兼容的类型之间 类型转换的格式: <ValueA> [:]= <TypeOfValueA>(< ...

  6. ATM网络

    ATM是Asynchronous Transfer Mode(ATM)异步传输模式的缩写,是实现B-ISDN的业务的核心技术之一.ATM是以信元为基础的一种分组交换和复用技术

  7. 关于ExecuteNonQuery执行存储过程的返回值 、、实例讲解存储过程的返回值与传出参数、、、C#获取存储过程的 Return返回值和Output输出参数值

    关于ExecuteNonQuery执行存储过程的返回值 用到过ExecuteNonQuery()函数的朋友们在开发的时候肯定这么用过. if(cmd.ExecuteNonQuery("xxx ...

  8. lucene .doc里存储的skiplist跳表

    http://forfuture1978.iteye.com/blog/546841 见图: lucene-6.5.1-src/lucene-6.5.1$ grep "skiplistwri ...

  9. 用C语言实现websocket服务器

    Websocket Echo Server Demo 背景 嵌入式设备的应用开发大都依靠C语言来完成,我去研究如何用c语言实现websocket服务器也是为了在嵌入式设备中实现一个ip camera的 ...

  10. 最长回文子串问题 O(n)算法 manacher URAL1297 HDU3068

    先来看一道简单的题,ural1297 给定一个1000长度的字符串,求最长回文子串. 看起来很Naive,乱搞一下,O(n^2)都可以解决. 再来看这个题 HDU3068 120个110000长度的字 ...