数据库分卷备份thinkphp3.2版

  • 摘自thinkcmf,功能经修复和部分修改

控制器代码

<?php
// +----------------------------------------------------------------------
// | TEA [ The customer with the product, we won't change any day. ]
// +----------------------------------------------------------------------
// | Copyright (c) 2015 http://www.lechezai.com All rights reserved.
// +----------------------------------------------------------------------
// | Author: WallE <654753115@qq.com> Last modified time:2015-08-24
// +----------------------------------------------------------------------
namespace Admin\Controller;
use Common\Controller\AdminBaseController;
/**
* 数据备份和恢复
* 数据库信息必须为进行了严格的转义数据,不能存在引起sql歧义符号!否则备份不能按每一行保存,导致数据恢复错误!
*/

class DataBaseController extends AdminBaseController {

public $backup_path = ''; //备份文件夹相对路径
public $backup_name = ''; //当前备份文件夹名
public $offset = '500'; //每次取数据条数
public $dump_sql = '';
public $ext = '.sql'; //文件后缀

public function _initialize()
{

parent::_initialize();
$this->backup_path = '/data/backup/';
$this->_database_mod = M();
}

/**
* 数据库备份
*/

public function index()
{

//获得当前服务器上传最大限制作为分卷大小
$allow_max_size = $this->_return_bytes(@ini_get('upload_max_filesize'));

$this->assign('sizelimit', 1024*1024 / 1024);
$this->assign('backup_name', $this->_make_backup_name());
$this->assign('tables', M()->db()->getTables()); //显示所有数据表

$this->assign('btype', I('get.type'));
$this->assign('bname', I('get.backup_name'));
$this->assign('bsizelimit', I('get.sizelimit'));
$this->assign('bdosubmit', I('get.dosubmit'));
$this->display();
}

public function index_post(){
if (IS_POST || isset($_GET['dosubmit']))
{
// print_r($_POST);exit();
if (isset($_GET['type']) && $_GET['type'] == 'url')
{
$sizelimit = isset($_GET['sizelimit']) && abs(intval($_GET['sizelimit'])) ? abs(intval($_GET['sizelimit'])) : $this->error('请输入每个分卷文件大小');
$this->backup_name = isset($_GET['backup_name']) && trim($_GET['backup_name']) ?
trim($_GET['backup_name']) : $this->error('请输入备份名称');
$vol = $this->_get_vol();
$vol++;
} else {
$sizelimit = isset($_POST['sizelimit']) && abs(intval($_POST['sizelimit'])) ?
abs(intval($_POST['sizelimit'])) : $this->error('请输入每个分卷文件大小');
$this->backup_name = isset($_POST['backup_name']) && trim($_POST['backup_name']) ?
trim($_POST['backup_name']) : $this->error('请输入备份名称');
$backup_tables = isset($_POST['backup_tables']) && $_POST['backup_tables'] ? $_POST['backup_tables'] : $this->error('请选择备份数据表');
if (is_dir(SITE_PATH . $this->backup_path . $this->backup_name))
{
$this->error('备份名称已经存在');
}
if (!file_exists(SITE_PATH . $this->backup_path . $this->backup_name))
{
mkdir(SITE_PATH . $this->backup_path . $this->backup_name, 0777,true);
}
if (!is_file(SITE_PATH . $this->backup_path . $this->backup_name . '/tbl_queue.log'))
{
//写入队列
$this->_put_tbl_queue($backup_tables);
}
$vol = 1;
}
$tables = $this->_dump_queue($vol, $sizelimit * 1024);

if ($tables === false)
{
$this->error('加载队列文件错误');
}
$this->_deal_result($tables, $vol, $sizelimit);
exit();
}
}

/**
* 数据恢复
*/

public function restore()
{

$this->assign('backups', $this->_get_backups());
$this->assign('table_list', true);
$this->display();
}

/**
* 导入备份
*/

public function import()
{

$backup_name = isset($_GET['backup']) && trim($_GET['backup']) ? trim($_GET['backup']) : $this->error('请选择备份名称');
$vol = empty($_GET['vol']) ? 1 : intval($_GET['vol']);
$this->backup_name = $backup_name;
//获得所有分卷
$backups = $this->_get_vols($this->backup_name);
$backup = isset($backups[$vol]) && $backups[$vol] ? $backups[$vol] : $this->error('无此文件!');
//开始导入卷
if ($this->_import_vol($backup['file']))
{
if ($vol < count($backups))
{
$vol++;
$link = U("DataBase/import",array("vol"=>$vol,"backup"=>urlencode($this->backup_name)));
$this->success(sprintf('正在导入数据分卷...第 %d 卷', $vol - 1), $link);
} else
{
$this->success('导入成功!', U("DataBase/restore"));
}
}
$this->display();
}

private function _import_vol($sql_file_name)
{

$sql_file = SITE_PATH . $this->backup_path . $this->backup_name . '/' . $sql_file_name;
$sql_str = file($sql_file);
$sql_str = preg_replace("/^--.+\n/",'', $sql_str);
$sql_str = str_replace("\r", '', implode('', $sql_str));
$ret = explode(";\n", $sql_str);
$ret_count = count($ret);
for ($i = 0; $i < $ret_count; $i++)
{
$ret[$i] = trim($ret[$i], " \r\n;"); //剔除多余信息
if (!empty($ret[$i]))
{
// 数据库信息必须为进行了严格的转义数据,不能存在引起sql歧义符号!否则备份不能按每一行保存,导致数据错误
$this->_database_mod->execute($ret[$i]);
}
}
return true;
}

/**
* 删除备份
*/

public function del_backup()
{

$_GET['backup'] = I('id');
if ((!isset($_GET['backup']) || empty($_GET['backup'])) && (!isset($_POST['backup']) || empty($_POST['backup'])))
{
$this->error('非法参数');
}
import("Org.Util.Dir");
$dir = new \Dir();
$dir->delDir(SITE_PATH . $this->backup_path . $_GET['backup'].'/');
$this->ajaxReturn(array('status'=>1,'info'=>'删除成功!'));
}

/**
* 下载备份文件
*/

public function download()
{

$backup_name = isset($_GET['backup']) && trim($_GET['backup']) ? trim($_GET['backup']) : $this->error('请选择备份名称!');
$file = isset($_GET['file']) && trim($_GET['file']) ? trim($_GET['file']) : $this->error('请选择备份文件!');
if (!in_array($this->ext, explode('.', $file))) {
$file .= $this->ext;
}
$sql_file = SITE_PATH . $this->backup_path . $backup_name . '/' . $file;
if (file_exists($sql_file))
{
header('Content-type: application/unknown');
header('Content-Disposition: attachment; filename="' . $file . '"');
header("Content-Length: " . filesize($sql_file) . "; ");
readfile($sql_file);
} else
{
$this->error('文件不存在!');
}
}
/**
@@ 悲伤逆流成河
*/


/**
* 获得备份文件夹下的sql文件
*/

private function _get_vols($backup_name)
{

$vols = array(); //所有的卷
$bytes = 0;
$vol_path = SITE_PATH . $this->backup_path . $backup_name . '/';
if (is_dir($vol_path))
{
if ($handle = opendir($vol_path))
{
$vol = array();
while (($file = readdir($handle)) !== false)
{
$file_info = pathinfo($vol_path . $file);
if ($file_info['extension'] == 'sql')
{
$vol = $this->_get_head($vol_path . $file);
$vol['file'] = $file;
$bytes += filesize($vol_path . $file);
$vol['size'] = ceil(10 * filesize($vol_path . $file) / 1024) / 10;
$vol['total_size'] = ceil(10 * $bytes / 1024) / 10;
$vols[$vol['vol']] = $vol;
}
}
}
}
ksort($vols);
return $vols;
}

/**
* 获得备份列表
*/

private function _get_backups()
{

$backups = array(); //所有的备份
if (is_dir(SITE_PATH . $this->backup_path))
{
if ($handle = opendir(SITE_PATH . $this->backup_path))
{
while (($file = readdir($handle)) !== false)
{
if ($file{0} != '.' && filetype(SITE_PATH . $this->backup_path . $file) == 'dir')
{
$backup['name'] = $file;
$backup['date'] = filemtime(SITE_PATH . $this->backup_path . $file) - date('Z');
$backup['date_str'] = date('Y-m-d H:i:s', $backup['date']);
$backup['vols'] = $this->_get_vols($file);
$end_vol = end($backup['vols']);
$backup['total_size'] =round($this->_get_dir_size(SITE_PATH . $this->backup_path . $file)/1024,2);
$backups[] = $backup;
}
}
}
}
ksort($backups);
return $backups;
}

private function _deal_result($tables, $vol, $sizelimit)
{

$this->_sava_sql($vol);
if (empty($tables))
{
//备份完毕
$this->_drop_tbl_queue();
$vol != 1 && $this->_drop_vol(); //只有一卷时不需删除
$this->success('备份成功!',U("DataBase/restore"));
} else
{
//开始下一卷
$this->_set_vol($vol); //设置分卷记录
$link= U("DataBase/index_post",array("dosubmit"=>1,"type"=>"url","backup_name"=>$this->backup_name,"sizelimit"=>$sizelimit));
$this->success(sprintf('准备分卷备份中...第 %d 卷', $vol), $link);
// $this->ajaxReturn(array('status'=>1, 'url'=>$link, 'info'=>sprintf('分卷备份中...第 %d 卷', $vol)));
}
}

private function _dump_queue($vol, $sizelimit)
{

$queue_tables = $this->_get_tbl_queue();
if (!$queue_tables)
{
return false;
}

$this->dump_sql = $this->_make_head($vol);
foreach ($queue_tables as $table => $pos)
{
//获取表结构
if ($pos == '-1')
{
$table_df = $this->_get_table_df($table);
if (strlen($this->dump_sql) + strlen($table_df) > $sizelimit)
{
break;
} else
{
$this->dump_sql .= $table_df;
$pos = 0;
}
}
//获取表数据
$post_pos = $this->_get_table_data($table, $pos, $sizelimit);
if ($post_pos == -1)
{
unset($queue_tables[$table]); //此表已经完全导出
} else
{
//此表未完成,放到下一个分卷
$queue_tables[$table] = $post_pos;
break;
}
}
$this->_put_tbl_queue($queue_tables);
return $queue_tables;
}

/**
* 获取数据表结构语句
*
* @param string $table 表名
*/

private function _get_table_df($table)
{

$table_df = "DROP TABLE IF EXISTS `$table`;\n";
$tmp_sql = $this->_database_mod->query("SHOW CREATE TABLE `$table` ");
$tmp_sql = $tmp_sql['0']['create table'];
$tt = $tmp_sql;
$tmp_sql = substr($tmp_sql, 0, strrpos($tmp_sql, ")") + 1); //去除行尾定义。
$tmp_sql = str_replace("\n", "\r\n", $tmp_sql);
$tmp = explode('ENGINE=', $tt);
$tmp_z = explode(' ', $tmp[1]);
$tmp = explode('CHARSET=', $tt);
$tmp_c = explode(' ', $tmp[1]);
$table_df .= $tmp_sql ."ENGINE=".$tmp_z[0]. " DEFAULT CHARSET='".trim($tmp_c[0])."';\r\n";
return $table_df;
}

/**
* 获取数据表数据
*/

private function _get_table_data($table, $pos, $sizelimit)
{

$post_pos = $pos;
$total = $this->_database_mod->query("SELECT COUNT(*) as count FROM $table"); //数据总数
$total = $total[0]['count'];

if ($total == 0 || $pos >= $total)
{
return - 1;
}
$cycle_time = ceil(($total - $pos) / $this->offset); //每次取offset条数。获得需要取的次数
for ($i = 0; $i < $cycle_time; $i++)
{
$data = $this->_database_mod->query("SELECT * FROM $table LIMIT " . ($this->
offset * $i + $pos) . ', ' . $this->offset);
$data_count = count($data);
$fields = array_keys($data[0]);
$start_sql = "INSERT INTO $table ( `" . implode("`, `", $fields) . "` ) VALUES ";
//循环将数据写入
for ($j = 0; $j < $data_count; $j++)
{
$record = array_map(array($this, '_dump_escape_string'), $data[$j]); //过滤非法字符

$tmp_dump_sql = $start_sql . " (" . $this->_implode_insert_values($record) . ");\r\n";
if (strlen($this->dump_sql) + strlen($tmp_dump_sql) > $sizelimit - 32)
{
return $post_pos;
} else
{
$this->dump_sql .= $tmp_dump_sql;
$post_pos++;
}
}
}
return - 1;
}

private function _dump_escape_string($str)
{

return addslashes($str);
//return $this->_database_mod->escape_string($str);
}

/**
* 备份文件头部声明信息
*/

private function _make_head($vol)
{

$date = date('Y-m-d H:i:s', time());
$head = "-- Tea SQL Dump Program\r\n" . "-- \r\n" . "-- DATE : " . $date . "\r\n" . "-- Vol : " . $vol . "\r\n";
return $head;
}

/**
* 获得头文件信息
*/

private function _get_head($path)
{

$fp = fopen($path, 'rb');
$str = fread($fp, 90);
fclose($fp);
$arr = explode("\n", $str);
foreach ($arr as $val)
{
$pos = strpos($val, ':');
if ($pos > 0)
{
$type = trim(substr($val, 0, $pos), "-\n\r\t ");
$value = trim(substr($val, $pos + 1), "/\n\r\t ");
if ($type == 'DATE')
{
$sql_info['date'] = $value;
} elseif ($type == 'Vol')
{
$sql_info['vol'] = $value;
}
}
}
return $sql_info;
}

/**
* 生成备份文件夹名称
*/

private function _make_backup_name()
{

$backup_path = SITE_PATH . '/data/backup/';
$today = date('Ymd_', time());
$today_backup = array(); //保存今天已经备份过的
if (is_dir($backup_path))
{
if ($handle = opendir($backup_path))
{
while (($file = readdir($handle)) !== false)
{
if ($file{0} != '.' && filetype($backup_path . $file) == 'dir')
{
if (strpos($file, $today) === 0)
{
$no = intval(str_replace($today, '', $file)); //当天的编号
if ($no)
{
$today_backup[] = $no;
}
}
}
}
}
}
if ($today_backup)
{
$today .= max($today_backup) + 1;
} else
{
$today .= '1';
}
return $today;
}

/**
* 需要备份的数据表写入队列
*/

private function _put_tbl_queue($tables)
{

return file_put_contents(SITE_PATH . $this->backup_path . $this->backup_name . '/tbl_queue.log', "<?php return " . var_export($tables, true) . ";\n?>");
}

/**
* 获取需要处理的数据表队列
*/

private function _get_tbl_queue()
{

$tbl_queue_file = SITE_PATH . $this->backup_path . $this->backup_name . '/tbl_queue.log';
if (!is_file($tbl_queue_file))
{
return false;
} else
{
return include ($tbl_queue_file);
}
}

/**
* 删除队列文件
*/

private function _drop_tbl_queue()
{

$tbl_queue_file = SITE_PATH . $this->backup_path . $this->backup_name .
'/tbl_queue.log';
return @unlink($tbl_queue_file);
}

/**
* 写入分卷记录
*/

private function _set_vol($vol)
{

$log_file = SITE_PATH . $this->backup_path . $this->backup_name . '/vol.log';
return file_put_contents($log_file, $vol);
}

/**
* 获取上一次操作分卷记录
*/

private function _get_vol()
{

$log_file = SITE_PATH . $this->backup_path . $this->backup_name . '/vol.log';
if (!is_file($log_file))
{
return 0;
}
$content = file_get_contents($log_file);
return is_numeric($content) ? intval($content) : false;
}

/**
* 删除分卷记录文件
*/

private function _drop_vol()
{

$log_file = SITE_PATH . $this->backup_path . $this->backup_name . '/vol.log';
return @unlink($log_file);
}

/**
* 保存导出的sql
*/

private function _sava_sql($vol)
{

$size = file_put_contents(SITE_PATH . $this->backup_path . $this->backup_name .
'/' . $this->backup_name . '_' . $vol . '.sql', $this->dump_sql);
return $size;
}

/**
* 对 MYSQL INSERT INTO 语句的values部分内容进行字符串连接
*
* @param array $values
* @return string
*/

private function _implode_insert_values($values)
{

$str = '';
$values = array_values($values);
foreach ($values as $k => $v)
{
$v = ($v === null) ? 'null' : "'" . $v . "'";
$str = ($k == 0) ? $str . $v : $str . ',' . $v;
}
return $str;
}

/**
* 将G M K转换为字节
*
* @param string $val
* @return int
*/

private function _return_bytes($val)
{

$val = trim($val);
$last = strtolower($val[strlen($val) - 1]);
switch ($last)
{
case 'g':
$val *= 1024;
case 'm':
$val *= 1024;
case 'k':
$val *= 1024;
}
return $val;
}
function _get_dir_size($dir)
{

$handle = opendir($dir);
$sizeResult=0;
while (false !== ($FolderOrFile = readdir($handle)))
{
if ($FolderOrFile != "." && $FolderOrFile != "..")
{
if (is_dir("$dir/$FolderOrFile"))
{
$sizeResult += getDirSize("$dir/$FolderOrFile");
} else
{
$sizeResult += filesize("$dir/$FolderOrFile");
}
}
}
closedir($handle);
return $sizeResult;
}
}

