Commit 827181d3 authored by 董先生's avatar 董先生

stock_new项目创建

parents

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

.idea
composer.lock
/runtime/
/.settings/
/.buildpath
/.project
*.log
/public/uploads/temp/
/public/uploads/images/
.user.ini
.DS_Store
\ No newline at end of file
\ No newline at end of file
8J4PlQ6BJJU7XlxLXJrC9QEBz5fEm6WM
\ No newline at end of file
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>404</title>
<style>
body{
background-color:#444;
font-size:14px;
}
h3{
font-size:60px;
color:#eee;
text-align:center;
padding-top:30px;
font-weight:normal;
}
</style>
</head>
<body>
<h3>404,您请求的文件不存在!</h3>
</body>
</html>
deny from all
\ No newline at end of file
<?php
// +----------------------------------------------------------------------
// | 系统框架
// +----------------------------------------------------------------------
// | 版权所有 2017~2020 路人甲乙科技有限公司 [ http://www.lurenjiayi.com ]
// +----------------------------------------------------------------------
// | 官方网站:http://www.lurenjiayi.com
// +----------------------------------------------------------------------
// | 开源协议 ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
namespace app\admin\controller;
use app\common\builder\ZBuilder;
use app\admin\model\Action as ActionModel;
use app\admin\model\Module as ModuleModel;
/**
* 行为管理控制器
* @package app\admin\controller
*/
class Action extends Admin
{
/**
* 首页
* @author 路人甲乙
* @return mixed
*/
public function index()
{
// 查询
$map = $this->getMap();
// 数据列表
$data_list = ActionModel::where($map)->order('id desc')->paginate();
// 所有模块的名称和标题
$list_module = ModuleModel::getModule();
// 新增或编辑页面的字段
$fields = [
['hidden', 'id'],
['select', 'module', '所属模块', '', $list_module],
['text', 'name', '行为标识', '由英文字母和下划线组成'],
['text', 'title', '行为名称', ''],
['textarea', 'remark', '行为描述'],
['textarea', 'rule', '行为规则', '不写则只记录日志'],
['textarea', 'log', '日志规则', '记录日志备注时按此规则来生成,支持[变量|函数]。目前变量有:user,time,model,record,data,details'],
['radio', 'status', '立即启用', '', ['否', '是'], 1]
];
// 使用ZBuilder快速创建数据表格
return ZBuilder::make('table')
->setPageTitle('行为管理') // 设置页面标题
->setSearch(['name' => '标识', 'title' => '名称']) // 设置搜索框
->addColumns([ // 批量添加数据列
['id', 'ID'],
['name', '标识'],
['title', '名称'],
['remark', '描述'],
['module', '所属模块', 'callback', function($module, $list_module){
return isset($list_module[$module]) ? $list_module[$module] : '未知';
}, $list_module],
['status', '状态', 'switch'],
['right_button', '操作', 'btn']
])
->autoAdd($fields, '', true, true) // 添加自动新增按钮
->autoEdit($fields, '', true, true) // 添加自动编辑按钮
->addTopButtons('enable,disable,delete') // 批量添加顶部按钮
->addRightButtons('delete') // 批量添加右侧按钮
->addFilter('module', $list_module)
->setRowList($data_list) // 设置表格数据
->fetch(); // 渲染模板
}
}
\ No newline at end of file
This diff is collapsed.
<?php
// +----------------------------------------------------------------------
// | 系统框架
// +----------------------------------------------------------------------
// | 版权所有 2017~2020 路人甲乙科技有限公司 [ http://www.lurenjiayi.com ]
// +----------------------------------------------------------------------
// | 官方网站:http://www.lurenjiayi.com
// +----------------------------------------------------------------------
// | 开源协议 ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
namespace app\admin\controller;
use app\common\controller\Common;
use app\admin\model\Menu as MenuModel;
use app\admin\model\Attachment as AttachmentModel;
use think\Cache;
use think\Db;
/**
* 用于处理ajax请求的控制器
* @package app\admin\controller
*/
class Ajax extends Common
{
/**
* 获取联动数据
* @param string $table 表名
* @param int $pid 父级ID
* @param string $key 下拉选项的值
* @param string $option 下拉选项的名称
* @param string $pidkey 父级id字段名
* @author 路人甲乙
* @return \think\response\Json
*/
public function getLevelData($table = '', $pid = 0, $key = 'id', $option = 'name', $pidkey = 'pid')
{
if ($table == '') {
return json(['code' => 0, 'msg' => '缺少表名']);
}
$data_list = Db::name($table)->where($pidkey, $pid)->column($option, $key);
if ($data_list === false) {
return json(['code' => 0, 'msg' => '查询失败']);
}
if ($data_list) {
$result = [
'code' => 1,
'msg' => '请求成功',
'list' => format_linkage($data_list)
];
return json($result);
} else {
return json(['code' => 0, 'msg' => '查询不到数据']);
}
}
/**
* 获取筛选数据
* @param string $table 表名
* @param string $field 字段名
* @param array $map 查询条件
* @param string $options 选项,用于显示转换
* @param string $list 选项缓存列表名称
* @author 路人甲乙
* @return \think\response\Json
*/
public function getFilterList($table = '', $field = '', $map = [], $options = '', $list = '')
{
if ($list != '') {
$result = [
'code' => 1,
'msg' => '请求成功',
'list' => Cache::get($list)
];
return json($result);
}
if ($table == '') {
return json(['code' => 0, 'msg' => '缺少表名']);
}
if ($field == '') {
return json(['code' => 0, 'msg' => '缺少字段']);
}
if (!empty($map) && is_array($map)) {
foreach ($map as &$item) {
if (is_array($item)) {
foreach ($item as &$value) {
$value = trim($value);
}
} else {
$item = trim($item);
}
}
}
$data_list = Db::name($table)->where($map)->group($field)->column($field);
if ($data_list === false) {
return json(['code' => 0, 'msg' => '查询失败']);
}
if ($data_list) {
if ($options != '') {
// 从缓存获取选项数据
$options = cache($options);
if ($options) {
$temp_data_list = [];
foreach ($data_list as $item) {
$temp_data_list[$item] = isset($options[$item]) ? $options[$item] : '';
}
$data_list = $temp_data_list;
} else {
$data_list = parse_array($data_list);
}
} else {
$data_list = parse_array($data_list);
}
$result = [
'code' => 1,
'msg' => '请求成功',
'list' => $data_list
];
return json($result);
} else {
return json(['code' => 0, 'msg' => '查询不到数据']);
}
}
/**
* 获取指定模块的菜单
* @param string $module 模块名
* @author 路人甲乙
* @return mixed
*/
public function getModuleMenus($module = '')
{
$menus = MenuModel::getMenuTree(0, '', $module);
$result = [
'code' => 1,
'msg' => '请求成功',
'list' => format_linkage($menus)
];
return json($result);
}
/**
* 设置配色方案
* @param string $theme 配色名称
* @author 路人甲乙
*/
public function setTheme($theme = '') {
$map['name'] = 'system_color';
$map['group'] = 'system';
if (Db::name('admin_config')->where($map)->setField('value', $theme)) {
$this->success('设置成功');
} else {
$this->error('设置失败,请重试');
}
}
/**
* 获取侧栏菜单
* @param string $module_id 模块id
* @param string $module 模型名
* @param string $controller 控制器名
* @author 路人甲乙
* @return string
*/
public function getSidebarMenu($module_id = '', $module = '', $controller = '')
{
role_auth();
$menus = MenuModel::getSidebarMenu($module_id, $module, $controller);
$output = '';
foreach ($menus as $key => $menu) {
if (!empty($menu['url_value'])) {
$output = $menu['url_value'];
break;
}
if (!empty($menu['child'])) {
$output = $menu['child'][0]['url_value'];
break;
}
}
return $output;
}
/**
* 检查附件是否存在
* @param string $md5 文件md5
* @author 路人甲乙
* @return \think\response\Json
*/
public function check($md5 = '')
{
$md5 == '' && $this->error('参数错误');
// 判断附件是否已存在
if ($file_exists = AttachmentModel::get(['md5' => $md5])) {
if ($file_exists['driver'] == 'local') {
$file_path = PUBLIC_PATH.$file_exists['path'];
} else {
$file_path = $file_exists['path'];
}
return json([
'code' => 1,
'info' => '上传成功',
'class' => 'success',
'id' => $file_exists['id'],
'path' => $file_path
]);
} else {
$this->error('文件不存在');
}
}
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<?php
// +----------------------------------------------------------------------
// | 系统框架
// +----------------------------------------------------------------------
// | 版权所有 2017~2020 路人甲乙科技有限公司 [ http://www.lurenjiayi.com ]
// +----------------------------------------------------------------------
// | 官方网站:http://www.lurenjiayi.com
// +----------------------------------------------------------------------
// | 开源协议 ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
namespace app\admin\controller;
use app\admin\model\HookPlugin;
use app\common\builder\ZBuilder;
use app\admin\model\Hook as HookModel;
use app\admin\model\HookPlugin as HookPluginModel;
/**
* 钩子控制器
* @package app\admin\controller
*/
class Hook extends Admin
{
/**
* 钩子管理
* @author 路人甲乙
* @return mixed
*/
public function index()
{
$map = $this->getMap();
$order = $this->getOrder();
// 数据列表
$data_list = HookModel::where($map)->order($order)->paginate();
// 分页数据
$page = $data_list->render();
// 使用ZBuilder快速创建数据表格
return ZBuilder::make('table')
->setPageTitle('钩子管理') // 设置页面标题
->setSearch(['name' => '钩子名称']) // 设置搜索框
->addColumns([ // 批量添加数据列
['name', '名称'],
['description', '描述'],
['plugin', '所属插件', 'callback', function($plugin){
return $plugin == '' ? '系统' : $plugin;
}],
['system', '系统钩子', 'yesno'],
['status', '状态', 'switch'],
['right_button', '操作', 'btn']
])
->addOrder('name,status')
->addTopButtons('add,enable,disable') // 批量添加顶部按钮
->addRightButtons('edit') // 批量添加右侧按钮
->setRowList($data_list) // 设置表格数据
->setPages($page) // 设置分页数据
->fetch(); // 渲染模板
}
/**
* 新增
* @author 路人甲乙
*/
public function add()
{
// 保存数据
if ($this->request->isPost()) {
// 表单数据
$data = $this->request->post();
$data['system'] = 1;
// 验证
$result = $this->validate($data, 'Hook');
if(true !== $result) $this->error($result);
if ($hook = HookModel::create($data)) {
cache('hook_plugins', null);
// 记录行为
action_log('hook_add', 'admin_hook', $hook['id'], UID, $data['name']);
$this->success('新增成功', 'index');
} else {
$this->error('新增失败');
}
}
// 使用ZBuilder快速创建表单
return ZBuilder::make('form')
->setPageTitle('新增')
->addText('name', '钩子名称', '由字母和下划线组成,如:<code>page_tips</code>')
->addText('description', '钩子描述')
->fetch();
}
/**
* 编辑
* @param int $id 钩子id
* @author 路人甲乙
*/
public function edit($id = 0)
{
if ($id === 0) $this->error('参数错误');
// 保存数据
if ($this->request->isPost()) {
$data = $this->request->post();
// 验证
$result = $this->validate($data, 'Hook');
if(true !== $result) $this->error($result);
if ($hook = HookModel::update($data)) {
// 调整插件顺序
if ($data['sort'] != '') {
HookPluginModel::sort($data['name'], $data['sort']);
}
cache('hook_plugins', null);
// 记录行为
action_log('hook_edit', 'admin_hook', $hook['id'], UID, $data['name']);
$this->success('编辑成功', 'index');
} else {
$this->error('编辑失败');
}
}
// 获取数据
$info = HookModel::get($id);
// 该钩子的所有插件
$hooks = HookPluginModel::where('hook', $info['name'])->order('sort')->column('plugin');
$hooks = parse_array($hooks);
// 使用ZBuilder快速创建表单
return ZBuilder::make('form')
->setPageTitle('编辑')
->addHidden('id')
->addText('name', '钩子名称', '由字母和下划线组成,如:<code>page_tips</code>')
->addText('description', '钩子描述')
->addSort('sort', '插件排序', '', $hooks)
->setFormData($info)
->fetch();
}
/**
* 快速编辑(启用/禁用)
* @param string $status 状态
* @author 路人甲乙
* @return mixed
*/
public function quickEdit($status = '')
{
$id = $this->request->post('pk');
$status = $this->request->param('value');
$hook_name = HookModel::where('id', $id)->value('name');
if (false === HookPluginModel::where('hook', $hook_name)->setField('status', $status == 'true' ? 1 : 0)) {
$this->error('操作失败,请重试');
}
cache('hook_plugins', null);
$details = $status == 'true' ? '启用钩子' : '禁用钩子';
return parent::quickEdit(['hook_edit', 'admin_hook', $id, UID, $details]);
}
/**
* 启用
* @param array $record 行为日志内容
* @author 路人甲乙
* @return mixed
*/
public function enable($record = [])
{
return $this->setStatus('enable');
}
/**
* 禁用
* @param array $record 行为日志内容
* @author 路人甲乙
* @return mixed
*/
public function disable($record = [])
{
return $this->setStatus('disable');
}
/**
* 删除钩子
* @param array $record 行为日志内容
* @author 路人甲乙
* @return mixed
*/
public function delete($record = [])
{
$ids = $this->request->isPost() ? input('post.ids/a') : input('param.ids');
$map['id'] = ['in', $ids];
$map['system'] = 1;
if (HookModel::where($map)->find()) {
$this->error('禁止删除系统钩子');
}
return $this->setStatus('delete');
}
/**
* 设置状态
* @param string $type 类型
* @param array $record 行为日志内容
* @author 路人甲乙
* @return mixed
*/
public function setStatus($type = '', $record = [])
{
$ids = $this->request->param('ids/a');
foreach ($ids as $id) {
$hook_name = HookModel::where('id', $id)->value('name');
if (false === HookPluginModel::where('hook', $hook_name)->setField('status', $type == 'enable' ? 1 : 0)) {
$this->error('操作失败,请重试');
}
}
cache('hook_plugins', null);
$hook_delete = is_array($ids) ? '' : $ids;
$hook_names = HookModel::where('id', 'in', $ids)->column('name');
return parent::setStatus($type, ['hook_'.$type, 'admin_hook', $hook_delete, UID, implode('、', $hook_names)]);
}
}
<?php
// +----------------------------------------------------------------------
// | 系统框架
// +----------------------------------------------------------------------
// | 版权所有 2017~2020 路人甲乙科技有限公司 [ http://www.lurenjiayi.com ]
// +----------------------------------------------------------------------
// | 官方网站:http://www.lurenjiayi.com
// +----------------------------------------------------------------------
// | 开源协议 ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
namespace app\admin\controller;
use app\common\controller\Common;
/**
* ie提示页面控制器
* @package app\admin\controller
*/
class Ie extends Common
{
/**
* 显示ie提示
* @author 路人甲乙
* @return mixed
*/
public function index(){
// ie浏览器判断
if (get_browser_type() == 'ie') {
return $this->fetch();
} else {
$this->redirect('admin/index/index');
}
}
}
\ No newline at end of file
<?php
// +----------------------------------------------------------------------
// | 系统框架
// +----------------------------------------------------------------------
// | 版权所有 2017~2020 路人甲乙科技有限公司 [ http://www.lurenjiayi.com ]
// +----------------------------------------------------------------------
// | 官方网站:http://www.lurenjiayi.com
// +----------------------------------------------------------------------
// | 开源协议 ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
namespace app\admin\controller;
use think\Cache;
use think\helper\Hash;
use think\Db;
use app\common\builder\ZBuilder;
use app\user\model\User as UserModel;
/**
* 后台默认控制器
* @package app\admin\controller
*/
class Index extends Admin
{
/**
* 后台首页
* @author 路人甲乙
* @return string
*/
public function index()
{
$admin_pass = Db::name('admin_user')->where('id', 1)->value('password');
if (UID == 1 && $admin_pass && Hash::check('admin', $admin_pass)) {
$this->assign('default_pass', 1);
}
$num=get_spapi();
if($num=='1'){
$this->assign('tips', "交易服务已启动");
}else{
$this->assign('tips', "交易服务未启动,请在到配资管理/证券管理下启动交易服务");
}
return $this->fetch();
}
/**
* 清空系统缓存
* @author 路人甲乙
*/
public function wipeCache()
{
if (!empty(config('wipe_cache_type'))) {
foreach (config('wipe_cache_type') as $item) {
if ($item == 'LOG_PATH') {
$dirs = (array) glob(constant($item) . '*');
foreach ($dirs as $dir) {
array_map('unlink', glob($dir . '/*.log'));
}
array_map('rmdir', $dirs);
} else {
array_map('unlink', glob(constant($item) . '/*.*'));
}
}
Cache::clear();
$this->success('清空成功');
} else {
$this->error('请在系统设置中选择需要清除的缓存类型');
}
}
/**
* 个人设置
* @author 路人甲乙
*/
public function profile()
{
// 保存数据
if ($this->request->isPost()) {
$data = $this->request->post();
$data['nickname'] == '' && $this->error('昵称不能为空');
$data['id'] = UID;
// 如果没有填写密码,则不更新密码
if ($data['password'] == '') {
unset($data['password']);
}
$UserModel = new UserModel();
if ($user = $UserModel->allowField(['nickname', 'email', 'password', 'mobile', 'avatar'])->update($data)) {
// 记录行为
action_log('user_edit', 'admin_user', UID, UID, get_nickname(UID));
$this->success('编辑成功');
} else {
$this->error('编辑失败');
}
}
// 获取数据
$info = UserModel::where('id', UID)->field('password', true)->find();
// 使用ZBuilder快速创建表单
return ZBuilder::make('form')
->addFormItems([ // 批量添加表单项
['static', 'username', '用户名', '不可更改'],
['text', 'nickname', '昵称', '可以是中文'],
['text', 'email', '邮箱', ''],
['password', 'password', '密码', '必填,6-20位'],
['text', 'mobile', '手机号'],
['image', 'avatar', '头像']
])
->setFormData($info) // 设置表单数据
->fetch();
}
/**
* 检查版本更新
* @author 路人甲乙
* @return \think\response\Json
*/
public function checkUpdate()
{
$params = config('panel');
$params['domain'] = request()->domain();
$params['website'] = config('web_site_title');
$params['ip'] = $_SERVER['SERVER_ADDR'];
$params['php_os'] = PHP_OS;
$params['php_version'] = PHP_VERSION;
$params['mysql_version'] = db()->query('select version() as version')[0]['version'];
$params['server_software'] = $_SERVER['SERVER_SOFTWARE'];
$params = http_build_query($params);
$opts = [
CURLOPT_TIMEOUT => 20,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_URL => config('panel.product_update'),
CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'],
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => $params
];
// 初始化并执行curl请求
$ch = curl_init();
curl_setopt_array($ch, $opts);
$data = curl_exec($ch);
curl_close($ch);
$result = json_decode($data, true);
if ($result['code'] == 1) {
return json([
'update' => '<a class="badge badge-primary" href="http://www.lurenjiayi.com/download" target="_blank">有新版本:'.$result["version"].'</a>',
'auth' => $result['auth']
]);
} else {
return json([
'update' => '',
'auth' => $result['auth']
]);
}
}
public function pz()
{
$pz = Db::name('stock_borrow')->where('status', -1)->count();
return $pz;
}
public function cz()
{
$cz = Db::name('money_recharge')->where('status', 0)->count();
return $cz;
}
}
\ No newline at end of file
<?php
// +----------------------------------------------------------------------
// | 系统框架
// +----------------------------------------------------------------------
// | 版权所有 2017~2020 路人甲乙科技有限公司 [ http://www.lurenjiayi.com ]
// +----------------------------------------------------------------------
// | 官方网站:http://www.lurenjiayi.com
// +----------------------------------------------------------------------
// | 开源协议 ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
namespace app\admin\controller;
use app\common\builder\ZBuilder;
use app\admin\model\Log as LogModel;
use think\Db;
/**
* 系统日志控制器
* @package app\admin\controller
*/
class Log extends Admin
{
/**
* 日志列表
* @author 路人甲乙
* @return mixed
*/
public function index()
{
// 查询
$map = $this->getMap();
// 排序
$order = $this->getOrder('admin_log.id desc');
// 数据列表
$data_list = LogModel::getAll($map, $order);
// 分页数据
$page = $data_list->render();
// 使用ZBuilder快速创建数据表格
return ZBuilder::make('table')
->setPageTitle('系统日志') // 设置页面标题
->setSearch(['admin_action.title' => '行为名称', 'admin_user.username' => '执行者', 'admin_module.title' => '所属模块']) // 设置搜索框
->hideCheckbox()
->addColumns([ // 批量添加数据列
['id', '编号'],
['title', '行为名称'],
['username', '执行者'],
['action_ip', '执行IP', 'callback', 'long2ip'],
['module_title', '所属模块'],
['create_time', '执行时间', 'datetime', '', 'Y-m-d H:i:s'],
['right_button', '操作', 'btn']
])
->addOrder(['title' => 'admin_action', 'username' => 'admin_user', 'module_title' => 'admin_module.title'])
->addFilter(['admin_action.title', 'admin_user.username', 'module_title' => 'admin_module.title'])
->addRightButton('edit', ['icon' => 'fa fa-eye', 'title' => '详情', 'href' => url('details', ['id' => '__id__'])])
->setRowList($data_list) // 设置表格数据
->setPages($page) // 设置分页数据
->fetch(); // 渲染模板
}
/**
* 日志详情
* @param null $id 日志id
* @author 路人甲乙
*/
public function details($id = null)
{
if ($id === null) $this->error('缺少参数');
$info = LogModel::getAll(['admin_log.id' => $id]);
$info = $info[0];
$info['action_ip'] = long2ip($info['action_ip']);
// 使用ZBuilder快速创建表单
return ZBuilder::make('form')
->setPageTitle('编辑') // 设置页面标题
->addFormItems([ // 批量添加表单项
['hidden', 'id'],
['static', 'title', '行为名称'],
['static', 'username', '执行者'],
['static', 'record_id', '目标ID'],
['static', 'action_ip', '执行IP'],
['static', 'module_title', '所属模块'],
['textarea', 'remark', '备注'],
])
->hideBtn('submit')
->setFormData($info) // 设置表单数据
->fetch();
}
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
<?php
// +----------------------------------------------------------------------
// | 系统框架
// +----------------------------------------------------------------------
// | 版权所有 2017~2020 路人甲乙科技有限公司 [ http://www.lurenjiayi.com ]
// +----------------------------------------------------------------------
// | 官方网站:http://www.lurenjiayi.com
// +----------------------------------------------------------------------
// | 开源协议 ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
namespace app\admin\controller;
use app\common\builder\ZBuilder;
use app\admin\model\Packet as PacketModel;
/**
* 数据包控制器
* @package app\admin\controller
*/
class Packet extends Admin
{
/**
* 首页
* @param string $group 分组
* @author 路人甲乙
* @return mixed
*/
public function index($group = 'local')
{
// 配置分组信息
$list_group = ['local' => '本地数据包'];
$tab_list = [];
foreach ($list_group as $key => $value) {
$tab_list[$key]['title'] = $value;
$tab_list[$key]['url'] = url('index', ['group' => $key]);
}
$PacketModel = new PacketModel;
$data_list = $PacketModel->getAll();
foreach ($data_list as &$value) {
if (isset($value['author_url']) && !empty($value['author_url'])) {
$value['author'] = '<a href="'. $value['author_url']. '" target="_blank">'. $value['author'] .'</a>';
}
}
if ($data_list === false) {
$this->error($PacketModel->getError());
}
// 自定义按钮
$btn_install = [
'title' => '安装',
'icon' => 'fa fa-fw fa-sign-in',
'class' => 'btn btn-xs btn-default ajax-get confirm',
'href' => url('install', ['name' => '__id__'])
];
$btn_uninstall = [
'title' => '卸载',
'icon' => 'fa fa-fw fa-sign-out',
'class' => 'btn btn-xs btn-default ajax-get confirm',
'href' => url('uninstall', ['name' => '__id__'])
];
$btn_install_all = [
'title' => '安装',
'icon' => 'fa fa-fw fa-sign-in',
'class' => 'btn btn-primary ajax-post confirm',
'href' => url('install')
];
$btn_uninstall_all = [
'title' => '卸载',
'icon' => 'fa fa-fw fa-sign-out',
'class' => 'btn btn-danger ajax-post confirm',
'href' => url('uninstall')
];
switch ($group) {
case 'local':
// 使用ZBuilder快速创建数据表格
return ZBuilder::make('table')
->setPageTitle('数据包管理') // 设置页面标题
->setPrimaryKey('name')
->setTabNav($tab_list, $group) // 设置tab分页
->hideCheckbox()
->addColumns([ // 批量添加数据列
['name', '名称'],
['title', '标题'],
//['author', '作者'],
['version', '版本号'],
['status', '是否安装', 'yesno'],
//['right_button', '操作', 'btn']
])
// ->addTopButton('custom', $btn_install_all)
//->addTopButton('custom', $btn_uninstall_all)
//->addRightButton('custom', $btn_install) // 添加右侧按钮
//->addRightButton('custom', $btn_uninstall) // 添加右侧按钮
->setRowList($data_list) // 设置表格数据
->fetch(); // 渲染模板
break;
case 'online':
return '<h2>正在制作中...</h2>';
break;
}
}
/**
* 安装
* @param string $name 数据包名
* @author 路人甲乙
* @return mixed
*/
public function install($name = '')
{
$names = $name != '' ? (array)$name : $this->request->param('ids/a');
foreach ($names as $name) {
$result = PacketModel::install($name);
if ($result === true) {
if (!PacketModel::where('name', $name)->find()) {
$data = PacketModel::getInfoFromFile($name);
$data['status'] = 1;
$data['tables'] = json_encode($data['tables']);
PacketModel::create($data);
}
} else {
$this->error('安装失败:'. $result);
}
}
// 记录行为
$packet_titles = PacketModel::where('name', 'in', $names)->column('title');
action_log('packet_install', 'admin_packet', 0, UID, implode('、', $packet_titles));
$this->success('安装成功');
}
/**
* 卸载
* @param string $name 数据包名
* @author 路人甲乙
*/
public function uninstall($name = '')
{
$names = $name != '' ? (array)$name : $this->request->param('ids/a');
// 记录行为
$packet_titles = PacketModel::where('name', 'in', $names)->column('title');
action_log('packet_uninstall', 'admin_packet', 0, UID, implode('、', $packet_titles));
foreach ($names as $name) {
PacketModel::uninstall($name);
}
$this->success('卸载成功');
}
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<?php
// +----------------------------------------------------------------------
// | 系统框架
// +----------------------------------------------------------------------
// | 版权所有 2017~2020 路人甲乙科技有限公司 [ http://www.lurenjiayi.com ]
// +----------------------------------------------------------------------
// | 官方网站:http://www.lurenjiayi.com
// +----------------------------------------------------------------------
// | 开源协议 ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
namespace app\admin\model;
use think\Model;
use think\Request;
/**
* 统一授权模型
* @package app\admin\model
*/
class Access extends Model
{
// 设置当前模型对应的完整数据表名称
protected $table = '__ADMIN_ACCESS__';
/**
* 获取用户授权节点
* @param int $uid 用户id
* @param string $group 权限分组,可以以点分开模型名称和分组名称,如user.group
* @author 路人甲乙
* @return array|bool
*/
public function getAuthNode($uid = 0, $group = '')
{
if ($uid == 0 || $group == '') {
$this->error = '缺少参数';
return false;
}
if (strpos($group, '.')) {
list($module, $group) = explode('.', $group);
} else {
$module = Request::instance()->module();
}
$map = [
'module' => $module,
'group' => $group,
'uid' => $uid
];
return $this->where($map)->column('nid');
}
/**
* 检查用户的某个节点是否授权
* @param int $uid 用户id
* @param string $group $group 权限分组,可以以点分开模型名称和分组名称,如user.group
* @param int $node 需要检查的节点id
* @author 路人甲乙
* @return bool
*/
public function checkAuthNode($uid = 0, $group = '', $node = 0)
{
if ($uid == 0 || $group == '' || $node == 0) {
$this->error = '缺少参数';
return false;
}
// 获取该用户的所有授权节点
$nodes = $this->getAuthNode($uid, $group);
if (!$nodes) {
$this->error = '该用户没有授权任何节点';
return false;
}
$nodes = array_flip($nodes);
if (isset($nodes[$node])) {
return true;
} else {
$this->error = '未授权';
return false;
}
}
}
<?php
// +----------------------------------------------------------------------
// | 系统框架
// +----------------------------------------------------------------------
// | 版权所有 2017~2020 路人甲乙科技有限公司 [ http://www.lurenjiayi.com ]
// +----------------------------------------------------------------------
// | 官方网站:http://www.lurenjiayi.com
// +----------------------------------------------------------------------
// | 开源协议 ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
namespace app\admin\model;
use think\Model;
/**
* 日志模型
* @package app\admin\model
*/
class Action extends Model
{
// 设置当前模型对应的完整数据表名称
protected $table = '__ADMIN_ACTION__';
// 自动写入时间戳
protected $autoWriteTimestamp = true;
}
\ No newline at end of file
<?php
// +----------------------------------------------------------------------
// | 系统框架
// +----------------------------------------------------------------------
// | 版权所有 2017~2020 路人甲乙科技有限公司 [ http://www.lurenjiayi.com ]
// +----------------------------------------------------------------------
// | 官方网站:http://www.lurenjiayi.com
// +----------------------------------------------------------------------
// | 开源协议 ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
namespace app\admin\model;
use think\Model;
/**
* 附件模型
* @package app\admin\model
*/
class Attachment extends Model
{
// 设置当前模型对应的完整数据表名称
protected $table = '__ADMIN_ATTACHMENT__';
// 自动写入时间戳
protected $autoWriteTimestamp = true;
/**
* 根据附件id获取路径
* @param string|array $id 附件id
* @param int $type 类型:0-补全目录,1-直接返回数据库记录的地址
* @return string|array 路径
*/
public function getFilePath($id = '', $type = 0)
{
if (is_array($id)) {
$data_list = $this->where('id', 'in', $id)->select();
$paths = [];
foreach ($data_list as $key => $value) {
if ($value['driver'] == 'local') {
$paths[$key] = ($type == 0 ? PUBLIC_PATH : '').$value['path'];
} else {
$paths[$key] = $value['path'];
}
}
return $paths;
} else {
$data = $this->where('id', $id)->find();
if ($data) {
if ($data['driver'] == 'local') {
return ($type == 0 ? PUBLIC_PATH : '').$data['path'];
} else {
return $data['path'];
}
} else {
return false;
}
}
}
/**
* 根据图片id获取缩略图路径,如果缩略图不存在,则返回原图路径
* @param string $id 图片id
* @author 路人甲乙
* @return mixed
*/
public function getThumbPath($id = '')
{
$result = $this->where('id', $id)->field('path,driver,thumb')->find();
if ($result) {
if ($result['driver'] == 'local') {
return $result['thumb'] != '' ? PUBLIC_PATH.$result['thumb'] : PUBLIC_PATH.$result['path'];
} else {
return $result['thumb'] != '' ? $result['thumb'] : $result['path'];
}
} else {
return $result;
}
}
/**
* 根据附件id获取名称
* @param string $id 附件id
* @return string 名称
*/
public function getFileName($id = '')
{
return $this->where('id', $id)->value('name');
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<?php
namespace app\apicom\model;
class BeforeValidException extends \UnexpectedValueException
{
}
This diff is collapsed.
This diff is collapsed.
<?php
namespace app\apicom\model;
class ExpiredException extends \UnexpectedValueException
{
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment