【一】准备工作
(1)创建数据表
表名:sp_doc
create table sp_doc( id int(11) not null auto_increment, title varchar(50) not null comment'公文标题', filepath varchar(255) default null comment'附件存储路径', filename varchar(255) default null comment'附件原名', hasfile smallint(1) default '0' comment'是否存在附件', content text comment'公文内容', author varchar(40) not null comment'作者', addtime int(11) default null comment'添加时间', primary key(id) )engine=myisam default charset=utf8;
(2)创建控制器(公文document)
控制器:DocController.class.php
方法:showList add
模板:showList.html add.html
控制器DocController.class.php
<?php namespace Admin\Controller; use Think\Controller; class DocController extends Controller{ } ?>
(3)创建二级导航
修改模板文件Index/index.html,修改出公文管理的导航菜单
<li> <a href="javascript:;" class="documentManage">公文管理</a> <ul> <li><a href="{:U('Doc/showList')}" class="documentManage">公文列表</a></li> <li><a href="{:U('Doc/add')}" class="documentManage">添加公文</a></li> </ul> </li>
列表方法还是showList,添加方法还是add,即方法名不变。只修改控制器即可
(4)公文添加功能
控制器:DocController.class.php
方法:add(操作分两部分:模板展示和数据操作)
模板:add.html
①控制中创建add方法
展示模板文件:
public function add(){ $this->display(); }
②将模板文件add.html复制到指定位置,并换掉静态资源路径
③检查表单
注意:
1. 因为表单需要提交附件,所以需要声明提交数据类型不光有字节流,还有二进制流。
enctype="multipart/form-data"
2. 跟文件相关的字段有三个filepath、filename、hasfile三个
3. 文件上传域的type类型file
4. 表单提交,jquery提交。绑定a点击事件
<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="filename">附件</label><input type="file" name="filename" id="filename"></p> <p><label for="author">作者</label><input type="text" name="author" id="author"></p> <p><label for="content">内容:</label><textarea name="content" id="content"></textarea></p> <div> <a href="javascript:;" id="submitBtn">提交</a> <a href="javascript:;" id="resetBtn">清空</a> </div> </fieldset> </form> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script> <script type="text/javascript"> $(document).ready(function(){ $('#submitBtn').on('click',function(){ $('form').submit(); }); $('#resetBtn').on('click',function(){ $('form').get(0).reset(); }); }); </script>
④先不考虑文件上传,将其他几个字段实现入表保存
public function add(){ if(IS_POST){//处理提交 // 接收除了file外其他字段,因为file无法通过post接收 $post = I('post.'); //补全addtime字段 $post['addtime']=time(); //实例化模型 $model = M('doc'); $result = $model->add($post); //判断保存结果 if($result){ $this->success('添加成功',U('showList'),3); }else{ $this-error('添加失败'); } }else{//展示模板 $this->display(); } }
添加结果:
不考虑文件上传的前提下,其他字段上传已经完成
【二】实现列表功能
控制器:DocController.class.php
方法:showList
模板:showList.html
(1)编写showList方法,传递数据,展示模板
(2)复制模板文件到指定位置,修改静态资源路径
(3)模板变量展示到模板,分析由于data是select返回结果二维数组,所以需要遍历操作
<table border="1" cellspacing="0" cellpadding="10"> <thead> <tr><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}</td> <td>附件</td> <td>{$vol.author}</td> <td>{$vol.addtime|date='Y-m-d H:i:s',###}</td> <td><a href="javascript:;">编辑</a></td> </tr> </volist> </table>
查看效果会发现有的标题过长会影响美观,所以需要截取下
解决方法:对多的字符进行截取,然后后面显示省略号
substr方法截取只能截取3的倍数(也就是中文),否则会乱码。。。。。
目前在提供的函数库文件中已经封装好了msubstr函数,该函数可以进行中文截取。这里我将这些方法放到了应用级别的公共文件Common下。具体代码该看文章最后
msubstr函数参数说明:$str需要截取的字符串;$start开始位置;$length截取的长度;$charset字符集;$suffix是否添加省略号(默认添加true)
最后修改模板文件:
{$vol.title|msubstr=###,0,10} //这里我限制显示10个字符
<?php /** * @desc thinkphp自定义函数库... * */ // 1. msubstr字符串截取; // 2. 通过curl发送get请求----这两种请求及支持HTTP协议,也支持https协议 // 3. 通过curl发送post请求--- // 4. 去除空格 /** *字符串截取函数 *开启mbstring扩展 */ function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true){ if(mb_strlen($str,$charset)>$length) { if(function_exists("mb_substr")){ if($suffix) return mb_substr($str, $start, $length, $charset)."..."; else return mb_substr($str, $start, $length, $charset); }elseif(function_exists('iconv_substr')) { if($suffix) return iconv_substr($str,$start,$length,$charset)."..."; else return iconv_substr($str,$start,$length,$charset); } $re['utf-8'] = "/[x01-x7f]|[xc2-xdf][x80-xbf]|[xe0-xef][x80-xbf]{2}|[xf0-xff][x80-xbf]{3}/"; $re['gb2312'] = "/[x01-x7f]|[xb0-xf7][xa0-xfe]/"; $re['gbk'] = "/[x01-x7f]|[x81-xfe][x40-xfe]/"; $re['big5'] = "/[x01-x7f]|[x81-xfe]([x40-x7e]|xa1-xfe])/"; preg_match_all($re[$charset], $str, $match); $slice = join("",array_slice($match[0], $start, $length)); if($suffix) return $slice."…"; return $slice; } else { return $str; } } /** * GET 请求 * 需要curl扩展支持 */ function http_get($url){ $oCurl = curl_init(); if(stripos($url,"https://")!==FALSE){ curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); } curl_setopt($oCurl, CURLOPT_URL, $url); curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); if(intval($aStatus["http_code"])==200){ return $sContent; }else{ return false; } } /** * POST 请求 * 需要curl扩展支持 */ function http_post($url,$param,$post_file=false){ $oCurl = curl_init(); if(stripos($url,"https://") !== FALSE){ curl_setopt($oCurl,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($oCurl,CURLOPT_SSL_VERIFYHOST,false); curl_setopt($oCurl,CURLOPT_SSLVERSION,1); } if (is_string($param) || $post_file){ $strPOST = $param; } else { $aPOST = array(); foreach($param as $key => $val){ $aPOST[] = $key."=" . urlencode($val); } $strPOST = join("&",$aPOST); } curl_setopt($oCurl,CURLOPT_URL,$url); curl_setopt($oCurl,CURLOPT_RETURNTRANSFER,1); curl_setopt($oCurl,CURLOPT_POST,true); curl_setopt($oCurl,CURLOPT_POSTFIELDS,$strPOST); $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); if(intval($aStatus["http_code"]) == 200){ return $sContent; }else{ return false; } } /** * 空格换行符过滤 */ function trimAll($parma){ if(is_array($parma)){ return array_map('trimAll',$parma); } $before = array(" "," ","\t","\r","\n"); $after = array('','','','',''); return str_replace($before,$after,$parma); }