VIEW模板代码

restore.html

<extend name="Boot:boot" />
<block name="page-styles">
<style type="text/css">
.panel
{
display:none;
}

</style>
</block>
<block name="page-content">
<div class="page-content">
<div class="row">
<div class="col-xs-12">
<!-- 返回信息 -->
<div class="error-message" style="display:none;"></div>
<form action="{:U('Admin/DataBase/import')}" method="post">
<div>
<a href="{:U('Admin/DataBase/index')}" class="btn btn-info">去备份数据</a>
</div>
<div class="widget-box">
<div class="widget-header widget-header-flat">
<h4 class="smaller">
<i class="ace-icon glyphicon glyphicon-list"></i>
{$meta_title}
</h4>
</div>
<div class="widget-body">
<div class="widget-main">
<!-- 自定内容 -->
<table id="sample-table-1" class="table table-striped table-bordered table-hover">
<thead>
<tr>
<th class="col-xs-4">备份名称</th>
<th>文件总大小</th>
<th>备份时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<volist name="backups" id="val">
<tr class="collapsed">
<td data="{$val.name}" class="flip">
<a href="javascript:void(0);" style="text-decoration:none;">
&nbsp;
<i class="ace-icon glyphicon glyphicon-plus"></i>
</a>&nbsp;{$val.name}
</td>
<td>{$val.total_size}kb</td>
<td>{$val.date_str}</td>
<td>
<!-- <a href="{:U('Admin/DataBase/del_backup', array('backup'=>$val['name']))}" value="{$val['name']}" class="js-ajax-delete dleLink">删除备份</a> | -->
<a href="javascript:void(0);" value="{$val['name']}" class="js-ajax-delete dleLink">删除备份</a> |
<a href="{:U('Admin/DataBase/import', array('backup'=>$val['name']))}" class="js-ajax-dialog-btn" onclick="return confirm('确认要恢复吗?');">恢复</a>
</td>
</tr>
<volist name="val['vols']" id="vol">
<tr parent="{$val.name}" class="panel {$val.name}">
<td>├─ {$vol.file}</td>
<td>{$vol.size}kb</td>
<td>{$val.date_str}</td>
<td>
<!-- <a href="{:U('Admin/DataBase/download', array('backup'=>$val['name'], 'file'=>$vol['file']))}">下载</a> -->
</td>
</tr>
</volist>
</volist>
</tbody>
</table>
</div>
</div>
</div>
</form>
<!-- end -->
</div>
</div>
<!-- /.row -->
</div>

</block>
<block name="page-scripts">
<script src="__PUBLIC__/Admin/js/jquery.dataTables.min.js"></script>
<script src="__PUBLIC__/Admin/js/jquery.dataTables.bootstrap.js"></script>
<script type="text/javascript" src="__PUBLIC__/Admin/teajs/jquery_asyncoper.js"></script>
<script type="text/javascript">
$(document).ready(function(){
// 隐藏、显示
$(".flip").click(function(){
var precent = $(this).attr('data');
$("tr[parent='"+precent+"']").slideToggle("slow");
});
});
//绑定删除的点击事件
$(".dleLink").click(function () {
var url="{:U('Admin/DataBase/del_backup')}";
del(url,$(this));
});
</script>
</block>

index.html

<extend name="Boot:boot" />
<block name="page-styles"></block>

<block name="page-content">
<div class="page-content">
<div class="row">
<div class="col-xs-12">
<!-- 返回信息 -->
<div class="error-message" style="display:none;"></div>
<form id="backupForm" action="{:U('Admin/DataBase/index_post',array('type'=>$btype,'backup_name'=>$bname,'sizelimit'=>$bsizelimit,'dosubmit'=>$bdosubmit))}" method="post">
<div>
<a href="{:U('Admin/DataBase/restore')}" class="btn btn-defalut">查看备份</a>
<!-- <input type="submit" value="开始备份" class="btn btn-info" id="submitbtn"> -->
<input type="button" value="开始备份" class="btn btn-info" id="submitbtn">
</div>
<div class="widget-box">
<div class="widget-header widget-header-flat">
<h4 class="smaller">
<i class="ace-icon glyphicon glyphicon-list"></i>
{$meta_title}
</h4>
</div>
<div class="widget-body">
<div class="widget-main">
<!-- 自定内容 -->
<div class="table_list">
<table class="table" cellspacing="0" class="table_form">
<tr>
<td class="col-xs-2">备份分卷大小</td>
<td>
<input type="text" name="sizelimit" value="{$sizelimit}" size="10"> K
&nbsp;&nbsp;(推荐10M以下)
</td>
</tr>
<tr>
<td>备份名称</td>
<td><input type="text" name="backup_name" value="{$backup_name}"></td>
</tr>
<tr>
<td>备份类型</td>
<td>
<label>
<input type="radio" checked="checked" value="full" name="backup_type" onclick="javascript:$('#js-showtables').hide();" class="ace">
<span class="lbl"> 备份所有&nbsp;&nbsp;</span>
</label>
<label>
<input type="radio" value="custom" name="backup_type" onclick="javascript:$('#js-showtables').show();" class="ace" />
<span class="lbl">自定义备份</span>
</label>
</td>
</tr>
<tr id="js-showtables">
<td align="right">
<label class="position-relative">
<input type="checkbox" class="ace" checked="checked" id="selectAll" onclick="checkAll()">
<span class="lbl">&nbsp;&nbsp;全选/反选</span>
</label>
</td>
<td colspan="2">
<volist name="tables" id="val">
<label class="position-relative inline" style="width:300px;">
<input name="backup_tables[{$val}]" type="checkbox" value="-1" checked="checked" class="ace js-checkitem" />
<span class="lbl">&nbsp;&nbsp;{$val}</span>
</label>
</volist>
</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</table>
</div>
<!-- end -->
</div>
</div>
</div>
</form>
<!-- end -->
</div>
</div>
<!-- /.row -->
</div>
<style type="text/css">
#js-showtables{display:none;}
.checkbox.inline{
margin-left: 10px;
}

