由于公司需求所以大概花了一个星期搞了一个一个基于onethink的数据管理平台demo不得不说onethink这个基于thinkphp3.2.3的框架还是很棒的 让我这个没基础过php的人也能在一星期能搞出东西来整理一下所遇到的坑 希望能给看到这篇文章的你有所帮助
首先安装onethink
1.连接数据库
由于onethink是基于mysql的如果你需要用mongo的话需要做数据表迁移由于后台权限逻辑本来就不适合mongo来搞 所以这里建议用mysql如果需求需要mongo数据库那么最好用mysql和mongo数据库结合的方式那么坑就来了
由于thinkphp的原因它本身对mongo的扩展没那么好 亲测 如果mongo为主mysql为辅 使用官方介绍的方法切换数据库完全没问题 反过来那就蛋疼了thinkphp官方接锅需要改底层代码 我这里说具体的解决方案尽量不改源代码 首先参考手册介绍的在common 文件夹下的config里的mysql的链接配置后将mongo数据库的信息写入如下图:(注意这里mongo的表前缀写与不写无所谓由于thinkphp问题(bug)导致它只会用全局的即上面mysql的前缀 解决方法见这里)
接下来在Model在新建例如BooksModel.class.php内容如下(thinkphp底层会将表名强行转成小写所以这里使用$trueTableName绕过转化否则会找不到表 也可以采用这里的方法改底层文件):
然后你就可以愉快的在BooksController操作使用D("Books")进行数据库的操作这里的 M方法不能用会报找不到表错误的信息仔细一看还是表前缀出的问题(官方背锅M方法里面的也是用的全局前缀你可以通过修改解决)
2.onethink的分页
你可以参考onthink 的ConfigController里的内容 它实现分页是通过红线标出的这一句继承自AdminController 里的lists你可以查看它使用方法这里有更为详细的介绍可以自己去实例化lists
3.onethink给的增删改例子都是在mysql下的这里提供在mongo下的增删改供参考
增:
(1)如果你也是将edit和add用一个页面采用在表单里隐藏_id的方法 注意这里有坑先看一下下面的edit的实现由于create方法创建时会把表单里的隐藏的空的_id(如果你name里不用_id那就会在新增时新创建这个为空的垃圾字段)拉过来导致数据新增失败这里采用在Model里写:
或者使用field方法详细介绍见这里
后台新增方法:
注意这里如果你想获得插入的id可以通过下面的方法 我是用$id = $book->add()返回是空
删:
onethink给的menu和config都有点问题这里给出我的
界面显示效果:
批量删除按钮:
需要批量删除的对象name命名和进行单一删除对象命名一个是id[]另一个是id
后台删除方法:
改:
前台:这里貌似一定要使用_id
后台方法:
4.样式修改
onethink 里a 标签实现鼠标放上去显示下划线使用的是border-bottom的方式 使用border:none 进行覆盖 text-decoration:none 是无效的 这个坑 坑了我好久wtf
5.onethink页面端获得后台服务器传值的方法
1:一般后台通过assign的值前台通过{$value}显示出来;
2:如果需要在js中使用 则可以通过 在js中写 var m = "{$value}"得到传来的值 注意这里的js需要与html在同一页面 不是封装的js
3:如果需要在dom元素中通过自定义属性获得后台传值 可以这样:<a del ="{$value}" url="{:U('books/del')}">删除</a>这里的del 即为自定义的属性可以通过 this.del获得del中暂存的数据 this为前面的a标签
4.如果后台穿的是一个数组 则前台可以通过使用volist或者foreach标签进行 遍历 可以通过组合if 或者 neq eq 等标签进行组合判断
例如:
<foreach name="category" item="vo">
<neq name="category_id" value="$key">
<a href="{:U('books/index?category='.$key)}">
{$vo}</a>
<else/>
<strong>
{$vo}
</strong>
</neq>
</foreach>
或者:
<volist name="search_type" id="res" >
<if condition ="I('search') eq $key ">
<option value="{$key}" selected >
{$res}
</option>
<else/>
<option value="{$key}" >{$res}</option>
</if>
</volist>
6.onethink 通过url传值的方法
通常你可以通过url传一个变量例如:
<a title="资源" href="{:U('Resource/index?search=ry_book_id&content='.$book['bo_book_id'])}">
如果你想通过url里传多个变量的话
则需要使用js来拼接url 可以采用下面的方式:
html:
<a class="sch-btn" href="javascript:;" id="search" url="{:U('books/index')}"><i class="btn-search"></i></a>
js:
$("#search").click(function()
{
var url = $(this).attr('url');
var query = $('.search-form').find('input').val();
//去空格 var search = 'search=' + $("#search_type").val();
query = '&content=' + $.trim(query);
if (url.indexOf('?') > 0)
{ url += '&' + search + query; }
else
{ url += '?' + search + query; }
window.location.href = url; });
php使用ajax导出CSV或者EXCEl(thinkphp)方法
首先我强烈推荐看到这篇文章的你将导出文件设置为csv格式的文件 实际测试导出csv文件的速度是excel文件的10几倍左右
首先我先介绍csv文件的导出的方法:
如果你单纯是在数据导出界面上通过用户点击生成csv或者excel按钮通过服务器往浏览器输出excel或者csv 如果数据量小的化可以使用这样的方法(这种方法无法使用ajax)网上百度一下一堆介绍
这里有较为详细的方法介绍 和源码
我这里介绍的是 当数据量比较大时比如生成excel或者csv文件可能需要 几分钟这时候我们需要在用户点击生成按钮后先生成一个loading框阻止用户随意乱点 将excel或者 csv文件先导出到
服务器端后然后通过ajax方法返回给浏览器一个下载地址用户点击下载地址后下载文件
1.导出csv的话非常简单
核心生成代码:
//这里传入的$data为二维数组
//即为$data = ( array ,array,array)
function create_csv($data,$filename='simple.xls')
{
ini_set('max_execution_time', '0');
//这里的CSV即你项目的根目录下新建一个CSV文件夹
$path = ('CSV/'.iconv('UTF-8','gb2312',$filename));
$fp = fopen($path, 'w');
foreach( $data as $k => $v)
{
foreach ($v as $key => &$value)
{
//将数据值进行在编码 避免中文乱码问题
$value = iconv('UTF-8','gb2312',$value);
}
fputcsv($fp, $v); }
fclose($fp);
$result = array( 'status' => 1, 'path' =>'CSV/'.$filename );
return $result;
exit;
}
后台调用代码:
public function generate()
{
//这里data需要处理为二维数据及最终为 $data = (array,array,array)这样
$data = array();
$excel_title =array( "_id" , "bo_subject", );
array_push($data,$excel_title);
...处理真实数据并将其push入$data中
$result = create_csv($data,$filename);
$this->ajaxReturn($result);
}
前台通过jquery进行post:建议先去学习一下layer这个弹出层组件特别不错传送门
代码:
<button style=" float: right;" class="btn" id="generate" url="{:U('generate')}">生成</button>
$('#generate').click(function(event)
{
var url = $(this).attr('url');
//loading层
var index = layer.load(1);
function download(content)
{
layer.open({
type: 1,
content: content,
skin: 'layui-layer-demo',
//样式类名
closeBtn: 1,
shift: 0,
area: ['200px', '105px'],
shadeClose: true,
//开启遮罩关闭
content:content }); }
$.post(url, function(data) {
if (data.status)
{
layer.close(index);
data.path = '__ROOT__' +'/'+(data.path);
var test = '<a class="download" href =' + data.path + ' target="_blank" >点击下载</a>';
download(test); }
else {
layer.close(index);
layer.alert('出现错误') } }, "json"); });
2.导出excel:(导出excel特别慢 适用场景为更复杂的问题比如导出字体的颜色大小排版控制 并且导出图片之类)
首先我们需要引入phpexcel这个插件下载完后去掉没必要的放在 /ThinkPHP/Library/Vendor/PHPExcel
注意目录结构为如图
核心函数为:
function create_xls($data,$filename='simple.xls')
{
ini_set('max_execution_time', '0');
Vendor('PHPExcel.PHPExcel');
$phpexcel = new PHPExcel();
$phpexcel->getProperties() ->setCreator("HYZ") ->setLastModifiedBy("HYZ") ->setTitle("Office 2007 XLSX Test Document") ->setSubject("Office 2007 XLSX Test Document") ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") ->setKeywords("office 2007 openxml php") ->setCategory("Test result file");
$phpexcel->getActiveSheet()->fromArray($data);
$phpexcel->getActiveSheet()->setTitle('Sheet1');
$phpexcel->setActiveSheetIndex(0);
function saveExcelToLocalFile($objWriter,$filename)
{
// make sure you have permission to write to directory
$filePath = 'Excel/'.$filename; $objWriter->save($filePath); return $filePath; }
// 导出到本地语法 $objWriter = new PHPExcel_Writer_Excel5($phpexcel);
// 导出到界面语法
// $objwriter = PHPExcel_IOFactory::createWriter($phpexcel, 'Excel5');
saveExcelToLocalFile($objWriter,iconv('utf-8','gb2312',$filename));
$response = array( 'result' => 1, 'url' =>'Excel/'.$filename );
return json_encode($response);
exit;
}
其他的部分基本可以参考生成csv的一样