</style>
</block>

<block name="page-scripts">
<script type="text/javascript" src="__PUBLIC__/Common/js/jquery.form.js"></script>
<script type="text/javascript" src="__PUBLIC__/Admin/teajs/jquery_asyncoper.js"></script>
<script type="text/javascript">
// 全选反选
function checkAll()
{

var checkedOfAll=$("#selectAll").prop("checked");
$("input[type='checkbox']").prop("checked", checkedOfAll);
}
$(function(){
$("#submitbtn").click(function(){
$('.error-message').css('display','block');
$('.error-message').html('<div class="alert alert-block alert-success"><button type="button" class="close" data-dismiss="alert"><i class="ace-icon fa fa-times"></i></button><i class="ace-icon fa fa-spinner fa-spin orange bigger-125"></i>&nbsp;&nbsp;正在备份,请勿进行其他操作!</div>');
var data=$('#backupForm').serialize();
var url="{:U('Admin/DataBase/index_post')}";
postajaxForm(url,data);
});
});
</script>
</block>

index_post.html

<extend name="Boot:boot" />
<block name="page-content">
<div class="page-content">
<div class="row">
<div class="col-xs-12">
<!-- 返回信息 -->
<div class="error-message" style="display:none;"></div>

<!-- end -->
</div>
</div>
<!-- /.row -->
</div>

</block>
<block name="page-scripts">
<script src="__PUBLIC__/Admin/js/jquery.dataTables.min.js"></script>
<script src="__PUBLIC__/Admin/js/jquery.dataTables.bootstrap.js"></script>
<script type="text/javascript" src="__PUBLIC__/Admin/teajs/jquery_asyncoper.js"></script>
<script type="text/javascript">
$(document).ready(function(){
// 隐藏、显示
$(".flip").click(function(){
var precent = $(this).attr('data');
$("tr[parent='"+precent+"']").slideToggle("slow");
});
});
//绑定删除的点击事件
$(".dleLink").click(function () {
var url="{:U('Admin/DataBase/del_backup')}";
del(url,$(this));
});
</script>
</block>

一个js函数


//异步提交数据
/**
* url:"{:U('Slide/edit_category_handle')}"
* serial:$('#edit_slide_category').serialize()
*/

function postajaxForm(url,serial){
cache: false,
$.ajax({
type: "POST",
url: url,
data: serial,
dataType: 'json',
success:function(data){
//判断时候为json数据
if(data.status)
{
// 延时执行
$('.error-message').css('display','block');
$(".error-message").html('<div class="alert alert-block alert-success"><button type="button" class="close" data-dismiss="alert"><i class="ace-icon fa fa-times"></i></button><p><i class="ace-icon fa fa-check"></i>提示!'+data.info+'</p></div>');
$('.error-message').click(function(){
$('.error-message').css('display','none');
});
setTimeout(function(){
if(data.hasOwnProperty("url")){
if(data.url!=''){
window.location=data.url;
}
}else{
$('.error-message').css('display','none');
}
},1000);

} else {
$('.error-message').css('display','block');
$(".error-message").html('<div class="alert alert-danger"><button type="button" class="close" data-dismiss="alert"><i class="ace-icon fa fa-times"></i></button><i class="ace-icon fa fa-times"></i>提示!'+data.info+'<br></div>');
$('.error-message').click(function(){
$('.error-message').css('display','none');
});
setTimeout(function(){
$('.error-message').css('display','none');
if(data.hasOwnProperty("url")){
if(data.url!=''){
window.location=data.url;
}
}
},1000);
}
}
});
}

//删除单行
/**
* url:"{:U('Slide/delete_slide_category', array('id'=>$vo['id']))}"
* os:$(this)
*/

function del(url,os){
var tr =os.parent().parent();
if (confirm("确定删除?")) {
var id = os.attr("value");
$.ajax({
url: url,
data: "id=" + id,
type: "POST",
success: function (data) {
if (data.status=='1') {
data=data.info;
showTis(data,1,'success');
tr.fadeOut("slow");
}else{
data=data.info;
showTis(data,1,'error');
}

}
});
}
return false;
}
function showTis(data,time,stut){

$('.error-message').css('display','block');
if(stut=='error'){
$(".error-message").html('<div class="alert alert-danger"><button type="button" class="close" data-dismiss="alert"><i class="ace-icon fa fa-times"></i></button><i class="ace-icon fa fa-times"></i>提示!'+data+'<br></div>');
}else{
$(".error-message").html('<div class="alert alert-block alert-success"><button type="button" class="close" data-dismiss="alert"><i class="ace-icon fa fa-times"></i></button><p><i class="ace-icon fa fa-check"></i>提示!'+data+'</p></div>');
}
$('.error-message').click(function(){
$('.error-message').css('display','none');
});
setTimeout(function(){
$('.error-message').css('display','none');
//window.location.reload();
},(1000*time));
}

//异步提交数据 jquery_asyncoper.js
/**
* url:"{:U('Slide/edit_category_handle')}"
* serial:$('#edit_slide_category').serialize()
*/

function postajaxForm(url,serial){
cache: false,
$.ajax({
type: "POST",
url: url,
data: serial,
dataType: 'json',
success:function(data){
//判断时候为json数据
if(data.status)
{
// 延时执行
$('.error-message').css('display','block');
$(".error-message").html('<div class="alert alert-block alert-success"><button type="button" class="close" data-dismiss="alert"><i class="ace-icon fa fa-times"></i></button><p><i class="ace-icon fa fa-check"></i>提示!'+data.info+'</p></div>');
$('.error-message').click(function(){
$('.error-message').css('display','none');
});
setTimeout(function(){
if(data.hasOwnProperty("url")){
if(data.url!=''){
window.location=data.url;
}
}else{
$('.error-message').css('display','none');
}
},1000);

} else {
$('.error-message').css('display','block');
$(".error-message").html('<div class="alert alert-danger"><button type="button" class="close" data-dismiss="alert"><i class="ace-icon fa fa-times"></i></button><i class="ace-icon fa fa-times"></i>提示!'+data.info+'<br></div>');
$('.error-message').click(function(){
$('.error-message').css('display','none');
});
setTimeout(function(){
$('.error-message').css('display','none');
if(data.hasOwnProperty("url")){
if(data.url!=''){
window.location=data.url;
}
}
},1000);
}
}
});
}

//删除单行
/**
* url:"{:U('Slide/delete_slide_category', array('id'=>$vo['id']))}"
* os:$(this)
*/

function del(url,os){
var tr =os.parent().parent();
if (confirm("确定删除?")) {
var id = os.attr("value");
$.ajax({
url: url,
data: "id=" + id,
type: "POST",
success: function (data) {
if (data.status=='1') {
data=data.info;
showTis(data,1,'success');
tr.fadeOut("slow");
}else{
data=data.info;
showTis(data,1,'error');
}

}
});
}
return false;
}
function showTis(data,time,stut){

$('.error-message').css('display','block');
if(stut=='error'){
$(".error-message").html('<div class="alert alert-danger"><button type="button" class="close" data-dismiss="alert"><i class="ace-icon fa fa-times"></i></button><i class="ace-icon fa fa-times"></i>提示!'+data+'<br></div>');
}else{
$(".error-message").html('<div class="alert alert-block alert-success"><button type="button" class="close" data-dismiss="alert"><i class="ace-icon fa fa-times"></i></button><p><i class="ace-icon fa fa-check"></i>提示!'+data+'</p></div>');
}
$('.error-message').click(function(){
$('.error-message').css('display','none');
});
setTimeout(function(){
$('.error-message').css('display','none');
//window.location.reload();
},(1000*time));
}

更多相关文章

  1. win下mysql物理备份恢复 适用与mysql 恢复
  2. java实现定时备份mysql数据库-----已通过测试
  3. 程序猿(媛)Shell脚本必备技能之一: 在Linux下如何自动备份mysql
  4. mysql-zrm备份工具实现全备+增备策略
  5. Mysqlbackup 3.9.0 企业级备份工具详解
  6. 如何在VB.net中进行备份和恢复mysql数据库
  7. mysql备份文件损坏的修复
  8. 再放100分,问:你是如何备份大于5M的mysql数据库的
  9. 为mysql数据备份建立最小权限的用户

随机推荐

  1. 每一位Android开发者应该知道的Android体
  2. Android Q Beta 6 终极测试版发布!
  3. Android Bluetooth蓝牙开发\蓝牙协议\
  4. Android内部存储改变读取权限
  5. Android使用XML全攻略
  6. android上使用XML
  7. android强大的SpannableStringBuilder
  8. Android解析XML(PULL)展示到ListView
  9. android与C++的选择
  10. 安装Android的SDK--中文教程(完整版,包括Ec