初始化

This commit is contained in:
liut
2021-10-12 11:06:24 +08:00
commit ff0b4d5b12
1270 changed files with 405680 additions and 0 deletions
+14
View File
@@ -0,0 +1,14 @@
/.idea
/.vscode
/vendor
*.log
thinkphp
.env
.DS_Store
/tp.com
/public/nginx.htaccess
/public/default
/public/server/chunks/*
/public/server/upload/*
/public/temp/*
/public/avatar/*
+83
View File
@@ -0,0 +1,83 @@
# SkyPan
#### 介绍
一款多用户赚钱网盘程序
#### 软件架构
前端
* Pear-admin
* Layui
* Jquery
后端
* PHP 7.3
* Thinkphp5.1
* Mysql
`服务器 nginx`
#### 环境依赖
* `fileinfo`
#### 安装教程
* 下载源码包 skpan-1.xxx.zip
* 解压到网站目录
* 通过`composer`安装相关依赖,在应用根目录运行`composer install`
* 导入数据库文件skpan.sql
* 后台帐号密码`admin`
composer 加速
```
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
```
#### nginx伪静态规则
```
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
}
}
```
#### nginx下载规则
```
location /下载目录名 {
internal;
}
```
#### 使用说明
1. xxxx
2. xxxx
3. xxxx
#### 参考Cloudreve下载
https://xiaoluzyw.lanzoui.com/iMblCto46sb
#### OSS帐号
`Bucket域名` skpan-store-1.oss-cn-hangzhou.aliyuncs.com
`Endpoint` oss-cn-hangzhou.aliyuncs.com
`AccessKey` LTAI5tRkL7PfE5YrYnK5i5Vp
`AccessKeySecret` LSRzPi3vGLsOdKh6Q48Wl89nTp6O9R
#### COS帐号
`SecretId` AKIDpEJHRNjG2nQtFTowuqlaKeDg5Pi0weuA
`SecretKey` Lajv0umaEi4KAuY9bzFQzTrBMwMct461
`APPID` 1253809068
`存储桶名称` skpan-1253809068
`访问域名` https://skpan-1253809068.cos.ap-guangzhou.myqcloud.com
+1
View File
@@ -0,0 +1 @@
deny from all
+52
View File
@@ -0,0 +1,52 @@
<?php
namespace app\admin\controller;
use app\common\controller\Admin;
use app\common\model\Users;
use think\captcha\Captcha;
class Auth extends Admin
{
public function login(){
if((new Users)->login_auth('admin')){
return redirect('index/index');
}
if($this->request->isPost()){
$username = input('post.username');
$password = input('post.password');
$captcha = input('post.captcha');
try {
if(!captcha_check($captcha)){
throw new \Exception('验证码错误');
}
(new Users)->login($username,$password,'admin');
return json(['code' => 200,'msg' => '登录成功,正在跳转后台..']);
}catch (\Throwable $e){
return json(['code' => 502,'msg' => '登录失败:' . $e->getMessage()]);
}
}else{
return $this->fetch();
}
}
public function logout(){
(new Users)->logout('admin');
return json(['code' => 200,'msg' => '退出登录成功']);
}
public function verify(){
$config = [
'length' => 4
];
$captcha = new Captcha($config);
return $captcha->entry();
}
}
+63
View File
@@ -0,0 +1,63 @@
<?php
namespace app\admin\controller;
use app\common\controller\Admin;
use app\common\model\Certify as CertifyModel;
use app\common\model\Users;
class Certify extends Admin
{
public function index(){
if($this->request->isAjax()){
$page = input('get.page',1);
$limit = input('get.limit',20);
$list = CertifyModel::order('create_time desc')
->page($page,$limit)
->field('id,uid,name,idcard,status,create_time')
->select()->each(function($item){
$item['create_time'] = date('Y-m-d H:i',$item['create_time']);
$item['uid'] = Users::where('id',$item['uid'])->value('username');
return $item;
});
$count = CertifyModel::count();
return json([
'code' => 0,
'msg' => '获取成功',
'data' => $list->toArray(),
'count' => $count
]);
}
return $this->fetch();
}
public function edit(){
$id = input('get.id');
$info = CertifyModel::where('id',$id)->find();
if(empty($info)){
return json(['code' => 502,'msg' => '数据不存在']);
}
$info['status'] = 1;
$info->save();
Users::where('id',$info['uid'])->update(['is_auth' => 1]);
return json(['code' => 200,'msg' => '处理成功']);
}
public function delete(){
$id = input('get.id');
CertifyModel::where('id',$id)->delete();
return json(['code' => 200,'msg' => '删除成功']);
}
}
@@ -0,0 +1,91 @@
<?php
namespace app\admin\controller;
use app\common\controller\Admin;
use app\common\model\Profit;
use app\common\model\Stores;
use app\common\model\Users;
class Dashboard extends Admin
{
public function index(){
// 获取当月所有时间
$month_time = [];
$time_type = [];
for ($i = 0;$i < 30;$i++){
$month_time[] = strtotime('-'.$i.' day');
$time_type[] = "'".date('m-d',strtotime('-'.$i.' day'))."'";
}
$time_type = array_reverse($time_type);
$time_type = implode(',',$time_type);
// 获取当月间隔时间
$start_time = strtotime(date('Y-m-d',strtotime('-29 day')));
$end_time = strtotime('now');
// 获取30天的统计记录
$profit = Profit::whereTime('create_time','>=',$start_time)
->whereTime('create_time','<=',$end_time)
->order('create_time desc')
->select();
// 图表统计
$series_reg = str_split(str_repeat('0',30),1);
$series_order = str_split(str_repeat('0',30),1);
$series_money = str_split(str_repeat('0',30),1);
foreach ($month_time as $key => $item){
$item_time = date('Y-m-d',$item);
foreach ($profit as $profit_item){
$profit_time = date('Y-m-d',$profit_item['create_time']);
if($item_time == $profit_time){
$series_reg[$key] = $profit_item['count_reg'];
$series_order[$key] = $profit_item['count_order_yes'];
$series_money[$key] = $profit_item['count_money'];
}
}
}
$series_reg = array_reverse($series_reg);
$series_reg = implode(',',$series_reg);
$series_order = array_reverse($series_order);
$series_order = implode(',',$series_order);
$series_money = array_reverse($series_money);
$series_money = implode(',',$series_money);
// 用户数量统计
$default_group = config('register.default_group');
$vip_group = config('vip.vip_group');
$default_user = Users::where('group',$default_group)->count();
$vip_user = Users::where('group',$vip_group)->count();
$file = Stores::count();
$size = Stores::sum('size');
$this->assign('count',[
'user' => $default_user,
'vip' => $vip_user,
'file' => $file,
'size' => countSize($size)
]);
$this->assign('profit',$profit);
$this->assign('series_reg',$series_reg);
$this->assign('series_order',$series_order);
$this->assign('series_money',$series_money);
$this->assign('time_type',$time_type);
return $this->fetch();
}
}
+152
View File
@@ -0,0 +1,152 @@
<?php
namespace app\admin\controller;
use app\common\controller\Admin;
use app\common\model\driver\AliyunOss;
use app\common\model\driver\Local;
use app\common\model\driver\TxyunOss;
use app\common\model\Policys;
use app\common\model\Stores;
use app\common\model\Users;
use think\response\Download;
class File extends Admin
{
public function index(){
if($this->request->isAjax()){
$page = input('get.page',1);
$limit = input('get.limit',10);
$map = [];
// 获取筛选条件
$start_time = input('get.start_time','');
$end_time = input('get.end_time','');
$policy_id = input('get.policy','');
$ext = input('get.ext','');
$uid = input('get.uid','');
$origin_name = input('get.origin_name','');
if(!empty($start_time) && !empty($end_time)){
$map[] = ['create_time','between time',[$start_time,$end_time]];
}
if(!empty($policy_id)){
$map[] = ['policy_id','=',$policy_id];
}
if(!empty($ext)){
$map[] = ['ext','=',$ext];
}
if(!empty($uid)){
$map[] = ['uid','=',$uid];
}
if(!empty($origin_name)){
$map[] = ['origin_name','like','%'.$origin_name.'%'];
}
//获取排序条件
$sort_key = input('get.sort_key','create_time');
$sort = input('get.sort',0);
$order_type = empty($sort) ? 'desc' : 'asc';
$list = Stores::where($map)->page($page,$limit)->order($sort_key,$order_type)->select()->each(function($item){
$item['icon'] = getFileIcon($item['ext'],'admin');
$item['size'] = countSize($item['size']);
$item['uid'] = Users::where('id',$item['uid'])->value('nickname');
$item['policy_id'] = Policys::where('id',$item['policy_id'])->value('name');
return $item;
});
$count = Stores::where($map)->count();
return json([
'code' => 0,
'msg' => '加载成功',
'count' => $count,
'data' => $list->toArray()
]);
}else{
$policy = Policys::field('id,name')->select();
$this->assign('policy',$policy);
return $this->fetch();
}
}
public function delete(){
$ids = input('get.ids');
$store = Stores::withTrashed()->where('id','in',$ids)->select();
if(empty($store)){
$this->returnError('数据不存在');
}
$succ = 0;
foreach ($store as $item){
$item->delete();
$succ++;
}
$this->returnSuccess('成功删除'.$succ.'个文件');
}
public function download(){
$id = input('get.id',0);
$info = Stores::get($id);
if(empty($info)){
$this->error('数据不存在');
}
$policy = Policys::get($info['policy_id']);
if(empty($policy)){
$this->error('存储策略不存在');
}
// 远程文件下载
if($policy['type'] == 'remote'){
$down_url = getDownloadRemote($info['file_name'],$info['origin_name'],$policy->config['server_uri'],"",$policy->config['access_token']);
$this->redirect($down_url);
}
// 存储驱动下载
switch ($policy['type']){
case 'aliyunoss':
$driver = new AliyunOss(0,0,0);
break;
case 'txyunoss':
$driver = new TxyunOss(0,0,0);
break;
default:
$driver = new Local(0,0,0);
break;
}
// 下载
return $driver->download($info,"",$policy);
}
public function info(){
$id = input('get.id',0);
$info = Stores::get($id);
if(empty($info)){
$this->error('数据不存在');
}
$username = Users::where('id',$info['uid'])->value('username');
$policy_name = Policys::where('id',$info['policy_id'])->value('name');
$file_path = $info['file_name'];
$this->assign('username',$username);
$this->assign('policy_name',$policy_name);
$this->assign('file_path',$file_path);
$this->assign('info',$info);
return $this->fetch();
}
}
+84
View File
@@ -0,0 +1,84 @@
<?php
namespace app\admin\controller;
use app\common\controller\Admin;
use app\common\model\Groups;
use app\common\model\Policys;
use app\common\model\Users;
class Group extends Admin
{
public function index(){
if($this->request->isAjax()){
$page = input('get.page',1);
$limit = input('get.limit',10);
$list = Groups::page($page,$limit)->select()->each(function($item){
$item['max_storage'] = countSize($item['max_storage']);
$item['is_sys'] = $item['is_sys'] ? '<span class="layui-badge-rim">系统</span>' : '自定义';
$item['user_num'] = Users::where('group',$item['id'])->count();
$item['policy_id'] = Policys::where('id',$item['policy_id'])->value('name');
return $item;
});
$count = Groups::count();
$this->returnSuccessLayTable($count,$list->toArray());
}
return $this->fetch();
}
public function add(){
if($this->request->isPost()){
$this->callModelMethods('Groups','addGroup',input('post.'));
$this->returnSuccess();
}
$policy = Policys::getPolicyAll();
$this->assign('policy',$policy);
return $this->fetch();
}
public function edit(){
$id = input('get.id');
$info = Groups::get($id);
if(empty($info)){
$this->error('用户组数据不存在');
}
if($this->request->isPost()){
$this->callModelMethods('Groups','editGroup',$id,input('post.'));
$this->returnSuccess();
}
$policy = Policys::getPolicyAll();
$this->assign('policy',$policy);
$this->assign('info',$info);
return $this->fetch();
}
public function delete(){
$id = input('get.id');
$info = Groups::get($id);
if(empty($info)){
$this->returnError('用户组不存在');
}
if($info['is_sys'] == 1){
$this->returnError('系统用户组,不可删除');
}
/**
* 判断用户组下是否存在用户
*/
Groups::where('id',$id)->delete();
$this->returnSuccess('删除成功');
}
}
+43
View File
@@ -0,0 +1,43 @@
<?php
namespace app\admin\controller;
use app\common\controller\Admin;
class Index extends Admin
{
public function index(){
$theme = [
// 标题
'title' => 'SkPan网盘',
// logo
'logo' => '/static/admin/images/logo.png',
// 菜单
'menu' => json_encode(config('menu.')),
// 管理员
'admin' => [
'avatar' => '/static/admin/images/avatar.jpg',
'nickname' => $this->adminInfo['nickname']
],
// 激活菜单
'menu_select' => 1,
// 首页url
'home_url' => url('dashboard/index'),
// 后台url
'index_url' => url('index/index'),
// 退出登录url
'logout_url' => url('auth/logout'),
// 修改密码url
'pass_url' => url('auth/pass'),
// 清除缓存
'clear_cache_url' => url('index/cache')
];
$this->assign('theme',$theme);
return $this->fetch();
}
}
+68
View File
@@ -0,0 +1,68 @@
<?php
namespace app\admin\controller;
use app\common\controller\Admin;
use app\common\model\Order as OrderModel;
use app\common\model\Users;
class Order extends Admin
{
public function index(){
if($this->request->isAjax()){
$page = input('get.page',1);
$limit = input('get.limit',10);
$search_type = input('get.search_type','');
$search_value = input('get.search_value','');
$status = input('get.status','');
$map = [];
if(!empty($search_type) && !empty($search_value)){
$map[] = [$search_type,'like','%'.$search_value.'%'];
}
if(!empty($status)){
$map[] = ['status','=',$status];
}
$pay_types = [
'alipay' => '支付宝',
'wxpay' => '微信'
];
$list = OrderModel::where($map)
->page($page,$limit)
->select()->each(function ($item) use($pay_types){
$item['uid'] = Users::where('id',$item['uid'])->value('username');
$item['type'] = $pay_types[$item['type']] ?? '';
$item['money'] = number_format($item['money'],2).'¥';
$item['vip_day'] = $item['vip_day'].'天';
$item['out_trade_no'] = empty($item['out_trade_no']) ? '-' : $item['out_trade_no'];
$item['create_time'] = date('Y-m-d H:i',$item['create_time']);
$item['pay_time'] = empty($item['pay_time']) ? '-' : date('Y-m-d H:i',$item['pay_time']);
return $item;
});
$count = OrderModel::count();
return json([
'code' => 0,
'msg' => '加载成功',
'count' => $count,
'data' => $list->toArray()
]);
}
return $this->fetch();
}
public function delete(){
$ids = input('get.ids');
OrderModel::where('id','in',$ids)->delete();
$this->returnSuccess('删除订单成功');
}
}
+77
View File
@@ -0,0 +1,77 @@
<?php
namespace app\admin\controller;
use app\common\controller\Admin;
use app\common\model\Policys;
use app\common\model\Stores;
class Policy extends Admin
{
public function index(){
if($this->request->isAjax()){
$page = input('get.page',1);
$limit = input('get.limit',10);
$list = Policys::page($page,$limit)->field('id,name,type,max_size')->select()->each(function($item){
$item['max_size'] = countSize($item['max_size']);
$item['type'] = PolicyType($item['type']);
$item['file_num'] = Stores::where('policy_id',$item['id'])->count();
$item['store_num'] = countSize(Stores::where('policy_id',$item['id'])->sum('size'));
return $item;
});
$count = Policys::count();
return json([
'code' => 0,
'msg' => '加载成功',
'count' => $count,
'data' => $list->toArray()
]);
}else{
return $this->fetch();
}
}
public function add(){
if($this->request->isPost()){
$this->callModelMethods('Policys','addPolicy',input('post.'));
$this->returnSuccess();
}
return $this->fetch();
}
public function edit(){
$id = input('get.id');
$info = Policys::get($id);
if(empty($info)){
$this->error('存储策略数据不存在');
}
if($this->request->isPost()){
$this->callModelMethods('Policys','editPolicy',$id,input('post.'));
$this->returnSuccess();
}
$this->assign('info',$info);
return $this->fetch();
}
public function delete(){
$id = input('get.id');
$info = Policys::get($id);
if(empty($info)){
$this->returnError('存储策略不存在');
}
Policys::where('id',$id)->delete();
$this->returnSuccess('删除成功');
}
}
+116
View File
@@ -0,0 +1,116 @@
<?php
namespace app\admin\controller;
use app\common\controller\Admin;
use app\common\model\Policys;
use app\common\model\Profit;
use app\common\model\Stores;
use app\common\model\Users;
class Recycle extends Admin
{
public function index(){
if($this->request->isAjax()){
$page = input('get.page',1);
$limit = input('get.limit',10);
$map = [];
// 获取筛选条件
$start_time = input('get.start_time','');
$end_time = input('get.end_time','');
$policy_id = input('get.policy','');
$ext = input('get.ext','');
$uid = input('get.uid','');
$origin_name = input('get.origin_name','');
if(!empty($start_time) && !empty($end_time)){
$map[] = ['delete_time','between time',[$start_time,$end_time]];
}
if(!empty($policy_id)){
$map[] = ['policy_id','=',$policy_id];
}
if(!empty($ext)){
$map[] = ['ext','=',$ext];
}
if(!empty($uid)){
$map[] = ['uid','=',$uid];
}
if(!empty($origin_name)){
$map[] = ['origin_name','like','%'.$origin_name.'%'];
}
//获取排序条件
$sort_key = input('get.sort_key','delete_time');
$sort = input('get.sort',0);
$order_type = empty($sort) ? 'desc' : 'asc';
$list = Stores::onlyTrashed()->where($map)->page($page,$limit)->order($sort_key,$order_type)->select()->each(function($item){
$item['icon'] = getFileIcon($item['ext'],'admin');
$item['size'] = countSize($item['size']);
$item['uid'] = Users::where('id',$item['uid'])->value('nickname');
$item['policy_id'] = Policys::where('id',$item['policy_id'])->value('name');
return $item;
});
$count = Stores::onlyTrashed()->where($map)->count();
return json([
'code' => 0,
'msg' => '加载成功',
'count' => $count,
'data' => $list->toArray()
]);
}
$policy = Policys::field('id,name')->select();
$this->assign('policy',$policy);
return $this->fetch();
}
public function restore(){
$ids = input('get.ids');
$store = Stores::onlyTrashed()->where('id','in',$ids)->select();
if(empty($store)){
$this->returnError('数据不存在');
}
$succ = 0;
foreach ($store as $item){
$item->restore();
$succ++;
}
$this->returnSuccess('处理完成,共恢复'.$succ.'个文件');
}
public function delete(){
$ids = input('get.ids');
$store = Stores::onlyTrashed()->where('id','in',$ids)->select();
if(empty($store)){
$this->returnError('数据不存在');
}
$succ = 0;
foreach ($store as $item){
$item->delete(true);
// 删除分享信息
Profit::where('file_id',$item['id'])
->where('uid',$item['uid'])
->delete();
$succ++;
}
$this->returnSuccess('成功删除'.$succ.'个文件');
}
}
+68
View File
@@ -0,0 +1,68 @@
<?php
namespace app\admin\controller;
use app\common\controller\Admin;
use app\common\model\Reports;
class Report extends Admin
{
public function index(){
if($this->request->isAjax()){
$page = input('get.page',1);
$limit = input('get.limit',20);
$list = Reports::order('create_time desc')
->page($page,$limit)
->field('id,source_name,source_url,source_username,type,contact,real_ip,status,create_time')
->select()->each(function($item){
$item['create_time'] = date('Y-m-d H:i',$item['create_time']);
return $item;
});
$count = Reports::count();
return json([
'code' => 0,
'msg' => '获取成功',
'data' => $list->toArray(),
'count' => $count
]);
}
return $this->fetch();
}
public function edit(){
$id = input('get.id');
$info = Reports::where('id',$id)->find();
if(empty($info)){
$this->error('数据不存在');
}
if($this->request->isPost()){
$status = input('post.status');
$info['status'] = $status;
$info->save();
return json(['code' => 200,'msg' => '处理成功']);
}
$this->assign('info',$info);
return $this->fetch();
}
public function delete(){
$id = input('get.id');
Reports::where('id',$id)->delete();
return json(['code' => 200,'msg' => '删除成功']);
}
}
+84
View File
@@ -0,0 +1,84 @@
<?php
namespace app\admin\controller;
use app\common\controller\Admin;
use app\common\model\Groups;
use app\common\model\Setting as SettingModel;
use think\facade\Cache;
class Setting extends Admin
{
public function basic(){
$this->saveOptions();
$this->assign('option',$this->getOptions());
return $this->fetch();
}
public function register(){
$this->saveOptions();
$group = Groups::field('id,group_name')->select()->toArray();
$this->assign('group',$group);
$this->assign('option',$this->getOptions());
return $this->fetch();
}
public function pay(){
$this->saveOptions();
$this->assign('option',$this->getOptions());
return $this->fetch();
}
public function vip(){
$this->saveOptions();
$group = Groups::field('id,group_name')->select()->toArray();
$this->assign('group',$group);
$this->assign('option',$this->getOptions());
return $this->fetch();
}
public function email(){
$this->saveOptions();
$this->assign('option',$this->getOptions());
return $this->fetch();
}
protected function saveOptions(){
if($this->request->isPost()){
$type = $this->request->action();
$post = input('post.');
try {
// 更新数据库
foreach ($post as $key => $item){
SettingModel::where('set_name',$key)
->where('set_type',$type)
->update(['set_value' => $item]);
}
}catch (\Throwable $e){
$this->returnError($e->getMessage());
}
// 更新缓存
$setting = SettingModel::select()->toArray();
Cache::set('_setting_config',$setting);
$this->returnSuccess('保存成功');
}
}
protected function getOptions(): array
{
$type = $this->request->action();
$settings = SettingModel::where('set_type',$type)->select();
$options = [];
foreach ($settings as $item){
$options[$item['set_name']] = $item['set_value'];
}
return $options;
}
}
+206
View File
@@ -0,0 +1,206 @@
<?php
namespace app\admin\controller;
use app\common\controller\Admin;
use app\common\model\Groups;
use app\common\model\Users;
use think\Exception;
class User extends Admin
{
public function index(){
if($this->request->isAjax()){
$page = input('get.page',1);
$limit = input('get.limit',10);
$search_type = input('get.search_type','');
$search_value = input('get.search_value','');
$map = [];
if(!empty($search_type) && !empty($search_value)){
$map[] = [$search_type,'like','%'.$search_value.'%'];
}
$groups = Groups::column('group_name','id');
$default_group = config('register.default_group');
$list = Users::where($map)
->page($page,$limit)
->field('id,nickname,username,group,is_auth,amount,email,avatar,status,create_time')
->select()->each(function ($item) use ($groups,$default_group){
$group_name = $groups[$item['group']] ?? '未知';
if($item['group'] == 1){
$item['group'] = '<span class="layui-badge layui-bg-blue">'. $group_name .'</span>';
}elseif ($item['group'] == $default_group){
$item['group'] = '<span class="layui-badge layui-bg-gray">'. $group_name .'</span>';
}else{
$item['group'] = '<span class="layui-badge layui-bg-red">'. $group_name .'</span>';
}
$item['avatar'] = getUserHead($item['avatar']);
return $item;
});
$count = Users::count();
return json([
'code' => 0,
'msg' => '加载成功',
'count' => $count,
'data' => $list->toArray()
]);
}else{
return $this->fetch();
}
}
public function add(){
$default_group = config('register.default_group');
if($this->request->isPost()){
$data = input('post.');
$result = $this->validate($data,[
'username|用户帐号' => 'require|alphaNum|length:6,26',
'group|用户组' => 'require|number',
'password|登录密码' => 'require|alphaNum|length:6,18',
'repassword|重复密码' => 'require|confirm:password',
'email|安全邮箱' => 'require|email'
]);
if($result !== true) return json(['code' => 502,'msg' => $result]);
if(empty($data['group'])){
$data['group'] = $default_group;
}
//处理用户的VIP时间
if(!empty($data['group_expire'])){
$group_expire = strtotime($data['group_expire']);
}
try {
(new Users)->register($data['username'],$data['email'],$data['password'],$data['group'],[],$group_expire);
return json(['code' => 200,'msg' => '账号新增成功']);
}catch (Exception $e){
return json(['code' => 503,'msg' => $e->getMessage()]);
}
}else{
$group = Groups::field('id,group_name')->select()->toArray();
$this->assign('default_group',$default_group);
$this->assign('group',$group);
return $this->fetch();
}
}
public function del(){
$ids = input('get.ids');
if(count(explode(',',$ids)) > 20){
$this->returnError('删除失败,不能一次删除20条以上的数据');
}
$delete_users = Users::where('id','in',$ids)->field('id,group')->select()->toArray();
foreach ($delete_users as $item){
if($item['id'] == 1){
$this->returnError('删除失败,删除帐号中包含总管理员帐号');
break;
}
/**
* 待完成功能:删除用户后删除相关数据,如:上传储存的数据,订单数据,目录数据,分享数据等
*/
Users::where('id',$item['id'])->delete();
}
return json(['code' => 200,'msg' => '删除成功']);
}
public function edit(){
$id = input('get.id');
$info = Users::get($id);
if(empty($info)){
$this->error('用户数据不存在');
}
if($this->request->isPost()){
$data = input('post.');
$result = $this->validate($data,[
'email|安全邮箱' => 'email',
'password|登录密码' => 'alphaNum|length:6,18',
'group|用户组' => 'require|number'
]);
if($result !== true) return json(['code' => 502,'msg' => $result]);
$update = [];
if(!empty($data['email'])){
$update['email'] = $data['email'];
}
if(!empty($data['password'])){
$en_password = md5($data['password'] . config('app.pass_salt'));
$update['password'] = $en_password;
}
if($info['group'] == 1 && $info['id'] != $this->adminInfo['id'] && !empty($data['password']) && $this->adminInfo['id'] != 1){
$this->returnError('操作失败,您不能更改其他管理员组用户的密码');
}
if($info['id'] == $this->adminInfo['id'] && $data['group'] != $info['group']){
$this->returnError('操作失败,您不能更改自己的用户组');
}
if($info['id'] == 1 && $data['group'] != $info['group']){
$this->returnError('操作失败,您不能更改总管理员的用户组');
}
$update['group'] = $data['group'];
//处理用户的VIP时间
if($info['group_expire']<time()&&strtotime($data['group_expire'])>$info['group_expire']){
$update['group_expire'] = strtotime($data['group_expire']);
}
Users::where('id',$id)->update($update);
return json(['code' => 200,'msg' => '用户信息修改成功']);
}else{
$group = Groups::field('id,group_name')->select()->toArray();
$this->assign('group',$group);
$this->assign('info',$info);
return $this->fetch();
}
}
public function change_status(){
$id = input('get.id');
$status = input('get.status');
$info = Users::get($id);
if($info->isEmpty()){
$this->returnError('用户数据不存在');
}
if($info['id'] == 1){
$this->returnError('操作失败,您不能封禁总管理员的帐号');
}
if($info['id'] == $this->adminInfo['id']){
$this->returnError('操作失败,您不能封禁自己的帐号');
}
Users::where('id',$id)->update(['status' => $status]);
return json(['code' => 200,'msg' => '用户状态切换成功']);
}
}
+68
View File
@@ -0,0 +1,68 @@
<?php
namespace app\admin\controller;
use app\common\controller\Admin;
use app\common\model\Record;
use app\common\model\Users;
use app\common\model\Withdraw as WithdrawModel;
class Withdraw extends Admin
{
public function index(){
if($this->request->isAjax()){
$page = input('get.page',1);
$limit = input('get.limit',20);
$list = WithdrawModel::order('create_time desc')
->page($page,$limit)
->field('id,uid,money,alipay_account,alipay_name,create_time,status')
->select()->each(function($item){
$item['uid'] = Users::where('id',$item['uid'])->value('username');
$item['create_time'] = date('Y-m-d H:i',$item['create_time']);
return $item;
});
$count = WithdrawModel::count();
return json([
'code' => 0,
'msg' => '获取成功',
'data' => $list->toArray(),
'count' => $count
]);
}
return $this->fetch();
}
public function delete(){
$id = input('get.id');
WithdrawModel::where('id',$id)->delete();
return json(['code' => 200,'msg' => '删除成功']);
}
public function change(){
$id = input('get.id');
$status = input('get.status');
$info = WithdrawModel::where('id',$id)->find();
if(empty($info)){
return json(['code' => 502,'msg' => '数据记录不存在']);
}
$info['status'] = $status;
$info->save();
if($status == 2){
// 退回金额
Record::addRecord($info['uid'],0,'提现退回',$info['money'],'提现系统退回金额');
}
return json(['code' => 200,'msg' => '操作成功']);
}
}
+80
View File
@@ -0,0 +1,80 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/>
<title> {$Think.config.app_name} 后台管理 </title>
<!-- 样 式 文 件 -->
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
<link rel="stylesheet" href="/static/admin/css/other/login.css" />
</head>
<!-- 代 码 结 构 -->
<body style="background-size: cover;">
<form class="layui-form" action="javascript:void(0);">
<div class="layui-form-item">
<img class="logo" src="/static/admin/images/logo.png" />
<div class="title">{$Think.config.app_name}Yun</div>
<div class="desc">
{$Think.config.app_name} 后台管理
</div>
</div>
<div class="layui-form-item">
<input placeholder="账 户" type="text" name="username" hover class="layui-input"/>
</div>
<div class="layui-form-item">
<input placeholder="密 码" type="password" name="password" hover class="layui-input"/>
</div>
<div class="layui-form-item">
<input placeholder="验证码 : " type="text" maxlength="4" name="captcha" hover class="code layui-input layui-input-inline"/>
<img id="codeimg" class="codeImage" style="cursor: pointer;width: calc(100% - 192px);"/>
</div>
<br>
<div class="layui-form-item">
<button class="pear-btn pear-btn-success login" lay-submit lay-filter="login">
登 入
</button>
</div>
</form>
<!-- 资 源 引 入 -->
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['form', 'layer', 'jquery', 'element'], function () {
var $ = layui.jquery
, layer = layui.layer
, element = layui.element
, form = layui.form;
// 登 录 提 交
form.on('submit(login)', function(data) {
layer.load();
$.ajax({
type: "POST",
data: data.field,
success: function (res) {
layer.closeAll('loading');
if (res.code == 200){
layer.msg(res.msg,{icon:1,time:1000},function () {
location.href = "{:url('index/index')}";
})
} else {
layer.msg(res.msg,{icon:2,time:1000},function () {
initCode();
})
}
}
});
return false;
});
initCode();
function initCode() {
$('#codeimg').attr("src","{:url('auth/verify')}?data=" + new Date().getTime());
}
$('#codeimg').on('click', function () {
initCode();
});
})
</script>
</body>
</html>
+151
View File
@@ -0,0 +1,151 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
</head>
<body class="pear-container">
<div class="layui-card">
<div class="layui-card-body">
<table id="user-table" lay-filter="user-table"></table>
</div>
</div>
<script type="text/html" id="user-toolbar"></script>
<script type="text/html" id="user-bar">
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit"><i class="layui-icon layui-icon-survey"></i></button>
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
</script>
<script type="text/html" id="user-auth">
{{#if (d.status == 0) { }}
<span class="layui-badge layui-bg-orange">未审核</span>
{{# }else if(d.status == 1){ }}
<span class="layui-badge layui-bg-blue">已审核</span>
{{# } }}
</script>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['table', 'form', 'jquery','common'], function() {
let table = layui.table;
let form = layui.form;
let $ = layui.jquery;
let common = layui.common;
let cols = [
[{type: 'checkbox'},
{title: 'ID', field: 'id', align: 'center'},
{title: '用户帐号', field: 'uid', align: 'center'},
{title: '真实姓名', field: 'name', align: 'center'},
{title: '身份证号码', field: 'idcard', align: 'center'},
{title: '处理状态', field: 'status', align: 'center', templet: '#user-auth'},
{title: '创建时间', field: 'create_time', align: 'center'},
{title: '操作', toolbar: '#user-bar', align: 'center', width: 130}
]
]
table.render({
elem: '#user-table',
url: "{:url('certify/index')}",
page: true,
limit:20,
cols: cols,
skin: 'line',
toolbar: '#user-toolbar',
defaultToolbar: [{
title: '刷新',
layEvent: 'refresh',
icon: 'layui-icon-refresh',
}, 'filter', 'print', 'exports']
});
table.on('tool(user-table)', function(obj) {
if (obj.event === 'remove') {
window.remove(obj);
} else if (obj.event === 'edit') {
window.edit(obj);
}
});
table.on('toolbar(user-table)', function(obj) {
if (obj.event === 'refresh') {
window.refresh();
}
});
window.edit = function(obj) {
layer.confirm('确认通过该条实名认证请求吗?', {
icon: 3,
title: '提示'
}, function(index) {
layer.close(index);
let loading = layer.load();
$.ajax({
url: "{:url('certify/edit')}?id=" + obj.data['id'],
dataType: 'json',
type: 'get',
success: function(result) {
layer.close(loading);
if (result.code == 200) {
layer.msg(result.msg, {
icon: 1,
time: 1000
},function(){
window.refresh();
});
} else {
layer.msg(result.msg, {
icon: 2,
time: 1000
});
}
}
})
});
}
window.remove = function(obj) {
layer.confirm('确定要删除该认证内容吗?', {
icon: 3,
title: '提示'
}, function(index) {
layer.close(index);
let loading = layer.load();
$.ajax({
url: "{:url('certify/delete')}?id=" + obj.data['id'],
dataType: 'json',
type: 'get',
success: function(result) {
layer.close(loading);
if (result.code == 200) {
layer.msg(result.msg, {
icon: 1,
time: 1000
}, function() {
obj.del();
});
} else {
layer.msg(result.msg, {
icon: 2,
time: 1000
});
}
}
})
});
}
window.refresh = function(param) {
table.reload('user-table');
}
})
</script>
</body>
</html>
+177
View File
@@ -0,0 +1,177 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>控制后台</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
<link rel="stylesheet" href="/static/admin/css/other/console1.css" />
</head>
<body class="pear-container">
<div>
<div class="layui-row layui-col-space10">
<div class="layui-col-xs6 layui-col-md3">
<div class="layui-card top-panel">
<div class="layui-card-header">用户数量</div>
<div class="layui-card-body">
<div class="layui-row layui-col-space5">
<div class="layui-col-xs8 layui-col-md8 top-panel-number" style="color: #28333E;">
{$count.user}
</div>
<div class="layui-col-xs4 layui-col-md4 top-panel-tips">
<span class="icon pear-icon" style="font-size: 40px">&#xe6e0;</span>
</div>
</div>
</div>
</div>
</div>
<div class="layui-col-xs6 layui-col-md3">
<div class="layui-card top-panel">
<div class="layui-card-header">VIP用户</div>
<div class="layui-card-body">
<div class="layui-row layui-col-space5">
<div class="layui-col-xs8 layui-col-md8 top-panel-number" style="color: #28333E;">
{$count.vip}
</div>
<div class="layui-col-xs4 layui-col-md4 top-panel-tips">
<span class="icon pear-icon" style="font-size: 40px">&#xe697;</span>
</div>
</div>
</div>
</div>
</div>
<div class="layui-col-xs6 layui-col-md3">
<div class="layui-card top-panel">
<div class="layui-card-header">文件数量</div>
<div class="layui-card-body">
<div class="layui-row layui-col-space5">
<div class="layui-col-xs8 layui-col-md8 top-panel-number" style="color: #28333E;">
{$count.file}
</div>
<div class="layui-col-xs4 layui-col-md4 top-panel-tips">
<span class="icon pear-icon" style="font-size: 40px">&#xe6a4;</span>
</div>
</div>
</div>
</div>
</div>
<div class="layui-col-xs6 layui-col-md3">
<div class="layui-card top-panel">
<div class="layui-card-header">文件大小</div>
<div class="layui-card-body">
<div class="layui-row layui-col-space5">
<div class="layui-col-xs8 layui-col-md8 top-panel-number" style="color: #28333E;">
{$count.size}
</div>
<div class="layui-col-xs4 layui-col-md4 top-panel-tips">
<span class="icon pear-icon" style="font-size: 40px">&#xe6ad;</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="layui-row layui-col-space10">
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-body">
<div class="layui-tab custom-tab layui-tab-brief" lay-filter="docDemoTabBrief">
<div id="echarts-records" style="background-color:#ffffff;min-height:400px;padding: 10px"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--</div>-->
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['layer', 'echarts', 'element'], function() {
var $ = layui.jquery,
layer = layui.layer,
element = layui.element,
echarts = layui.echarts;
var echartsRecords = echarts.init(document.getElementById('echarts-records'), 'walden');
var option = {
tooltip: {
trigger: 'axis'
},
xAxis: [{
type: 'category',
data: [{$time_type|raw}],
axisLine: {
lineStyle: {
color: "#999"
}
}
}],
yAxis: [{
type: 'value',
splitNumber: 4,
splitLine: {
lineStyle: {
type: 'dashed',
color: '#DDD'
}
},
axisLine: {
show: false,
lineStyle: {
color: "#333"
},
},
nameTextStyle: {
color: "#999"
},
splitArea: {
show: false
}
}],
tooltip: {
valueSuffix: ' 个',
crosshairs: true,
shared: true
},
legend: {
layout: 'vertical',
align: 'right',
verticalAlign: 'middle',
borderWidth: 0
},
series: [
{
name: '注册',
type: 'line',
color: 'rgba(0,242,59,246)', marker: { radius: 6 }, data: [{$series_reg|raw}]
},
{
name: '成功订单',
type: 'line',
color: 'rgba(0,15,182,59)', marker: { radius: 6 }, data: [{$series_order|raw}]
},
{
name: '金额',
type: 'line',
color: 'rgba(0,92,219,192)', marker: { radius: 6 }, data: [{$series_money|raw}]
}
]
};
echartsRecords.setOption(option);
window.onresize = function() {
echartsRecords.resize();
}
});
</script>
</body>
</html>
+288
View File
@@ -0,0 +1,288 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
</head>
<body class="pear-container">
<div class="layui-card">
<div class="layui-card-body">
<form class="layui-form" action="">
<div class="layui-form-item">
<div id="test6">
<div class="layui-form-item layui-inline">
<label class="layui-form-label">开始日期</label>
<div class="layui-input-inline">
<input type="text" autocomplete="off" name="start_time" id="test-startDate-1" class="layui-input" placeholder="开始日期">
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">结束日期</label>
<div class="layui-input-inline">
<input type="text" autocomplete="off" name="end_time" id="test-endDate-1" class="layui-input" placeholder="结束日期">
</div>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">排序字段</label>
<div class="layui-input-inline">
<select name="sort_key" lay-verify="required">
<option value="create_time">上传时间排序</option>
<option value="update_time">更新时间排序</option>
<option value="id">ID排序</option>
<option value="size">文件大小排序</option>
<option value="count_down">下载量排序</option>
<option value="count_open">浏览量排序</option>
</select>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">排序方式</label>
<div class="layui-input-inline">
<select name="sort" lay-verify="required">
<option value="0">降序</option>
<option value="1">升序</option>
</select>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">存储筛选</label>
<div class="layui-input-inline">
<select name="policy" lay-verify="required">
{volist name="$policy" id="vo"}
<option value="{$vo.id}">{$vo.name}</option>
{/volist}
</select>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">文件后缀</label>
<div class="layui-input-inline">
<input type="text" name="ext" placeholder="请输入文件后缀 如 png jpg 等" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">用户UID</label>
<div class="layui-input-inline">
<input type="number" name="uid" placeholder="请输入UID" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">文件名称</label>
<div class="layui-input-inline">
<input type="text" name="origin_name" placeholder="请输入文件名称" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-inline">
<button class="pear-btn pear-btn-md pear-btn-primary" style="margin-left: 36px;" lay-submit lay-filter="user-query">
<i class="layui-icon layui-icon-search"></i>
搜索结果
</button>
<button type="reset" class="pear-btn pear-btn-md">
<i class="layui-icon layui-icon-refresh"></i>
重置搜索
</button>
</div>
</div>
</form>
</div>
</div>
<div class="layui-card">
<div class="layui-card-body">
<table id="user-table" lay-filter="user-table"></table>
</div>
</div>
<script type="text/html" id="user-toolbar">
<button class="pear-btn pear-btn-danger pear-btn-md" lay-event="batchRemove">
<i class="layui-icon layui-icon-delete"></i>
批量删除
</button>
</script>
<script type="text/html" id="user-bar">
<button class="pear-btn pear-btn-primary pear-btn-sm" title="下载文件" lay-event="download"><i class="layui-icon layui-icon-download-circle"></i></button>
<button class="pear-btn pear-btn-primary pear-btn-sm" title="查看文件" lay-event="info"><i class="layui-icon layui-icon-form"></i></button>
<button class="pear-btn pear-btn-danger pear-btn-sm" title="删除文件" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
</script>
<script type="text/html" id="file-icon">
<img src="{{ d.icon }}">
</script>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['table', 'form', 'jquery','common','laydate'], function() {
let table = layui.table;
let form = layui.form;
let $ = layui.jquery;
let common = layui.common;
var laydate = layui.laydate;
laydate.render({
elem: '#test6'
,range: ['#test-startDate-1', '#test-endDate-1']
});
let cols = [
[{type: 'checkbox'},
{title: '', field: 'icon', align: 'center',width: 40,templet: '#file-icon'},
{title: '文件名', field: 'origin_name',width: 300, align: 'left'},
{title: '大小', field: 'size', align: 'center'},
{title: '上传用户', field: 'uid', align: 'center'},
{title: '储存服务器', field: 'policy_id', align: 'center'},
{title: '文件后缀', field: 'ext', align: 'center'},
{title: '下载量', field: 'count_down', align: 'center'},
{title: '浏览量', field: 'count_open', align: 'center'},
{title: '上传时间', field: 'create_time', align: 'center'},
{title: '操作', toolbar: '#user-bar', align: 'center', width: 160}
]
]
table.render({
elem: '#user-table',
url: "{:url('file/index')}",
page: true,
cols: cols,
skin: 'line',
limit:20,
toolbar: '#user-toolbar',
defaultToolbar: [{
title: '刷新',
layEvent: 'refresh',
icon: 'layui-icon-refresh',
}, 'print', 'exports']
});
table.on('tool(user-table)', function(obj) {
if (obj.event === 'remove') {
window.remove(obj);
} else if(obj.event === 'info'){
window.info(obj);
} else if (obj.event === 'download') {
window.download(obj);
}
});
table.on('toolbar(user-table)', function(obj) {
if (obj.event === 'refresh') {
window.refresh();
} else if (obj.event === 'batchRemove') {
window.batchRemove(obj);
}
});
form.on('submit(user-query)', function(data) {
table.reload('user-table', {
where: data.field
})
return false;
});
window.info = function(obj) {
layer.open({
type: 2,
title: '文件信息',
shade: 0.1,
area: ['600px', '600px'],
content: "{:url('file/info')}?id=" + obj.data['id']
});
}
window.download = function(obj) {
window.open("{:url('file/download')}?id=" + obj.data['id']);
}
window.remove = function(obj) {
layer.confirm('确定要删除该文件吗?', {
icon: 3,
title: '提示'
}, function(index) {
layer.close(index);
let loading = layer.load();
$.ajax({
url: "{:url('file/delete')}?ids=" + obj.data['id'],
dataType: 'json',
type: 'get',
success: function(result) {
layer.close(loading);
if (result.code == 200) {
layer.msg(result.msg, {
icon: 1,
time: 1000
}, function() {
obj.del();
});
} else {
layer.msg(result.msg, {
icon: 2,
time: 1000
});
}
}
})
});
}
window.batchRemove = function(obj) {
var checkIds = common.checkField(obj,'id');
if (checkIds === "") {
layer.msg("未选中数据", {
icon: 3,
time: 1000
});
return false;
}
layer.confirm('确定要删除这些文件[' + checkIds + ']吗?', {
icon: 3,
title: '提示'
}, function(index) {
layer.close(index);
let loading = layer.load();
$.ajax({
url: "{:url('file/delete')}?ids=" + checkIds,
dataType: 'json',
type: 'get',
success: function(result) {
layer.close(loading);
if (result.code == 200) {
layer.msg(result.msg, {
icon: 1,
time: 1000
}, function() {
table.reload('user-table');
});
} else {
layer.msg(result.msg, {
icon: 2,
time: 1000
});
}
}
})
});
}
window.refresh = function(param) {
table.reload('user-table');
}
})
</script>
</body>
</html>
+71
View File
@@ -0,0 +1,71 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
</head>
<body>
<form class="layui-form">
<div class="mainBox">
<div class="main-container">
<div class="layui-form-item">
<label class="layui-form-label">文件名</label>
<div class="layui-input-block">
<div class="layui-form-mid">{$info.origin_name}</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">文件大小</label>
<div class="layui-input-block">
<div class="layui-form-mid">{:countSize($info.size)}</div>
</div>
</div>
<br>
<div class="layui-form-item">
<label class="layui-form-label">储存策略</label>
<div class="layui-input-block">
<div class="layui-form-mid">{$policy_name}</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">所属用户</label>
<div class="layui-input-block">
<div class="layui-form-mid">{$username}</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">储存地址</label>
<div class="layui-input-block">
<div class="layui-form-mid">{$file_path}</div>
</div>
</div>
<br>
<div class="layui-form-item">
<label class="layui-form-label">上传时间</label>
<div class="layui-input-block">
<div class="layui-form-mid">{$info.create_time}</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">更新时间</label>
<div class="layui-input-block">
<div class="layui-form-mid">{$info.update_time}</div>
</div>
</div>
</div>
</div>
</form>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
</body>
</html>
+119
View File
@@ -0,0 +1,119 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
</head>
<body>
<form class="layui-form">
<div class="mainBox">
<div class="main-container">
<div class="layui-form-item">
<label class="layui-form-label">用户组名</label>
<div class="layui-input-block">
<input type="text" name="group_name" required lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">用户组的名称</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">存储策略</label>
<div class="layui-input-block">
<select name="policy_id" lay-verify="required">
{volist name="$policy" id="vo"}
<option value="{$vo.id}">{$vo.name}</option>
{/volist}
</select>
<div class="layui-form-mid layui-word-aux">为该用户组绑定一个上传策略</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">上传大小</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="number" name="max_storage" required value="10" lay-verify="required" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid">单位:</div>
<div class="layui-input-inline">
<select name="storage_size" lay-verify="required">
<option value="1">B</option>
<option value="1024">KB</option>
<option value="1048576" selected>MB</option>
<option value="1073741824">GB</option>
</select>
</div>
<div class="layui-form-mid layui-word-aux">限制用户组单文件上传大小</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">下载限速</label>
<div class="layui-input-inline">
<input type="text" name="speed" min="0" placeholder="留空表示不限速" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid layui-word-aux"><b>KB/s</b> 填写0表示禁止下载</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">分享文件</label>
<div class="layui-input-inline">
<input type="radio" name="allow_share" value="1" title="允许">
<input type="radio" name="allow_share" value="0" title="禁止" checked>
</div>
<div class="layui-form-mid layui-word-aux">是否允许创建文件分享链接</div>
</div>
</div>
</div>
<div class="bottom">
<div class="button-container">
<button type="submit" class="layui-btn layui-btn-normal layui-btn-sm" lay-submit="" lay-filter="save">
<i class="layui-icon layui-icon-ok"></i>
提交
</button>
<button type="reset" class="layui-btn layui-btn-primary layui-btn-sm">
<i class="layui-icon layui-icon-refresh"></i>
重置
</button>
</div>
</div>
</form>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['form','jquery'],function(){
let form = layui.form;
let $ = layui.jquery;
form.on('submit(save)', function(data){
$.ajax({
data:JSON.stringify(data.field),
dataType:'json',
contentType:'application/json',
type:'post',
success:function(res){
//判断有没有权限
if(res && res.code == 999){
layer.msg(res.msg, {
icon: 5,
time: 2000,
})
return false;
}else if(res.code == 200){
layer.msg(res.msg,{icon:1,time:1000},function(){
parent.layer.close(parent.layer.getFrameIndex(window.name));//关闭当前页
parent.layui.table.reload("user-table");
});
}else{
layer.msg(res.msg,{icon:2,time:1000});
}
}
})
return false;
});
})
</script>
</body>
</html>
+118
View File
@@ -0,0 +1,118 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
</head>
<body>
<form class="layui-form">
<div class="mainBox">
<div class="main-container">
<div class="layui-form-item">
<label class="layui-form-label">用户组名</label>
<div class="layui-input-block">
<input type="text" name="group_name" value="{$info.group_name}" required lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">用户组的名称</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">存储策略</label>
<div class="layui-input-block">
<select name="policy_id" lay-verify="required">
{volist name="$policy" id="vo"}
<option value="{$vo.id}" {eq name="$vo.id" value="$info.policy_id"}selected{/eq}>{$vo.name}</option>
{/volist}
</select>
<div class="layui-form-mid layui-word-aux">为该用户组绑定一个上传策略</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">上传大小</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="number" name="max_storage" required value="{:countSize($info.max_storage,true)[0]}" lay-verify="required" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid">单位:</div>
<div class="layui-input-inline">
<select name="storage_size" lay-verify="required">
{php}
$storage_size = countSize($info['max_storage'],true)[1];
{/php}
<option value="1" {eq name="$storage_size" value="1"}selected{/eq}>B</option>
<option value="1024" {eq name="$storage_size" value="1024"}selected{/eq}>KB</option>
<option value="1048576" {eq name="$storage_size" value="1048576"}selected{/eq}>MB</option>
<option value="1073741824" {eq name="$storage_size" value="1073741824"}selected{/eq}>GB</option>
</select>
</div>
<div class="layui-form-mid layui-word-aux">限制用户组单文件上传大小</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">下载限速</label>
<div class="layui-input-inline">
<input type="text" name="speed" min="0" value="{$info.speed}" placeholder="留空表示不限速" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid layui-word-aux"><b>KB/s</b> 填写0表示禁止下载</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">分享文件</label>
<div class="layui-input-inline">
<input type="radio" name="allow_share" value="1" title="允许" {eq name="$info.allow_share" value="1"}checked{/eq}>
<input type="radio" name="allow_share" value="0" title="禁止" {eq name="$info.allow_share" value="0"}checked{/eq}>
</div>
<div class="layui-form-mid layui-word-aux">是否允许创建文件分享链接</div>
</div>
</div>
</div>
<div class="bottom">
<div class="button-container">
<button type="submit" class="layui-btn layui-btn-normal layui-btn-sm" lay-submit="" lay-filter="save">
<i class="layui-icon layui-icon-ok"></i>
提交
</button>
</div>
</div>
</form>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['form','jquery'],function(){
let form = layui.form;
let $ = layui.jquery;
form.on('submit(save)', function(data){
$.ajax({
data:JSON.stringify(data.field),
dataType:'json',
contentType:'application/json',
type:'post',
success:function(res){
//判断有没有权限
if(res && res.code == 999){
layer.msg(res.msg, {
icon: 5,
time: 2000,
})
return false;
}else if(res.code == 200){
layer.msg(res.msg,{icon:1,time:1000},function(){
parent.layer.close(parent.layer.getFrameIndex(window.name));//关闭当前页
parent.layui.table.reload("user-table");
});
}else{
layer.msg(res.msg,{icon:2,time:1000});
}
}
})
return false;
});
})
</script>
</body>
</html>
+158
View File
@@ -0,0 +1,158 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>用户组管理</title>
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
</head>
<body class="pear-container">
<div class="layui-card">
<div class="layui-card-body">
<table id="user-table" lay-filter="user-table"></table>
</div>
</div>
<script type="text/html" id="user-toolbar">
<button class="pear-btn pear-btn-primary pear-btn-md" lay-event="add">
<i class="layui-icon layui-icon-add-1"></i>
新增用户组
</button>
</script>
<script type="text/html" id="user-bar">
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit"><i class="layui-icon layui-icon-edit"></i></button>
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
</script>
<script type="text/html" id="user-speed">
{{#if (d.speed == '') { }}
<span class="layui-badge layui-bg-blue">不限速</span>
{{# }else if(d.speed == 0){ }}
<span class="layui-badge layui-bg-orange">禁止下载</span>
{{# }else if(d.speed > 0){ }}
<span class="layui-badge-rim">{{ d.speed }} KB/s</span>
{{# } }}
</script>
<script type="text/html" id="user-share">
{{#if (d.allow_share == 0) { }}
<span class="layui-badge layui-bg-orange">禁止</span>
{{# }else if(d.allow_share == 1){ }}
<span class="layui-badge layui-bg-blue">允许</span>
{{# } }}
</script>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['table', 'form', 'jquery','common'], function() {
let table = layui.table;
let form = layui.form;
let $ = layui.jquery;
let common = layui.common;
let cols = [
[{type: 'checkbox'},
{title: 'ID', field: 'id', align: 'center'},
{title: '用户组名称', field: 'group_name', align: 'center'},
{title: '类型', field: 'is_sys', align: 'center'},
{title: '存储策略', field: 'policy_id', align: 'center'},
{title: '用户数量', field: 'user_num', align: 'center'},
{title: '上传大小限制', field: 'max_storage', align: 'center'},
{title: '下载限速', field: 'speed', align: 'center', templet: '#user-speed'},
{title: '允许分享', field: 'allow_share', align: 'center', templet: '#user-share'},
{title: '操作', toolbar: '#user-bar', align: 'center', width: 130}
]
]
table.render({
elem: '#user-table',
url: window.location.href,
page: true,
cols: cols,
skin: 'line',
toolbar: '#user-toolbar',
defaultToolbar: [{
title: '刷新',
layEvent: 'refresh',
icon: 'layui-icon-refresh',
}, 'print', 'exports']
});
table.on('tool(user-table)', function(obj) {
if (obj.event === 'remove') {
window.remove(obj);
} else if (obj.event === 'edit') {
window.edit(obj);
}
});
table.on('toolbar(user-table)', function(obj) {
if (obj.event === 'add') {
window.add();
} else if (obj.event === 'refresh') {
window.refresh();
}
});
window.add = function() {
layer.open({
type: 2,
title: '新增用户组',
shade: 0.1,
area: [common.isModile()?'100%':'600px', common.isModile()?'100%':'500px'],
content: "{:url('group/add')}"
});
}
window.edit = function(obj) {
layer.open({
type: 2,
title: '修改用户组',
shade: 0.1,
area: ['600px', '500px'],
content: "{:url('group/edit')}?id=" + obj.data['id']
});
}
window.remove = function(obj) {
layer.confirm('确定要删除该用户组吗?', {
icon: 3,
title: '提示'
}, function(index) {
layer.close(index);
let loading = layer.load();
$.ajax({
url: "{:url('group/delete')}?id=" + obj.data['id'],
dataType: 'json',
type: 'get',
success: function(result) {
layer.close(loading);
if (result.code == 200) {
layer.msg(result.msg, {
icon: 1,
time: 1000
}, function() {
obj.del();
});
} else {
layer.msg(result.msg, {
icon: 2,
time: 1000
});
}
}
})
});
}
window.refresh = function(param) {
table.reload('user-table');
}
})
</script>
</body>
</html>
+93
View File
@@ -0,0 +1,93 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title> {$Think.config.app_name} 后台管理 </title>
<!-- 依 赖 样 式 -->
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
<!-- 加 载 样 式-->
<link rel="stylesheet" href="/static/admin/css/load.css" />
<!-- 布 局 样 式 -->
<link rel="stylesheet" href="/static/admin/css/admin.css" />
<script>
if(window!=top){ top.location.href = location.href; }
var skpan_config = {
title:"{$theme.title}",
logo:"{$theme.logo}",
menu: {$theme.menu|raw},
menu_select:"{$theme.menu_select}",
home_url:"{$theme.home_url}",
index_url:"{$theme.index_url}",
logout_url:"{$theme.logout_url}",
pass_url:"{$theme.pass_url}",
clear_cache_url:"{$theme.clear_cache_url}"
}
</script>
</head>
<!-- 结 构 代 码 -->
<body class="layui-layout-body pear-admin">
<!-- 布 局 框 架 -->
<div class="layui-layout layui-layout-admin">
<div class="layui-header">
<!-- 顶 部 左 侧 功 能 -->
<ul class="layui-nav layui-layout-left">
<li class="collaspe layui-nav-item"><a href="#" class="layui-icon layui-icon-shrink-right"></a></li>
<li class="refresh layui-nav-item"><a href="#" class="layui-icon layui-icon-refresh-1" loading=600></a></li>
</ul>
<!-- 顶 部 右 侧 菜 单 -->
<div id="control" class="layui-layout-control"></div>
<ul class="layui-nav layui-layout-right" lay-filter="layui_nav_right">
<li class="layui-nav-item layui-hide-xs"><a href="#" class="fullScreen layui-icon layui-icon-screen-full"></a></li>
<li class="layui-nav-item user">
<!-- 头 像 -->
<a href="javascript:;">
<img src="{$theme.admin.avatar}" class="layui-nav-img">
{$theme.admin.nickname}
</a>
<!-- 功 能 菜 单 -->
<dl class="layui-nav-child">
<dd>
<a href="javascript:void(0);" class="logout">
退出登录
</a>
</dd>
</dl>
</li>
</ul>
</div>
<!-- 侧 边 区 域 -->
<div class="layui-side layui-bg-black">
<!-- 顶 部 图 标 -->
<div class="layui-logo">
<!-- 图 表 -->
<img class="logo">
<!-- 标 题 -->
<span class="title"></span>
</div>
<!-- 侧 边 菜 单 -->
<div class="layui-side-scroll">
<div id="sideMenu"></div>
</div>
</div>
<!-- 视 图 页 面 -->
<div class="layui-body">
<!-- 内 容 页 面 -->
<div id="content"></div>
</div>
</div>
<!-- 遮 盖 层 -->
<div class="pear-cover"></div>
<!-- 移 动 端 便 捷 操 作 -->
<div class="pear-collasped-pe collaspe"><a href="#" class="layui-icon layui-icon-shrink-right"></a></div>
<!-- 加 载 动 画-->
<div class="loader-main">
<div class="loader"></div>
</div>
<!-- 依 赖 脚 本 -->
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<!-- 框 架 初 始 化 -->
<script src="/static/admin/js/boostrap.js"></script>
</body>
</html>
+222
View File
@@ -0,0 +1,222 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
</head>
<body class="pear-container">
<div class="layui-card">
<div class="layui-card-body">
<form class="layui-form" action="">
<div class="layui-form-item">
<div class="layui-form-item layui-inline">
<label class="layui-form-label">搜索类型</label>
<div class="layui-input-inline">
<select name="search_type" lay-verify="required">
<option value="trade_no">订单号</option>
<option value="out_trade_no">易支付订单号</option>
</select>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">支付状态</label>
<div class="layui-input-inline">
<select name="status" lay-verify="required">
<option value="0">等待支付</option>
<option value="1">支付成功</option>
<option value="2">订单关闭</option>
</select>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">搜索内容</label>
<div class="layui-input-inline">
<input type="text" name="search_value" placeholder="请输入搜索内容" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-inline">
<button class="pear-btn pear-btn-md pear-btn-primary" lay-submit lay-filter="user-query">
<i class="layui-icon layui-icon-search"></i>
搜索结果
</button>
<button type="reset" class="pear-btn pear-btn-md">
<i class="layui-icon layui-icon-refresh"></i>
重置搜索
</button>
</div>
</div>
</form>
</div>
</div>
<div class="layui-card">
<div class="layui-card-body">
<table id="user-table" lay-filter="user-table"></table>
</div>
</div>
<script type="text/html" id="user-toolbar">
<button class="pear-btn pear-btn-danger pear-btn-md" lay-event="batchRemove">
<i class="layui-icon layui-icon-delete"></i>
批量删除
</button>
</script>
<script type="text/html" id="user-bar">
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
</script>
<script type="text/html" id="user-auth">
{{#if (d.status == 0) { }}
<span class="layui-badge layui-bg-orange">等待支付</span>
{{# }else if(d.status == 1){ }}
<span class="layui-badge layui-bg-blue">支付完成</span>
{{# }else if(d.status == 2){ }}
<span class="layui-badge layui-bg-red">订单关闭</span>
{{# } }}
</script>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['table', 'form', 'jquery','common'], function() {
let table = layui.table;
let form = layui.form;
let $ = layui.jquery;
let common = layui.common;
let cols = [
[{type: 'checkbox'},
{title: '订单号', field: 'trade_no', align: 'center', width: 250},
{title: '开通用户', field: 'uid', align: 'center'},
{title: '支付方式', field: 'type', align: 'center'},
{title: '支付金额', field: 'money', align: 'center'},
{title: '开通时长', field: 'vip_day', align: 'center'},
{title: '易支付订单号', field: 'out_trade_no', align: 'center'},
{title: '支付状态', field: 'status', align: 'center', templet: '#user-auth'},
{title: '发起时间', field: 'create_time', align: 'center'},
{title: '支付时间', field: 'pay_time', align: 'center'},
{title: '操作', toolbar: '#user-bar', align: 'center', width: 130}
]
]
table.render({
elem: '#user-table',
url: "{:url('order/index')}",
page: true,
limit: 20,
cols: cols,
skin: 'line',
toolbar: '#user-toolbar',
defaultToolbar: [{
title: '刷新',
layEvent: 'refresh',
icon: 'layui-icon-refresh',
}, 'filter', 'print', 'exports']
});
table.on('tool(user-table)', function(obj) {
if (obj.event === 'remove') {
window.remove(obj);
}
});
table.on('toolbar(user-table)', function(obj) {
if (obj.event === 'refresh') {
window.refresh();
} else if (obj.event === 'batchRemove') {
window.batchRemove(obj);
}
});
form.on('submit(user-query)', function(data) {
table.reload('user-table', {
where: data.field
})
return false;
});
window.remove = function(obj) {
layer.confirm('确定要删除订单吗?<br><b style="color: red">请勿删除正在等待支付或者支付完成的订单</b>', {
icon: 3,
title: '提示'
}, function(index) {
layer.close(index);
let loading = layer.load();
$.ajax({
url: "{:url('order/delete')}?ids=" + obj.data['id'],
dataType: 'json',
type: 'get',
success: function(result) {
layer.close(loading);
if (result.code == 200) {
layer.msg(result.msg, {
icon: 1,
time: 1000
}, function() {
obj.del();
});
} else {
layer.msg(result.msg, {
icon: 2,
time: 1000
});
}
}
})
});
}
window.batchRemove = function(obj) {
var checkIds = common.checkField(obj,'id');
if (checkIds === "") {
layer.msg("未选中数据", {
icon: 3,
time: 1000
});
return false;
}
layer.confirm('确定要批量删除这些订单吗?<br><b style="color: red">请勿删除正在等待支付或者支付完成的订单</b>', {
icon: 3,
title: '提示'
}, function(index) {
layer.close(index);
let loading = layer.load();
$.ajax({
url: "{:url('order/delete')}?ids=" + checkIds,
dataType: 'json',
type: 'get',
success: function(result) {
layer.close(loading);
if (result.code == 200) {
layer.msg(result.msg, {
icon: 1,
time: 1000
}, function() {
table.reload('user-table');
});
} else {
layer.msg(result.msg, {
icon: 2,
time: 1000
});
}
}
})
});
}
window.refresh = function(param) {
table.reload('user-table');
}
})
</script>
</body>
</html>
+241
View File
@@ -0,0 +1,241 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
<style>
.remote_field{
display: none;
}
</style>
</head>
<body>
<form class="layui-form">
<div class="mainBox">
<div class="main-container">
<div class="layui-form-item">
<label class="layui-form-label">策略名称</label>
<div class="layui-input-block">
<input type="text" name="name" lay-verify="required" placeholder="请输入上传策略的名称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">允许后缀</label>
<div class="layui-input-block">
<input type="text" name="filetype" placeholder="请输入文件后缀" class="layui-input">
<div class="layui-form-mid layui-word-aux">多个请以半角逗号","隔开,留空表示不限制。如"png,jpg"</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">存储服务器</label>
<div class="layui-input-block">
<select name="type" lay-verify="required" lay-filter="server_select">
<option value="local">本地</option>
<option value="remote">远程</option>
<option value="aliyunoss">阿里云OSS</option>
<option value="txyunoss">腾讯云COS</option>
</select>
<div class="layui-form-mid layui-word-aux">文件存储的服务器</div>
</div>
</div>
<div class="other-field">
</div>
</div>
</div>
<div class="bottom">
<div class="button-container">
<button type="submit" class="layui-btn layui-btn-normal layui-btn-sm" lay-submit="" lay-filter="save">
<i class="layui-icon layui-icon-ok"></i>
提交
</button>
</div>
</div>
</form>
<script id="field_local" type="text/html">
<div class="layui-form-item">
<label class="layui-form-label">存储目录</label>
<div class="layui-input-block">
<input type="text" name="save_dir" placeholder="请输入文件存放的目录" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">请以根目录 / 开始结尾要加"/"例如/uploads/</div>
</div>
</div>
</script>
<script id="field_remote" type="text/html">
<div class="layui-form-item">
<label class="layui-form-label">存储目录</label>
<div class="layui-input-block">
<input type="text" name="save_dir" placeholder="请输入文件存放的目录" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">请以根目录 / 开始结尾要加"/"例如/uploads/</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">远程Token</label>
<div class="layui-input-block">
<input type="text" name="access_token" placeholder="AccessToken" lay-verify="required" class="layui-input">
<div class="layui-form-mid layui-word-aux">请与远程服务端配置文件中保持一致</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">服务端URL</label>
<div class="layui-input-block">
<input type="text" name="server_uri" placeholder="服务端URL" lay-verify="required" class="layui-input">
<div class="layui-form-mid layui-word-aux">请填写合法的URL地址结尾要加"/"</div>
</div>
</div>
</script>
<script id="field_aliyunoss" type="text/html">
<div class="layui-form-item">
<label class="layui-form-label">存储目录</label>
<div class="layui-input-block">
<input type="text" name="save_dir" placeholder="请输入文件存放的目录" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">请以根目录 / 开始结尾要加"/"例如/uploads/</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">Endpoint</label>
<div class="layui-input-block">
<input type="text" name="endpoint" placeholder="Endpoint" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">OSS Endpoint</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">Bucket</label>
<div class="layui-input-block">
<input type="text" name="bucket" placeholder="Bucket" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">OSS Bucket</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">AccessKey</label>
<div class="layui-input-block">
<input type="text" name="access_key" placeholder="AccessKey" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">OSS AccessKey</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">AccessKeySecret</label>
<div class="layui-input-block">
<input type="text" name="access_secret" placeholder="AccessKeySecret" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">OSS AccessKeySecret</div>
</div>
</div>
</script>
<script id="field_txyunoss" type="text/html">
<div class="layui-form-item">
<label class="layui-form-label">存储目录</label>
<div class="layui-input-block">
<input type="text" name="save_dir" placeholder="请输入文件存放的目录" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">请以根目录 / 开始结尾要加"/"例如/uploads/</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">SecretId</label>
<div class="layui-input-block">
<input type="text" name="secret_id" placeholder="SecretId" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">COS SecretId</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">SecretKey</label>
<div class="layui-input-block">
<input type="text" name="secret_key" placeholder="SecretKey" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">COS SecretKey</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">Bucket</label>
<div class="layui-input-block">
<input type="text" name="bucket" placeholder="Bucket" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">COS Bucket</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">Region</label>
<div class="layui-input-block">
<input type="text" name="region" placeholder="Region" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">COS Region 存储桶地域</div>
</div>
</div>
</script>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['form','jquery'],function(){
let form = layui.form;
let $ = layui.jquery;
setFieldHtml('local');
function setFieldHtml(field){
let field_name = '#field_' + field;
let html = $(field_name).html();
if(typeof html !== "undefined"){
$(".other-field").html(html);
return true;
}
$(".other-field").html("");
return false;
}
form.on('select(server_select)',function(obj){
setFieldHtml(obj.value);
});
form.on('submit(save)', function(data){
$.ajax({
data:JSON.stringify(data.field),
dataType:'json',
contentType:'application/json',
type:'post',
success:function(res){
//判断有没有权限
if(res && res.code == 999){
layer.msg(res.msg, {
icon: 5,
time: 2000,
})
return false;
}else if(res.code == 200){
layer.msg(res.msg,{icon:1,time:1000},function(){
parent.layer.close(parent.layer.getFrameIndex(window.name));//关闭当前页
parent.layui.table.reload("user-table");
});
}else{
layer.msg(res.msg,{icon:2,time:1000});
}
}
})
return false;
});
})
</script>
</body>
</html>
+241
View File
@@ -0,0 +1,241 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
<style>
.remote_field{
display: none;
}
</style>
</head>
<body>
<form class="layui-form">
<div class="mainBox">
<div class="main-container">
<div class="layui-form-item">
<label class="layui-form-label">策略名称</label>
<div class="layui-input-block">
<input type="text" name="name" lay-verify="required" value="{$info.name}" placeholder="请输入上传策略的名称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">允许后缀</label>
<div class="layui-input-block">
<input type="text" name="filetype" value="{$info.filetype}" placeholder="请输入文件后缀" class="layui-input">
<div class="layui-form-mid layui-word-aux">多个请以半角逗号","隔开,留空表示不限制。如"png,jpg"</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">存储服务器</label>
<div class="layui-input-block">
<select name="type" lay-verify="required" lay-filter="server_select" disabled>
<option value="local" {eq name="$info.type" value="local"}selected{/eq}>本地</option>
<option value="remote" {eq name="$info.type" value="remote"}selected{/eq}>远程</option>
<option value="aliyunoss" {eq name="$info.type" value="aliyunoss"}selected{/eq}>阿里云OSS</option>
<option value="txyunoss" {eq name="$info.type" value="txyunoss"}selected{/eq}>腾讯云C0S</option>
</select>
<div class="layui-form-mid layui-word-aux">文件存储的服务器</div>
</div>
</div>
<div class="other-field">
</div>
</div>
</div>
<div class="bottom">
<div class="button-container">
<button type="submit" class="layui-btn layui-btn-normal layui-btn-sm" lay-submit="" lay-filter="save">
<i class="layui-icon layui-icon-ok"></i>
保存修改
</button>
</div>
</div>
</form>
{eq name="$info.type" value="local"}
<script id="field_local" type="text/html">
<div class="layui-form-item">
<label class="layui-form-label">存储目录</label>
<div class="layui-input-block">
<input type="text" name="save_dir" value="{$info.config.save_dir}" placeholder="请输入文件存放的目录" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">请以根目录 / 开始结尾要加"/"例如/uploads/</div>
</div>
</div>
</script>
{/eq}
{eq name="$info.type" value="remote"}
<script id="field_remote" type="text/html">
<div class="layui-form-item">
<label class="layui-form-label">存储目录</label>
<div class="layui-input-block">
<input type="text" name="save_dir" value="{$info.config.save_dir}" placeholder="请输入文件存放的目录" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">请以根目录 / 开始结尾要加"/"例如/uploads/</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">远程Token</label>
<div class="layui-input-block">
<input type="text" name="access_token" value="{$info.config.access_token}" placeholder="AccessToken" lay-verify="required" class="layui-input">
<div class="layui-form-mid layui-word-aux">请与远程服务端配置文件中保持一致</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">服务端URL</label>
<div class="layui-input-block">
<input type="text" name="server_uri" value="{$info.config.server_uri}" placeholder="服务端URL" lay-verify="required" class="layui-input">
<div class="layui-form-mid layui-word-aux">请填写合法的URL地址结尾要加"/"</div>
</div>
</div>
</script>
{/eq}
{eq name="$info.type" value="aliyunoss"}
<script id="field_aliyunoss" type="text/html">
<div class="layui-form-item">
<label class="layui-form-label">存储目录</label>
<div class="layui-input-block">
<input type="text" name="save_dir" value="{$info.config.save_dir}" placeholder="请输入文件存放的目录" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">请以根目录 / 开始结尾要加"/"例如/uploads/</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">Endpoint</label>
<div class="layui-input-block">
<input type="text" name="endpoint" value="{$info.config.endpoint}" placeholder="Endpoint" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">OSS Endpoint</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">Bucket</label>
<div class="layui-input-block">
<input type="text" name="bucket" value="{$info.config.bucket}" placeholder="Bucket" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">OSS Bucket</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">AccessKey</label>
<div class="layui-input-block">
<input type="text" name="access_key" value="{$info.config.access_key}" placeholder="AccessKey" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">OSS AccessKey</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">AccessKeySecret</label>
<div class="layui-input-block">
<input type="text" name="access_secret" value="{$info.config.access_secret}" placeholder="AccessKeySecret" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">OSS AccessKeySecret</div>
</div>
</div>
</script>
{/eq}
{eq name="$info.type" value="txyunoss"}
<script id="field_txyunoss" type="text/html">
<div class="layui-form-item">
<label class="layui-form-label">存储目录</label>
<div class="layui-input-block">
<input type="text" name="save_dir" value="{$info.config.save_dir}" placeholder="请输入文件存放的目录" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">请以根目录 / 开始结尾要加"/"例如/uploads/</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">SecretId</label>
<div class="layui-input-block">
<input type="text" name="secret_id" value="{$info.config.secret_id}" placeholder="SecretId" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">COS SecretId</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">SecretKey</label>
<div class="layui-input-block">
<input type="text" name="secret_key" value="{$info.config.secret_key}" placeholder="SecretKey" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">COS SecretKey</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">Bucket</label>
<div class="layui-input-block">
<input type="text" name="bucket" value="{$info.config.bucket}" placeholder="Bucket" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">COS Bucket</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">Region</label>
<div class="layui-input-block">
<input type="text" name="region" value="{$info.config.region}" placeholder="Region" lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">COS Region 存储桶地域</div>
</div>
</div>
</script>
{/eq}
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['form','jquery'],function(){
let form = layui.form;
let $ = layui.jquery;
function setFieldHtml(field){
let field_name = '#field_' + field;
let html = $(field_name).html();
if(typeof html !== "undefined"){
$(".other-field").html(html);
return true;
}
$(".other-field").html("");
return false;
}
setFieldHtml('{$info.type}');
form.on('submit(save)', function(data){
$.ajax({
data:JSON.stringify(data.field),
dataType:'json',
contentType:'application/json',
type:'post',
success:function(res){
//判断有没有权限
if(res && res.code == 999){
layer.msg(res.msg, {
icon: 5,
time: 2000,
})
return false;
}else if(res.code == 200){
layer.msg(res.msg,{icon:1,time:1000},function(){
parent.layer.close(parent.layer.getFrameIndex(window.name));//关闭当前页
parent.layui.table.reload("user-table");
});
}else{
layer.msg(res.msg,{icon:2,time:1000});
}
}
})
return false;
});
})
</script>
</body>
</html>
+136
View File
@@ -0,0 +1,136 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
</head>
<body class="pear-container">
<div class="layui-card">
<div class="layui-card-body">
<table id="user-table" lay-filter="user-table"></table>
</div>
</div>
<script type="text/html" id="user-toolbar">
<button class="pear-btn pear-btn-primary pear-btn-md" lay-event="add">
<i class="layui-icon layui-icon-add-1"></i>
添加策略
</button>
</script>
<script type="text/html" id="user-bar">
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit"><i class="layui-icon layui-icon-edit"></i></button>
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
</script>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['table', 'form', 'jquery','common'], function() {
let table = layui.table;
let form = layui.form;
let $ = layui.jquery;
let common = layui.common;
let cols = [
[{type: 'checkbox'},
{title: '策略名称', field: 'name', align: 'center'},
{title: '类型', field: 'type', align: 'center'},
{title: '文件数量', field: 'file_num', align: 'center'},
{title: '存储数据量', field: 'store_num', align: 'center'},
{title: '操作', toolbar: '#user-bar', align: 'center', width: 130}
]
]
table.render({
elem: '#user-table',
url: "{:url('policy/index')}",
page: true,
cols: cols,
skin: 'line',
toolbar: '#user-toolbar',
defaultToolbar: [{
title: '刷新',
layEvent: 'refresh',
icon: 'layui-icon-refresh',
}, 'filter', 'print', 'exports']
});
table.on('tool(user-table)', function(obj) {
if (obj.event === 'remove') {
window.remove(obj);
} else if (obj.event === 'edit') {
window.edit(obj);
}
});
table.on('toolbar(user-table)', function(obj) {
if (obj.event === 'add') {
window.add();
} else if (obj.event === 'refresh') {
window.refresh();
}
});
window.add = function() {
layer.open({
type: 2,
title: '添加策略',
shade: 0.1,
area: [common.isModile()?'100%':'600px', common.isModile()?'100%':'600px'],
content: "{:url('Policy/add')}"
});
}
window.edit = function(obj) {
layer.open({
type: 2,
title: '修改策略',
shade: 0.1,
area: [common.isModile()?'100%':'600px', common.isModile()?'100%':'600px'],
content: "{:url('policy/edit')}?id=" + obj.data['id']
});
}
window.remove = function(obj) {
layer.confirm('确定要删除该储存策略吗?<b style="color: red">删除后会导致上传文件不能下载,且不可恢复</b>', {
icon: 3,
title: '提示'
}, function(index) {
layer.close(index);
let loading = layer.load();
$.ajax({
url: "{:url('policy/delete')}?id=" + obj.data['id'],
dataType: 'json',
type: 'get',
success: function(result) {
layer.close(loading);
if (result.code == 200) {
layer.msg(result.msg, {
icon: 1,
time: 1000
}, function() {
obj.del();
});
} else {
layer.msg(result.msg, {
icon: 2,
time: 1000
});
}
}
})
});
}
window.refresh = function(param) {
table.reload('user-table');
}
})
</script>
</body>
</html>
+351
View File
@@ -0,0 +1,351 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
</head>
<body class="pear-container">
<div class="layui-card">
<div class="layui-card-body">
<form class="layui-form" action="">
<div class="layui-form-item">
<div id="test6">
<div class="layui-form-item layui-inline">
<label class="layui-form-label">开始日期</label>
<div class="layui-input-inline">
<input type="text" autocomplete="off" name="start_time" id="test-startDate-1" class="layui-input" placeholder="开始日期">
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">结束日期</label>
<div class="layui-input-inline">
<input type="text" autocomplete="off" name="end_time" id="test-endDate-1" class="layui-input" placeholder="结束日期">
</div>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">排序字段</label>
<div class="layui-input-inline">
<select name="sort_key" lay-verify="required">
<option value="delete_time">删除时间排序</option>
<option value="update_time">更新时间排序</option>
<option value="id">ID排序</option>
<option value="size">文件大小排序</option>
<option value="count_down">下载量排序</option>
<option value="count_open">浏览量排序</option>
</select>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">排序方式</label>
<div class="layui-input-inline">
<select name="sort" lay-verify="required">
<option value="0">降序</option>
<option value="1">升序</option>
</select>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">存储筛选</label>
<div class="layui-input-inline">
<select name="policy" lay-verify="required">
{volist name="$policy" id="vo"}
<option value="{$vo.id}">{$vo.name}</option>
{/volist}
</select>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">文件后缀</label>
<div class="layui-input-inline">
<input type="text" name="ext" placeholder="请输入文件后缀 如 png jpg 等" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">用户UID</label>
<div class="layui-input-inline">
<input type="number" name="uid" placeholder="请输入UID" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">文件名称</label>
<div class="layui-input-inline">
<input type="text" name="origin_name" placeholder="请输入文件名称" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-inline">
<button class="pear-btn pear-btn-md pear-btn-primary" style="margin-left: 36px;" lay-submit lay-filter="user-query">
<i class="layui-icon layui-icon-search"></i>
搜索结果
</button>
<button type="reset" class="pear-btn pear-btn-md">
<i class="layui-icon layui-icon-refresh"></i>
重置搜索
</button>
</div>
</div>
</form>
</div>
</div>
<div class="layui-card">
<div class="layui-card-body">
<table id="user-table" lay-filter="user-table"></table>
</div>
</div>
<script type="text/html" id="user-toolbar">
<button class="pear-btn pear-btn-primary pear-btn-md" lay-event="batchBack">
<i class="layui-icon layui-icon-time"></i>
批量还原
</button>
<button class="pear-btn pear-btn-danger pear-btn-md" lay-event="batchRemove">
<i class="layui-icon layui-icon-delete"></i>
彻底删除
</button>
</script>
<script type="text/html" id="user-bar">
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="back"><i class="layui-icon layui-icon-time"></i></button>
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
</script>
<script type="text/html" id="file-icon">
<img src="{{ d.icon }}">
</script>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['table', 'form', 'jquery','common','laydate'], function() {
let table = layui.table;
let form = layui.form;
let $ = layui.jquery;
let common = layui.common;
var laydate = layui.laydate;
laydate.render({
elem: '#test6'
,range: ['#test-startDate-1', '#test-endDate-1']
});
let cols = [
[{type: 'checkbox'},
{title: '', field: 'icon', align: 'center',width: 40,templet: '#file-icon'},
{title: '文件名', field: 'origin_name',width: 300, align: 'left'},
{title: '大小', field: 'size', align: 'center'},
{title: '上传用户', field: 'uid', align: 'center'},
{title: '储存服务器', field: 'policy_id', align: 'center'},
{title: '文件后缀', field: 'ext', align: 'center'},
{title: '下载量', field: 'count_down', align: 'center'},
{title: '浏览量', field: 'count_open', align: 'center'},
{title: '删除时间', field: 'create_time', align: 'center'},
{title: '操作', toolbar: '#user-bar', align: 'center', width: 130}
]
]
table.render({
elem: '#user-table',
url: "{:url('recycle/index')}",
page: true,
cols: cols,
skin: 'line',
limit:20,
toolbar: '#user-toolbar',
defaultToolbar: [{
title: '刷新',
layEvent: 'refresh',
icon: 'layui-icon-refresh',
}, 'print', 'exports']
});
table.on('tool(user-table)', function(obj) {
if (obj.event === 'remove') {
window.remove(obj);
}else if(obj.event === 'back'){
window.restore(obj);
}
});
table.on('toolbar(user-table)', function(obj) {
if (obj.event === 'refresh') {
window.refresh();
} else if (obj.event === 'batchRemove') {
window.batchRemove(obj);
} else if (obj.event === 'batchBack'){
window.batchRestore(obj);
}
});
form.on('submit(user-query)', function(data) {
table.reload('user-table', {
where: data.field
})
return false;
});
window.restore = function(obj){
layer.confirm('确认要恢复该文件吗?', {
icon: 3,
title: '提示'
}, function(index) {
layer.close(index);
let loading = layer.load();
$.ajax({
url: "{:url('recycle/restore')}?ids=" + obj.data['id'],
dataType: 'json',
type: 'get',
success: function(result) {
layer.close(loading);
if (result.code == 200) {
layer.msg(result.msg, {
icon: 1,
time: 1000
}, function() {
obj.del();
});
} else {
layer.msg(result.msg, {
icon: 2,
time: 1000
});
}
}
})
});
}
window.remove = function(obj) {
layer.confirm('确定要彻底删除该文件吗?<b style="color: red">删除后储存数据会被清空,且不可恢复</b>', {
icon: 3,
title: '提示'
}, function(index) {
layer.close(index);
let loading = layer.load();
$.ajax({
url: "{:url('recycle/delete')}?ids=" + obj.data['id'],
dataType: 'json',
type: 'get',
success: function(result) {
layer.close(loading);
if (result.code == 200) {
layer.msg(result.msg, {
icon: 1,
time: 1000
}, function() {
obj.del();
});
} else {
layer.msg(result.msg, {
icon: 2,
time: 1000
});
}
}
})
});
}
window.batchRemove = function(obj) {
var checkIds = common.checkField(obj,'id');
if (checkIds === "") {
layer.msg("未选中数据", {
icon: 3,
time: 1000
});
return false;
}
layer.confirm('确定要删除这些文件[' + checkIds + ']吗,<b style="color: red">删除后数据不可恢复</b>', {
icon: 3,
title: '提示'
}, function(index) {
layer.close(index);
let loading = layer.load();
$.ajax({
url: "{:url('recycle/delete')}?ids=" + checkIds,
dataType: 'json',
type: 'get',
success: function(result) {
layer.close(loading);
if (result.code == 200) {
layer.msg(result.msg, {
icon: 1,
time: 1000
}, function() {
table.reload('user-table');
});
} else {
layer.msg(result.msg, {
icon: 2,
time: 1000
});
}
}
})
});
}
window.batchRestore = function(obj){
var checkIds = common.checkField(obj,'id');
if (checkIds === "") {
layer.msg("未选中数据", {
icon: 3,
time: 1000
});
return false;
}
layer.confirm('确定要恢复这些文件[' + checkIds + ']吗?', {
icon: 3,
title: '提示'
}, function(index) {
layer.close(index);
let loading = layer.load();
$.ajax({
url: "{:url('recycle/restore')}?ids=" + checkIds,
dataType: 'json',
type: 'get',
success: function(result) {
layer.close(loading);
if (result.code == 200) {
layer.msg(result.msg, {
icon: 1,
time: 1000
}, function() {
table.reload('user-table');
});
} else {
layer.msg(result.msg, {
icon: 2,
time: 1000
});
}
}
})
});
}
window.refresh = function(param) {
table.reload('user-table');
}
})
</script>
</body>
</html>
+113
View File
@@ -0,0 +1,113 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
</head>
<body>
<form class="layui-form">
<div class="mainBox">
<div class="main-container">
<div class="layui-form-item">
<label class="layui-form-label">文件/目录名</label>
<div class="layui-input-block">
<div class="layui-form-mid">{$info.source_name}</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">储存类型</label>
<div class="layui-input-block">
<div class="layui-form-mid">{$info.source_type?'文件':'目录'}</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">所属用户</label>
<div class="layui-input-block">
<div class="layui-form-mid">{$info.source_username}</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">链接地址</label>
<div class="layui-input-block">
<div class="layui-form-mid"><a href="{$info.source_url}" target="_blank">{$info.source_url}</a></div>
</div>
</div>
<br>
<div class="layui-form-item">
<label class="layui-form-label">举报类型</label>
<div class="layui-input-block">
<div class="layui-form-mid">{$info.type}</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">联系方式</label>
<div class="layui-input-block">
<div class="layui-form-mid">{$info.contact}</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">举报理由</label>
<div class="layui-input-block">
<div class="layui-form-mid">{$info.content}</div>
</div>
</div>
</div>
</div>
<div class="bottom">
<div class="button-container">
<button type="submit" class="layui-btn layui-btn-normal layui-btn-sm" lay-submit="" lay-filter="save">
<i class="layui-icon layui-icon-ok"></i>
完成处理
</button>
<button type="reset" class="layui-btn layui-btn-primary layui-btn-sm">
<i class="layui-icon layui-icon-refresh"></i>
取消处理
</button>
</div>
</div>
</form>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['form','jquery'],function(){
let form = layui.form;
let $ = layui.jquery;
form.on('submit(save)', function(data){
$.ajax({
data:JSON.stringify({status:1}),
dataType:'json',
contentType:'application/json',
type:'post',
success:function(res){
//判断有没有权限
if(res && res.code == 999){
layer.msg(res.msg, {
icon: 5,
time: 2000,
})
return false;
}else if(res.code == 200){
layer.msg(res.msg,{icon:1,time:1000},function(){
parent.layer.close(parent.layer.getFrameIndex(window.name));//关闭当前页
parent.layui.table.reload("user-table");
});
}else{
layer.msg(res.msg,{icon:2,time:1000});
}
}
})
return false;
});
})
</script>
</body>
</html>
+135
View File
@@ -0,0 +1,135 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
</head>
<body class="pear-container">
<div class="layui-card">
<div class="layui-card-body">
<table id="user-table" lay-filter="user-table"></table>
</div>
</div>
<script type="text/html" id="user-toolbar"></script>
<script type="text/html" id="user-bar">
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit"><i class="layui-icon layui-icon-survey"></i></button>
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
</script>
<script type="text/html" id="user-auth">
{{#if (d.status == 0) { }}
<span class="layui-badge layui-bg-orange">未处理</span>
{{# }else if(d.status == 1){ }}
<span class="layui-badge layui-bg-blue">已处理</span>
{{# } }}
</script>
<script type="text/html" id="user-url">
<a href="{{ d.source_url }}" target="_blank">{{ d.source_url }}</a>
</script>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['table', 'form', 'jquery','common'], function() {
let table = layui.table;
let form = layui.form;
let $ = layui.jquery;
let common = layui.common;
let cols = [
[{type: 'checkbox'},
{title: '文件/目录名', field: 'source_name', align: 'center'},
{title: '链接地址', field: 'source_url', align: 'center', templet: '#user-url'},
{title: '所属用户', field: 'source_username', align: 'center'},
{title: '危害类别', field: 'type', align: 'center'},
{title: '联系方式', field: 'contact', align: 'center'},
{title: '举报IP', field: 'real_ip', align: 'center'},
{title: '处理状态', field: 'status', align: 'center', templet: '#user-auth'},
{title: '创建时间', field: 'create_time', align: 'center'},
{title: '操作', toolbar: '#user-bar', align: 'center', width: 130}
]
]
table.render({
elem: '#user-table',
url: "{:url('report/index')}",
page: true,
limit:20,
cols: cols,
skin: 'line',
toolbar: '#user-toolbar',
defaultToolbar: [{
title: '刷新',
layEvent: 'refresh',
icon: 'layui-icon-refresh',
}, 'filter', 'print', 'exports']
});
table.on('tool(user-table)', function(obj) {
if (obj.event === 'remove') {
window.remove(obj);
} else if (obj.event === 'edit') {
window.edit(obj);
}
});
table.on('toolbar(user-table)', function(obj) {
if (obj.event === 'refresh') {
window.refresh();
}
});
window.edit = function(obj) {
layer.open({
type: 2,
title: '处理举报',
shade: 0.1,
area: ['600px', '520px'],
content: "{:url('report/edit')}?id=" + obj.data['id']
});
}
window.remove = function(obj) {
layer.confirm('确定要删除该举报内容吗?', {
icon: 3,
title: '提示'
}, function(index) {
layer.close(index);
let loading = layer.load();
$.ajax({
url: "{:url('report/delete')}?id=" + obj.data['id'],
dataType: 'json',
type: 'get',
success: function(result) {
layer.close(loading);
if (result.code == 200) {
layer.msg(result.msg, {
icon: 1,
time: 1000
}, function() {
obj.del();
});
} else {
layer.msg(result.msg, {
icon: 2,
time: 1000
});
}
}
})
});
}
window.refresh = function(param) {
table.reload('user-table');
}
})
</script>
</body>
</html>
+145
View File
@@ -0,0 +1,145 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
</head>
<body>
<form class="layui-form">
<div class="mainBox">
<div class="main-container">
<br>
<br>
<div class="layui-form-item">
<label class="layui-form-label">站点名称</label>
<div class="layui-input-block" style="max-width: 800px;">
<input type="text" name="site_title" value="{$option.site_title}" required lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">站点的名称,将会展示在个页面的标题尾部、邮件中。</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">站点LOGO</label>
<div class="layui-input-block" style="max-width: 800px;">
<input type="text" name="site_logo" value="{$option.site_logo}" required lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">站点logo路径</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">网站首页</label>
<div class="layui-input-block" style="max-width: 800px;">
<select name="index_theme" lay-verify="required">
<option value="default" {eq name="$option.index_theme" value="default"}selected{/eq}>旧版主题</option>
<option value="new1" {eq name="$option.index_theme" value="new1"}selected{/eq}>新版主题</option>
</select>
<div class="layui-form-mid layui-word-aux">网站首页主题</div>
</div>
</div>
<br>
<div class="layui-form-item">
<label class="layui-form-label">SEO标题</label>
<div class="layui-input-block" style="max-width: 800px;">
<input type="text" name="site_name" value="{$option.site_name}" required lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">位于首页meta标签内的站点标题</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">SEO关键词</label>
<div class="layui-input-block" style="max-width: 800px;">
<input type="text" name="site_keywords" value="{$option.site_keywords}" required lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">位于首页meta标签内的站点关键词</div>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">SEO描述</label>
<div class="layui-input-block" style="max-width: 800px;">
<textarea name="site_desc" placeholder="位于首页meta标签内的SEO描述" class="layui-textarea">{$option.site_desc}</textarea>
</div>
</div>
<br>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">网站头部</label>
<div class="layui-input-block" style="max-width: 800px;">
<textarea name="site_head" placeholder="网站头部代码,用于百度站长等工具验证" class="layui-textarea">{$option.site_head}</textarea>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">网站底部</label>
<div class="layui-input-block" style="max-width: 800px;">
<textarea name="site_foot" placeholder="网站底部代码,你可以在此放置统计代码" class="layui-textarea">{$option.site_foot}</textarea>
</div>
</div>
<br>
<div class="layui-form-item">
<label class="layui-form-label">站点邮箱</label>
<div class="layui-input-block" style="max-width: 800px;">
<input type="text" name="site_email" value="{$option.site_email}" required lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">站点的用户投诉举报邮箱</div>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">客服信息</label>
<div class="layui-input-block" style="max-width: 800px;">
<textarea name="site_kefu" placeholder="" class="layui-textarea">{$option.site_kefu}</textarea>
</div>
</div>
<br>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="save">保存设置</button>
</div>
</div>
</div>
</div>
</form>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['form','jquery'],function(){
let form = layui.form;
let $ = layui.jquery;
form.on('submit(save)', function(data){
$.ajax({
data:JSON.stringify(data.field),
dataType:'json',
contentType:'application/json',
type:'post',
success:function(res){
//判断有没有权限
if(res && res.code == 999){
layer.msg(res.msg, {
icon: 5,
time: 2000,
})
return false;
}else if(res.code == 200){
layer.msg(res.msg,{icon:1,time:1000},function(){
parent.layer.close(parent.layer.getFrameIndex(window.name));//关闭当前页
});
}else{
layer.msg(res.msg,{icon:2,time:1000});
}
}
})
return false;
});
})
</script>
</body>
</html>
+122
View File
@@ -0,0 +1,122 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
</head>
<body>
<form class="layui-form">
<div class="mainBox">
<div class="main-container">
<br>
<br>
<div class="layui-form-item">
<label class="layui-form-label">邮件服务器</label>
<div class="layui-input-block" style="max-width: 800px;">
<input type="text" name="smtp_host" value="{$option.smtp_host}" required lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">邮箱的SMTP服务器地址</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">SMTP端口</label>
<div class="layui-input-block" style="max-width: 800px;">
<input type="text" name="smtp_port" value="{$option.smtp_port}" required lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">SSL连接SMTP服务器的远程服务器端口号</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">发信昵称</label>
<div class="layui-input-block" style="max-width: 800px;">
<input type="text" name="nickname" value="{$option.nickname}" required lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">显示在收件人邮件的发件人邮箱地址前的发件人姓名</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">邮箱帐号</label>
<div class="layui-input-block" style="max-width: 800px;">
<input type="text" name="username" value="{$option.username}" required lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">SMTP登录的账号</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">邮箱密码</label>
<div class="layui-input-block" style="max-width: 800px;">
<input type="text" name="password" value="{$option.password}" required lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">SMTP登录的密码 使用生成的授权码</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">找回密码模板</label>
<div class="layui-input-block" style="max-width: 800px;">
<textarea name="template_forget" id="edit" cols="30" rows="10">{$option.template_forget}</textarea>
<div class="layui-form-mid layui-word-aux">
模板内变量:
{username} 用户帐号
{literal}{url}{/literal} 重设密码url地址
{site_name} 站点名称
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="save">保存设置</button>
</div>
</div>
</div>
</div>
</form>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['form','jquery','tinymce'],function(){
let form = layui.form;
let $ = layui.jquery;
var tinymce = layui.tinymce
var edit = tinymce.render({
elem: "#edit",
height: 400,
menubar: false, //隐藏菜单栏
plugins: "code",
toolbar: "code",
});
form.on('submit(save)', function(data){
data.field['template_forget'] = edit.getContent()
$.ajax({
data:JSON.stringify(data.field),
dataType:'json',
contentType:'application/json',
type:'post',
success:function(res){
//判断有没有权限
if(res && res.code == 999){
layer.msg(res.msg, {
icon: 5,
time: 2000,
})
return false;
}else if(res.code == 200){
layer.msg(res.msg,{icon:1,time:1000},function(){
parent.layer.close(parent.layer.getFrameIndex(window.name));//关闭当前页
});
}else{
layer.msg(res.msg,{icon:2,time:1000});
}
}
})
return false;
});
})
</script>
</body>
</html>
+91
View File
@@ -0,0 +1,91 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
</head>
<body>
<form class="layui-form">
<div class="mainBox">
<div class="main-container">
<br>
<br>
<div class="layui-form-item">
<label class="layui-form-label">易支付网关</label>
<div class="layui-input-block" style="max-width: 800px;">
<input type="text" name="api_gateway" value="{$option.api_gateway}" required lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">
支付网关注册地址:只要是易支付即可
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">易支付商户</label>
<div class="layui-input-block" style="max-width: 800px;">
<input type="text" name="api_pid" value="{$option.api_pid}" required lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">
请填写易支付的商户ID
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">易支付密钥</label>
<div class="layui-input-block" style="max-width: 800px;">
<input type="text" name="api_key" value="{$option.api_key}" required lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">
请填写易支付的商户密钥
</div>
</div>
</div>
<br>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="save">保存设置</button>
</div>
</div>
</div>
</div>
</form>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['form','jquery'],function(){
let form = layui.form;
let $ = layui.jquery;
form.on('submit(save)', function(data){
$.ajax({
data:JSON.stringify(data.field),
dataType:'json',
contentType:'application/json',
type:'post',
success:function(res){
//判断有没有权限
if(res && res.code == 999){
layer.msg(res.msg, {
icon: 5,
time: 2000,
})
return false;
}else if(res.code == 200){
layer.msg(res.msg,{icon:1,time:1000},function(){
parent.layer.close(parent.layer.getFrameIndex(window.name));//关闭当前页
});
}else{
layer.msg(res.msg,{icon:2,time:1000});
}
}
})
return false;
});
})
</script>
</body>
</html>
@@ -0,0 +1,82 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
</head>
<body>
<form class="layui-form">
<div class="mainBox">
<div class="main-container">
<br>
<br>
<div class="layui-form-item">
<label class="layui-form-label">允许注册</label>
<div class="layui-input-block">
<input type="radio" name="allow_register" value="1" title="允许" {eq name="$option.allow_register" value="1"}checked{/eq}>
<input type="radio" name="allow_register" value="0" title="禁止" {eq name="$option.allow_register" value="0"}checked{/eq}>
</div>
<div class="layui-form-mid layui-word-aux">是否允许新用户注册</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">默认用户组</label>
<div class="layui-input-block" style="max-width: 800px;">
<select name="default_group" lay-verify="required">
{volist name="$group" id="vo"}
<option value="{$vo.id}" {eq name="$option.default_group" value="$vo.id"}selected{/eq}>{$vo.group_name}</option>
{/volist}
</select>
<div class="layui-form-mid layui-word-aux">用户注册后默认属于的用户组</div>
</div>
</div>
<br>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="save">保存设置</button>
</div>
</div>
</div>
</div>
</form>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['form','jquery'],function(){
let form = layui.form;
let $ = layui.jquery;
form.on('submit(save)', function(data){
$.ajax({
data:JSON.stringify(data.field),
dataType:'json',
contentType:'application/json',
type:'post',
success:function(res){
//判断有没有权限
if(res && res.code == 999){
layer.msg(res.msg, {
icon: 5,
time: 2000,
})
return false;
}else if(res.code == 200){
layer.msg(res.msg,{icon:1,time:1000},function(){
parent.layer.close(parent.layer.getFrameIndex(window.name));//关闭当前页
});
}else{
layer.msg(res.msg,{icon:2,time:1000});
}
}
})
return false;
});
})
</script>
</body>
</html>
+93
View File
@@ -0,0 +1,93 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
</head>
<body>
<form class="layui-form">
<div class="mainBox">
<div class="main-container">
<br>
<br>
<div class="layui-form-item">
<label class="layui-form-label">VIP用户组</label>
<div class="layui-input-block" style="max-width: 800px;">
<select name="vip_group" lay-verify="required">
{volist name="$group" id="vo"}
<option value="{$vo.id}" {eq name="$option.vip_group" value="$vo.id"}selected{/eq}>{$vo.group_name}</option>
{/volist}
</select>
<div class="layui-form-mid layui-word-aux">开通VIP后属于的用户组</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">VIP分成</label>
<div class="layui-input-block" style="max-width: 800px;">
<input type="number" name="vip_profit" value="{$option.vip_profit}" required lay-verify="required" autocomplete="off" class="layui-input">
<div class="layui-form-mid layui-word-aux">
游客通过分享者的链接开通VIP后,分享者获得的提成。请填写百分比如50%那么就填写50
</div>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">VIP价格规则</label>
<div class="layui-input-block" style="max-width: 800px;">
<textarea name="vip_rule" placeholder="VIP价格规则" rows="10" class="layui-textarea">{$option.vip_rule}</textarea>
<div class="layui-form-mid layui-word-aux">
价格规则,一行一条,规则格式为:
价格名称|开通价格|开通时长(单位天)|显示单位|折扣显示|省钱显示|描述内容|是否推荐(推荐填写1,不推荐填写0)
</div>
</div>
</div>
<br>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="save">保存设置</button>
</div>
</div>
</div>
</div>
</form>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['form','jquery'],function(){
let form = layui.form;
let $ = layui.jquery;
form.on('submit(save)', function(data){
$.ajax({
data:JSON.stringify(data.field),
dataType:'json',
contentType:'application/json',
type:'post',
success:function(res){
//判断有没有权限
if(res && res.code == 999){
layer.msg(res.msg, {
icon: 5,
time: 2000,
})
return false;
}else if(res.code == 200){
layer.msg(res.msg,{icon:1,time:1000},function(){
parent.layer.close(parent.layer.getFrameIndex(window.name));//关闭当前页
});
}else{
layer.msg(res.msg,{icon:2,time:1000});
}
}
})
return false;
});
})
</script>
</body>
</html>
+116
View File
@@ -0,0 +1,116 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
</head>
<body>
<form class="layui-form">
<div class="mainBox">
<div class="main-container">
<div class="layui-form-item">
<label class="layui-form-label">用户帐号</label>
<div class="layui-input-block">
<input type="text" name="username" lay-verify="required" placeholder="请输入用户帐号" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">当前用户组</label>
<div class="layui-input-block">
<select name="group" lay-verify="required">
{volist name="$group" id="vo"}
<option value="{$vo.id}" {eq name="$default_group" value="$vo.id"}selected{/eq}>{$vo.group_name}</option>
{/volist}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">设置VIP时间</label>
<div class="layui-input-block">
<input type="text" name="group_expire" value="" placeholder="非VIP默认不选" class="layui-input" id="group_expire">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">登录密码</label>
<div class="layui-input-block">
<input type="password" name="password" placeholder="请输入密码" lay-verify="required" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">重复密码</label>
<div class="layui-input-block">
<input type="password" name="repassword" placeholder="请再次输入密码" lay-verify="required" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">安全邮箱</label>
<div class="layui-input-block">
<input type="email" name="email" placeholder="请输入密码邮箱账号 " lay-verify="required" autocomplete="off" class="layui-input">
</div>
</div>
</div>
</div>
<div class="bottom">
<div class="button-container">
<button type="submit" class="layui-btn layui-btn-normal layui-btn-sm" lay-submit="" lay-filter="save">
<i class="layui-icon layui-icon-ok"></i>
提交
</button>
<button type="reset" class="layui-btn layui-btn-primary layui-btn-sm">
<i class="layui-icon layui-icon-refresh"></i>
重置
</button>
</div>
</div>
</form>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['form','jquery','laydate'],function(){
let form = layui.form;
let $ = layui.jquery;
let laydate = layui.laydate;
laydate.render({
elem: '#group_expire', //指定元素
type:'datetime'
});
form.on('submit(save)', function(data){
$.ajax({
data:JSON.stringify(data.field),
dataType:'json',
contentType:'application/json',
type:'post',
success:function(res){
//判断有没有权限
if(res && res.code == 999){
layer.msg(res.msg, {
icon: 5,
time: 2000,
})
return false;
}else if(res.code == 200){
layer.msg(res.msg,{icon:1,time:1000},function(){
parent.layer.close(parent.layer.getFrameIndex(window.name));//关闭当前页
parent.layui.table.reload("user-table");
});
}else{
layer.msg(res.msg,{icon:2,time:1000});
}
}
})
return false;
});
})
</script>
</body>
</html>
+154
View File
@@ -0,0 +1,154 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
</head>
<body>
<form class="layui-form">
<div class="mainBox">
<div class="main-container">
<div class="layui-form-item">
<label class="layui-form-label">用户帐号</label>
<div class="layui-input-block">
<div class="layui-form-mid layui-word-aux">{$info.username}</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">安全邮箱</label>
<div class="layui-input-block">
<input type="email" name="email" value="{$info.email}" placeholder="请输入安全邮箱,如果不修改请忽略本参数" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">修改密码</label>
<div class="layui-input-block">
<input type="password" name="password" placeholder="请输入密码,如果不修改请忽略本参数" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">实名认证</label>
<div class="layui-input-block">
<div class="layui-form-mid layui-word-aux">{$info.is_auth ? '<span class="layui-badge layui-bg-blue">认证成功</span>' : '未认证'}</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">注册时间</label>
<div class="layui-input-block">
<div class="layui-form-mid layui-word-aux">{$info.create_time|date="Y-m-d H:i:s"}</div>
</div>
</div>
<hr>
<div class="layui-form-item">
<label class="layui-form-label">账户余额</label>
<div class="layui-input-block">
<div class="layui-form-mid">{$info.amount} ¥</div>
</div>
</div>
<hr>
<div class="layui-form-item">
<label class="layui-form-label">当前用户组</label>
<div class="layui-input-block">
<select name="group" lay-verify="required">
{volist name="$group" id="vo"}
<option value="{$vo.id}" {eq name="$info.group" value="$vo.id"}selected{/eq}>{$vo.group_name}</option>
{/volist}
</select>
</div>
</div>
<hr>
<div class="layui-form-item">
<label class="layui-form-label">设置VIP时间</label>
<div class="layui-input-block">
<input type="text" name="group_expire" value="<?=$info['group_expire']<time()?'':date('Y-m-d h:i:s',$info['group_expire'])?>" placeholder="非VIP默认不选" class="layui-input" id="group_expire">
</div>
</div>
<hr>
<div class="layui-form-item">
<label class="layui-form-label">最近登录</label>
<div class="layui-input-block">
<div class="layui-form-mid layui-word-aux">{:getNotNullTime($info.login_time,'暂无登录信息')}</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">登录IP地址</label>
<div class="layui-input-block">
<div class="layui-form-mid layui-word-aux">{$info.login_real_ip|default='暂无登录信息'}</div>
</div>
</div>
</div>
</div>
<div class="bottom">
<div class="button-container">
<button type="submit" class="layui-btn layui-btn-normal layui-btn-sm" lay-submit="" lay-filter="save">
<i class="layui-icon layui-icon-ok"></i>
保存更改
</button>
</div>
</div>
</form>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['form','jquery','laydate'],function(){
let form = layui.form;
let $ = layui.jquery;
let laydate = layui.laydate;
// laydate.render({
// elem: '#grade_time',
// type:'date'
// });
laydate.render({
elem: '#group_expire', //指定元素
type:'datetime'
});
form.on('submit(save)', function(data){
$.ajax({
data:JSON.stringify(data.field),
dataType:'json',
contentType:'application/json',
type:'post',
success:function(res){
//判断有没有权限
if(res && res.code == 999){
layer.msg(res.msg, {
icon: 5,
time: 2000,
})
return false;
}else if(res.code == 200){
layer.msg(res.msg,{icon:1,time:1000},function(){
parent.layer.close(parent.layer.getFrameIndex(window.name));//关闭当前页
parent.layui.table.reload("user-table");
});
}else{
layer.msg(res.msg,{icon:2,time:1000});
}
}
})
return false;
});
})
</script>
</body>
</html>
+267
View File
@@ -0,0 +1,267 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>用户管理</title>
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
</head>
<body class="pear-container">
<div class="layui-card">
<div class="layui-card-body">
<form class="layui-form" action="">
<div class="layui-form-item">
<div class="layui-form-item layui-inline">
<label class="layui-form-label">搜索类型</label>
<div class="layui-input-inline">
<select name="search_type" lay-verify="required">
<option value="username">帐号搜索</option>
<option value="email">邮箱搜索</option>
<option value="nickname">昵称搜索</option>
</select>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">搜索内容</label>
<div class="layui-input-inline">
<input type="text" name="search_value" placeholder="请输入搜索内容" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-inline">
<button class="pear-btn pear-btn-md pear-btn-primary" lay-submit lay-filter="user-query">
<i class="layui-icon layui-icon-search"></i>
搜索结果
</button>
<button type="reset" class="pear-btn pear-btn-md">
<i class="layui-icon layui-icon-refresh"></i>
重置搜索
</button>
</div>
</div>
</form>
</div>
</div>
<div class="layui-card">
<div class="layui-card-body">
<table id="user-table" lay-filter="user-table"></table>
</div>
</div>
<script type="text/html" id="user-toolbar">
<button class="pear-btn pear-btn-primary pear-btn-md" lay-event="add">
<i class="layui-icon layui-icon-add-1"></i>
新增账号
</button>
<button class="pear-btn pear-btn-danger pear-btn-md" lay-event="batchRemove">
<i class="layui-icon layui-icon-delete"></i>
批量删除
</button>
</script>
<script type="text/html" id="user-bar">
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit"><i class="layui-icon layui-icon-edit"></i></button>
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
</script>
<script type="text/html" id="user-enable">
<input type="checkbox" name="status" value="{{d.id}}" lay-skin="switch" lay-text="启用|禁用" lay-filter="user-enable" {{ d.status == 1 ? 'checked' : '' }}>
</script>
<script type="text/html" id="user-auth">
{{#if (d.is_auth == 0) { }}
<span class="layui-badge layui-bg-orange">未实名</span>
{{# }else if(d.is_auth == 1){ }}
<span class="layui-badge layui-bg-blue">已认证</span>
{{# } }}
</script>
<script type="text/html" id="user-createTime">
{{layui.util.toDateString(d.createTime, 'yyyy-MM-dd')}}
</script>
<script type="text/html" id="user-avatar">
<img src="{{ d.avatar }}" style="width: 30px;height: 30px;border-radius: 50%">
</script>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['table', 'form', 'jquery','common'], function() {
let table = layui.table;
let form = layui.form;
let $ = layui.jquery;
let common = layui.common;
let cols = [
[{type: 'checkbox'},
{title: 'UID', field: 'id', align: 'center'},
{title: '',field:'avatar',align: 'center',templet: '#user-avatar',width: 45},
{title: '昵称', field: 'nickname', align: 'left'},
{title: '用户帐号', field: 'username', align: 'center'},
{title: '用户等级', field: 'group', align: 'center'},
{title: '余额', field: 'amount', align: 'center'},
{title: '安全邮箱', field: 'email', align: 'center'},
{title: '实名认证', field: 'is_auth', align: 'center', templet: '#user-auth'},
{title: '账号状态', field: 'status', align: 'center', templet: '#user-enable'},
{title: '注册时间', field: 'create_time', align: 'center', templet: '#user-createTime'},
{title: '操作', toolbar: '#user-bar', align: 'center', width: 130}
]
]
table.render({
elem: '#user-table',
url: "{:url('user/index')}",
page: true,
cols: cols,
skin: 'line',
toolbar: '#user-toolbar',
defaultToolbar: [{
title: '刷新',
layEvent: 'refresh',
icon: 'layui-icon-refresh',
}, 'filter', 'print', 'exports']
});
table.on('tool(user-table)', function(obj) {
if (obj.event === 'remove') {
window.remove(obj);
} else if (obj.event === 'edit') {
window.edit(obj);
}
});
table.on('toolbar(user-table)', function(obj) {
if (obj.event === 'add') {
window.add();
} else if (obj.event === 'refresh') {
window.refresh();
} else if (obj.event === 'batchRemove') {
window.batchRemove(obj);
}
});
form.on('submit(user-query)', function(data) {
table.reload('user-table', {
where: data.field
})
return false;
});
form.on('switch(user-enable)', function(obj) {
let status = obj.elem.checked ? 1 : 0;
$.ajax({
url:"{:url('user/change_status')}",
type:'get',
data:{
id:this.value,
status:status
},
dataType:'JSON',
success:function(result){
layer.tips(result.msg, obj.othis);
}
})
});
window.add = function() {
layer.open({
type: 2,
title: '新增',
shade: 0.1,
area: [common.isModile()?'100%':'600px', common.isModile()?'100%':'400px'],
content: "{:url('user/add')}"
});
}
window.edit = function(obj) {
layer.open({
type: 2,
title: '修改',
shade: 0.1,
area: ['600px', '500px'],
content: "{:url('user/edit')}?id=" + obj.data['id']
});
}
window.remove = function(obj) {
layer.confirm('确定要删除该用户吗?<b style="color: red">删除后用户的储存数据会被清空,且不可恢复</b>', {
icon: 3,
title: '提示'
}, function(index) {
layer.close(index);
let loading = layer.load();
$.ajax({
url: "{:url('user/del')}?ids=" + obj.data['id'],
dataType: 'json',
type: 'get',
success: function(result) {
layer.close(loading);
if (result.code == 200) {
layer.msg(result.msg, {
icon: 1,
time: 1000
}, function() {
obj.del();
});
} else {
layer.msg(result.msg, {
icon: 2,
time: 1000
});
}
}
})
});
}
window.batchRemove = function(obj) {
var checkIds = common.checkField(obj,'id');
if (checkIds === "") {
layer.msg("未选中数据", {
icon: 3,
time: 1000
});
return false;
}
layer.confirm('确定要删除这些用户[' + checkIds + ']吗,<b style="color: red">删除后数据不可恢复</b>', {
icon: 3,
title: '提示'
}, function(index) {
layer.close(index);
let loading = layer.load();
$.ajax({
url: "{:url('user/del')}?ids=" + checkIds,
dataType: 'json',
type: 'get',
success: function(result) {
layer.close(loading);
if (result.code == 200) {
layer.msg(result.msg, {
icon: 1,
time: 1000
}, function() {
table.reload('user-table');
});
} else {
layer.msg(result.msg, {
icon: 2,
time: 1000
});
}
}
})
});
}
window.refresh = function(param) {
table.reload('user-table');
}
})
</script>
</body>
</html>
+170
View File
@@ -0,0 +1,170 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
</head>
<body class="pear-container">
<div class="layui-card">
<div class="layui-card-body">
<table id="user-table" lay-filter="user-table"></table>
</div>
</div>
<script type="text/html" id="user-toolbar"></script>
<script type="text/html" id="user-bar">
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="status_yes"><i class="layui-icon layui-icon-ok"></i></button>
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="status_no"><i class="layui-icon layui-icon-close"></i></button>
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
</script>
<script type="text/html" id="user-auth">
{{#if (d.status == 0) { }}
<span class="layui-badge layui-bg-orange">等待处理</span>
{{# }else if(d.status == 1){ }}
<span class="layui-badge layui-bg-blue">提现成功</span>
{{# }else if(d.status == 2){ }}
<span class="layui-badge layui-bg-red">退回金额</span>
{{# } }}
</script>
<script src="/static/component/layui/layui.js"></script>
<script src="/static/component/pear/pear.js"></script>
<script>
layui.use(['table', 'form', 'jquery','common'], function() {
let table = layui.table;
let form = layui.form;
let $ = layui.jquery;
let common = layui.common;
let cols = [
[{type: 'checkbox'},
{title: 'ID', field: 'id', align: 'center'},
{title: '用户帐号', field: 'uid', align: 'center'},
{title: '提现金额', field: 'money', align: 'center'},
{title: '支付宝帐号', field: 'alipay_account', align: 'center'},
{title: '支付宝姓名', field: 'alipay_name', align: 'center'},
{title: '处理状态', field: 'status', align: 'center', templet: '#user-auth'},
{title: '创建时间', field: 'create_time', align: 'center'},
{title: '操作', toolbar: '#user-bar', align: 'center', width: 130}
]
]
table.render({
elem: '#user-table',
url: "{:url('withdraw/index')}",
page: true,
limit:20,
cols: cols,
skin: 'line',
toolbar: '#user-toolbar',
defaultToolbar: [{
title: '刷新',
layEvent: 'refresh',
icon: 'layui-icon-refresh',
}, 'filter', 'print', 'exports']
});
table.on('tool(user-table)', function(obj) {
if (obj.event === 'remove') {
window.remove(obj);
} else if (obj.event === 'status_yes') {
window.edit(obj,1);
} else if (obj.event === 'status_no') {
window.edit(obj,2);
}
});
table.on('toolbar(user-table)', function(obj) {
if (obj.event === 'refresh') {
window.refresh();
}
});
window.edit = function(obj,status) {
if(status){
var msg = '确认进行提现成功操作吗?操作前请转账至对应的支付宝帐号';
}else{
var msg = '确认拒绝提现吗?拒绝后资金会退回到用户帐号内';
}
if(obj.data['status'] !== 0){
layer.msg('已经处理成功的记录禁止操作',{icon:2});
return false;
}
layer.confirm(msg, {
icon: 3,
title: '提示'
}, function(index) {
layer.close(index);
let loading = layer.load();
$.ajax({
url: "{:url('withdraw/change')}?status="+status+"&id=" + obj.data['id'],
dataType: 'json',
type: 'get',
success: function(result) {
layer.close(loading);
if (result.code == 200) {
layer.msg(result.msg, {
icon: 1,
time: 1000
}, function() {
window.refresh();
});
} else {
layer.msg(result.msg, {
icon: 2,
time: 1000
});
}
}
})
});
}
window.remove = function(obj) {
layer.confirm('确定要删除该举报内容吗?', {
icon: 3,
title: '提示'
}, function(index) {
layer.close(index);
let loading = layer.load();
$.ajax({
url: "{:url('withdraw/delete')}?id=" + obj.data['id'],
dataType: 'json',
type: 'get',
success: function(result) {
layer.close(loading);
if (result.code == 200) {
layer.msg(result.msg, {
icon: 1,
time: 1000
}, function() {
obj.del();
});
} else {
layer.msg(result.msg, {
icon: 2,
time: 1000
});
}
}
})
});
}
window.refresh = function(param) {
table.reload('user-table');
}
})
</script>
</body>
</html>
+12
View File
@@ -0,0 +1,12 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: yunwuxin <448901948@qq.com>
// +----------------------------------------------------------------------
return [];
+391
View File
@@ -0,0 +1,391 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------
// 应用公共文件
function getNotNullTime($time, $default = '', $format = 'Y-m-d H:i:s'){
if($time > 0){
return date($format,$time);
}else{
return $default;
}
}
function countSize($bit,$array=false){
$type = ['B','KB','MB','GB','TB'];
$box = ['1','1024','1048576','1073741824','TB'];
for($i = 0; $bit >= 1024; $i++) {
$bit/=1024;
}
if($array){
return [(floor($bit*100)/100),$box[$i]];
}
return (floor($bit*100)/100).$type[$i];
}
function PolicyType($d): string
{
$type = [
'local' => '本地',
'remote' => '远程',
'aliyunoss' => '阿里云OSS',
'txyunoss' => '腾讯云COS'
];
return $type[$d] ?? '未知';
}
function getFileIcon($file_ext,$type = 'admin'): string
{
$file_types = [
'video' => ['mp4','avi','mov','rmvb','rm','asf','divx','mpg','mpeg','mpe','wmv','mp4','mkv','vob','swf','flv'],
'music' => ['cd','mp3','flac','ape','wma','mid','midi','mmf','ncm','wav','dts','dsf'],
'code' => ['c','php','py','py3','cpp','h','jar','html','hta','chm','css','js','htm','asp','aspx','jsp','dll','cs','go','sql','xml','vb','java','lib','e','ec','db','bat','vbs','cmd','json','vbe','ocx','conf','sh','dat'],
'zip' => ['zip','tar','gz','rar','7z','arj','z','iso','gho'],
'ps' => ['ps','psd','pdd','eps','iff','tdi','pcx','raw'],
'img' => ['png','bmp','rle','dib','gif','ico','jpeg','jpe','jff','jps','jpg','psb','svg','pbm','mp0'],
'fonts' => ['ttf','eot','woff','otf','woff2'],
'text' => ['txt','md','rtf','ini'],
'word' => ['doc','docx','docm'],
'excel' => ['xls','xlsx','xlsm'],
'ppt' => ['ppt','pptx','pdf','pdp'],
'links' => ['url','lnk'],
'exe' => ['exe','msi'],
'ipa' => ['ipa'],
'apk' => ['apk']
];
$file_mime = 'unknown';
if($file_ext == 'dir'){
$file_mime = 'folder';
}else{
foreach ($file_types as $mime_name => $item){
foreach ($item as $ext){
if($ext == $file_ext){
$file_mime = $mime_name;
break;
}
}
}
}
if($type == 'admin'){
return '/static/admin/images/file_ext/'.$file_mime.'.png';
}else{
return '/assets/file_ext/'.$file_mime.'.png';
}
}
function getUserHead($user_head): string
{
if(empty($user_head)){
return '/assets/image/userhead.png';
}
return $user_head;
}
function getVipRule(){
$vip_rule = config('vip.vip_rule');
$rule_list = explode('<br />',nl2br($vip_rule));
foreach ($rule_list as $key => $item){
$keys = ['name', 'money', 'day','day_name', 'discount', 'discount_msg', 'desc','is_top'];
$rule = array_combine($keys,explode('|',trim($item)));
$rule['id'] = $key;
$rule_list[$key] = $rule;
}
return $rule_list;
}
function shortUrl($url){
$hex = md5($url);
$base32 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$hexLen = strlen($hex);
$subHexLen = $hexLen / 8;
$output = [];
for( $i = 0; $i < $subHexLen; $i++ ) {
$subHex = substr($hex, $i*8, 8);
$idx = 0x3FFFFFFF & (1 * hexdec('0x' . $subHex));
$out = '';
for( $j = 0; $j < 6; $j++ )
{
$out .= $base32[0x0000003D & $idx];
$idx = $idx >> 5;
}
$output[$i] = $out;
}
$code = array_shift($output);
$suc = substr(microtime(),2,4);
foreach (str_split($suc,1) as $k){
$code .= substr(str_shuffle($base32),$k,1);
}
return $code;
}
function getRndSharePwd($len = 4){
$string = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$result = '';
for ($i = 0;$i < $len;$i++){
$result .= substr(str_shuffle($string),rand(0,strlen($string) - 1),1);
}
return $result;
}
function getShareUrl($code): string
{
return url('index/share',['code' => $code],false,true);
}
function friendDate($time, $format='Y-m-d'){
if (!$time)
return '';
$nowtime = time();
if ($time > $nowtime){
return date($format, $time);
}
$Y = date('Y', $time);//年份
$z = date('z', $time);//当前的第几天
$nowY = date('Y', $nowtime);
$nowz = date('z', $nowtime);
if ($z > $nowz){
$nowz += 365;
}
$diffz = $nowz - $z;//获取差异天
$diffs = $nowtime - $time;//获取差异秒
if ($diffz >= 365){
return ($nowY-$Y).'年前';
} elseif ($diffz >= 30){
return floor($diffz / 30).'个月前';
} elseif ($diffz >= 7){
return floor($diffz / 7).'个星期前';
} elseif ($diffz >= 1){
return $diffz.'天前';
} elseif ($diffs >= 3600) {
return floor($diffs / 3600).'小时前';
} elseif ($diffs >= 300) {
return floor($diffs / 60).'分钟前';
} else {//五分钟内
return '刚刚';
}
}
function getSafeNickname($name): string
{
if(mb_strlen($name) <= 2){
$name = mb_substr($name,0,1) . '*';
}else{
$len = mb_strlen($name);
$sub_len = $len - 2;
$name = mb_substr($name,0,1) . '*' . str_repeat('*',$sub_len) . mb_substr($name,$len - 1,1);
}
return $name;
}
function getSafeDirSeparator($dir){
return str_replace(['/','\\','//','\\\\'],DIRECTORY_SEPARATOR,$dir);
}
function getDiyDirSeparator($spr,$dir){
return str_replace(['/','\\','//','\\\\'],$spr,$dir);
}
function sendEmail($username,$url){
// 邮件配置
$config = config('email.');
// 获取模板变量
$temp_var = [
'{username}' => $username,
'{site_title}' => config('basic.site_title'),
'{url}' => $url
];
// 邮件正文
$email_body = str_replace(array_keys($temp_var),array_values($temp_var),$config['template_forget']);
// php mail客户端
$mail = new PHPMailer\PHPMailer\PHPMailer();
// debug调试
$mail->SMTPDebug = 0;
// 使用smtp鉴权方式
$mail->isSMTP();
// SMTP鉴权
$mail->SMTPAuth = true;
// 邮箱服务器地址
$mail->Host = $config['smtp_host'];
// SSL加密
$mail->SMTPSecure = 'ssl';
// 端口
$mail->Port = $config['smtp_port'];
// 邮件的编码
$mail->CharSet = 'UTF-8';
// smtp账号
$mail->Username = $config['username'];
// smtp密码
$mail->Password = $config['password'];
// 设置发件人昵称
$mail->FromName = $config['nickname'];
// 设置发件人邮箱
$mail->From = $config['username'];
// 邮件正文为html编码
$mail->isHTML(true);
// 收件人邮箱
$mail->addAddress('1655545174@qq.com');
// 邮件标题
$mail->Subject = '【'.config('basic.site_title').'】找回密码邮件';
// 邮件正文
$mail->Body = $email_body;
// 发送邮件 返回状态
return $mail->send();
}
function getFileDownloadUrl($shares_id,$file_id,$is_count = 1){
$params = [
'file' => $file_id,
'shares' => $shares_id,
'timestamp' => time(),
];
$sign = md5(urldecode(http_build_query($params)) . config('app.pass_salt'));
$params['sign'] = $sign;
$params['is_count'] = $is_count;
return url('Index/download','',false,true).'?'.urldecode(http_build_query($params));
}
function getDownloadFileSignVerify($param,$sign): bool
{
$sign_key = md5(urldecode(http_build_query($param)) . config('app.pass_salt'));
return $sign_key == $sign;
}
function getFileName($field_id){
return \app\common\model\Stores::withTrashed()->where('id',$field_id)->value('origin_name');
}
function getWeekDay($time){
$week = ["","","","","","",""];
return '星期'.$week[date('w',$time)];
}
function getTimeLastDay($time){
$now_time = strtotime(date('Y-m-d'));
$the_time = strtotime(date('Y-m-d',$time));
$day_lazy = $now_time - $the_time;
return floor($day_lazy / 86400);
}
function getDownloadRemote($file_path,$origin_name,$hosts,$speed,$token){
if($speed === ""){
$speed = 'full';
}
if($speed === 0){
$speed = 'none';
}
$params = [
'file' => $file_path,
'origin' => $origin_name,
'speed' => $speed,
'time' => time()
];
$post = [
'md' => 'download',
'tk' => urlsafe_b64encode(implode(',',$params))
];
$post['sign'] = getRemoteSign($post,$token);
return $hosts .'?' . urldecode(http_build_query($post));
}
function urlsafe_b64encode($string) {
$data = base64_encode($string);
$data = str_replace(['+','/','='],['-','_',''],$data);
return $data;
}
function getRemoteSign($params,$key): string
{
// 过滤参数
$params = array_filter($params,function($key) use ($params){
if(empty($params[$key]) || $key == 'sign'){
return false;
}
return true;
},ARRAY_FILTER_USE_KEY);
// ascii排序
ksort($params);
reset($params);
// 签名
return md5(urldecode(http_build_query($params)) . $key);
}
function Recursion($data, $pid = 0)
{
static $child = [];
foreach ($data as $key => $value) {
if ($value['pid'] == $pid) {
$child[] = $value;
unset($data[$key]);
Recursion($data, $value['id']);
}
}
return $child;
}
function getFolderChildFiles($uid,$folder_id){
// 获取目录列表
$folder_list = db('folders')
->where('uid',$uid)
->field('id,parent_folder as pid')
->select();
$folder = Recursion($folder_list,$folder_id);
$folder_ids = array_column($folder,'id');
$files = db('stores')->where('uid',$uid)
->where('parent_folder','in',$folder_ids)
->field('id')
->select();
$files_ids = array_column($files,'id');
return [
'folder' => $folder_ids,
'file' => $files_ids
];
}
@@ -0,0 +1,28 @@
<?php
namespace app\common\behavior;
use app\common\model\Setting;
use think\facade\Cache;
use think\facade\Config;
class LoadConfigRun
{
public function run(){
$conf_cache = Cache::get('_setting_config');
if(empty($conf_cache)){
$conf_cache = Setting::select()->toArray();
Cache::set('_setting_config',$conf_cache);
}
// 加载配置
foreach ($conf_cache as $item){
Config::set([$item['set_name'] => $item['set_value']],$item['set_type']);
}
}
}
+89
View File
@@ -0,0 +1,89 @@
<?php
namespace app\common\controller;
use app\admin\controller\User;
use app\common\model\Users;
use think\Controller;
use think\exception\HttpResponseException;
use think\Response;
class Admin extends Controller
{
protected $middleware = ['AdminLoginCheck'];
protected $adminInfo = [];
public function initialize(){
parent::initialize(); // TODO: Change the autogenerated stub
$this->adminInfo = (new Users())->login_info('admin');
}
protected function callModelMethods($model,$methods,...$args){
$class_name = 'app\common\model\\'.$model;
$class = new $class_name;
try {
call_user_func_array([$class,$methods],$args);
}catch (\Throwable $e){
$this->returnError($e->getMessage(),505);
}
}
protected function returnSuccess($msg = '操作成功',$data = []){
$result = [
'code' => 200,
'msg' => $msg,
'time' => time(),
'data' => $data,
];
$type = 'json';
$response = Response::create($result, $type)->header([]);
throw new HttpResponseException($response);
}
protected function returnSuccessLayTable($count,$data = []){
$result = [
'code' => 0,
'msg' => '加载成功',
'count' => $count,
'data' => $data,
];
$type = 'json';
$response = Response::create($result, $type)->header([]);
throw new HttpResponseException($response);
}
protected function returnError($msg = '操作失败,系统错误',$code = 502,$data = []){
$result = [
'code' => $code,
'msg' => $msg,
'time' => time(),
'data' => $data,
];
$type = 'json';
$response = Response::create($result, $type)->header([]);
throw new HttpResponseException($response);
}
protected function getQueryMap($methods,$kw = [],$ql = []){
$map = [];
foreach ($ql as $item){
$value = input($methods.'.'.$item);
if(!empty($value)){
$map[$item] = $value;
}
}
foreach ($kw as $item){
$value = input($methods.'.'.$item);
if(!empty($value)){
$map[$item] = $value;
}
}
return $map;
}
}
+115
View File
@@ -0,0 +1,115 @@
<?php
namespace app\common\controller;
use app\common\model\Groups;
use app\common\model\Policys;
use app\common\model\Users;
use think\Controller;
class Home extends Controller
{
protected $middleware = ['UserLoginCheck'];
protected $userInfo = [];
protected $groupData = [];
protected $vip_info = [];
protected $is_login = 0;
public function initialize(){
parent::initialize(); // TODO: Change the autogenerated stub
$this->userInfo = (new Users())->login_info('default');
// 是否登录
$this->is_login = empty($this->userInfo) ? 0 : 1;
// 用户组信息
if($this->is_login){
// 登录用户组
$this->groupData = Groups::where('id',$this->userInfo['group'])->find();
}else{
// 游客用户组
$this->groupData = Groups::where('id',2)->find();
}
// 获取VIP用户组ID
$vip_group = config('vip.vip_group');
// 获取普通用户组ID
$default_group = config('register.default_group');
// 判断是否VIP
if($this->userInfo['group'] == $vip_group){
// VIP过期
if(intval($this->userInfo['group_expire']) < time()){
Users::where('id',$this->userInfo['id'])->update([
'group' => $default_group,
'group_expire' => 0
]);
$this->vip_info['is_vip'] = 0;
$this->vip_info['expire_time'] = 0;
}else{
$this->vip_info['is_vip'] = 1;
$this->vip_info['expire_time'] = date('Y-m-d',$this->userInfo['group_expire']);
}
}else{
$this->vip_info['is_vip'] = 0;
$this->vip_info['expire_time'] = 0;
}
$this->assign('group',$this->groupData);
$this->assign('info',$this->userInfo);
$this->assign('is_login',$this->is_login);
$this->assign('vip_info',$this->vip_info);
$this->assign('url_path',$this->request->path());
}
protected function getPolicy(): array
{
$policy = Policys::where('id',$this->groupData['policy_id'])->find()->toArray();
return $policy;
}
protected function getPolicyUrl($policy,$param = []): string
{
if($policy['type'] != 'remote'){
return url('upload/file');
}
$data = [
'uid' => $this->userInfo['id'],
'policy_id' => $policy['id'],
'save_dir' => $policy['config']['save_dir']
];
$data = array_merge($data,$param);
$data['sign'] = $this->remote_sign_params($data,$policy['config']['access_token']);
return $policy['config']['server_uri'].'?'.urldecode(http_build_query($data));
}
protected function remote_sign_params($params,$key): string
{
// 过滤参数
$params = array_filter($params,function($key) use ($params){
if(empty($params[$key]) || $key == 'sign'){
return false;
}
return true;
},ARRAY_FILTER_USE_KEY);
// ascii排序
ksort($params);
reset($params);
// 签名
return md5(urldecode(http_build_query($params)) . $key);
}
}
@@ -0,0 +1,11 @@
<?php
namespace app\common\exception;
use think\Exception;
class LoginError extends Exception
{
}
+12
View File
@@ -0,0 +1,12 @@
<?php
namespace app\common\model;
use think\Model;
class Certify extends Model
{
}
+432
View File
@@ -0,0 +1,432 @@
<?php
namespace app\common\model;
use think\Exception;
class FileManage
{
/**
* 获取上级目录ID
* @param $folder_id
* @param $uid
* @return mixed
*/
public static function getFolderPid($folder_id,$uid){
if(empty($folder_id)){
$folder_id = Folders::where('uid',$uid)->where('parent_folder',$folder_id)->value('id');
}
return $folder_id;
}
/**
* 获取有效的目录ID
* @param $folder_id
* @param $uid
* @return mixed
*/
public static function getFolderAllowPid($folder_id,$uid){
if(empty($folder_id)){
$folder_id = Folders::where('uid',$uid)->where('parent_folder',$folder_id)->value('id');
}else{
$folder_id = Folders::where('uid',$uid)->where('id',$folder_id)->value('id');
}
return $folder_id;
}
/**
* 获取文件列表
* @param $folder_id
* @param $search
* @param $uid
* @param $page
* @param $limit
* @return array|array[]
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public static function ListFile($folder_id,$search,$uid,$page,$limit): array
{
//获取当前根目录
$folder_id = self::getFolderPid($folder_id,$uid);
$maps = [
['uid','=',$uid],
['parent_folder','=',$folder_id],
['delete_time','null','']
];
$files_sql = db('stores')
->where($maps)
->where('origin_name','like','%'.$search.'%')
->field('id,uid,shares_id,origin_name as name,ext,size,count_down,count_open,update_time')
->fetchSql(true)
->select();
$list = db('folders')
->where($maps)
->where('folder_name','like','%'.$search.'%')
->field('id,uid,shares_id,folder_name as name,ext,size,count_down,count_open,update_time')
->union($files_sql,true)
->page($page,$limit)
->select();
$files_count = db('stores')
->where($maps)
->where('origin_name','like','%'.$search.'%')
->field('id')
->count();
$folder_count = db('folders')
->where($maps)
->where('folder_name','like','%'.$search.'%')
->field('id')
->count();
$data = ['data' => []];
foreach ($list as $item){
$file_item = [
'file_name' => '',
'file_size' => '-',
'url' => '',
'url_pass' => '',
'count_down' => '<font color="#f81" size="4">'.$item['count_down'].'</font>',
'count_open' => $item['count_open'],
'update_time' => date('Y-m-d H:i',$item['update_time'])
];
if($item['ext'] == 755){
$file_item['file_name'] = '
<img class="file-icon" src="'.getFileIcon('dir','index').'" />
<text class="filename folder" id="t'.$item['id'].'" data-id="'.$item['id'].'" data-filename="'.$item['name'].'" data-folder="1">'.$item['name'].'</text>
<div class="gengduo" onclick="clickGengduo(event,'.$item['id'].')">
<span><em class="icon icon-more icon-color" title="更多"></em></span>
</div>';
$share_info = Shares::getShare($item['uid'],$item['id'],1);
}else{
$file_item['file_name'] = '
<img class="file-icon" src="'.getFileIcon($item['ext'],'index').'" />
<text class="filename" id="t'.$item['id'].'" data-id="'.$item['id'].'" data-filename="'.$item['name'].'" data-folder="0">'.$item['name'].'</text>
<div class="gengduo" onclick="clickGengduo(event,'.$item['id'].')">
<span><em class="icon icon-more icon-color" title="更多"></em></span>
</div>';
$share_info = Shares::getShare($item['uid'],$item['id'],0);
$file_item['file_size'] = countSize($item['size']);
}
$is_folder = $item['ext'] == 755 ? 1 : 0;
if(!empty($share_info)){
$share_url = getShareUrl($share_info['code']);
$file_item['url'] = '<a id="'.$item['id'].'-url" data-id="'.$item['id'].'" data-pass="'.$share_info['pwd'].'" data-pass-status="'.$share_info['pwd_status'].'" href="'.$share_url.'" target="_blank">'.$share_url.'</a>';
if(empty($share_info['pwd']) || $share_info['pwd_status'] == 0){
$share_info['pwd'] = '-';
}
$file_item['url_pass'] = '<a id="'.$item['id'].'-pass" onclick="if($(\'#'.$item['id'].'-pass\').html() != \'-\'){CopyText($(\'#'.$item['id'].'-pass\').html(),\'复制提取码成功~\')}else{setPass('.$item['id'].',$(\'#t'.$item['id'].'\').html(),'.$is_folder.')}">'.$share_info['pwd'].'</a>';
}
$data['data'][] = $file_item;
}
//查询上级目录
$data['parent'] = "";
if($folder_id != 0){
$parent_ids = self::getUserDirParents($uid,$folder_id);
if(!empty($parent_ids)){
$folder_parents = Folders::where('id','in',$parent_ids)
->where('uid',$uid)
->field('id,folder_name')
->order('id desc')
->select()->toArray();
$folder_parents = array_reverse($folder_parents);
$data['parent'] = $folder_parents;
}
}
$data['total'] = $files_count + $folder_count;
return $data;
}
public static function ShareListFile($folder_id,$uid){
//获取当前根目录
$folder_id = self::getFolderPid($folder_id,$uid);
$maps = [
['uid','=',$uid],
['parent_folder','=',$folder_id],
['delete_time','null','']
];
$files_sql = db('stores')
->where($maps)
->field('id,uid,shares_id,origin_name as name,ext,size,update_time')
->fetchSql(true)
->select();
$list = db('folders')
->where($maps)
->field('id,uid,shares_id,folder_name as name,ext,size,update_time')
->union($files_sql,true)
->select();
$share_ids = array_column($list,'shares_id');
// 查询分享代码
$share_list = Shares::where('id','in',$share_ids)->column('code','id');
// 返回数据
$data = [];
foreach ($list as $item){
$type = $item['ext'] == 755 ? 'dir' : $item['ext'];
$files = [
'id' => $item['id'],
'type' => $item['ext'] == 755 ? 'dir' : 'file',
'icon' => getFileIcon($type,'index'),
'name' => $item['name'],
'size' => empty($item['size']) ? '-' : countSize($item['size']),
'time' => friendDate($item['update_time'])
];
$code = $share_list[$item['shares_id']] ?? '';
if(empty($code)){
$files['url'] = 'javascript:;';
}else{
$files['url'] = getShareUrl($code);
}
$data[] = $files;
}
return $data;
}
public static function FolderList($folder_id,$uid): array
{
//获取当前根目录
$folder_id = self::getFolderPid($folder_id,$uid);
$maps = [
['uid','=',$uid],
['parent_folder','=',$folder_id],
['delete_time','null','']
];
return Folders::withTrashed()
->where($maps)
->field('id,folder_name')
->select()->each(function($item) use ($uid){
if(Folders::withTrashed()->where('parent_folder',$item['id'])->where('uid',$uid)->count() > 0){
$item['down'] = 1;
}else{
$item['down'] = 0;
}
return $item;
})->toArray();
}
/**
* 回收站文件列表
* @param $search
* @param $uid
* @param $page
* @param $limit
* @return array|array[]
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public static function RecycleFile($search,$uid,$page,$limit){
$file_sql = db('stores')
->where('uid',$uid)
->where('delete_time','not null')
->where('origin_name','like','%'.$search.'%')
->field('id,uid,shares_id,origin_name as name,ext,size,count_down,count_open,update_time')
->fetchSql(true)
->select();
$list = db('folders')
->where('uid',$uid)
->where('delete_time','not null')
->where('folder_name','like','%'.$search.'%')
->field('id,uid,shares_id,folder_name as name,ext,size,count_down,count_open,update_time')
->union($file_sql,true)
->page($page,$limit)
->select();
$stores_count = db('stores')
->where('uid',$uid)
->where('delete_time','not null')
->where('origin_name','like','%'.$search.'%')
->field('id')
->count();
$folders_count = db('folders')
->where('uid',$uid)
->where('delete_time','not null')
->where('folder_name','like','%'.$search.'%')
->field('id')
->count();
$data = ['data' => []];
foreach ($list as $item){
$file_item = [
'file_name' => '',
'file_size' => '-',
'url' => '',
'url_pass' => '',
'count_down' => '<font color="#f81" size="4">'.$item['count_down'].'</font>',
'count_open' => $item['count_open'],
'update_time' => date('Y-m-d H:i',$item['update_time'])
];
if($item['ext'] == 755){
$file_item['file_name'] = '
<img class="file-icon" src="'.getFileIcon('dir','index').'" />
<text class="filename folder" id="t'.$item['id'].'" data-id="'.$item['id'].'" data-filename="'.$item['name'].'" data-folder="1">'.$item['name'].'</text>
<div class="gengduo" onclick="clickGengduo(event,'.$item['id'].')">
<span><em class="icon icon-more icon-color" title="更多"></em></span>
</div>';
$share_info = Shares::getShare($item['uid'],$item['id'],1);
}else{
$file_item['file_name'] = '
<img class="file-icon" src="'.getFileIcon($item['ext'],'index').'" />
<text class="filename" id="t'.$item['id'].'" data-id="'.$item['id'].'" data-filename="'.$item['name'].'" data-folder="0">'.$item['name'].'</text>
<div class="gengduo" onclick="clickGengduo(event,'.$item['id'].')">
<span><em class="icon icon-more icon-color" title="更多"></em></span>
</div>';
$share_info = Shares::getShare($item['uid'],$item['id'],0);
$file_item['file_size'] = countSize($item['size']);
}
$is_folder = $item['ext'] == 755 ? 1 : 0;
if(!empty($share_info)){
$share_url = getShareUrl($share_info['code']);
$file_item['url'] = '<a id="'.$item['id'].'-url" data-id="'.$item['id'].'" data-pass="'.$share_info['pwd'].'" data-pass-status="'.$share_info['pwd_status'].'" href="'.$share_url.'" target="_blank">'.$share_url.'</a>';
if(empty($share_info['pwd']) || $share_info['pwd_status'] == 0){
$share_info['pwd'] = '-';
}
$file_item['url_pass'] = '<a id="'.$item['id'].'-pass" onclick="if($(\'#'.$item['id'].'-pass\').html() != \'-\'){CopyText($(\'#'.$item['id'].'-pass\').html(),\'复制提取码成功~\')}else{setPass('.$item['id'].',$(\'#t'.$item['id'].'\').html(),'.$is_folder.')}">'.$share_info['pwd'].'</a>';
}
$data['data'][] = $file_item;
}
//查询上级目录
$data['parent'] = "";
$data['total'] = $stores_count + $folders_count;
return $data;
}
/**
* 创建目录
* @throws Exception
*/
public static function createFolder($folder_pid, $folder_name, $folder_desc, $uid){
$folder_name = str_replace(" ","",$folder_name);
$folder_name = str_replace("/","",$folder_name);
//获取当前根目录
$folder_pid = self::getFolderPid($folder_pid,$uid);
if(empty($folder_name)){
throw new Exception('目录名不能为空');
}
// 判断路径
if(Folders::where('id',$folder_pid)->where('uid',$uid)->find() == null){
throw new Exception('文件夹路径不存在');
}
// 是否重复
if(
Folders::where('parent_folder',$folder_pid)
->where('folder_name',$folder_name)
->where('uid',$uid)->find() != null
){
throw new Exception('文件夹已存在');
}
$dir_id = (new Folders)->insertGetId([
'uid' => $uid,
'folder_name' => $folder_name,
'parent_folder' => $folder_pid,
'desc' => $folder_desc,
'create_time' => time(),
'update_time' => time()
]);
$share_id = Shares::addShare($uid,$dir_id,1);
(new Folders)->where('id',$dir_id)->update(['shares_id' => $share_id]);
return $dir_id;
}
/**
* 获取用户上级目录列表
* @param $uid
* @param $folder_id
* @return array
*/
protected static function getUserDirParents($uid,$folder_id): array
{
$folders = self::getUserDirs($uid);
return self::getDirParents($folders,$folder_id);
}
/**
* 递归获取上级目录
* @param $folders
* @param $folder_id
* @return array
*/
protected static function getDirParents($folders,$folder_id): array
{
$ids = [];
foreach ($folders as $item){
if($item['id'] == $folder_id){
if($item['pid']){
$ids[] = $item['id'];
$ids = array_merge(self::getDirParents($folders,$item['pid']),$ids);
}
}
}
return $ids;
}
/**
* 获取用户目录
* @param $uid
* @return array
*/
protected static function getUserDirs($uid): array
{
return Folders::where('uid',$uid)->field('id,parent_folder as pid')->select()->toArray();
}
}
+238
View File
@@ -0,0 +1,238 @@
<?php
namespace app\common\model;
use app\common\model\driver\AliyunOss;
use app\common\model\driver\Local;
use app\common\model\driver\TxyunOss;
use think\Exception;
class FileUpload
{
/**
* @var int 储存策略
*/
protected $policy;
/**
* @var int 上传用户
*/
protected $uid;
/**
* @var array 上传数据
*/
protected $info;
/**
* @var int 最大上传大小
*/
protected $max_size;
/**
* 设置来源信息
* @param $uid
* @param $policy
* @param $max_size
* @return FileUpload
*/
public function source($uid,$policy,$max_size): FileUpload
{
$this->uid = $uid;
$this->policy = $policy;
$this->max_size = $max_size;
return $this;
}
/**
* 检查文件信息
* @throws Exception
*/
protected function check(){
if(empty($this->info['file']['folder'])){
throw new Exception('上传目标文件夹不存在');
}
if(empty($this->info['file']['data'])){
throw new Exception('请选择上传的文件');
}
if(empty($this->info['file']['size'])){
throw new Exception('文件大小异常');
}
if(empty($this->info['file']['name'])){
throw new Exception('上传文件名异常');
}
if($this->policy['type'] == 'remote'){
throw new Exception('您不可以使用该存储策略');
}
if(!empty($this->max_size)){
if($this->info['file']['size'] > $this->max_size){
throw new Exception('单文件最大上传大小'.countSize($this->max_size));
}
}
if(!empty($this->policy['filetype'])){
$file_ext = $this->getFileExt($this->info['file']['name']);
$allow_ext = explode(',',$this->policy['filetype']);
if(!in_array($file_ext,$allow_ext)){
throw new Exception('不允许上传'.$file_ext.'类型的文件');
}
}
if(empty($this->info['chunk']['key'])){
throw new Exception('分片密钥错误');
}
}
/**
* 获取文件后缀名
* @param $filename
* @return string
*/
protected function getFileExt($filename): string
{
return strtolower(pathinfo($filename, PATHINFO_EXTENSION));
}
/**
* 获取随机文件名
* @param int $length
* @return string
*/
protected function getRandomKey(int $length = 16): string
{
$charTable = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$result = "";
for ( $i = 0; $i < $length; $i++ ){
$result .= $charTable[ mt_rand(0, strlen($charTable) - 1) ];
}
return $result;
}
/**
* 获取上传目录
* @param $key
* @return string|string[]
*/
protected function getPath($key)
{
// 目录分割
$ds = DIRECTORY_SEPARATOR;
// 配置目录
$save_dir = str_replace('/',$ds,$this->policy['config']['save_dir']);
// 根目录
$root_path = realpath(env('root_path') . './public') . $save_dir;
// 临时存储目录
$temp_path = realpath(env('root_path') . './public') . str_replace('/',$ds,'/temp/');
// 当前保存目录
$file_path = date('Ymd') . $ds . $this->uid . $ds;
//文件名
$file_name = uniqid( "file_") . time();
$data = [
'root' => $root_path,
'temp' => $temp_path,
'file' => $file_path,
'path' => $root_path . $file_path,
'temp_path' => $temp_path . $file_path,
'name' => $file_name,
'filename' => $file_name .'.'. $this->getFileExt($this->info['file']['name'])
];
if($key == 'all'){
return $data;
}
return $data[$key] ?? '';
}
public function upload(){
// 超时时间5分钟
@set_time_limit(5 * 60);
// 获取有效的目录ID
$this->info['file']['folder'] = FileManage::getFolderAllowPid(input('post.folder_id',0),$this->uid);
// 获取上传文件大小
$this->info['file']['size'] = input('post.size',0);
// 获取上传文件名
$this->info['file']['name'] = input('post.name','');
// 上传文件对象获取
$this->info['file']['data'] = request()->file('file');
// 分片上传
$this->info['chunk']['key'] = input('post.chunks_key');
$this->info['chunk']['chunk'] = input('post.chunk',0);
$this->info['chunk']['chunks'] = input('post.chunks',0);
$this->info['uid'] = $this->uid;
// 参数校验
$this->check();
// 目录
$path = $this->getPath('all');
// 上传驱动
switch ($this->policy['type']){
// 阿里云
case 'aliyunoss':
$upload = new AliyunOss($this->info,$this->policy,$path);
break;
// 腾讯云
case 'txyunoss':
$upload = new TxyunOss($this->info,$this->policy,$path);
break;
// 本地
default:
$upload = new Local($this->info,$this->policy,$path);
break;
}
// 上传文件
$file_object = $upload->upload();
// 插入数据库
if($file_object != 'chunk_file' && $file_object != null){
// 加入数据库
$data = [
'uid' => $this->uid,
'origin_name' => $this->info['file']['name'],
'file_name' => $file_object,
'size' => $this->info['file']['size'],
'ext' => $this->getFileExt($this->info['file']['name']),
'parent_folder' => $this->info['file']['folder'],
'policy_id' => $this->policy['id'],
'create_time' => time(),
'update_time' => time()
];
$file_id = (new Stores)->insertGetId($data);
$share_id = Shares::addShare($this->uid,$file_id,0);
Stores::where('id',$file_id)->update(['shares_id' => $share_id]);
return ['code' => 1,'msg' => '文件上传成功'];
}
return ['code' => 1,'chunks' => 'chunk 文件上传成功'];
}
}
+18
View File
@@ -0,0 +1,18 @@
<?php
namespace app\common\model;
use think\Exception;
use think\Model;
use think\model\concern\SoftDelete;
class Folders extends Model
{
use SoftDelete;
protected $deleteTime = 'delete_time';
protected $autoWriteTimestamp = true;
}
+22
View File
@@ -0,0 +1,22 @@
<?php
namespace app\common\model;
use think\Model;
class Groups extends Model
{
public function addGroup($data){
$data["max_storage"] = $data["max_storage"] * $data["storage_size"];
unset($data["storage_size"]);
self::insert($data);
}
public function editGroup($id,$data){
$data["max_storage"] = $data["max_storage"] * $data["storage_size"];
unset($data["storage_size"]);
self::where('id',$id)->update($data);
}
}
+12
View File
@@ -0,0 +1,12 @@
<?php
namespace app\common\model;
use think\Model;
class Order extends Model
{
}
+53
View File
@@ -0,0 +1,53 @@
<?php
namespace app\common\model;
use think\Model;
class Policys extends Model
{
public function addPolicy($data){
//基础参数
$keys = ['name','type','filetype'];
// 附加参数
$field = [];
foreach ($data as $key => $item){
if(!in_array($key,$keys)){
$field[$key] = $item;
unset($data[$key]);
}
}
$data['config'] = json_encode($field);
self::insert($data);
}
public function editPolicy($id,$data){
//基础参数
$keys = ['name','type','filetype'];
// 附加参数
$field = [];
foreach ($data as $key => $item){
if(!in_array($key,$keys)){
$field[$key] = $item;
unset($data[$key]);
}
}
$data['config'] = json_encode($field);
self::where('id',$id)->update($data);
}
public function getConfigAttr($value){
return json_decode($value,true);
}
public static function getPolicyAll(): array
{
return self::field('id,name')->select()->toArray();
}
}
+60
View File
@@ -0,0 +1,60 @@
<?php
namespace app\common\model;
use think\Model;
class Profit extends Model
{
public static function record($uid,$file_id,$field,$value = 1): bool
{
$fp = fopen('record_lock.txt', "w+");
if(flock($fp,LOCK_EX | LOCK_NB)){
// 判断今日是否统计
$rec = self::where('uid',$uid)->where('file_id',$file_id)->whereTime('create_time','d')->find();
// 补全字段
$field = 'count_'.$field;
if($field == 'count_view'){
Stores::where('id',$file_id)->where('uid',$uid)->setInc('count_open',1);
}
if($field == 'count_down'){
Stores::where('id',$file_id)->where('uid',$uid)->setInc('count_down',1);
}
if(!empty($rec)){
self::where('uid',$uid)->where('file_id',$file_id)->setInc($field,$value);
flock($fp,LOCK_UN);
return true;
}
// 插入新统计
$data = [
'uid' => $uid,
'file_id' => $file_id,
'create_time' => time(),
$field => $value
];
// 插入统计
self::insert($data);
flock($fp,LOCK_UN);
return true;
} else{
fclose($fp);
return false;
}
}
}
+44
View File
@@ -0,0 +1,44 @@
<?php
namespace app\common\model;
use think\Model;
class Record extends Model
{
public static function addRecord($uid,$type,$source,$money,$remark){
$user = Users::where('id',$uid)->find();
// 操作前金额
$before_money = $user['amount'];
// 操作
if($type){
$after_money = floatval($user['amount']) - floatval($money);
}else{
$after_money = floatval($user['amount']) + floatval($money);
}
if($after_money < 0){
return false;
}
if($type){
Users::where('id',$uid)->setDec('amount',$money);
}else{
Users::where('id',$uid)->setInc('amount',$money);
}
return self::create([
'uid' => $uid,
'type' => $type,
'source' => $source,
'money' => $money,
'before_money' => $before_money,
'after_money' => $after_money,
'remark' => $remark,
'create_time' => time()
]);
}
}
+13
View File
@@ -0,0 +1,13 @@
<?php
namespace app\common\model;
use think\Model;
class Reports extends Model
{
}
+14
View File
@@ -0,0 +1,14 @@
<?php
namespace app\common\model;
use think\Model;
class Setting extends Model
{
}
+58
View File
@@ -0,0 +1,58 @@
<?php
namespace app\common\model;
use think\Exception;
use think\Model;
class Shares extends Model
{
public static function addShare($uid,$source,$type){
$share_code = '';
for ($i = 0;$i < 5;$i++){
$code = shortUrl($uid.'_'.$source.'_'.$type.time());
if(self::where('code',$code)->count() == 0){
$share_code = $code;
break;
}
}
if(empty($share_code)){
throw new Exception('分享连接生成失败,请稍后重试');
}
$pwd = getRndSharePwd();
$data = [
'uid' => $uid,
'source_id' => $source,
'type' => $type,
'speed' => 0,
'code' => $code,
'pwd' => $pwd,
'pwd_status' => 0
];
return self::insertGetId($data);
}
public static function getShare($uid,$source,$type){
return self::where([
['uid','=',$uid],
['source_id','=',$source],
['type','=',$type]
])->field('id,code,pwd,pwd_status,speed')->find();
}
public function delShare(){
}
public static function updateShare($id,$data){
return self::where('id',$id)->update($data);
}
}
+34
View File
@@ -0,0 +1,34 @@
<?php
namespace app\common\model;
use think\Model;
use think\model\concern\SoftDelete;
class Stores extends Model
{
use SoftDelete;
protected $deleteTime = 'delete_time';
protected $autoWriteTimestamp = true;
public function getPolicy(){
$policy = Policys::get($this->policy_id);
if(empty($policy)){
return false;
}
return $policy;
}
public function getLocalSaveFilePath($save_dir,$filename): string
{
return env('root_path').'public'.getSafeDirSeparator($save_dir . $filename);
}
public function getLocalSaveFile($save_dir,$filename){
return str_replace(['/','\\','//','\\\\'],'/',($save_dir.$filename));
}
}
+167
View File
@@ -0,0 +1,167 @@
<?php
namespace app\common\model;
use app\common\exception\LoginError;
use think\Exception;
use think\facade\Session;
use think\Model;
class Users extends Model
{
/**
* 用户注册方法
* @param $username
* @param $email
* @param $password
* @param $group
* @param array $other
* @throws Exception
*/
public function register($username, $email, $password, $group, array $other = [],$group_expire=0){
if(self::where('username',$username)->count() > 0){
throw new Exception('当前帐号已被注册');
}
if(self::where('email',$email)->count() > 0){
throw new Exception('当前安全邮箱已被绑定');
}
$en_password = md5($password . config('app.pass_salt'));
$nickname = ucfirst($username);
if(isset($other['nickname'])){
$nickname = $other['nickname'];
}
$user = [
'nickname' => $nickname,
'username' => $username,
'email' => $email,
'group' => $group,
'password' => $en_password,
'create_time' => time(),
'group_expire' => $group_expire,
'status' => 1
];
self::insert($user);
$user_id = self::getLastInsID();
//添加基础目录
if($group != 1){
Folders::insert([
'uid' => $user_id,
'folder_name' => '根目录',
'parent_folder' => 0,
'create_time' => time()
]);
}
}
/**
* 用户登录登录方法
* @param $username
* @param $password
* @param string $login_type
* @return bool
* @throws LoginError
*/
public function login($username,$password,$login_type = 'default'){
// 登录用户组类型
if($login_type == 'admin'){
$group = 1;
}else{
$group = config('register.default_group') .','.config('vip.vip_group');
}
// 查找用户
$user = self::where('username',$username)->where('group','in',$group)->find();
// 用户不存在
if(empty($user)){
throw new LoginError('登录帐号或者密码错误,请重试');
}
// 加密密码
$password = md5($password . config('app.pass_salt'));
if($user['password'] != $password){
throw new LoginError('登录帐号或者密码错误,请重试');
}
// 不允许登录
if($login_type == 'default' && $user['status'] == 0){
throw new LoginError('登录帐号已被管理员封禁,请联系管理员处理!');
}
// 登录成功
Session::set($login_type .'_uid',$user['id']);
Session::set($login_type .'_lkey',md5($username . $password . $user['status']));
return true;
}
/**
* 退出登录方法
* @param string $type
*/
public function logout(string $type = 'default'){
Session::delete($type .'_uid');
Session::delete($type .'_lkey');
}
/**
*登录验证方法
* @param string $type
* @return bool
*/
public function login_auth(string $type = 'default'): bool
{
$uid = Session::get($type .'_uid');
$key = Session::get($type .'_lkey');
$user = self::where('id',$uid)->find();
if(empty($user)){
return false;
}
if($key != md5($user['username'] . $user['password'] . $user['status'])){
return false;
}
return true;
}
/**
* 获取当前登录用户信息
* @param string $type
* @return Users|false
*/
public function login_info(string $type = 'default'){
$uid = Session::get($type .'_uid');
$user = self::where('id',$uid)->find();
if(empty($user)){
return false;
}
return $user;
}
public function getCertify(){
return Certify::where('uid',$this->id)
->where('status',1)
->field('name,idcard,create_time')
->find();
}
}
+12
View File
@@ -0,0 +1,12 @@
<?php
namespace app\common\model;
use think\Model;
class Withdraw extends Model
{
}
@@ -0,0 +1,185 @@
<?php
namespace app\common\model\driver;
use OSS\Core\OssException;
use OSS\OssClient;
use think\Exception;
use think\facade\Cache;
class AliyunOss extends PolicyStore
{
public function uploadSimple(){
// 临时文件地址
$temp_file = $this->path['temp_path'] . $this->path['filename'];
// 保存临时文件
$file_info = $this->info['file']['data']->move($this->path['temp_path'],$this->path['filename']);
if(!$file_info){
throw new Exception($this->info['file']['data']->getError());
}
$accessKeyId = $this->policy['config']['access_key'];
$accessKeySecret = $this->policy['config']['access_secret'];
$endpoint = $this->policy['config']['endpoint'];
$bucket = $this->policy['config']['bucket'];
$policy_save_dir = ltrim($this->policy['config']['save_dir'],'/');
$object = getDiyDirSeparator('/',$policy_save_dir. $this->path['file'].$this->path['filename']);
try{
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
$ossClient->uploadFile($bucket,$object,$temp_file);
// 删除临时文件
@unlink($temp_file);
// 返回文件存储地址
return '/'. $object;
} catch(OssException $e) {
throw new Exception('FAILED'.$e->getMessage());
}
}
public function uploadPart()
{
// 临时文件地址
$temp_file = $this->path['temp_path'] . $this->path['filename'];
// 保存临时文件
$file_info = $this->info['file']['data']->move($this->path['temp_path'],$this->path['filename']);
if(!$file_info){
throw new Exception($this->info['file']['data']->getError());
}
$accessKeyId = $this->policy['config']['access_key'];
$accessKeySecret = $this->policy['config']['access_secret'];
$endpoint = $this->policy['config']['endpoint'];
$bucket = $this->policy['config']['bucket'];
$policy_save_dir = ltrim($this->policy['config']['save_dir'],'/');
// 缓存分片上传地址
$chunks_object_keys = 'aliyun_oss_chunks_'.$this->info['chunk']['key'];
$multi_upload_object = Cache::get($chunks_object_keys);
try {
$client = new OssClient($accessKeyId,$accessKeySecret,$endpoint);
// 缓存防止重复文件地址
if(empty($multi_upload_object)){
$upload_object_path = getDiyDirSeparator('/',$policy_save_dir. $this->path['file'].$this->path['filename']);
$uploadId = $client->initiateMultipartUpload($bucket,$upload_object_path);
$multi_upload_object = [
'object' => $upload_object_path,
'upload_id' => $uploadId
];
Cache::set($chunks_object_keys,$multi_upload_object);
}
// 分片上传配置
$options = [
// 上传文件地址
OssClient::OSS_FILE_UPLOAD => $temp_file,
// 分片号
OssClient::OSS_PART_NUM => $this->info['chunk']['chunk'] + 1,
];
$client->uploadPart($bucket, $multi_upload_object['object'], $multi_upload_object['upload_id'], $options);
// 组合文件
if(($this->info['chunk']['chunk'] + 1) == $this->info['chunk']['chunks']){
// 获取所有分片信息
$listPartsInfo = $client->listParts($bucket, $multi_upload_object['object'], $multi_upload_object['upload_id']);
$uploadParts = [];
foreach ($listPartsInfo->getListPart() as $partInfo) {
$uploadParts[] = [
'PartNumber' => $partInfo->getPartNumber(),
'ETag' => $partInfo->getETag()
];
}
// 合并分片
$client->completeMultipartUpload($bucket, $multi_upload_object['object'], $multi_upload_object['upload_id'], $uploadParts);
// 删除分片缓存信息
Cache::rm($chunks_object_keys);
// 删除临时文件
@unlink($temp_file);
// 返回结果
return '/' . $multi_upload_object['object'];
}
// 删除临时文件
@unlink($temp_file);
return 'chunk_file';
}catch (OssException $e){
throw new Exception('FAILED'.$e->getMessage());
}
}
public function download($stores, $speed, $policy)
{
$accessKeyId = $policy['config']['access_key'];
$accessKeySecret = $policy['config']['access_secret'];
$endpoint = $policy['config']['endpoint'];
$bucket = $policy['config']['bucket'];
$object = ltrim($stores['file_name'],'/');
// 限速下载
if($speed !== ""){
// 下载速度
$down_speed = round(intval($speed) * 8192);
// 最小限速100kb/s
if($down_speed < 819200){
$down_speed = 819200;
}
$options = [
OssClient::OSS_TRAFFIC_LIMIT => $down_speed
];
}
try {
$ossClient = new OssClient($accessKeyId,$accessKeySecret,$endpoint);
$options['response-content-disposition'] = 'attachment; filename='.$stores['origin_name'];
// 120s有效期
$timeout = 120;
$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET", $options);
// 跳转下载地址
return redirect($signedUrl);
}catch (OssException $e){
throw new Exception($e->getMessage());
}
}
}
+125
View File
@@ -0,0 +1,125 @@
<?php
namespace app\common\model\driver;
use think\Exception;
use think\facade\Cache;
class Local extends PolicyStore
{
public function uploadSimple()
{
// 保存文件
$file_info = $this->info['file']['data']->move($this->path['path'],$this->path['name']);
if(!$file_info){
throw new Exception($this->info['file']['data']->getError());
}
$policy_save_dir = $this->policy['config']['save_dir'];
return getDiyDirSeparator('/',$policy_save_dir. $this->path['file'].$this->path['filename']);
}
public function uploadPart()
{
// 分片数据存储名称
$chunks_saveKey = 'chunks_'.$this->info['uid'].'_'.$this->info['chunk']['key'];
// 文件名称
$temp_filename = 'chunks_'.md5($this->info['chunk']['key']).'_'.$this->getRandomKey(4) . '_part_'.$this->info['chunk']['chunk'].'.chunk';
// 临时文件地址
$temp_file = $this->path['temp_path'] . $temp_filename;
// 保存临时文件
$file_info = $this->info['file']['data']->move($this->path['temp_path'],$temp_filename);
if(!$file_info){
throw new Exception('分片创建错误:'.$this->info['file']['data']->getError());
}
// 分片存储列表
$chunk_list = Cache::get($chunks_saveKey) ?? [];
// 加入分片文件
$chunk_list[] = $temp_file;
// 保存分片临时存储列表
Cache::set($chunks_saveKey,$chunk_list);
// 分片上传成功
if($this->info['chunk']['chunk'] == ($this->info['chunk']['chunks'] - 1)){
$save_file = $this->path['path'] . $this->path['filename'];
// 融合文件路径
$fileObj = fopen($save_file,"a+");
// 融合文件
foreach ($chunk_list as $value) {
$chunkObj = fopen($value, "rb");
if(!($fileObj && $chunkObj)){
throw new Exception('分片融合文件创建失败');
}
$content = fread($chunkObj, (2 * 1024 * 1024));
fwrite($fileObj, $content, (2 * 1024 * 1024));
unset($content);
fclose($chunkObj);
// 删除分片文件
unlink($value);
}
// 清空分片临时存储列表
Cache::rm($chunks_saveKey);
$policy_save_dir = $this->policy['config']['save_dir'];
return getDiyDirSeparator('/',$policy_save_dir. $this->path['file'] . $this->path['filename']);
}
return 'chunk_file';
}
protected function getRandomKey($length = 16){
$charTable = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$result = "";
for ( $i = 0; $i < $length; $i++ ){
$result .= $charTable[ mt_rand(0, strlen($charTable) - 1) ];
}
return $result;
}
public function download($stores,$speed,$policy)
{
//存储文件地址
$_file = getSafeDirSeparator(env('root_path').'public'.$stores['file_name']);
// 文件不存在
if(!is_file($_file)){
throw new Exception('文件不存在,可能已被删除');
}
$_file_path = $stores['file_name'];
$_file_limit_size = round(intval($speed) * 1024);
// 启用 nginx X-Accel 下载
header('Content-Type: application/octet-stream');
$encoded_fname = rawurlencode($stores['origin_name']);
header('Content-Disposition: attachment;filename="'.$encoded_fname.'";filename*=utf-8'."''".$encoded_fname);
header('X-Accel-Redirect: '. $_file_path);
header('X-Accel-Buffering: yes');
// 不限速下载
if($speed !== ""){
header('X-Accel-Limit-Rate:'.$_file_limit_size);
}
}
}
@@ -0,0 +1,46 @@
<?php
namespace app\common\model\driver;
abstract class PolicyStore
{
protected $info;
protected $policy;
protected $path;
public function __construct($info,$policy,$path)
{
$this->info = $info;
$this->policy = $policy;
$this->path = $path;
}
public function upload()
{
if(!empty($this->info['chunk']['chunks'])){
return $this->uploadPart();
}else{
return $this->uploadSimple();
}
}
public function uploadSimple()
{
return 0;
}
public function uploadPart()
{
return 0;
}
public function download($stores,$speed,$policy)
{
return 0;
}
}
@@ -0,0 +1,210 @@
<?php
namespace app\common\model\driver;
use Qcloud\Cos\Client;
use Qcloud\Cos\Exception\ServiceResponseException;
use think\Exception;
use think\facade\Cache;
class TxyunOss extends PolicyStore
{
public function uploadSimple(){
$secretId = $this->policy['config']['secret_id'];
$secretKey = $this->policy['config']['secret_key'];
$region = $this->policy['config']['region'];
$bucket = $this->policy['config']['bucket'];
// 文件路径
$file_path = $this->info['file']['data']->getInfo('tmp_name');
$file = fopen($file_path, 'rb');
// 存储路径
$policy_save_dir = ltrim($this->policy['config']['save_dir'],'/');
$object = getDiyDirSeparator('/',$policy_save_dir. $this->path['file'].$this->path['filename']);
try {
// COS对象
$client = new Client([
'region' => $region,
'schema' => 'http',
'credentials' => [
'secretId' => $secretId,
'secretKey' => $secretKey
]
]);
if ($file) {
// 上传文件
$client->putObject([
'Bucket' => $bucket,
'Key' => $object,
'Body' => $file
]);
// 返回文件存储地址
return '/'. $object;
}else{
throw new Exception('上传文件路径错误');
}
}catch (ServiceResponseException $e){
throw new Exception($e->getMessage());
}catch (\Exception $e) {
throw new Exception($e->getMessage());
}
}
public function uploadPart()
{
// 配置信息
$secretId = $this->policy['config']['secret_id'];
$secretKey = $this->policy['config']['secret_key'];
$region = $this->policy['config']['region'];
$bucket = $this->policy['config']['bucket'];
// 分片数据存储名称
$chunks_saveKey = 'txyunoss_chunks_'.$this->info['uid'].'_'.$this->info['chunk']['key'];
// 文件名称
$temp_filename = 'chunks_'.md5($this->info['chunk']['key']).'_'.$this->getRandomKey(4) . '_part_'.$this->info['chunk']['chunk'].'.chunk';
// 临时文件地址
$temp_file = $this->path['temp_path'] . $temp_filename;
// 保存临时文件
$file_info = $this->info['file']['data']->move($this->path['temp_path'],$temp_filename);
if(!$file_info){
throw new Exception('分片创建错误:'.$this->info['file']['data']->getError());
}
// 分片存储列表
$chunk_list = Cache::get($chunks_saveKey) ?? [];
// 加入分片文件
$chunk_list[] = $temp_file;
// 保存分片临时存储列表
Cache::set($chunks_saveKey,$chunk_list);
// 分片上传成功
if($this->info['chunk']['chunk'] == ($this->info['chunk']['chunks'] - 1)){
// COS对象
$client = new Client([
'region' => $region,
'schema' => 'http',
'credentials' => [
'secretId' => $secretId,
'secretKey' => $secretKey
]
]);
$save_file = $this->path['temp_path'] . 'cos_cob_'.substr(md5($this->info['chunk']['key']),0,8).'_t_'.time().'.bak';
// 融合文件路径
$fileObj = fopen($save_file,"a+");
// 融合文件
foreach ($chunk_list as $value) {
$chunkObj = fopen($value, "rb");
if(!($fileObj && $chunkObj)){
throw new Exception('分片融合文件创建失败');
}
$content = fread($chunkObj, (2 * 1024 * 1024));
fwrite($fileObj, $content, (2 * 1024 * 1024));
unset($content);
fclose($chunkObj);
// 删除分片文件
unlink($value);
}
// 清空分片临时存储列表
Cache::rm($chunks_saveKey);
try {
$policy_save_dir = $this->policy['config']['save_dir'];
$upload_object_path = getDiyDirSeparator('/',$policy_save_dir. $this->path['file'].$this->path['filename']);
if ($fileObj) {
// 上传文件
$client->Upload($bucket,$upload_object_path,$fileObj);
// 删除临时组合文件
@unlink($save_file);
return $upload_object_path;
}else{
throw new Exception('上传文件路径错误');
}
}catch (ServiceResponseException $e){
throw new Exception($e->getMessage());
}catch (\Exception $e) {
throw new Exception($e->getMessage());
}
}
return 'chunk_file';
}
protected function getRandomKey($length = 16){
$charTable = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$result = "";
for ( $i = 0; $i < $length; $i++ ){
$result .= $charTable[ mt_rand(0, strlen($charTable) - 1) ];
}
return $result;
}
public function download($stores, $speed, $policy)
{
$secretId = $policy['config']['secret_id'];
$secretKey = $policy['config']['secret_key'];
$region = $policy['config']['region'];
$bucket = $policy['config']['bucket'];
$object = ltrim($stores['file_name'],'/');
// COS对象
$client = new Client([
'region' => $region,
'schema' => 'http',
'credentials' => [
'secretId' => $secretId,
'secretKey' => $secretKey
]
]);
$disposition = 'attachment; filename='.$stores['origin_name'];
$url = $client->getPresignedUrl('GetObject',[
'Bucket' => $bucket,
'Key' => $object
],'+10 minutes')->__toString();
$url .= 'response-content-disposition='.urlencode($disposition).'&';
// 限速下载
if($speed !== ""){
// 下载速度
$down_speed = round(intval($speed) * 8192);
// 最小限速100kb/s
if($down_speed < 819200){
$down_speed = 819200;
}
$url .= 'x-cos-traffic-limit='.$down_speed;
}
// 跳转下载地址
return redirect($url);
}
}
@@ -0,0 +1,27 @@
<?php
namespace app\http\middleware;
use app\common\model\Users;
class AdminLoginCheck
{
protected $except = [
'Auth/login',
'Auth/verify'
];
public function handle($request, \Closure $next){
$request_uri = $request->controller() . '/' . $request->action();
if(!in_array($request_uri,$this->except) && !(new Users)->login_auth('admin')){
return redirect('auth/login');
}
return $next($request);
}
}
@@ -0,0 +1,37 @@
<?php
namespace app\http\middleware;
use app\common\model\Users;
class UserLoginCheck
{
protected $except = [
'User/login',
'User/register',
'User/forget',
'User/reset',
'Index/index',
'Index/share',
'Index/report',
'Index/share_pass',
'Index/qrcode',
'Index/download',
'Index/return_callback',
'Index/return_notify',
'Upload/notify'
];
public function handle($request, \Closure $next){
$request_uri = $request->controller() . '/' . $request->action();
if(!in_array($request_uri,$this->except) && !(new Users)->login_auth('default')){
(new Users)->logout('default');
return redirect('user/login');
}
return $next($request);
}
}
+349
View File
@@ -0,0 +1,349 @@
<?php
namespace app\index\controller;
use app\common\controller\Home;
use app\common\model\FileManage;
use app\common\model\Folders;
use app\common\model\Policys;
use app\common\model\Shares;
use app\common\model\Stores;
use think\Exception;
use think\response\Download;
class File extends Home
{
public function list(){
$folder_id = input('get.folder_id',0);
$search = input('get.search','');
$page = input('get.page',1);
$limit = input('get.rows',20);
$file_list = FileManage::ListFile($folder_id,$search,$this->userInfo['id'],$page,$limit);
return json($file_list);
}
public function mkdir(){
$data = input('post.');
$result = $this->validate($data,[
'folder_id' => 'require|number',
'folder_name' => 'require|chsDash|max:255',
'folder_miaoshu' => 'max:255'
],[
'folder_name.chsDash' => '文件名只能是汉字、字母、数字和下划线_及破折号-'
]);
if($result !== true) return json(['status' => 0,'msg' => $result]);
try {
$dir_id = FileManage::createFolder($data['folder_id'],$data['folder_name'],$data['folder_miaoshu'],$this->userInfo['id']);
return json(['status' => 1,'msg' => '新建文件夹成功~','data' => $dir_id]);
}catch (\Throwable $e){
return json(['status' => 0,'msg' => $e->getMessage()]);
}
}
public function rename(){
$id = input('get.id');
$file_name = input('get.file_name');
$is_folder = input('get.is_folder');
$is_folder = intval($is_folder);
try {
if($is_folder){
$result = $this->validate(['file_name' => $file_name],[
'file_name' => 'require|chsDash|max:255',
],[
'file_name.chsDash' => '文件(夹)名只能是汉字、字母、数字和下划线_及破折号-'
]);
$info = Folders::where('id',$id)->where('uid',$this->userInfo['id'])->find();
if(empty($info)){
throw new Exception('文件数据不存在');
}
$info['folder_name'] = $file_name;
$info->save();
}else{
$result = $this->validate(['file_name' => $file_name],['file_name' => 'require|max:255',]);
$info = Stores::where('id',$id)->where('uid',$this->userInfo['id'])->find();
if(empty($info)){
throw new Exception('文件数据不存在');
}
$info['origin_name'] = $file_name;
$info->save();
}
if($result !== true){
throw new Exception($result);
}
return json(['status' => 1,'msg' => '重命名成功']);
}catch (\Throwable $e){
return json(['status' => 0,'msg' => $e->getMessage()]);
}
}
public function delete(){
$id = input('get.id');
$is_folder = input('get.is_folder');
$uid = $this->userInfo['id'];
if(empty($id)){
return json(['status' => 0,'msg' => '删除错误,参数缺失']);
}
//删除目录
if(boolval($is_folder)){
$pid = Folders::where('id',$id)->value('parent_folder');
if($pid == 0){
return json(['status' => 0,'msg' => '删除失败,您不能删除根目录']);
}
$child_object = getFolderChildFiles($uid,$pid);
if(!empty($child_object['file'])){
Stores::destroy($child_object['file']);
}
if(!empty($child_object['folder'])){
Folders::destroy($child_object['folder']);
}
}else{
Stores::destroy(function($query) use($id,$uid){
$query->where('id','=',$id)->where('uid','=',$uid);
});
}
return json(['status' => 1,'msg' => '删除成功']);
}
public function edit_folder(){
$id = input('get.id');
$info = Folders::get($id);
if(empty($info)){
$this->error('数据不存在');
}
if($this->request->isPost()){
$folder_name = input('post.folder_name');
$folder_miaoshu = input('post.folder_miaoshu');
$shouyi = input('post.shouyi');
Folders::where('id',$id)->update([
'folder_name' => $folder_name,
'desc' => $folder_miaoshu,
'size' => $shouyi
]);
return json(['status' => 1,'msg' => '修改文件夹信息成功']);
}
$this->assign('info',$info);
return $this->fetch();
}
public function edit_file(){
$id = input('get.id');
$info = Stores::get($id);
if(empty($info)){
$this->error('数据不存在');
}
if($this->request->isPost()){
$file_name = input('post.file_name');
$file_miaoshu = input('post.file_miaoshu');
Stores::where('id',$id)->update([
'origin_name' => $file_name,
'desc' => $file_miaoshu
]);
return json(['status' => 1,'msg' => '修改文件信息成功']);
}
$this->assign('info',$info);
return $this->fetch();
}
public function delete_all(){
$ids = input('get.ids');
$idFs = input('get.idFs');
$uid = $this->userInfo['id'];
$success_ids = [];
if(empty($ids) && empty($idFs)){
return json(['status' => 0,'msg' => '请选择需要删除的文件(夹)~']);
}
if(!empty($ids)){
$ids_list = explode(',',$ids);
try {
foreach ($ids_list as $file){
//删除
Stores::destroy(function($query) use($file,$uid){
$query->where('id','=',$file)->where('uid','=',$uid);
});
$success_ids[] = $file;
}
}catch (\Throwable $e){
return json(['status' => 0,'msg' => $e->getMessage()]);
}
}
if(!empty($idFs)){
$idFs_list = explode(',',$idFs);
try {
foreach ($idFs_list as $dir){
$pid = Folders::where('id',$dir)->value('parent_folder');
if($pid == 0){
return json(['status' => 0,'msg' => '删除失败,目录操作异常']);
}
//删除
$child_object = getFolderChildFiles($uid,$pid);
if(!empty($child_object['file'])){
Stores::destroy($child_object['file']);
}
if(!empty($child_object['folder'])){
Folders::destroy($child_object['folder']);
}
$success_ids[] = $dir;
}
}catch (\Throwable $e){
return json(['status' => 0,'msg' => $e->getMessage()]);
}
}
return json(['status' => 1,'msg' => '成功删除 '.count($success_ids).' 个文件(夹)~','data' => $success_ids]);
}
public function move_files(){
$ids = input('get.ids');
$idFs = input('get.idFs');
$this->assign('ids',$ids);
$this->assign('idFs',$idFs);
return $this->fetch();
}
public function folder_list(){
$folder_id = input('post.folder_id',0);
$folder = FileManage::FolderList($folder_id,$this->userInfo['id']);
return json(['status' => 1,'msg' => 'ok','data' => $folder]);
}
public function move_to_file(){
$folder_id = input('post.folder_id',0);
$ids = input('post.ids');
$idFs = input('post.idFs');
$uid = $this->userInfo['id'];
if(empty($ids) && empty($idFs)){
return json(['status' => 0,'msg' => '请选择需要移动的文件或者文件夹']);
}
$folder_id = FileManage::getFolderPid($folder_id,$uid);
$root_folder = FileManage::getFolderPid(0,$uid);
$ids_list = array_filter(explode(',',trim($ids)));
$idFs_list = array_filter(explode(',',trim($idFs)));
$success = [];
//移动目录
if(!empty($idFs_list)){
foreach ($idFs_list as $dir){
if($dir != $root_folder && $dir != $folder_id && !empty($dir)){
Folders::where('id',$dir)->where('uid',$uid)->update(['parent_folder' => $folder_id]);
$success[] = $dir;
}
}
}
//移动文件
if(!empty($ids_list)){
foreach ($ids_list as $file){
if(!empty($file)){
Stores::where('id',$file)->where('uid',$uid)->update(['parent_folder' => $folder_id]);
$success[] = $file;
}
}
}
return json(['status' => 1,'msg' => '成功移动 '.count($success).' 个文件(夹)~','data' => $success]);
}
public function set_share_pass(){
$id = input('get.id');
$pass = input('get.pass');
$is_folder = input('get.is_folder');
$pass_status = input('get.pass_status');
$is_folder = intval($is_folder);
$pass_status = intval($pass_status);
$uid = $this->userInfo['id'];
if($is_folder){
$info = Folders::where('id',$id)->where('uid',$uid)->find();
}else{
$info = Stores::where('id',$id)->where('uid',$uid)->find();
}
if(empty($info)){
return json(['status' => 0,'msg' => '文件数据不存在']);
}
$result = $this->validate(['pass' => $pass],['pass|提取码' => 'require|alphaNum|length:4,6'],[
'pass.require' => '提取码必须填写',
'pass.alphaNum' => '提取码只能为字母或者数字',
'pass.length' => '提取码长度只能为 4 ~ 6 位字母或者数字'
]);
if($result !== true) return json(['status' => 0,'msg' => $result]);
Shares::updateShare($info['shares_id'],[
'pwd' => $pass,
'pwd_status' => $pass_status
]);
return json(['status' => 1,'msg' => '设置提取码成功']);
}
public function user_download(){
$id = input('get.id',0);
$info = Stores::where('id',$id)->where('uid',$this->userInfo['id'])->find();
if(empty($info)){
$this->error('数据不存在');
}
$share = Shares::where('id',$info['shares_id'])->find();
$share_url = getShareUrl($share['code']);
$this->redirect($share_url);
}
}
+411
View File
@@ -0,0 +1,411 @@
<?php
namespace app\index\controller;
use app\common\controller\Home;
use app\common\model\driver\AliyunOss;
use app\common\model\driver\Local;
use app\common\model\driver\TxyunOss;
use app\common\model\FileManage;
use app\common\model\Folders;
use app\common\model\Order;
use app\common\model\Profit;
use app\common\model\Record;
use app\common\model\Reports;
use app\common\model\Shares;
use app\common\model\Stores;
use app\common\model\Users;
use Qrcode\Qrcode;
use think\Exception;
use think\facade\Cookie;
use think\response\Download;
class Index extends Home
{
public function index()
{
return $this->fetch('index_'.config('basic.index_theme'));
}
public function share(){
$code = $this->request->param('code');
//分享信息
$info = Shares::where('code',$code)->find();
//分享信息不存在
if(empty($info)){
return $this->fetch('404');
}
// 判断类型
if($info['type']){
$storeInfo = Folders::where('uid',$info['uid'])
->where('id',$info['source_id'])
->find();
}else{
$storeInfo = Stores::where('uid',$info['uid'])
->where('id',$info['source_id'])
->find();
}
// 存储文件/夹不存在
if(empty($storeInfo)){
return $this->fetch('404');
}
// 获取文件所有者信息
$user = Users::where('id',$storeInfo['uid'])->field('id,nickname,avatar,status,group,desc')->find();
if(empty($user) || $user['status'] == 0){
return $this->fetch('404');
}
$this->assign('share_id',$info['id']);
$this->assign('is_login',$this->is_login);
$this->assign('url',getShareUrl($code));
$share_pwd = Cookie::get('share_key_'.$code);
// 需要密码
if($info['pwd_status'] == 1 && !empty($info['pwd']) && $share_pwd != $info['pwd']){
// VIP用户组
$vip_group = config('vip.vip_group');
$is_vip = $user['group'] == $vip_group ? 1 : 0;
$desc = empty(trim($user['desc'])) ? '暂无签名' : $user['desc'];
$this->assign('desc',$desc);
$this->assign('userinfo',$user);
$this->assign('is_vip',$is_vip);
return $this->fetch('pwd');
}
// 显示界面
if($info['type']){
// 目录显示
$base_info = [
'id' => $storeInfo['id'],
'username' => getSafeNickname($user['nickname']),
'folder_name' => $storeInfo['folder_name'],
'desc' => $storeInfo['desc'],
'is_desc' => empty(trim($storeInfo['desc'])) ? 0 : 1,
'create_time' => $storeInfo->getData('create_time')
];
Folders::where('id',$storeInfo['id'])->where('uid',$storeInfo['uid'])->setInc('count_open',1);
// 获取当前文件夹下所有文件
$share_list = FileManage::ShareListFile($storeInfo['id'],$user['id']);
$this->assign('share_list',$share_list);
$this->assign('info',$base_info);
if($this->request->isMobile()){
return $this->fetch('folder_wap');
}
return $this->fetch('folder');
}else{
// 统计数据
Profit::record($storeInfo['uid'],$storeInfo['id'],'view');
// 文件显示
$file_info = [
'username' => getSafeNickname($user['nickname']),
'file_name' => $storeInfo['origin_name'],
'size' => countSize($storeInfo['size']),
'create_time' => friendDate($storeInfo->getData('create_time'))
];
// 获取VIP价格
$vip_rule = getVipRule();
// 获取最高价格
$vip_max = end($vip_rule)['id'];
$download = getFileDownloadUrl($storeInfo['shares_id'],$storeInfo['id']);
$this->assign('vip_max',$vip_max);
$this->assign('vip_rule',$vip_rule);
$this->assign('download',$download);
$this->assign('user',$this->userInfo);
$this->assign('info',$file_info);
return $this->fetch('file');
}
}
public function report(){
$share_id = input('get.share_id');
$share = Shares::where('id',$share_id)->find();
if(empty($share)){
return $this->fetch('user/err',['msg' => '传递参数不正确']);
}
// 获取文件信息
if($share['type'] == 1){
$files = Folders::where('id',$share['source_id'])->find();
}else{
$files = Stores::where('id',$share['source_id'])->find();
}
// 文件信息获取失败
if(empty($files)){
return $this->fetch('user/err',['msg' => '文件信息获取失败']);
}
// 获取用户信息
$share_user = Users::where('id',$share['uid'])->find();
if(empty($share_user)){
return $this->fetch('user/err',['msg' => '举报用户不存在']);
}
// 分享信息
$report = [
'share_id' => $share['id'],
'source_name' => $share['type'] ? $files['folder_name'] : $files['origin_name'],
'source_url' => getShareUrl($share['code']),
'source_uid' => $share['uid'],
'source_username' => $share_user['username'],
'source_type' => $share['type'],
'create_time' => time(),
'real_ip' => request()->ip()
];
if($this->request->isPost()){
$data = input('post.');
$result = $this->validate($data,[
'contact|联系方式' => 'require',
'content|详细描述' => 'require',
'type|危害类别' => 'require'
]);
if($result !== true) return json(['code' => 0,'msg' => $result]);
$report_key = 'report_'.$share_id;
if(!empty(Cookie::get($report_key))){
return json(['code' => 0,'msg' => '您已经举报过了,请勿重复举报']);
}
$report = array_merge($report,$data);
Cookie::set('report_'.$share_id,'1');
Reports::create($report);
return json(['code' => 1,'msg' => '举报反馈成功']);
}
return $this->fetch();
}
public function qrcode(){
$url = input('get.url');
if(!empty($url)){
Qrcode::createQrcode($url);
}
}
public function share_pass(){
$id = input('post.id');
$pass = input('post.pass');
$id = intval($id);
$info = Shares::where('id',$id)->find();
if(empty($info)){
return json(['status' => 0,'msg' => '分享数据不存在']);
}
if($pass != $info['pwd']){
return json(['status' => 0,'msg' => '提取码不正确']);
}
Cookie::set('share_key_'.$info['code'],$info['pwd'],3600);
return json(['status' => 1,'msg' => '提取码正确']);
}
public function download(){
$file = input('get.file');
$shares_id = input('get.shares');
$timestamp = input('get.timestamp');
$sign = input('get.sign');
$is_count = input('get.is_count');
// 数据签名校验
if(!getDownloadFileSignVerify([
'file' => $file,
'shares' => $shares_id,
'timestamp' => $timestamp
],$sign)){
return $this->fetch('user/err',['msg' => '数据sign签名校验失败']);
}
try {
// 获取存储数据
$stores = Stores::get($file);
if(empty($stores)){
throw new Exception('文件数据不存在');
}
if($is_count){
// 统计数据
Profit::record($stores['uid'],$stores['id'],'down',1);
$download_url = getFileDownloadUrl($stores['shares_id'],$stores['id'],0);
return redirect($download_url);
}
// 获取存储策略
$policy = $stores->getPolicy();
if(empty($policy)){
throw new Exception('文件数据存储策略不存在');
}
// 禁止下载
if($this->groupData['speed'] === 0){
throw new Exception('您当前的用户组禁止下载文件');
}
// 远程文件下载
if($policy->type == 'remote'){
$down_url = getDownloadRemote($stores['file_name'],$stores['origin_name'],$policy->config['server_uri'],$this->groupData['speed'],$policy->config['access_token']);
$this->redirect($down_url);
}
// 存储驱动下载
switch ($policy->type){
case 'aliyunoss':
$driver = new AliyunOss(0,0,0);
break;
case 'txyunoss':
$driver = new TxyunOss(0,0,0);
break;
default:
$driver = new Local(0,0,0);
break;
}
// 下载
return $driver->download($stores,$this->groupData['speed'],$policy);
}catch (Exception $e){
return $this->fetch('user/err',['msg' => $e->getMessage()]);
}
}
public function return_callback(){
$param = input('get.');
$sign = input('get.sign');
if($sign != $this->sign_param($param)){
$this->error('签名校验失败');
}
$order = Order::where('trade_no',$param['out_trade_no'])->find();
if(empty($order)){
$this->error('订单数据不存在');
}
if($order['status'] != 1){
$this->error('订单未支付成功');
}
$this->success('VIP开通/续费成功','none','请刷新当前页面,然后重新点击下载');
}
public function return_notify(){
$param = input('get.');
$sign = input('get.sign');
if($sign != $this->sign_param($param)){
exit('Fail is sign verify.');
}
if($param['trade_status'] != 'TRADE_SUCCESS'){
exit('Fail is trade status.');
}
// 查找订单
$order = Order::where('trade_no',$param['out_trade_no'])->find();
if(empty($order)){
exit('Fail order is not found.');
}
// 查找用户
$user = Users::where('id',$order['uid'])->find();
if(empty($user)){
exit('Fail order user is not found.');
}
// VIP用户组
$vip_group = config('vip.vip_group');
// 开通/续费时长
$vip_expire = $order['vip_day'] * 86400;
// 开通/续费VIP
if($user['group'] == $vip_group){
// 续费VIP
$user['group_expire'] = $user['group_expire'] + $vip_expire;
}else{
// 开通VIP
$user['group'] = $vip_group;
$user['group_expire'] = time() + $vip_expire;
}
// 保存数据
$user->save();
// 完成订单
$order['status'] = 1;
$order['out_trade_no'] = $param['trade_no'];
$order['pay_time'] = time();
// 保存订单
$order->save();
// 查询分成用户
$share = Shares::where('id',$order['profit_id'])->find();
// 参与分成
if(!empty($share)){
// 用户分成奖励比例
$vip_profit = config('vip.vip_profit');
// 计算用户分成奖励
$user_profit = ($order['money'] / 100) * $vip_profit;
// 通用户不奖励
if($order['uid'] != $share['uid']){
// 奖励
Record::addRecord($share['uid'],0,'VIP分成',$user_profit,'用户'.getSafeNickname($user['nickname']).'开通VIP奖励');
// 记录
Profit::record($share['uid'],$share['source_id'],'count_order',1);
Profit::record($share['uid'],$share['source_id'],'count_order_yes',1);
Profit::record($share['uid'],$share['source_id'],'count_money',$order['money']);
Profit::record($share['uid'],$share['source_id'],'count_profit',$user_profit);
}
}
// 处理完成
exit('SUCCESS');
}
protected function sign_param($param): string
{
unset($param['sign']);
unset($param['sign_type']);
ksort($param);
reset($param);
return md5(urldecode(http_build_query($param)) . config('pay.api_key'));
}
}
+190
View File
@@ -0,0 +1,190 @@
<?php
namespace app\index\controller;
use app\common\controller\Home;
use app\common\model\FileManage;
use app\common\model\Folders;
use app\common\model\Profit;
use app\common\model\Shares;
use app\common\model\Stores;
class Recycle extends Home
{
public function index(){
return $this->fetch();
}
public function list(){
$limit = input('get.rows',20);
$page = input('get.page',1);
$search = input('get.search','');
$file_list = FileManage::RecycleFile($search,$this->userInfo['id'],$page,$limit);
return json($file_list);
}
public function clear(){
// 清空回收站
$uid = $this->userInfo['id'];
$success_ids = [];
try {
$stores = Stores::onlyTrashed()->where('uid',$uid)->select();
foreach ($stores as $file){
// 删除文件
$file->delete(true);
// 删除分享信息
Profit::where('file_id',$file['id'])
->where('uid',$uid)
->delete();
$success_ids[] = $file['id'];
}
$folders = Folders::onlyTrashed()->where('uid',$uid)->select();
foreach ($folders as $dir){
// 删除文件
$dir->delete(true);
// 获取子文件夹
$folder_object = getFolderChildFiles($uid,$dir['id']);
// 子文件夹
if(!empty($folder_object['folder'])){
Folders::where('id','in',$folder_object['folder'])->delete(true);
}
// 子文件
if(!empty($folder_object['file'])){
// 删除文件
Stores::where('id','in',$folder_object['file'])->delete(true);
// 删除分享信息
Profit::where('file_id','in',$folder_object['file'])
->where('uid',$uid)
->delete();
}
$success_ids[] = $dir['id'];
}
return json(['status' => 1,'msg' => '成功清空回收站,共删除 '.count($success_ids).' 个文件(夹)~']);
}catch (\Throwable $e){
return json(['status' => 0,'msg' => $e->getMessage()]);
}
}
public function restore(){
$ids = input('get.ids');
$idFs = input('get.idFs');
$uid = $this->userInfo['id'];
$success_ids = [];
if(empty($ids) && empty($idFs)){
return json(['status' => 0,'msg' => '请选择需要还原的文件(夹)~']);
}
if(!empty($ids)){
try {
$stores = Stores::onlyTrashed()->where('id','in',$ids)->where('uid',$uid)->select();
foreach ($stores as $file){
//还原文件
$file->restore();
$success_ids[] = $file['id'];
}
}catch (\Throwable $e){
return json(['status' => 0,'msg' => $e->getMessage()]);
}
}
if(!empty($idFs)){
try {
$folders = Folders::onlyTrashed()->where('id','in',$idFs)->where('uid',$uid)->select();
foreach ($folders as $dir){
//还原文件
$dir->restore();
$success_ids[] = $dir['id'];
}
}catch (\Throwable $e){
return json(['status' => 0,'msg' => $e->getMessage()]);
}
}
return json(['status' => 1,'msg' => '成功还原 '.count($success_ids).' 个文件(夹)~','data' => $success_ids]);
}
public function delete(){
$ids = input('get.ids');
$idFs = input('get.idFs');
$uid = $this->userInfo['id'];
$success_ids = [];
if(empty($ids) && empty($idFs)){
return json(['status' => 0,'msg' => '请选择需要删除的文件(夹)~']);
}
if(!empty($ids)){
try {
$stores = Stores::onlyTrashed()->where('id','in',$ids)->where('uid',$uid)->select();
foreach ($stores as $file){
// 删除文件
$file->delete(true);
// 删除分享信息
Profit::where('file_id',$file['id'])
->where('uid',$uid)
->delete();
$success_ids[] = $file['id'];
}
}catch (\Throwable $e){
return json(['status' => 0,'msg' => $e->getMessage()]);
}
}
if(!empty($idFs)){
try {
$folders = Folders::onlyTrashed()->where('id','in',$idFs)->where('uid',$uid)->select();
foreach ($folders as $dir){
// 删除文件
$dir->delete(true);
// 获取子文件夹
$folder_object = getFolderChildFiles($uid,$dir['id']);
// 子文件夹
if(!empty($folder_object['folder'])){
Folders::where('id','in',$folder_object['folder'])->delete(true);
}
// 子文件
if(!empty($folder_object['file'])){
// 删除文件
Stores::where('id','in',$folder_object['file'])->delete(true);
// 删除分享信息
Profit::where('file_id','in',$folder_object['file'])
->where('uid',$uid)
->delete();
}
$success_ids[] = $dir['id'];
}
}catch (\Throwable $e){
return json(['status' => 0,'msg' => $e->getMessage()]);
}
}
return json(['status' => 1,'msg' => '成功彻底删除 '.count($success_ids).' 个文件(夹)~','data' => $success_ids]);
}
}
+121
View File
@@ -0,0 +1,121 @@
<?php
namespace app\index\controller;
use app\common\controller\Home;
use app\common\model\Profit;
use app\common\model\Record;
use app\common\model\Withdraw;
class Share extends Home
{
public function index(){
$time = input('get.time');
$query = [];
if(!empty($time)){
$query = ['time' => $time];
}else{
$time = date('Y-m-d');
}
$list = Profit::where('uid',$this->userInfo['id'])
->whereBetweenTime('create_time',$time)
->order([
'count_money' => 'desc',
'id' => 'desc'
])
->paginate(15,false,[
'query' => $query
]);
$this->assign('time',$time);
$this->assign('list',$list);
return $this->fetch();
}
public function record(){
$list = Record::where('uid',$this->userInfo['id'])->order('create_time desc')->paginate(15);
$this->assign('list',$list);
return $this->fetch();
}
public function withdraw(){
$list = Withdraw::where('uid',$this->userInfo['id'])->order('create_time desc')->paginate(15);
$money = Withdraw::where('uid',$this->userInfo['id'])->where('status',1)->sum('money');
$this->assign('money',$money);
$this->assign('list',$list);
$this->assign('amount',$this->userInfo['amount']);
return $this->fetch();
}
public function echarts(){
$id = input('get.id');
// 获取当月所有时间
$month_time = [];
$time_type = [];
for ($i = 0;$i < 30;$i++){
$month_time[] = strtotime('-'.$i.' day');
$time_type[] = "'".date('m-d',strtotime('-'.$i.' day'))."'";
}
$time_type = array_reverse($time_type);
$time_type = implode(',',$time_type);
// 获取当月间隔时间
$start_time = strtotime(date('Y-m-d',strtotime('-29 day')));
$end_time = strtotime('now');
// 获取30天的统计记录
$profit = Profit::where('file_id',$id)
->where('uid',$this->userInfo['id'])
->whereTime('create_time','>=',$start_time)
->whereTime('create_time','<=',$end_time)
->order('create_time desc')
->select();
// 图表统计
$series_reg = str_split(str_repeat('0',30),1);
$series_order = str_split(str_repeat('0',30),1);
$series_money = str_split(str_repeat('0',30),1);
foreach ($month_time as $key => $item){
$item_time = date('Y-m-d',$item);
foreach ($profit as $profit_item){
$profit_time = date('Y-m-d',$profit_item['create_time']);
if($item_time == $profit_time){
$series_reg[$key] = $profit_item['count_reg'];
$series_order[$key] = $profit_item['count_order_yes'];
$series_money[$key] = $profit_item['count_money'];
}
}
}
$series_reg = array_reverse($series_reg);
$series_reg = implode(',',$series_reg);
$series_order = array_reverse($series_order);
$series_order = implode(',',$series_order);
$series_money = array_reverse($series_money);
$series_money = implode(',',$series_money);
$this->assign('profit',$profit);
$this->assign('series_reg',$series_reg);
$this->assign('series_order',$series_order);
$this->assign('series_money',$series_money);
$this->assign('time_type',$time_type);
return $this->fetch();
}
}
+116
View File
@@ -0,0 +1,116 @@
<?php
namespace app\index\controller;
use app\common\controller\Home;
use app\common\model\FileManage;
use app\common\model\FileUpload;
use app\common\model\Groups;
use app\common\model\Policys;
use app\common\model\Shares;
use app\common\model\Stores;
use think\Exception;
use think\facade\Cache;
class Upload extends Home
{
public function index(){
// 上传策略
$policy = $this->getPolicy();
// 上传文件数量限制
$upload_limit = 20;
// 上传限制
$upload_rule = [
'upsize_byte' => $this->groupData['max_storage'],
'upsize' => countSize($this->groupData['max_storage']),
'fsize_byte' => $this->groupData['max_storage'] * $upload_limit,
'fsize' => countSize($this->groupData['max_storage'] * $upload_limit),
];
$folder_id = FileManage::getFolderAllowPid(0,$this->userInfo['id']);
$upload_api = $this->getPolicyUrl($policy,[
'md' => 'upload',
'size' => $this->groupData['max_storage'],
'notify' => url('upload/notify','',false,true),
'root_folder_id' => $folder_id
]);
$this->assign('upload_api',$upload_api);
$this->assign('upload_limit',$upload_limit);
$this->assign('upload_rule',$upload_rule);
return $this->fetch();
}
public function notify(){
$data = input('get.');
$policy_id = input('get.policy_id');
$sign = input('get.sign');
$policy = Policys::where('id',$policy_id)->find();
if(empty($policy)){
exit('Fail policy not found.');
}
if(empty($sign)){
exit('Fail is no params a sign.');
}
$remote_sign = $this->remote_sign_params($data,$policy['config']['access_token']);
if($remote_sign != $sign){
exit('Fail is sign verify.');
}
// 加入数据库
$data = [
'uid' => $data['uid'],
'origin_name' => $data['name'],
'file_name' => $data['path'],
'size' => $data['size'],
'meta' => '',
'mime_type' => $data['mime'],
'ext' => $data['ext'],
'parent_folder' => $data['folder_id'],
'policy_id' => $policy['id'],
'dir' => '',
'create_time' => time(),
'update_time' => time()
];
$file_id = (new Stores)->insertGetId($data);
$share_id = Shares::addShare($data['uid'],$file_id,0);
Stores::where('id',$file_id)->update(['shares_id' => $share_id]);
exit('UPLOAD_SUCCESS');
}
public function file(){
// 存储策略
$policy = $this->getPolicy();
try {
// 上传文件
$result = (new FileUpload())
->source($this->userInfo['id'],$policy,$this->groupData['max_storage'])
->upload();
return json($result);
}catch (Exception $e){
return json(['code' => 0,'msg' => $e->getMessage()]);
}
}
}
+433
View File
@@ -0,0 +1,433 @@
<?php
namespace app\index\controller;
use app\common\controller\Home;
use app\common\model\Certify;
use app\common\model\Order;
use app\common\model\Profit;
use app\common\model\Record;
use app\common\model\Shares;
use app\common\model\Users;
use app\common\model\Withdraw;
use think\Exception;
use think\facade\Cache;
use function MongoDB\BSON\toRelaxedExtendedJSON;
class User extends Home
{
public function index(){
return $this->fetch();
}
public function login(){
$layer = input('get.layer',0);
$share_id = input('get.share_id',0);
if(empty($layer)) $layer = 0;
if((new Users)->login_auth('default')){
return redirect('user/index');
}
if($this->request->isPost()){
$username = input('post.username');
$password = input('post.password');
try {
(new Users)->login($username,$password,'default');
return json(['status' => 1,'msg' => '登录成功']);
}catch (\Throwable $e){
return json(['status' => 0,'msg' => '登录失败:' . $e->getMessage()]);
}
}
$this->assign('share_id',$share_id);
$this->assign('layer',$layer);
return $this->fetch();
}
public function register(){
$data = input('post.');
$share_id = input('get.share_id');
if(config('register.allow_register') != 1){
return json(['code' => 0,'msg' => '管理员已关闭用户注册功能']);
}
$result = $this->validate($data,[
'nickname|昵称' => 'require|chsAlphaNum|length:2,18',
'username|用户帐号' => 'require|alphaNum|length:6,26',
'password|登录密码' => 'require|alphaNum|length:6,18',
'email|安全邮箱' => 'require|email'
]);
if($result !== true) return json(['code' => 0,'msg' => $result]);
$default_group = config('register.default_group');
// 获取注册来源
$share_info = Shares::where('id',$share_id)->find();
try {
(new Users)->register(
$data['username'],
$data['email'],
$data['password'],
$default_group,
['nickname' => $data['nickname']]
);
// 统计数据
if(!empty($share_info)){
Profit::record($share_info['uid'],$share_info['source_id'],'reg',1);
}
return json(['code' => 1,'msg' => '注册帐号成功']);
}catch (Exception $e){
return json(['code' => 0,'msg' => $e->getMessage()]);
}
}
public function logout(){
(new Users)->logout('default');
$this->success('退出登录成功','index/index');
}
public function vip(){
$share_id = input('get.share_id',0);
$is_layer = input('get.layer',0);
$rule = getVipRule();
$this->assign('rule',$rule);
$this->assign('share_id',$share_id);
$this->assign('is_layer',$is_layer);
if($this->request->isMobile()){
return $this->fetch('vip_wap');
}
return $this->fetch();
}
public function payment(){
$vip_type = input('get.vip',0);
$share_id = input('get.share_id',0);
$pay_type = input('get.pay_type',0);
if($pay_type != 'alipay' && $pay_type != 'wxpay'){
$this->error('支付方式错误');
}
// 获取VIP规则
$rule = getVipRule();
// 判断VIP类型是否正确
if(!isset($rule[$vip_type])){
$this->error('VIP类型不存在');
}
// 获取VIP价格
$vip_config = $rule[$vip_type];
// 获取支付配置信息
$config = config('pay.');
// 本地创建订单号
$trade_no = strtoupper('VIP_'.date('YmdHis').substr(md5(uniqid()),0,10));
// 订单数据
$order = [
'uid' => $this->userInfo['id'],
'trade_no' => $trade_no,
'type' => $pay_type,
'profit_id' => $share_id,
'money' => $vip_config['money'],
'vip_day' => $vip_config['day'],
'create_time' => time(),
'status' => 0
];
Order::create($order);
// 获取支付参数
$pay_params = [
'pid' => $config['api_pid'],
'type' => $pay_type,
'out_trade_no' => $trade_no,
'notify_url' => url('index/return_notify','',false,true),
'return_url' => url('index/return_callback','',false,true),
'name' => 'VIP会员',
'money' => $vip_config['money']
];
ksort($pay_params);
reset($pay_params);
$pay_params['sign'] = md5(urldecode(http_build_query($pay_params)) . $config['api_key']);
$pay_params['sign_type'] = strtoupper('MD5');
$pay_html = '<html><head><title>正在跳转支付</title><meta name="viewport" content="width=device-width, initial-scale=1.0">';
$pay_html .= '<style>body{background-color: #e6e6e6;}.pay_btn{border: 0;display: block;width: 100%;font-size: 22px;font-weight: bold;outline: none;height: 250px;color: #989898;line-height: 250px;background-color: transparent;}</style>';
$pay_html .= '</head><body>';
// 拼接支付表单
$pay_html .= '<form id="alipaysubmit" name="alipaysubmit" action="'.$config['api_gateway'].'" method="POST">';
foreach ($pay_params as $key => $val) {
$pay_html .= '<input type="hidden" name="'.$key.'" value="'.$val.'" />';
}
$pay_html .= '<input class="pay_btn" type="submit" value="订单创建中..."></form>';
$pay_html .= "<script>document.forms['alipaysubmit'].submit();</script>";
$pay_html .= '</body></html>';
exit($pay_html);
}
public function vip_close(){
$lock_time = time() - 7200;
Order::where('status',0)
->limit(50)
->whereTime('create_time','<=',$lock_time)
->update(['status' => 2]);
return json(['code' => 1,'msg' => '关闭订单成功']);
}
public function forget(){
if($this->request->isPost()){
$email = input('post.email');
$result = $this->validate(['email' => $email],['email|安全邮箱' => 'require|email']);
if($result !== true) return json(['code' => 0,'msg' => $result]);
$info = Users::where('email',$email)->find();
if(empty($info)){
return json(['code' => 0,'msg' => '该邮箱未绑定帐号']);
}
// 获取key
$forget_key = 'forget_'.str_replace(['@','.'],['_','_'],$info['email']);
// 邮件发送记录
$forget_info = Cache::get($forget_key);
if(!empty($forget_info)){
if($forget_info['time'] >= time()){
return json(['code' => 0,'msg' => '发送频繁,请等待'.($forget_info['time'] - time()) . ' 秒后重新发送']);
}
}
$hash_key = bin2hex($forget_key);
$sign = md5($forget_key . time());
// 设置找回密码key
Cache::set($forget_key,[
'uid' => $info['id'],
'email' => $info['email'],
'sign' => $sign,
'time' => time() + 60
],600);
// 找回密码链接
$forget_url = url('user/reset','',false,true)."?key={$hash_key}&sign={$sign}";
// 发送邮件
if(!sendEmail($info['username'],$forget_url)){
return json(['code' => 0,'msg' => '找回密码邮件发送失败,请联系管理员处理']);
}
return json(['code' => 1,'msg' => '找回密码邮件发送成功']);
}
return $this->fetch();
}
public function reset(){
$key = input('get.key');
$sign = input('get.sign');
if(empty($key) || empty($sign)){
return $this->fetch('err',['msg' => '参数缺失']);
}
$forget_key = @hex2bin($key);
if(empty($forget_key)){
return $this->fetch('err',['msg' => '参数验证失败']);
}
$forget_info = Cache::get($forget_key);
if(empty($forget_info)){
return $this->fetch('err',['msg' => '访问错误,无效链接']);
}
if($sign != $forget_info['sign']){
return $this->fetch('err',['msg' => '访问错误,数据签名校验失败']);
}
if($this->request->isPost()){
$pwd = input('post.pwd');
$result = $this->validate(['pwd' => $pwd],['pwd|密码' => 'require|alphaNum|length:6,18']);
if($result !== true) return json(['code' => 0,'msg' => $result]);
$password = md5($pwd . config('app.pass_salt'));
Users::where('id',$forget_info['uid'])->update(['password' => $password]);
return json(['code' => 1,'msg' => '密码修改成功']);
}
$this->assign('key',$key);
$this->assign('sign',$sign);
return $this->fetch('reset');
}
public function auth(){
if($this->request->isPost()){
$data = input('post.');
$result = $this->validate($data,[
'name|姓名' => 'require|chs|length:2,20',
'idcard|身份证号码' => 'require|idCard'
]);
if($result !== true) return json(['code' => 0,'msg' => $result]);
if($this->userInfo['is_auth']){
return json(['code' => 0,'msg' => '您已完成实名认证,请勿重复提交']);
}
if(Certify::where('uid',$this->userInfo['id'])->where('status',0)->count() > 0){
return json(['code' => 0,'msg' => '您提交的实名资料正在审核中,请勿重复提交']);
}
Certify::create([
'uid' => $this->userInfo['id'],
'name' => $data['name'],
'idcard' => $data['idcard'],
'create_time' => time()
]);
return json(['code' => 1,'msg' => '实名资料已提交,请耐心等待审核']);
}
$this->assign('info',$this->userInfo->getCertify());
$this->assign('is_auth',$this->userInfo['is_auth']);
return $this->fetch();
}
public function withdraw(){
if($this->request->isPost()){
$data = input('post.');
$result = $this->validate($data,[
'tx_money|提现金额' => 'require|float',
'alipay_account|支付宝帐号' => 'require|max:255',
'alipay_name|支付宝姓名' => 'require|chs|max:60'
]);
if($result !== true) return json(['code' => 0,'msg' => $result]);
$withdraw_count = Withdraw::where('uid',$this->userInfo['id'])
->where('status',0)
->whereTime('create_time','d')
->count();
if($withdraw_count > 0){
return json(['code' => 0,'msg' => '您有一条提现申请还在审核中,请勿重复提交']);
}
if(floatval($this->userInfo['amount']) - floatval($data['tx_money']) < 0){
return json(['code' => 0,'msg' => '您的账户余额不足']);
}
// 扣钱
Record::addRecord($this->userInfo['id'],1,'用户提现',$data['tx_money'],'余额提现'.$data['tx_money'].'元至支付宝');
// 添加记录
Withdraw::create([
'uid' => $this->userInfo['id'],
'money' => $data['tx_money'],
'alipay_account' => $data['alipay_account'],
'alipay_name' => $data['alipay_name'],
'create_time' => time()
]);
return json(['code' => 1,'msg' => '申请成功,请等待处理']);
}
$this->assign('amount',$this->userInfo['amount']);
return $this->fetch();
}
public function info(){
return $this->fetch();
}
public function change_pass(){
$data = input('post.');
$result = $this->validate($data,[
'old_password|原密码' => 'require|alphaNum|length:6,18',
'password|新密码' => 'require|alphaNum|length:6,18'
]);
if($result !== true){
return json(['code' => 0,'msg' => $result]);
}
$en_password = md5($data['old_password'] . config('app.pass_salt'));
if($en_password != $this->userInfo['password']){
return json(['code' => 0,'msg' => '修改失败,原密码不正确']);
}
$en_new_password = md5($data['password'] . config('app.pass_salt'));
Users::where('id',$this->userInfo['id'])->update([
'password' => $en_new_password
]);
return json(['code' => 1,'msg' => '密码修改成功,请重新登录']);
}
public function set_userinfo(){
$data = input('post.');
$result = $this->validate($data,[
'nickname|昵称' => 'require|max:30|min:1',
'desc|个性签名' => 'max:255'
]);
if($result !== true){
return json(['code' => 0,'msg' => $result]);
}
Users::where('id',$this->userInfo['id'])->update([
'nickname' => $data['nickname'],
'desc' => $data['desc']
]);
return json(['code' => 1,'msg' => '更新用户资料成功']);
}
public function upload_avatar(){
$file = request()->file('file');
if(!$file){
return json(['code' => 0,'msg' => '请选择上传的文件','data' => []]);
}
// 根目录
$root_path = getSafeDirSeparator(realpath(env('root_path') . './public').'/avatar');
$info = $file->validate(['size'=> 2097152,'ext'=>'jpg,png,gif'])->move($root_path);
if($info){
$avatar = '/avatar/'.str_replace('\\','/',$info->getSaveName());
Users::where('id',$this->userInfo['id'])->update([
'avatar' => $avatar
]);
return json(['code' => 1,'msg' => '头像上传成功','data' => []]);
}else{
// 上传失败获取错误信息
return json(['code' => 0,'msg' => $file->getError(),'data' => []]);
}
}
}
+123
View File
@@ -0,0 +1,123 @@
<html>
<head>
<link href="__STATIC__/css/bootstrap.min.css" rel="stylesheet">
<script type="text/javascript" src="__STATIC__/js/jquery.js"></script>
<script src="__STATIC__/js/layer.js"></script>
</head>
<body>
<div class="panel-body">
<div id="alert" class="alert alert-success alert-dismissable" style="display:none;">
<button type="button" class="close" onclick="$('#alert').hide();" aria-hidden="true">
×
</button>
<span id="msg">上传成功</span>
</div>
<div id="alert2" class="alert alert-danger alert-dismissable" style="display:none;">
<button type="button" class="close" onclick="$('#alert2').hide();" aria-hidden="true">
×
</button>
<span id="msg2">错误!请进行一些更改。</span>
</div>
<div class='form-group has-feedback'>
<span style="color: red;">*</span>
<font size="3">文件名称</font>
<input style="margin-top: 3%;" id='fileName' class='form-control' type='text' placeholder="请输入文件名称..."
value="{$info.origin_name}" />
</div>
<div class='form-group has-feedback'>
<font size="3">文件描述</font>
<textarea style="margin-top: 3%;" id='fileMiaoshu' class='form-control' rows="3"
placeholder="(可选) 请输入文件描述...&#10;&#10;提示:文件编辑后分享链接不会变哦~">{$info.desc}</textarea>
</div>
<p class='help-block'>
&nbsp;
</p>
<div class='form-group has-feedback' style="margin-top: 5%;">
<button type='button' class='btn btn-block btn-success' onclick='upload()'>保存</button>
</div>
</div>
<script type="text/javascript">
var _fileName = $("#fileName").val();
var _fileMiaoshu = $("#fileMiaoshu").val();
//选择的文件发生修改时
$("#fileInput").change(function (e) {
var name = document.getElementById('fileInput').files[0].name;
$("#fileName").val(name);
});
function upload() {
var fileName = $("#fileName").val();
var fileMiaoshu = $("#fileMiaoshu").val();
if (fileName == "") {
$('#fileName').focus();
layer.msg('请填写文件名称!', { time: 700 });
return;
}
//判断数据是否更改
if (_fileName == fileName &&
_fileMiaoshu == fileMiaoshu
) {
layer.msg('未作任何修改...', { time: 500 });
setTimeout(function () {
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}, 500);
return;
}
//修改文件
var data2 = { 'file_name': fileName, 'file_miaoshu': fileMiaoshu};
update(data2);
}
//ajax请求数据
function update(data) {
$.ajax({
type: "post",
url: window.location.href,
dataType: 'json',
data: data,
success: function (data) {
msg(data.status, data.msg);
},
error: function (error) {
msg(0, "API请求失败,请联系客服");
}
});
}
//提示信息
function msg(status, msg) {
if (!status) {
$("#msg2").html(msg);
$("#alert2").show();
$("#alert").hide();
} else {
$("#msg").html(msg);
$("#alert").show();
$("#alert2").hide();
setTimeout(function () {
window.parent.getTable("当前文件夹");
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}, 800);
}
}
</script>
</div>
</body>
</html>
@@ -0,0 +1,128 @@
<html>
<head>
<link href="__STATIC__/css/bootstrap.min.css" rel="stylesheet">
<link href="__STATIC__/css/file.css" rel="stylesheet">
<script type="text/javascript" src="__STATIC__/js/jquery.js"></script>
<script src="__STATIC__/js/layer.js"></script>
</head>
<body>
<div style='width:320px;margin-left: 3%;margin-top: 3%;display:none;' id="alert" class="alert alert-success alert-dismissable">
<button type="button" class="close" onclick="$('#alert').hide();" aria-hidden="true">
×
</button>
<span id="msg">保存成功</span>
</div>
<div style='width:320px;margin-left: 3%;margin-top: 3%;display:none;' id="alert2" class="alert alert-danger alert-dismissable">
<button type="button" class="close" onclick="$('#alert2').hide();" aria-hidden="true">
×
</button>
<span id="msg2">错误!请进行一些更改。</span>
</div>
<div style='width:320px;margin-left: 3%;margin-top: 3%;' class='form-group has-feedback'>
<span style="color: red;">*</span>文件夹名称
<input style="margin-top: 3%;" id='folderName' class='form-control' type='text' placeholder="请输入文件夹名称..." value="{$info.folder_name}"/>
</div>
<div style='width:320px;margin-left: 3%;' class='form-group has-feedback'>
<p>文件夹描述</p>
<textarea style="margin-top: 3%;" id='folderMiaoshu' class='form-control' rows="3" placeholder="(可选) 请输入文件夹描述...">{$info.desc}</textarea>
</div>
<label class="col-sm-1">限速收益开关</label>
<div class="col-sm-4" style="margin-left: 100px;margin-top: -30px;">
<label class="switch">
<input type="checkbox" id="shouyi" value="{$info.size}">
<div class="slider round"></div>
</label>
</div>
<div style='width:320px;margin-left: 3%;' class='form-group has-feedback'>
<button style='margin-top:5%;' type='button' class='btn btn-block btn-success' onclick='upload()'>保存</button>
</div>
<script type="text/javascript">
var _folderName = $("#folderName").val();
var _folderMiaoshu = $("#folderMiaoshu").val();
var _shouyi = '{$info.size}';
$("#shouyi").val(_shouyi);
if(_shouyi == 1){
$("#shouyi").attr("checked","");
}
$("#shouyi").click(function(){
if($("#shouyi").val() == "0") //是否禁用
{
$("#shouyi").val("1");
}else{
$("#shouyi").val("0");
}
});
function upload() {
var folderName = $("#folderName").val();
var folderMiaoshu = $("#folderMiaoshu").val();
var shouyi = $("#shouyi").val();
if(folderName == "")
{
$('#folderName').focus();
layer.msg('请填写文件夹名称!', {time: 700});
return;
}
//判断数据是否更改
if(folderName == _folderName &&
folderMiaoshu == _folderMiaoshu &&
shouyi == _shouyi
){
layer.msg('未作任何修改...', {time: 500});
setTimeout(function (){
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
},500);
return;
}
var data2 = {'folder_name': folderName, 'folder_miaoshu': folderMiaoshu, "shouyi": shouyi};
$.ajax({
type: "post",
url : window.location.href,
dataType:'json',
data: data2,
success: function(data){
msg(data.status,data.msg);
},
error: function (error) {
msg(0,"API请求失败,请联系客服");
}
});
}
//提示信息
function msg(status,msg) {
if(!status){
$("#msg2").html(msg);
$("#alert2").show();
$("#alert").hide();
}else{
$("#msg").html(msg);
$("#alert").show();
$("#alert2").hide();
setTimeout(function (){
window.parent.getTable("当前文件夹");
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
},800);
}
}
</script>
</body>
+463
View File
@@ -0,0 +1,463 @@
<html>
<head>
<link href="__STATIC__/css/bootstrap.min.css" rel="stylesheet">
<script type="text/javascript" src="__STATIC__/js/jquery.js"></script>
<script src="__STATIC__/js/layer.js"></script>
<link href="__STATIC__/icon/icon.css" rel="stylesheet">
<link href="__STATIC__/css/list.css" rel="stylesheet"> <!-- 放在最后 -->
<script src="__STATIC__/js/bootstrap.min.js"></script>
<link href="__STATIC__/css/bootstrap-editable.css" rel="stylesheet">
<script src="__STATIC__/js/bootstrap-editable.js" type="text/javascript"></script>
</head>
<body>
<style>
.dialog-body {
font-feature-settings: "lnum";
-webkit-font-smoothing: antialiased;
font-size: 12px;
color: #666;
font-family: "Microsoft YaHei", SimSun;
margin: 0;
padding: 0;
line-height: 24px;
background: 0 0;
}
.file-tree-container {
height: 250px;
margin: 10px 11px;
border: 1px solid #f2f2f2;
overflow: auto;
}
.treeview {
margin: 0;
padding: 0;
list-style: none;
visibility: visible;
}
.treeview-node-on {
border: 1px solid #fff;
border-width: 1px 0;
color: #2974B6;
cursor: pointer;
display: block;
white-space: nowrap;
text-decoration: none;
background: #e5f0fb !important;
border-color: #BBD4EF #fff !important;
padding-left: 0px;
}
.treeview-node-handler {
-webkit-font-smoothing: antialiased;
cursor: pointer;
display: block;
white-space: nowrap;
text-decoration: none;
padding: 4px 0;
color: #333;
}
.icon-operate {
white-space: nowrap;
color: #333;
background: url(__STATIC__/image/icon-tree_77d7929.png) 0 0 no-repeat;
display: inline-block;
zoom: 1;
vertical-align: middle;
margin: 0 3px;
width: 15px;
height: 15px;
cursor: pointer;
background-position: -999px -999px;
}
.treeview-node .close2 {
background-position: -30px 0;
}
.treeview-node .open {
background-position: -30px -22px;
}
.treeview-dir {
cursor: pointer;
white-space: nowrap;
color: #333;
margin-right: 5px;
height: 18px;
width: 22px;
background: url(__STATIC__/image/icon-tree_77d7929.png) 0 0 no-repeat;
background-position: 0 -22px;
display: inline-block;
zoom: 1;
vertical-align: middle;
}
.treeview-node:hover {
background: #f4f9fd;
border-color: #e5f0fb;
}
.top,
.text {
margin: 0;
padding: 0;
border: 0;
}
.space-between {
-webkit-box-pack: justify;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
justify-content: space-between;
}
.align-center,
.flex-box,
.space-between {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
}
.flex-box {
-webkit-box-pack: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
}
.editable-button {
margin: 10px 2px 8px 5px;
}
.editable-input input {
width: 200px !important;
}
@media (max-width:890px) {
#upload{
width: auto !important;
}
}
</style>
<div class="dialog-body">
<div class="file-tree-container">
<ul class="treeview ">
<li>
<div class="treeview-node treeview-node-on _minus" data-padding-left="0" style="padding-left:0px"
id="0" data-isGet="0">
<span class="treeview-node-handler">
<em class="icon-operate open"></em><dfn class="treeview-dir"></dfn>
<span class="treeview-txt">根目录</span>
</span>
</div>
<ul class="treeview treeview-root-content" data-padding-left="15">
</ul>
</li>
</ul>
</div>
</div>
<div id="mkdir2">
<li id="mkdir" style="display: none;">
<div class="treeview-node" no="1" data-padding-left="15" style="padding-left:15px">
<span class="treeview-node-handler">
<em class="b-in-blk plus icon-operate"></em><dfn
class="b-in-blk treeview-ic treeview-dir"></dfn><span class="treeview-txt"
id="mkdir_input"></span>
</span>
</div>
<ul class="treeview treeview-collapse" data-padding-left="30"></ul>
</li>
</div>
<div id="DirMb" style="display: none;">
<li>
<div class="treeview-node" data-padding-left="15" style="padding-left:15px" id="" data-isGet="0">
<span class="treeview-node-handler">
<em class="icon-operate"></em><dfn class="treeview-dir"></dfn><span class="treeview-txt"></span>
</span>
</div>
<ul class="treeview treeview-collapse" data-padding-left="30"></ul>
</li>
</div>
<div class="top space-between">
<div class="top-left align-center">
<div class="top-item flex-box" onclick="mkdir_open()" style="margin-left: 10px;">
<em class="icon icon-newfolder" title="新建文件夹"></em>
<p class="text">新建文件夹</p>
</div>
</div>
<div style="float:left">
<div class="top-item flex-box upload" onclick="ok()" id="upload"style="width: 120px;float:left">
<p class="text" style="margin-left:0">确定</p>
</div>
<div class="top-item flex-box" onclick="no()" style="width: 120px;">
<p class="text" style="margin-left:0">取消</p>
</div>
</div>
</div>
<script>
var mkdir_html = $("#mkdir2").html();
mkdirInputSet($(".treeview-node-on").parent().find('ul:first')); //设置初始位置在根目录下
getFolderData("0"); //获取根目录下的文件夹
//设置新建文件夹的位置
function mkdirInputSet(ulObj) {
var ulLeft = ulObj.attr("data-padding-left");
$("#mkdir").remove();
ulObj.append(mkdir_html);//添加
$("#mkdir div").css("padding-left", ulLeft + "px");
$("#mkdir div").attr("data-padding-left", ulLeft);
$("#mkdir ul").attr("data-padding-left", Number(ulLeft) + 15);
mkdir_editable();//设置行内编辑
}
//获取文件夹下的文件夹
function getFolderData(id) {
var obj = $("#" + id);
if (obj.attr("data-isGet") == "1") //防止重复获取
return;
obj.attr("data-isGet", "1");
var objUl = obj.parent().find('ul:first');
var Left = Number(objUl.attr("data-padding-left"));
$.ajax({
type: "post",
url: "/file/folder_list",
dataType: 'json',
data: {
"folder_id": id,
},
success: function (data) {
if (data.status) {
data = data.data;
for (var i = 0; i < data.length; i++) {
data2 = data[i];
objUl.append(setDirMB(data2['id'], data2['folder_name'], Left, data2['down']));
}
setClick(); //动态修改html后需要重新绑定事件
} else {
layer.alert(data.msg, { icon: 2 });
}
},
error: function (error) {
layer.alert("API请求失败,请联系客服", { icon: 2 });
}
});
}
//设置文件模板
function setDirMB(id, name, Left, isParent = 0, isXuanzhong = 0) //ID 名称 左偏移长度 是否有下级文件 是否选中
{
$("#DirMb li div span span").html(name); //设置文件名
$("#DirMb li div").attr("id", id);
$("#DirMb li div").attr("data-padding-left", Left);
$("#DirMb li div").css("padding-left", Left + "px");
$("#DirMb li ul").attr("data-padding-left", Left + 15);
if (isParent) {
$("#DirMb li div span em").addClass("close2"); //展开图标
}
if (isXuanzhong) {
$("#DirMb li div").addClass("treeview-node-on");
}
html = $("#DirMb").html();
//样式删除掉
if (isParent) {
$("#DirMb li div span em").removeClass("close2");
}
if (isXuanzhong) {
$("#DirMb li div").removeClass("treeview-node-on"); //选中
}
return html;
}
//设置选中列事件
function setClick() {
//选中列
$(".treeview-node").unbind("click").click(function (e) { //解绑再绑定
var id = $(this).attr("id");
var ulObj = $(this).parent().find('ul:first');
if ($(this).attr("no") != "1") { //不是编辑框自身的点击
mkdirInputSet(ulObj); //设置新建文件夹的位置
} else {
return;
}
if ($(this).hasClass("treeview-node-on")) { //是否已经选中过了
var objEm = $(this).find("em");
if (objEm.hasClass("open")) { //是否展开
objEm.removeClass("open");
objEm.addClass("close2");
ulObj.hide('fast');
} else if (objEm.hasClass("close2")) { //否则显示
objEm.removeClass("close2");
objEm.addClass("open");
ulObj.show('fast');
getFolderData(id);
}
} else {
$(".treeview-node-on").removeClass("treeview-node-on"); //删除原来的选中
$(this).addClass("treeview-node-on"); //自身增加选中
}
});
}
//设置行内编辑
function mkdir_editable() {
$("#mkdir_input").editable({
toggle: 'manual',
mode: "inline",
validate: function (v) {
if (!v) return '文件夹名不能为空';
$.ajax({
type: "post",
url: "/file/mkdir",
dataType: 'json',
data: {
"folder_id": $(".treeview-node-on").attr("id"),
"folder_name": v,
"folder_miaoshu": "",
},
success: function (data) {
if (data.status) {
var obj = $(".treeview-node-on").parent().find('ul:first');
var Left = Number(obj.attr("data-padding-left"));
$(".treeview-node-on").find("em").addClass("open");
$(".treeview-node-on").removeClass("treeview-node-on");
obj.append(setDirMB(data.data, v, Left, 0, 1));
//选中的位置修改了 要重新获取一下
obj = $(".treeview-node-on").parent().find('ul:first');
mkdirInputSet(obj); //重新修改编辑框的位置
setClick(); //动态修改html后需要重新绑定事件
layer.msg(data.msg, { time: 1000, icon: 1, shift: 4 });
} else {
layer.alert(data.msg, { icon: 2 });
}
},
error: function (error) {
layer.alert("API请求失败,请联系客服", { icon: 2 });
}
});
}
});
}
//循环判断输入框是不是消失了
function mkdir_ifColse() {
setTimeout(
function () {
var html = $(".editable-input").html();
//console.log(html);
if (!html) {
$("#mkdir").hide();
$("#mkdir").hide();
return;
}
mkdir_ifColse();
}
, 50);
}
//新建文件夹按钮
function mkdir_open() {
$("#mkdir").show();
setTimeout(function () {
$("#mkdir_input").editable('toggle');
$('.file-tree-container').scrollTop($('.file-tree-container')[0].scrollHeight); //设置滚动条
//$(".editable-cancel").attr("onclick","mkdir_colse()");
}, 1); //神奇的BUG 必须得要延迟
mkdir_ifColse();
var obj = $(".treeview-node-on");
var objEm = obj.find("em");
var objUl = obj.parent().find('ul:first');
if (objEm.hasClass("close2")) { //帮你展开
objEm.removeClass("close2");
objEm.addClass("open");
objUl.show('fast');
}
}
//确定按钮
function ok() {
$.ajax({
type: "post",
url: "/file/move_to_file",
dataType: 'json',
data: {
"folder_id": $(".treeview-node-on").attr("id"),
"ids": "{$ids}",
"idFs": "{$idFs}",
},
success: function (data) {
if (data.status) {
layer.msg(data.msg, { time: 1000, icon: 1, shift: 4 });
setTimeout(function () {
window.parent.getTable("当前文件夹");
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}, 1000);
} else {
layer.alert(data.msg, { icon: 2 });
}
},
error: function (error) {
layer.alert("API请求失败,请联系客服", { icon: 2 });
}
});
}
//取消按钮
function no() {
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
</script>
</body>
</html>
+18
View File
@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0" />
<title>404文件不存在</title>
</head>
<body>
<style>
body{margin: 20px;}
.off{text-align: center;font-size: 16px;color: #b3b3b3;}
.off0{background: #eee;width: 70px;height: 60px;margin: 10% auto 30px auto;border-radius: 3px;padding-top: 10px;}
.off1{border-top: 30px solid #b1b1b1;width: 10px;height: 10px;border-bottom: 10px solid #b1b1b1;margin: auto;}
</style>
<div class="off"><div class="off0"><div class="off1"></div></div>来晚啦...文件取消分享了</div>
</body>
</html>
+394
View File
@@ -0,0 +1,394 @@
<!DOCTYPE html>
<html dir="ltr" class="fontawesome-i2svg-active fontawesome-i2svg-complete">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="renderer" content="webkit">
<meta name="force-rendering" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="referrer" content="always">
<title>{$info.file_name} - {$Think.config.basic.site_title}</title>
<link href="__STATIC__/pan/shouyi/theme.css" rel="stylesheet">
<script src="__STATIC__/js/jquery.js"></script>
<script src="__STATIC__/js/lay/modules/layer.js"></script>
<script src="__STATIC__/pan/shouyi/bootstrap.js"></script>
</head>
<body>
<main class="main">
<div class="container">
<div class="content">
<nav class="navbar navbar-light navbar-glass fs--1 font-weight-semi-bold row navbar-top sticky-kit navbar-expand">
<button class="navbar-toggler collapsed" type="button" data-toggle="collapse"
data-target="#navbarVerticalCollapse" aria-controls="navbarVerticalCollapse"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<a class="navbar-brand text-left ml-3" href="/">
<div class="d-flex align-items-center">
<img class="mr-2" src="__STATIC__/pan/img/logo.png" alt="" width="40"><span>文件下载</span>
</div>
</a>
<div class="collapse navbar-collapse">
{eq name="$is_login" value="1"}
<ul class="navbar-nav align-items-center ml-auto">
<ul class="navbar-nav align-items-center ml-auto">
{eq name="$vip_info.is_vip" value="1"}
<li class="nav-item mr-3" title="点击续费" onclick="vip()" style="cursor:pointer;color: red;">
{$user.nickname} ({$group.group_name})
</li>
{/eq}
<li class="nav-item" title="点击开通" onclick="vip()" style="cursor:pointer;">
<div class="avatar avatar-xl mt-2">
<img class="rounded-circle"
src="{:getUserHead($user.avatar)}">
</div>
</li>
<li class="nav-item">
<a class="btn btn-falcon-default ml-2" href="{:url('user/logout')}">登出</a>
</li>
</ul>
{else/}
<ul class="navbar-nav align-items-center ml-auto">
<li class="nav-item">
<a class="btn btn-falcon-default ml-2 mr-2" onclick="login()" href="javascript:;">注册</a>
</li>
<li class="nav-item">
<a class="btn btn-falcon-default" onclick="login()" href="javascript:;">登录</a>
</li>
</ul>
{/eq}
</div>
</nav>
<div class="card mb-3">
<div class="card-body rounded-soft bg-gradient">
<div class="row text-white align-items-center no-gutters">
<div class="col">
<h4 class="text-white mb-2">文件下载:<span id="filename">{$info.file_name}</span></h4>
<p class="fs--1 mb-1">
<span class="text-300 mr-1">文件大小</span>{$info.size}
<span class="text-300 mr-1 ml-2">上传时间</span>{$info.create_time}
<span class="text-300 mr-1 ml-2">分享用户</span>{$info.username}
</p>
</div>
<div class="col-auto d-none d-sm-block">
<a class="btn btn-info" href="javascript:;" onclick="kefu()">联系客服</a>
<a class="btn btn-warning ml-3" target="_blank" href="{:url('index/report')}?share_id={$share_id}">举报</a>
</div>
</div>
</div>
</div>
{eq name="$vip_info.is_vip" value="0"}
<div class="card-deck">
<div class="card mb-3 overflow-hidden" style="min-width: 12rem">
<div class="bg-holder bg-card" style="background-image:url(__STATIC__/pan/img/corner-1.png);"></div>
<div class="card-body position-relative">
<h5>普通下载<span class="badge badge-soft-warning rounded-capsule ml-2">低速</span></h5>
<div class="display-4 fs-2 mb-3 mt-3 font-weight-normal text-warning">下载需时约 60 分钟</div>
<button class="btn btn-outline-secondary fs--1" onclick="down()">立即下载</button>
</div>
</div>
<div class="card mb-3 overflow-hidden" style="min-width: 12rem">
<div class="bg-holder bg-card" style="background-image:url(__STATIC__/pan/img/corner-2.png);">
</div>
<div class="card-body position-relative">
<h5>登录下载<span class="badge badge-soft-info rounded-capsule ml-2">稳定</span></h5>
<div class="display-4 fs-2 mb-3 mt-3 font-weight-normal text-info">下载需时约 5 分钟</div>
<button class="btn btn-outline-info fs--1" onclick="down()">立即下载</button>
</div>
</div>
<div class="card mb-3 overflow-hidden" style="min-width: 12rem">
<div class="bg-holder bg-card" style="background-image:url(__STATIC__/pan/img/corner-3.png);">
</div>
<div class="card-body position-relative">
<h5>VIP极速下载<span class="badge badge-soft-success rounded-capsule ml-2">推荐</span></h5>
<div class="display-4 fs-2 mb-3 mt-3 font-weight-normal">下载需时约 1 秒</div>
<button class="btn btn-outline-dark fs--1 " onclick="vip()">立即升级</button>
</div>
</div>
</div>
{else/}
<div class="card-deck">
<div class="card mb-3 overflow-hidden" style="min-width: 12rem">
<div class="bg-holder bg-card" style="background-image:url((__STATIC__/pan/img/corner-1.png);">
</div>
<div class="card-body position-relative">
<h5>电信下载<span class="badge badge-soft-warning rounded-capsule ml-2">VIP专用</span></h5>
<button class="btn btn-outline-info fs--1" onclick="down()">立即下载</button>
</div>
</div>
<div class="card mb-3 overflow-hidden" style="min-width: 12rem">
<div class="bg-holder bg-card" style="background-image:url(__STATIC__/pan/img/corner-2.png);">
</div>
<div class="card-body position-relative">
<h5>联通下载<span class="badge badge-soft-info rounded-capsule ml-2">VIP专用</span></h5>
<button class="btn btn-outline-info fs--1" onclick="down()">立即下载</button>
</div>
</div>
<div class="card mb-3 overflow-hidden" style="min-width: 12rem">
<div class="bg-holder bg-card" style="background-image:url(__STATIC__/pan/img/corner-3.png);">
</div>
<div class="card-body position-relative">
<h5>移动下载<span class="badge badge-soft-success rounded-capsule ml-2">VIP专用</span></h5>
<button class="btn btn-outline-info fs--1" onclick="down()">立即下载</button>
</div>
</div>
</div>
{/eq}
{eq name="$vip_info.is_vip" value="1"}
<div class="card bg-light mb-3" rv-show="file.vip_guest" style="">
<div class="card-body p-3">
<div class="row justify-content-center justify-content-sm-between">
<div class="col-sm-auto text-center">
<p class="fs--1 mb-0">
尊贵的{$group.group_name}您好,您已经购买成为
<a href="javascript:;" onclick="vip()"><strong> {$group.group_name} </strong></a>
到期时间:{$vip_info.expire_time}</p>
</div>
<div class="col-sm-auto d-flex flex-center">
<p class="fs--1 mb-0"><a href="javascript:;" onclick="kefu()">在线客服</a></p>
</div>
</div>
</div>
</div>
{/eq}
<div class="h-100 card mb-3">
<div class="card-body">
<div class="row no-gutters">
<div class="col-12 mb-3">
<div class="row justify-content-center justify-content-sm-between">
<div class="col-sm-auto text-center">
<h5 class="d-inline-block">升级会员尊享极速下载</h5><span
class="badge badge-soft-success badge-pill ml-2">永久更省83%</span>
</div>
<div class="col-sm-auto d-flex flex-center fs-1 mt-1 mt-sm-0">
<span class="badge badge-pill badge-danger">
限时大促 最后一天!仅剩
<span id="ctp_time_left">2 小时 20 分钟 17 秒</span>
</span>
</div>
</div>
</div>
{php}
$vip_list_num = 0;
{/php}
{volist name="$vip_rule" id="vo" key="k"}
{eq name="$vo.is_top" value="1"}
<div class="col-lg-4 border-top border-bottom">
{php}
$vip_list_num++;
$is_hot = intval(($vip_list_num % 3) == 2);
{/php}
<div class="h-100" {eq name="$is_hot" value="1"}style="background-color: rgba(115, 255, 236, 0.18)"{/eq}>
<div class="text-center p-4">
<h3 class="font-weight-normal my-0">{$vo.name}</h3>
<span class="badge badge-soft-success badge-pill ml-1">限时{$vo.discount}折</span>
<p class="mt-3">
{$vo.desc}
</p>
<h2 class="font-weight-medium my-4">
{$vo.money}
<small class="fs--1 text-700">元 / {$vo.day_name}</small>
<br>
<span class="fs--1 badge badge-info badge-pill">{$vo.discount_msg}</span>
</h2>
<button class="btn btn-outline-primary" onclick="vip({$vo.id})">立即购买</button>
</div>
</div>
</div>
{/eq}
{/volist}
<div class="col-12 text-center px-3 px-sm-4 py-4">
<h5 class="font-weight-medium fs-0">所有会员均尊享以下特权:</h5>
<svg class="svg-inline--fa fa-check fa-w-16 mr-2 text-success" aria-hidden="true"
focusable="false" data-prefix="fas" data-icon="check" role="img"
xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" data-fa-i2svg="">
<path fill="currentColor"
d="M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z">
</path>
</svg> VIP极速下载通道
<svg class="svg-inline--fa fa-check fa-w-16 ml-5 mr-2 text-success" aria-hidden="true"
focusable="false" data-prefix="fas" data-icon="check" role="img"
xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" data-fa-i2svg="">
<path fill="currentColor"
d="M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z">
</path>
</svg> 多文件同时下载
<svg class="svg-inline--fa fa-check fa-w-16 ml-5 mr-2 text-success" aria-hidden="true"
focusable="false" data-prefix="fas" data-icon="check" role="img"
xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" data-fa-i2svg="">
<path fill="currentColor"
d="M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z">
</path>
</svg> 去除弹窗广告
</div>
</div>
</div>
</div>
<div class="card bg-light mb-3">
<div class="card-body p-3">
<div class="row justify-content-center justify-content-sm-between">
<div class="col-sm-auto text-center">
<p class="fs--1 mb-0">谨防刷单兼职,网贷,金融,裸聊敲诈,赌博等诈骗,请立即举报</p>
</div>
</div>
</div>
</div>
</div>
<footer>
<div class="row no-gutters justify-content-between fs--1 mt-4 mb-3">
<div class="col-12 col-sm-auto text-center">
<p class="mb-0 text-600">版权声明:不得利用云存储发布,存储,淫秽,诈骗等违法信息。
<a href="{:url('index/report')}?share_id={$share_id}">侵权/违法投诉</a>
或者投诉邮箱:{$Think.config.basic.site_email}</p>
</div>
<div class="col-12 col-sm-auto text-center">
<p class="mb-0 text-600">© 2018-2021 {$Think.config.basic.site_title}</p>
</div>
</div>
</footer>
<div class="modal fade hide" id="infoModal" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="true"></div>
<script>
var down_info = {
is_login:{$is_login},
is_vip:{$vip_info.is_vip},
link:'{$download|raw}',
kefu:"{$Think.config.basic.site_kefu|raw}",
vip_max:{$vip_max},
vip_expire:"{$vip_info.expire_time}"
}
var second_left = 8035;
function isMobile(){
return /Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent);
}
function formatTime(second) {
return (parseInt(second / 60 / 60) + " 小时 " + parseInt(second / 60 % 60) + " 分钟 " + parseInt(
second % 60) + " 秒")
.replace(/\b(\d)\b/g, "0$1");
}
function updateTimeInfo(){
second_left = second_left - 1;
$("#ctp_time_left").text(formatTime(second_left));
}
function kefu() {
layer.alert(down_info.kefu, { title: '联系客服' });
}
function vip(buy) {
buy = (buy === "" || typeof buy === "undefined" ? down_info.vip_max : buy);
if (down_info.is_login) {
if (isMobile()) {
$("#infoModal").load("/user/vip?share_id={$share_id}&buy=" + buy, function () {
$(this).modal('toggle');
});
} else {
layer.open({
type: 2,
shadeClose: true,
title: down_info.is_vip ? ('续费VIP会员 到期时间:' + down_info.vip_expire) : "在线开通VIP会员",
area: ['723px', '520px'], // 宽高
content: "/user/vip?share_id={$share_id}&buy=" + buy,
end: function () {
location.reload();
},
});
}
}else {
login("抱歉您还未登录");
}
}
function vipOk() {
layer.alert('恭喜您开通VIP成功~ 感谢您的支持!<br><br/>请刷新页面重新点击下载~',
{
icon: 1,
end: function () {
location.reload();
},
});
}
function login(title) {
if(title === ''){
title = '登录'
}
layer.open({
type: 2,
title: title,
area: ['325px', '500px'],
//shadeClose: true, // 是否点击遮罩关闭
content: '/user/login?layer=1&share_id={$share_id}',
end: function () {
location.reload(); //刷新数据
}
});
}
function down() {
//判断登录
if (down_info.is_login) {
//判断VIP
if (down_info.is_vip) {
window.open(down_info.link);
} else {
layer.confirm('普通下载很慢,推荐您开通VIP极速下载,是否继续下载?', {
icon: 2,
btn: ['继续下载', '开通VIP'] //按钮
}, function () {
window.open(down_info.link);
}, function () {
vip();
});
}
//未登录
} else {
layer.confirm('未登录下载非常慢,推荐您登录下载,是否继续下载?', {
icon: 3,
btn: ['继续下载', '登录下载'] //按钮
}, function () {
window.open(down_info.link);
}, function () {
login();
});
}
}
updateTimeInfo();
setInterval("updateTimeInfo()", 1000);
</script>
</div>
</main>
</body>
</html>
+82
View File
@@ -0,0 +1,82 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0" />
<title>{$info.folder_name} - {$Think.config.basic.site_title}</title>
<link href="__STATIC__/pan/t0.css" rel="stylesheet" type="text/css">
<link href="__STATIC__/pan/t1.css" rel="stylesheet" type="text/css">
</head>
<body>
<div class="top">
<div class="d1">
<div class="d11" style="background-image: url({$Think.config.basic.site_logo});height: 18px; background-repeat: no-repeat; background-position: 15px 5px;">
<a href="/" class="d7">&nbsp;</a>
</div>
<div class="d12">
{eq name="$is_login" value="1"}
<a href="{:url('user/index')}">前往我的网盘</a>
{else/}
<a href="{:url('user/login')}">登录</a>
{/eq}
</div>
</div>
</div>
<div class="pc bgimg"></div>
<div class="d" id="info">
<div class="b">
<div id="filename">{$info.folder_name}</div>
<div class="rets">
<span class="mt2" style="padding-right: 3px;">分享者:</span>
<span style="color:#000">{$info.username}</span>
<span style="padding-left: 20px;">{$info.create_time|date="Y-m-d H:i"}</span>
<a href="{:url('index/report')}?share_id={$share_id}" target="_blank"><span class="retspan">文件投诉</span></a>
</div>
</div>
{eq name="$info.is_desc" value="1"}
<div class="tet">
<span class="teta"></span><span class="teta tetb"></span>
<span id="miaoshu">{$info.desc}</span>
</div>
{/eq}
<div class="d2">
<div class="nameh">文件名</div>
<div class="sizeh">大小</div>
<div class="timeh">时间</div>
</div>
<div id="infos">
{volist name="$share_list" id="vo"}
<div id="ready">
<div id="name">
&nbsp;<img src="{$vo.icon}" align="absmiddle" border="0">&nbsp;
<a href="{$vo.url}" {eq name="$vo.type" value="file"}target="_blank"{/eq}>{$vo.name}</a>
</div>
<div id="size">{$vo.size}</div>
<div id="time">{$vo.time}</div>
</div>
{/volist}
</div>
</div>
<div class="n_bot" style="margin-top: 10%;">
<div class="wap-down">手机可扫描二维码下载</div>
<div id="code">
<img src="{:url('index/qrcode')}?url={$url}" style="width: 218px;height: 218px;">
</div>
<div class="foot_info">
<div class="shenmin">
谨防刷单兼职,网贷,金融,裸聊敲诈,赌博等诈骗,请立即举报
</div>
<div class="foot_copy">版权声明:不得利用云存储发布,存储,淫秽,诈骗等违法信息。
<a href="{:url('index/report')}?share_id={$share_id}" target="_blank">侵权/违法投诉</a><br>或者投诉邮箱:{$Think.config.basic.site_email}</div>
© 2021 <a href="/">{$Think.config.basic.site_title}</a>
</div>
</div>
</body>
</html>
@@ -0,0 +1,70 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0">
<title>{$info.folder_name} - {$Think.config.basic.site_title}</title>
<link href="__STATIC__/pan/t0.css" rel="stylesheet" type="text/css">
<link href="__STATIC__/pan/t2.css" rel="stylesheet" type="text/css">
</head>
<body>
<div class="top">
<div class="d1">
<div class="d11" style="background-image: url({$Think.config.basic.site_logo});height: 18px; background-repeat: no-repeat; background-position: 15px 5px;">
<a href="/" class="d7">&nbsp;</a>
</div>
<div class="d12">
{eq name="$is_login" value="1"}
<a href="{:url('user/index')}">前往我的网盘</a>
{else/}
<a href="{:url('user/login')}">登录</a>
{/eq}
</div>
</div>
</div>
<div class="pc bgimg"></div>
<div class="md" id="info">
<div class="tet">
<div class="md2" id="filename">{$info.folder_name}</div>
<div class="mf">
<span class="mt2">分享者:</span>{$info.username}
<span class="mt2"></span>{$info.create_time|date="Y-m-d"}
<span class="mt2">
<a href="{:url('index/report')}?share_id={$share_id}" target="_blank">举报文件</a>
</span>
</div>
{eq name="$info.is_desc" value="1"}
<span class="teta"></span><span class="teta tetb"></span>
{$info.desc}
{/eq}
</div>
<div class="tbale">
<div>文件名</div>
<div id="infos">
{volist name="$share_list" id="vo"}
<div id="ready">
<div class="mbx">
<a href={$vo.url}" {eq name="$vo.type" value="file"}target="_blank"{/eq} class="mlink">
<img src="{$vo.icon}" align="absmiddle" border="0">
&nbsp; {$vo.name}
<div class="mmr">
<span>&nbsp;{$vo.time}</span>
</div>
</a>
</div>
</div>
{/volist}
</div>
</div>
</div>
<div class="foot_info" style="color:#939393">© 2018-2021 {$Think.config.basic.site_title}</div>
</body>
</html>
@@ -0,0 +1,191 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="format-detection" content="telephone=no">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="default">
<meta name="apple-mobile-web-app-title" content="{$Think.config.basic.site_title}">
<meta name="keywords" content="{$Think.config.basic.site_keywords}">
<meta name="description" content="{$Think.config.basic.site_desc}">
<link href="__STATIC__/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="__STATIC__/css/main.css">
<!--<link href="__STATIC__/css/index.css" rel="stylesheet" type="text/css">-->
<title>{$Think.config.basic.site_name}</title>
<link href="__STATIC__/css/app.css" rel="stylesheet">
<style>
.loader-x {
display: block;
width: 2em;
height: 2em;
margin: 100px auto;
color: inherit;
pointer-events: none;
color: #f60
}
.loader-x {
border-top: .2em solid currentcolor;
border-right: .1em solid transparent;
-webkit-animation: loader-x 1s linear infinite;
animation: loader-x 1s linear infinite;
border-radius: 100%;
position: relative
}
@-webkit-keyframes loader-x {
to {
-webkit-transform: rotate(360deg);
transform: rotate(360deg)
}
}
@keyframes loader-x {
to {
-webkit-transform: rotate(360deg);
transform: rotate(360deg)
}
}
</style>
{$Think.config.basic.site_head|raw}
</head>
<body>
<div id="app">
<div class="home">
<div id="header">
<div class="fixwid">
<div class="logo">
<a href="">
<img src="{$Think.config.basic.site_logo}" style="width: 100%;margin-top: 17px;">
</a>
</div>
<div class="nav">
<ul>
<li><a href="{:url('index/index')}" class="a_line">首页</a></li>
<li><a href="{:url('index/xieyi')}" class="a_line" target="_blank">免责声明</a></li>
</ul>
<div class="login">
{eq name="$is_login" value="1"}
<a href="{:url('user/index')}" class="a_area">我的网盘</a>
{else/}
<a target="_blank" href="{:url('user/login')}" class="a_area">登录/注册</a>
{/eq}
</div>
</div>
</div>
<img src="__STATIC__/picture/shadow.png">
</div>
<div data-v-e9e0751c="" class="header">
<div data-v-e9e0751c="" class="header-content">
<div data-v-e9e0751c="" class="header-body">
<div data-v-e9e0751c="" class="body-left">
<div data-v-e9e0751c="" class="left-title">高速存储的云盘</div>
<div data-v-e9e0751c="" class="left-text">
{$Think.config.basic.site_title}是一款速度快、不打扰、够安全、易于分享的网络云盘,你可以在这里存储、管理和探索内容,尽情打造丰富的数字世界。</div>
<div data-v-e9e0751c="" class="left-download">
<a data-v-e9e0751c="" href="{:url('user/index')}">
<div data-v-e9e0751c="" class="apps">用户中心</div>
</a>
<a data-v-e9e0751c="" href="{:url('user/index')}" target="_self">
<div data-v-e9e0751c="" class="pc">网盘联盟</div>
</a>
</div>
</div>
<div data-v-e9e0751c="" class="body-right">
<div data-v-e9e0751c="" class="right-round1"></div>
<div data-v-e9e0751c="" class="right-round5"></div>
<div data-v-e9e0751c="" class="right-round2"></div>
<div data-v-e9e0751c="" class="right-round3"></div>
<div data-v-e9e0751c="" class="right-round4"></div>
<!---->
<div data-v-e9e0751c="" class="header-img">
<img data-v-e9e0751c="" src="__STATIC__/picture/header-mobile.png" alt=""></div>
</div>
</div>
</div>
</div>
<div data-v-35ecef7e="" class="space">
<div data-v-35ecef7e="" class="space-content">
<div data-v-35ecef7e="" class="space-title">
<p data-v-35ecef7e="">存储到云端更畅快</p>
</div>
<div data-v-35ecef7e="" class="space-body">
<div data-v-35ecef7e="" class="body-item">
<p data-v-35ecef7e="">尽享极速</p>
<p data-v-35ecef7e="">上传下载</p>
<p data-v-35ecef7e="">告别 kb/s,极速上传下载文件资料,</p>
<p data-v-35ecef7e="">免费用户也享有合理带宽。</p>
<div data-v-35ecef7e="" class="space-logo space1"></div>
</div>
<div data-v-35ecef7e="" class="body-item">
<p data-v-35ecef7e="">网盘联盟</p>
<p data-v-35ecef7e="">资源共享</p>
<p data-v-35ecef7e="">您的数据,变的有价值!</p>
<p data-v-35ecef7e="">入口一直向你敞开。</p>
<div data-v-35ecef7e="" class="space-logo space3"></div>
</div>
<div data-v-35ecef7e="" class="body-item">
<p data-v-35ecef7e="">云端数据</p>
<p data-v-35ecef7e="">非常安全</p>
<p data-v-35ecef7e="">分享文件地址永久有效</p>
<p data-v-35ecef7e="">不必担心过期而经常更换链接。</p>
<p data-v-35ecef7e=""></p>
<div data-v-35ecef7e="" class="space-logo space4"></div>
</div>
</div>
</div>
</div>
</div>
<div data-v-20ff4511="" class="footer">
<div data-v-20ff4511="" class="footer-item">
<div data-v-20ff4511="" class="footer-img">
<div data-v-20ff4511="" class="footer-img2 spinMe"></div>
<div data-v-20ff4511="" class="footer-img1 spinMe"></div>
</div>
<div data-v-20ff4511="" class="footer-title">
<p data-v-20ff4511="">高效存储,真正的云加速下载!</p>
</div>
<div data-v-20ff4511="" class="footer-content">
<a data-v-20ff4511="" href="{:url('user/index')}">
<div data-v-20ff4511="" class="content-apps">用户中心</div>
</a>
<a data-v-20ff4511="" href="{:url('user/login')}">
<div data-v-20ff4511="" class="content-pc">账户登录</div>
</a>
</div>
<div data-v-20ff4511="" class="footer-text">
<div data-v-20ff4511="" class="footer-text-content">Copyright © 2018-2021 {$Think.config.basic.site_title} All rights
reserved. 版权所有
</div>
</div>
</div>
</div>
</div>
<script src="__STATIC__/js/jquery.js"></script>
<script src="__STATIC__/js/bootstrap.min.js"></script>
<script src="__STATIC__/js/jquery.cxscroll.js"></script>
<script type="text/javascript">
$(".display,#main .fixwid:eq(2) h1").css("background", "#f5f7f7");
$(".course_c:eq(3),.course_c:eq(7)").css("margin-right", "0");
$(".course_c:eq(2),.course_c:eq(6)").css("margin-right", "28px");
$("#pic_list_1").cxScroll();
</script>
{$Think.config.basic.site_foot|raw}
</body>
</html>
@@ -0,0 +1,149 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{$Think.config.basic.site_name}</title>
<meta name="keywords" content="{$Think.config.basic.site_keywords}">
<meta name="description" content="{$Think.config.basic.site_desc}">
<link rel="stylesheet" href="__STATIC__/static/index/css/index.css">
<link href="__STATIC__/static/index/css/icon-style.css" rel="stylesheet">
<link href="__STATIC__/static/index/css/common-style.css" rel="stylesheet">
<link href="__STATIC__/static/index/css/share-style.css" rel="stylesheet">
<link href="__STATIC__/static/index/css/vendor.css" rel="stylesheet">
<link href="__STATIC__/static/index/css/login.css" rel="stylesheet">
{$Think.config.basic.site_head|raw}
</head>
<body class="body-login wrapper-login body-login-activity">
<div id="header" class="header header-login home-header theme-blue" style="display: block;">
<div class="clearfix">
<h1 class="logo logo-st pull-left ml50">
<a style="background: url({$Think.config.basic.site_logo}) no-repeat 50% 50%;" href="/" title="盛天云盘"></a>
</h1>
<div class="js-nav pull-left nav ml50">
<a data-route="index" href="/" class="active">首页</a>
<a data-route="download" href="{:url('user/login')}">下载</a>
</div>
<div class="divider pull-right "></div>
<div class="pull-right link-wrap mr20">
<a data-dssp="页头 会员中心" href="{:url('user/login')}" class="text link" target="_blank">
<i class="icon icon-home-header-vip"></i>
<span>会员中心</span>
</a>
</div>
</div>
</div>
<div class="main-login container-login main-activity-twelve">
<div class="container">
<div class="wrap-activity-in">
<div class="js-activity-in">
<a href="{:url('user/login')}"
style="background-image: url('__STATIC__/static/index/img/login_top_20210903.png')"
target="_blank" class="activity-in-login"></a>
</div>
</div>
<div class="wrap-inset">
<div class="js-box">
<div class="box pull-right" style=" box-sizing: border-box; ">
<div class="box-logo">
<p>帐号密码登录</p>
</div>
<div class="box-hd">
</div>
<div class="box-bd">
<div class="box-block" id="js-login">
<div class="y2" style="font-size: 19px;color: #0574ff; ">1,免费注册<br>2,上传文件<br>3,分享链接</div>
<a href="{:url('user/login')}" class="mt8 _btn btn-default btn-lg btn-block" style="margin: 30px 0;">
登录
</a>
<a href="{:url('user/login')}" class="mt8 _btn btn-default btn-lg btn-block" style="margin: 30px 0;">
注册
</a>
</div>
</div>
</div>
</div>
</div>
<div class="c"></div>
</div>
<div class="u1"></div>
<ul class="wrap-intro" style=" box-sizing: border-box; margin: 0 auto;">
<li>
<div class="pic pic-intro-1"></div>
<p class="title">安全可靠</p>
<p class="desc">多副本部署,并加密存储和传输,保障数据安全可靠</p>
</li>
<li>
<div class="pic pic-intro-2"></div>
<p class="title">极速传输</p>
<p class="desc">多地专线加速,上传下载尊享极速传输</p>
</li>
<li>
<div class="pic pic-intro-3"></div>
<p class="title">高效云下载</p>
<p class="desc">云端专用服务器代理下载,告别挂机等待</p>
</li>
<li>
<div class="pic pic-intro-4"></div>
<p class="title">高清云预览</p>
<p class="desc">随时随地访问视频、照片、文档,免下载即时检阅</p>
</li>
<li>
<div class="pic pic-intro-5"></div>
<p class="title">超大空间</p>
<p class="desc">最高可达6T的会员专享空间,支持任性扩容</p>
</li>
</ul>
</div>
</div>
<div class="u">
<div class="u3">
<div class="m1">网盘用高效说话...</div>
<div class="m2">分享文件地址永久有效,不必担心过期而经常更换链接,帮您节省繁琐步骤,把时间用到有价值的地方去。
</div>
</div>
<div class="u2">
<div class="u5"></div>
</div>
</div>
<div class="c"></div>
<div class="v3">
<div class="h3">
<div class="v4">体验真正的云加速</div>
<div class="v6">下载无任何限制,无验证码等影响用户体验限制。</div>
<div class="v5">在蓝奏,所有云存储、文件下载都是秒级响应。采用网众公司云计算+存储分发技术。任何网络,享受到最快的下载速度。</div>
<div><a class="v7" href="{:url('user/login')}" target="_blank">立刻体验</a></div>
</div>
</div>
<div class="c"></div>
<div class="h2">
<div class="m1">我们的优势...</div>
<div class="m2">整合各种资源为你所用,为你24小时不间断增加收入。帮你解决各种问题,节省你的时间,等于让你赚更多的钱。<br>我们对于任何大小客户同等待遇,对下载IP不做各种级别区分,都是高价。<a
href="{:url('user/login')}" target="_blank">了解详情</a></div>
</div>
<div class="c"></div>
<div class="h1">
<div class="m1">我们这么一群人...</div>
<div class="m2">我们是一群有着激情的年轻人组成的团队,如果你怀才不遇无处倾诉?各类有才能之士,凡是有一技之长,赶快加入我们。
<a href="{:url('user/login')}" target="_blank">了解详情</a></div>
</div>
<div class="c"></div>
<div class="foot">
<div class="f5"></div>
<div class="f1" style="margin-top: 10px;word-spacing: normal">
<p>
Copyright © 2018-2021 {$Think.config.basic.site_title} All rights
reserved. 版权所有
</p>
</div>
</div>
<script type="text/javascript" src="__STATIC__/static/js/jquery.js"></script>
<script type="text/javascript" src="__STATIC__/static/index/img/top.js"></script>
{$Think.config.basic.site_foot|raw}
</body>
</html>
+106
View File
@@ -0,0 +1,106 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="renderer" content="webkit">
<title>请输入提取码 - {$Think.config.basic.site_title}</title>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0">
<meta content="{$Think.config.basic.site_keywords}" name="keywords">
<meta content="{$Think.config.basic.site_desc}" name="description">
<link href="__STATIC__/css/t0.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="__STATIC__/pass/base.css">
<link rel="stylesheet" type="text/css" href="__STATIC__/pass/pc.css">
<script type="text/javascript" src="__STATIC__/js/jquery.js"></script>
</head>
<body style="background-color: #eef2f6;">
<div class="top">
<div class="d1">
<div class="d11" style="background-image: url({$Think.config.basic.site_logo});height: 18px; background-repeat: no-repeat; background-position: 15px 5px;">
<a href="{:url('index/index')}" class="d7">&nbsp;</a></div>
<div class="d12">
<a href="{:url('user/login')}">登录</a>
</div>
</div>
</div>
<div class="pc bgimg"></div>
<div class="docs init-docs">
<div class="acss-header" id="mweul5Yl">
<div class="acss_banner"></div>
<div class="verify-form">
<div class="clearfix">
<div class="CMxQsC {eq name="$is_vip" value="1"}is_vip{/eq}">
<div class="avatar">
<div class="photo-frame">
<span class="radius-3">
<img src="{:getUserHead($userinfo.avatar)}" width="44">
<span class="cert-info"></span>
</span>
</div>
</div>
<div class="verify-property">
<div class="verify-user">
<div class="username">{:getSafeNickname($userinfo.nickname)}</div>
&nbsp;
<span class="verify-user-avatar">
{eq name="$is_vip" value="1"}
<a href="javascript:;" class="v-icon vip-icon" title="VIP会员"><em></em></a>
{else/}
<a href="javascript:;" class="v-icon unvip-icon" title="普通用户"><em></em></a>
{/eq}
</span>
</div>
<div class="author-desc">{$desc}</div>
</div>
<div class="cb"></div>
</div>
<div class="verify-input ac-close clearfix">
<dl class="pickpw clearfix">
<dt><strong style="font-size: 15px;">请输入提取码:</strong></dt>
<dd class="clearfix input-area">
<input type="hidden" id="urlId" value="{$share_id}">
<input class="QKKaIE LxgeIt" id="accessCode" tabindex="1" type="text">
<div id="submitBtn">
<a class="submit-a g-button-blue-large" href="javascript:;" title="提取文件">
<span class="g-button-right">
<span class="text" style="width: auto;">提取文件</span>
</span>
</a>
</div>
</dd>
</dl>
<dl class="pickcode clearfix">
<dt>
验证码:</dt>
<dd class="clearfix">
<input class="LIztsC QKKaIE" id="wu4Lbl" tabindex="2" type="text">
<img alt="验证码" id="gsxl4Am4"><a class="change-code" href="javascript:;">换一张</a>
</dd>
</dl>
<div class="verify-desc-protect-share">
</div>
</div>
</div>
<div id="passCuowu" style="display: block;"></div>
</div>
</div>
<div class="cloud-bg">
<div class="bg1"></div>
<div class="bg2"></div>
<div class="bg3"></div>
</div>
<div class="init-footer">
<div class="footer" id="footer" style="height: 40px;">
<div class="footer-txt">
© 2018-2021 {$Think.config.basic.site_title} | 版权声明:不得利用云存储发布,存储,淫秽,诈骗等违法信息。
<a href="{:url('index/report')}?share_id={$share_id}" target="_blank">侵权/违法投诉</a>或者投诉邮箱:{$Think.config.basic.site_email}
</div>
</div>
</div>
</div>
<script type="text/javascript" src="__STATIC__/pass/api.js"></script>
</body>
</html>
+422
View File
@@ -0,0 +1,422 @@
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0" />
<script type="text/javascript" src="__STATIC__/js/jquery.js"></script>
<script src="__STATIC__/js/layer.js"></script>
<title>举报 - {$Think.config.basic.site_title}</title>
<style>
body,
td,
th {
font-family: Arial, \5FAE\8F6F\96C5\9ED1, sans-serif;
font-size: 14px;
margin: 0px;
color: #333333;
}
.d2 {
font-size: 22px;
font-family: MingLiU, PMingLiU;
width: auto;
margin-right: auto;
margin-left: auto;
padding-left: 8%;
padding-right: 50px;
padding-top: 17px;
padding-bottom: 11px;
}
#date {
font-size: 12px;
color: #666666;
margin: auto;
padding: 7px 98px;
text-align: center;
width: auto;
}
.d5 {
color: #000000;
font-size: 16px;
}
.h3 {
color: #FFFF66;
font-weight: normal;
padding-bottom: 30px;
padding-top: 27px;
background-color: #19A9E5;
padding-right: 50px;
padding-left: 8%;
line-height: 2.1;
font-size: 16px;
}
.h9 {
text-align: center;
padding: 7px;
border: 1px solid #FFFFFF;
color: #FFFFFF;
}
.d7 {
padding-left: 8%;
margin-right: auto;
margin-left: auto;
width: auto;
padding-top: 17px;
padding-right: 50px;
padding-bottom: 98px;
color: #666666;
}
.m {
border: 1px solid #ccc;
padding: 9px;
/* width: 500px; */
font-size: 14px;
box-shadow: inset 0 1px 2px rgba(0, 0, 0, .125);
background-color: #fafafa;
}
.m:hover {
border: 1px solid #19A9E5;
}
.m2 {
border: none;
color: #FF0000;
font-size: 14px;
font-weight: 700;
}
.anniu {
padding: 9px;
height: 39px;
width: 150px;
background-color: #FFFFFF;
color: #0099FF;
}
.anniu:disabled {
color: #757575;
background-color: #DEDEDE;
border: 2px solid #DEDEDE;
}
.copy {
border-top: 1px dashed #CCCCCC;
border-right: 1px none #CCCCCC;
border-bottom: 1px dashed #CCCCCC;
border-left: 1px none #CCCCCC;
color: #888888;
line-height: 37px;
text-align: left;
padding: 7px;
}
span {
color: #8AD3F2;
font-size: 14px;
line-height: 2.3;
}
.p {
width: 709px;
margin-right: auto;
margin-left: auto;
}
.tc {
padding: 8px;
visibility: hidden;
background-color: #78E789;
border: 1px solid #009900;
font-size: 30px;
color: #FFFFFF;
line-height: 100px;
}
#f8 {
color: #75D84B;
display: none;
}
input:focus {
outline: 0;
}
.m:focus {
border: #52A6EF 1px solid;
box-shadow: 0 0 3px rgba(82, 166, 239, .8);
outline: 0;
background-color: #fff
}
.radio {
position: absolute;
left: -9999em
}
.cb_empty {
margin-bottom: 16px;
font-weight: 700;
font-size: 12px;
background-color: #fff;
border: 1px #ddd solid;
padding: 0 16px;
border-radius: 3px;
cursor: pointer;
background-image: linear-gradient(#FCFCFC, #EEE);
display: inline-block;
line-height: 28px;
height: 28px
}
.cb_empty:hover {
border: 1px #ccc solid;
background-image: linear-gradient(#EEE, #DDD)
}
.cb_empty:active {
box-shadow: inset 0 1px 6px rgba(0, 0, 0, .3)
}
.checked {
color: #fff;
cursor: default;
background: #379be9;
border: 1px #2287D5 solid;
background-image: linear-gradient(#379BE9, #379BE9);
box-shadow: inset 0 2px 6px rgba(0, 0, 0, .3)
}
.checked:hover {
border: 1px #2287D5 solid;
background-image: linear-gradient(#379BE9, #379BE9)
}
::-webkit-scrollbar {
background: rgba(0, 0, 0, 0.1);
height: 8px;
;
width: 8px
}
::-webkit-scrollbar-thumb {
background-color: rgba(0, 0, 0, 0.3)
}
::-webkit-scrollbar-thumb:hover {
background: rgba(0, 0, 0, 0.5);
}
::-webkit-scrollbar-thumb:active {
background: rgba(0, 0, 0, 0.6);
}
#report {
position: fixed;
width: 100%;
background: rgba(17, 17, 17, .3);
height: 100%;
top: 0;
border: 0;
z-index: 9;
}
.report {
background: #fff;
border-radius: 7px;
width: 300px;
text-align: center;
padding: 17px;
position: absolute;
margin: auto;
right: 0;
left: 0;
bottom: 0;
top: 0;
height: 80px;
}
.report span {
margin: 0 15px;
cursor: pointer;
font-size: 16px;
color: #08f;
}
.report_hd {
padding-bottom: 20px;
}
#f9 {
cursor: pointer;
}
</style>
</head>
<body>
<div class="d2">互联网不良信息 文件举报</div>
<div class="h3">
<span class="d5">文件举报说明:</span> <br />
1,如果有害信息类别属于“版权或者危害他人”,请提供以下材料:
<br />
<span>版权证明文件(如著作权、版权证书等)或侵犯他人权利的相关证明(如肖像权的本人身份证等)。书面处理请求书(需要注明处理方式,如删除相关文件或冻结用户账户文件等)。举报人的相关证件扫描件(如身份证、营业执照等),如果与第一项版权证明不相符的,还需要提供
授权委托书 。<br />
以上材料均采用电子扫描件,并加盖公章或签名。发送到邮件 <span class="h9">{$Think.config.basic.site_email}</span></span><br />
2,如果文件含有诈骗,病毒,木马,淫秽等问题,可以直接提交。
</div>
<div id="content">
<div class="main">
<div class="d7">
<table width="100%" cellspacing="0" cellpadding="7" border="0">
<tbody>
<tr valign="top">
<td valign="middle">
<div align="left"><span class="field"><strong>联系邮箱/手机号:</strong></span>[必填]<br />
<input type="text" class="m" maxlength="60" size="26" id="yourname"
name="yourname" />
</div>
</td>
</tr>
<tr valign="top">
<td>
<div align="left"><span class="field"><strong>详细描述:</strong></span><br />
<textarea name="message" class="m" id="message" cols="60" rows="5"></textarea>
<span class="tip"></span>
</div>
</td>
</tr>
<tr valign="top">
<td>
<div align="left"><span class="field"><strong>危害类别:</strong></span>
<div id="pay">
<label for="t0" class="cb_empty checked"><input type="radio" name="tel"
value="病毒" id="t0" class="radio" checked />病毒</label>
<label for="t1" class="cb_empty"><input type="radio" name="tel" value="诈骗"
id="t1" class="radio" />诈骗</label>
<label for="t5" class="cb_empty"><input type="radio" name="tel" value="赌博"
id="t5" class="radio" />赌博</label>
<label for="t2" class="cb_empty"><input type="radio" name="tel" value="侵权"
id="t2" class="radio" />侵权</label>
<label for="t3" class="cb_empty"><input type="radio" name="tel" value="色情"
id="t3" class="radio" />色情</label>
<label for="t4" class="cb_empty"><input type="radio" name="tel" value="其它"
id="t4" class="radio" />其它</label>
</div>
</div>
</td>
</tr>
<tr valign="top">
<td>
<div>
<input type="submit" id="f9" class="anniu" value="提 交" onclick="ck()" />
<font id="f8"> 请稍后...</font>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<script language="javascript">
var type = "病毒";
$('#pay label').click(function () {
type = $(this).find('input').val();
var id = $(this).find('input').attr('id');
$('#' + id).attr('checked', true);
$($('#' + id).parent()).addClass('checked').siblings().removeClass('checked');
});
//获取浏览器参数
function getQueryVariable(variable) {
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split("=");
if (pair[0] == variable) { return pair[1]; }
}
return (false);
}
function G(id) {
return document.getElementById(id);
}
function ck() {
var url_id = getQueryVariable("url_id") || '';
var contact = $("#yourname").val();
var text = $("#message").val();
if (contact == '') {
layer.msg("请提供您的联系方式", function () { });
$("#yourname").focus();
return false;
}
if (text == '') {
layer.msg("请提供详细举报内容", function () { });
$("#message").focus();
return false;
}
G('f9').disabled = true;
G('f9').value = "正在提交中...";
//提交举报
$.ajax({
type: "post",
url: window.location.href,
data: {
"contact": contact,
"content": text,
"type": type
},
dataType: 'json',
success: function (data) {
if (data.code == 1) {
layer.alert(data.msg, {
icon: 1,
end: function () {
location.reload();
},
});
} else if (data.code == 0) {
layer.alert(data.msg, { icon: 2 });
}
},
error: function (error) {
layer.alert("API请求失败,请联系客服", { icon: 2 });
}
});
G('f9').disabled = false;
G('f9').value = "提 交";
return false;
}
function getdates() {
var d = new Date();
var year = d.getFullYear();
var shows = "&copy; 2018-" + year + " {$Think.config.basic.site_title}";
document.getElementById("date").innerHTML = shows;
}
</script>
<div id='date'>
<script>
getdates();
</script>
</div>
</div>
</body>
</html>
+310
View File
@@ -0,0 +1,310 @@
<!DOCTYPE html>
<html>
<head>
<script>
//遮罩层
if (window != top) {
try {
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
catch (err) {
//在此处理错误
}
}
</script>
<meta http-equiv="Content-Type" content="text/html; 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>文件管理 - {$Think.config.basic.site_title}</title>
<link href="__STATIC__/css/bootstrap.min.css" rel="stylesheet">
<link href="__STATIC__/css/userapp.css" rel="stylesheet">
<link href="__STATIC__/icon/icon.css" rel="stylesheet">
<link href="__STATIC__/css/home.css" rel="stylesheet">
<link href="__STATIC__/css/elementui.css" rel="stylesheet">
<link href="__STATIC__/css/list.css" rel="stylesheet"> <!-- 放在最后 -->
<script src="__STATIC__/js/jquery.js"></script>
<script src="__STATIC__/js/bootstrap.min.js"></script>
<script src="__STATIC__/js/common.js"></script>
<link href="__STATIC__/css/file.css" rel="stylesheet">
<link href="__STATIC__/css/bootstrap-table.min.css" rel="stylesheet">
<link href="__STATIC__/css/bootstrap-table-fixed-columns.css" rel="stylesheet">
<link href="__STATIC__/css/bootstrap-editable.css" rel="stylesheet">
<script src="__STATIC__/js/bootstrap-table.min.js" type="text/javascript"></script>
<script src="__STATIC__/js/bootstrap-table-fixed-columns.js" type="text/javascript"></script>
<script src="__STATIC__/js/bootstrap-editable.js" type="text/javascript"></script>
<script src="__STATIC__/js/lay/modules/layer.js"></script>
<script type="text/javascript" src="__STATIC__/viewer/viewer.min.js"></script>
<link rel="stylesheet" href="__STATIC__/viewer/viewer.min.css">
<style>
.el-menu-item a{
display: block;
text-decoration: none;
color: #7e8c8d;
}
.el-menu-item.select a{
color: #09AAFF;
}
@media (max-width:890px) {
.pub-header .logo{
width: 100px !important;
}
.pub-header .head-box .text{
display: none;
}
.el-menu-item{
padding: 0;
}
.el-container{
flex-direction: column;
}
.el-aside{
width: 100%;
overflow:inherit
}
.el-menu-item{
display: inline-block;
width: 30.33333%;
text-align: center;
margin: .5%;
}
.top-item em{
display: none;
}
.top-item .text {
margin-left: 0;
width: 28px;
}
.top-right input{
width: 80%;
}
.filename {
display: inline-block;
width: 100px;
overflow: hidden;
}
.col-sm-1{
display: inline-block;
padding-right:0 !important;
margin-left: 0 !important;
}
.col-sm-1:nth-child(2){
padding-left:0;
}
.col-sm-3{
display: inline-block;
margin-left: 0;
}
.switch {
width: 48px;
height: 26px;
}
.slider:before {
height: 17px;
width: 15px ;
}
}
</style>
</head>
<body>
<div class="app">
<div class="header">
<section class="el-container is-vertical">
<header class="el-header" style="height: 60px;">
<div class="pub-header space-between">
<a href="/"><img src="{$Think.config.basic.site_logo}" class="logo"
style="width: 130px;height: 40px;"></a>
<div class="pub-right flex">
<span>
<div class="head-box align-center el-popover__reference tan"
aria-describedby="el-popover-2040" tabindex="0"
{eq name="$vip_info.is_vip" value="0"}tan="VIP到期时间:未开通">{/eq}
{eq name="$vip_info.is_vip" value="1"}tan="VIP到期时间:{$vip_info.expire_time}">{/eq}
<img src="{:getUserHead($info.avatar)}" alt=""class="head-img">
<p class="text" {eq name="$vip_info.is_vip" value="1"}style="color: red;"{/eq}>
{$info.nickname} ({$group.group_name})
</p>
<p class="line"></p>
</div>
</span>
<div class="pub-header1 align-center"><img
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAQCAYAAADJViUEAAABCUlEQVQokZXTvyvEYRwH8Nc9sbrtDJLVdl05qfMPKFaJzHSDwUJmZTEwCBnFJgOZUYorq8l2AxtXFkoZvs+Xb9e5H+/l8/S83+/n86PPkyuVSpowjTxOcIp5LKCBy6wwZM6DkZzATbwbiPEWk7iKOtAXYx5nWEWtuRTUsY4KzjGFRpp5D2v/GLO4wwb207LH8RaJbnCND5QDlrDbpTHFDpYDhvDco/kJIwGfPRpThOBv4q2w2Yb7Cm1IuO+U+QXDHR5pxijqAUeS5egFKzgMeEABY10aK5KNrKU9V7GNYgdjGVtR/zvpBuYkLTziAK8ZUyGWWsRs1Mu1+JIzWJT8qG/04x3HuMgKfwBDXy+/tOYcjQAAAABJRU5ErkJggg=="
alt="" class="tc">
<p class="text">
<a href="{:url('user/logout')}" class="js-ajax-btn" style="color:#313131">退出登录</a>
</p>
</div>
</div>
</div>
</header>
<section class="el-container">
<aside class="el-aside">
<div class="el-col el-col el-col-24">
<ul id="menubar" class="el-menu-vertical-demo el-menu"
style="background-color: rgb(247, 247, 247);margin-top: 8px;">
<li role="menuitem" class="el-menu-item g-button-right {eq name="url_path" value="user/index"}select{/eq}">
<a href="{:url('user/index')}">
<em class="icon icon-disk"></em>
<span>全部文件</span>
</a>
</li>
<li role="menuitem" class="el-menu-item g-button-right {eq name="url_path" value="recycle/index"}select{/eq}">
<a href="{:url('recycle/index')}">
<em class="icon icon-delete"></em>
<span>回收站</span>
</a>
</li>
{php}
if($url_path == 'share/index' || $url_path == 'share/record' || $url_path == 'share/withdraw'){
$share_active = 1;
}else{
$share_active = 0;
}
{/php}
<li role="menuitem" class="el-menu-item g-button-right {eq name="$share_active" value="1"}select{/eq}">
<a href="{:url('share/index')}">
<em class="icon icon-my-share"></em>
<span>分享赚钱</span>
</a>
</li>
</ul>
</div>
</aside>
<main class="el-main">
{block name="main"}{/block}
</main>
</section>
</section>
<div class="el-dialog__wrapper" style="display: none;">
<div role="dialog" aria-modal="true" aria-label="更换手机号" class="el-dialog"
style="margin-top: 15vh; width: 404px;">
<div class="el-dialog__header"><span class="el-dialog__title">更换手机号</span><button type="button"
aria-label="Close" class="el-dialog__headerbtn"><i
class="el-dialog__close el-icon el-icon-close"></i></button></div>
<!---->
<!---->
</div>
</div>
<div class="el-dialog__wrapper" style="display: none;">
<div role="dialog" aria-modal="true" aria-label="修改密码" class="el-dialog"
style="margin-top: 15vh; width: 404px;">
<div class="el-dialog__header"><span class="el-dialog__title">修改密码</span><button type="button"
aria-label="Close" class="el-dialog__headerbtn"><i
class="el-dialog__close el-icon el-icon-close"></i></button></div>
<!---->
<!---->
</div>
</div>
</div>
</div>
<script type="text/javascript">
//全局变量
var GV = {
ROOT: "/",
WEB_ROOT: "/",
JS_ROOT: "./assets/js/",
APP: ''/*当前应用名*/
};
function isMobile(){
return /Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent);
}
function vip() {
let w = window.screen.width < 768 ? '95%' : '723px';
let h = window.screen.width < 768 ? '95%' : '520px';
if (isMobile()) {
layer.open({
type: 2,
shadeClose: true,
closeBtn: 0,
title: false,
offset: 'b',
anim: 2,
area: ['100%', '620px'], // 宽高
content: "/user/vip?layer=1",
end: function () {
},
});
}else{
layer.open({
type: 2,
shadeClose: true,
title: "VIP中心",
area: [w, h], // 宽高
content: "/user/vip",
end: function () {
//location.reload();
},
});
}
}
function userinfo() {
let w = window.screen.width < 768 ? '95%' : '723px';
let h = window.screen.width < 768 ? '95%' : '620px';
layer.open({
type: 2,
shadeClose: true,
title: "个人中心",
area: [w, h], // 宽高
content: "/user/info",
end: function () {
//location.reload();
},
});
}
function vipOk() {
layer.alert('恭喜您开通VIP成功~ 感谢您的支持!',
{
icon: 1,
end: function () {
location.reload();
},
});
}
$(".head-box").click(
function () {
userinfo();
}
);
$('.tan').on({
mouseenter: function () {
var nei = $(this).attr("tan");
if (nei) {
var that = $(this);
tips = layer.tips("<span style='color:#000;font-size:17px;'>" + nei + "</span>", that, { tips: [2, '#fff'], time: 0, area: 'auto', maxWidth: 700 });
}
},
mouseleave: function () {
layer.close(tips);
}
});
</script>
<script src="__STATIC__/js/wind.js"></script>
<script src="__STATIC__/js/admin.js"></script>
</body>
</html>
+236
View File
@@ -0,0 +1,236 @@
{extend name="layout/user" /}
{block name="main"}
<div class="all-box">
<div class="top space-between">
<div class="top-left align-center">
<!--[if lte IE 9]><div style="color: #FFFFFF;width: 770px;text-align: center;background: #FF4949;margin: auto;">升级提示:当您看到此信息,说明您的浏览器不支持上传接口,请使用360(极速模式),QQ(新版),Chrome等新一代浏览器。</div><![endif]-->
<div id="CilckCheck2" class="top-item flex-box upload " onclick="CheckEmpty()" style="background-color: #d9534f;">
<em class="icon icon-delete"></em><p class="text">清空</p>
</div>
<div id="CilckCheck" style="display: none;" class="align-center">
<div id="CheckTmp" style="display: none;"></div>
<div class="top-item flex-box upload" onclick="CheckBack()">
<em class="icon icon-disk" title="收集文件"></em>
<p class="text">还原文件</p>
</div>
<div class="top-item flex-box" onclick="CheckDelete()" style="margin-right: 0px;padding: 0 8px 0 8px;border-radius: 0px;">
<em class="icon icon-delete" title="删除"></em>
<p class="text">彻底删除</p>
</div>
</div>
</div>
<div class="top-right space-between">
<div class="el-input">
<input id="sousuo" type="text" autocomplete="off" placeholder="搜索您的文件" class="el-input__inner">
<span class="icon icon-search" onclick="getTable($('#sousuo').val())"></span>
</div>
</div>
</div>
<div id="emptyFile" style="display: none;">
<div class="emptyFile" style="visibility: visible;">
<div class="emptyFile2 emptyRecyclebin">
<div class="img">
</div>
</div>
</div>
</div>
<div class="daohang">
<span class="daohang-all" style="display: block;">
<span onclick="getTable()" style="cursor:pointer;">放到回收站中的文件,外链无法分享不可下载。重要文件不要放到回收站!</span>
<span style="float:right;top: 1px;">
<span style="color: #f0ad4e;font-size: 12px;margin-right: 5px;" title="鼠标右键文件去试试~">
<span class="icon icon-tips-caution"></span>
文件操作可使用右键
</span>
<span>已全部加载,共<span class="daohang-count">-</span></span>
</span>
</span>
<ul class="daohang-path" style="display: none;">
<li>
<a id="daohang-shangyiji" onclick="getTable()" href="javascript:;">返回上一级</a>
<span class="fuhao">|</span>
</li>
<li>
<a href="javascript:;" onclick="getTable()">全部文件</a>
<span class="fuhao">&gt;</span>
<span id="daohang">
</span>
</li>
<span style="float:right;">已全部加载,共<span class="daohang-count">-</span></span>
</ul>
</div>
<div class="context-menu">
<ul class="list" data-id="" data-filename="" data-folder=""
id="list1"
style="z-index: 100; left: 524px; top: 194px; display: none;">
<li>彻底删除</li>
<li class="separate"></li>
<li>还原</li>
</ul>
<ul class="list" id="list2" style="z-index: 100; left: 524px; top: 194px; display: none;">
<li>重新加载页面</li>
<li class="separate"></li>
<li>刷新</li>
</ul>
</div>
<script src="__STATIC__/js/recyclebin.js"></script>
<div class="table-box">
<table id="table"></table>
<script>
//table自适应
$(window).resize(function () {
$("#table").bootstrapTable('resetView', {
height: $(window).height() - 171
});
});
//搜索回车
$("#sousuo").keydown(function(e){
if(e.keyCode==13){
getTable($(this).val());
}
});
function getTable(sousuo="") {
$('#table').bootstrapTable('destroy'); //销毁数据
var queryUrl = "{:url('recycle/list')}?rnd=" + Math.random() + "&search="+sousuo;
$("#table").bootstrapTable({
url: queryUrl, //请求后台的URL*
method: 'GET', //请求方式(*
striped: true, //是否显示行间隔色
sortable: true, //是否启用排序
sortOrder: "asc", //排序方式
dataField: "data", //Json数据的字段
pagination: true,
pageNumber: 1,
pageSize: 20,
pageList: [10, 25, 50, 100],
//clickToSelect: true, //点击选中
height: $(window).height() - 171, //高度
sidePagination: "server", //分页方式:client客户端分页,server服务端分页(*)
classes: "table table-hover",
queryParams : function (params) {
return {
rows: params.limit, //页面大小
page: (params.offset / params.limit) + 1, //页码
};
},
//无内容时
formatNoMatches: function () {
if(sousuo && 1==2){
$(".emptyFile2").addClass("emptySousuo");
var msg = '<p title="为什么不去问问神奇的海螺呢">在您的网盘中,未搜索到相应的文件</p>';
}else{
$(".emptyFile2").addClass("emptyRecyclebin");
var msg = '<p style="font-size: 16px;font-weight: 700;color: #03081a;">您的回收站是空的噢</p><p>建议您把网盘的文件都删除后再来,2333~</p>';
}
$(".emptyFile2 div").html(msg);
$("#table").html($("#emptyFile").html());
return "";
},
//加载动画
loadingTemplate: function () {
return "<span class=\"loading-wrap\">\n <img src=\"//static.skpan.cn/user/img/loading.gif\"/>\n</span>";
},
//加载失败
onLoadError: function () {
// showTips("数据加载失败!");
},
//加载完成
onLoadSuccess: function (data) {
$(".fixed-table-loading").remove();
daohang(data.parent,data.total,sousuo); //修改导航
HoverGengduo(); //鼠标悬浮显示更多按钮
clickList(); //初始化右键菜单
},
//自定义css
rowStyle: function (row, index) {
var style = {};
style = {
css: {
'font-size': '13px'
}
};
return style;
},
//复选框点击事件
onCheckAll:function(rows){
CilckCheck(); //复选框选中 更新菜单栏
},
onCheck:function(row){
CilckCheck(); //复选框选中 更新菜单栏
},
onUncheck:function(row){
CilckCheck(); //复选框选中 更新菜单栏
},
onUncheckAll: function (row) {
CilckCheck(); //复选框选中 更新菜单栏
},
//表头
columns: [{
checkbox: true,
visible: true //是否显示复选框
},
{
field: 'file_name',
title: '文件名',
sortable: true, //排序
width:'500px',
formatter: function (value, row, index) { //处理数据
return value;
},
}, {
field: 'file_size',
title: '文件大小',
sortable: true, //排序
}, {
field: 'count_open',
title: '阅览',
sortable: true, //排序
}, {
field: 'count_down',
title: '下载',
sortable: true, //排序
}, {
field: 'url',
title: '分享链接',
}, {
field: 'update_time',
title: '删除日期',
sortable: true, //排序
},
],
//填入个数据,要不然会显示没文件
data: [{
"file_name": "",
}],
})
}
getTable();
</script>
</div>
</div>
{/block}
+122
View File
@@ -0,0 +1,122 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script src="__STATIC__/js/jquery.js"></script>
<script src="__STATIC__/js/highcharts.js"></script>
<link href="__STATIC__/css/bootstrap.min.css" rel="stylesheet">
<link href="__STATIC__/css/bootstrap-table.min.css" rel="stylesheet">
<link href="__STATIC__/css/bootstrap-table-fixed-columns.css" rel="stylesheet">
</head>
<body>
<div class="wrap">
<div class="panel-body" id="container" style="width: 95%; height: 400px; margin: 0 auto">
</div>
<table class="table table-hover table-bordered margin-top-10">
<thead>
<tr>
<th>浏览</th>
<th>下载</th>
<th>总订单</th>
<th>成功订单</th>
<th>注册</th>
<th>金额</th>
<th>分成</th>
<th>日期</th>
<th>星期</th>
<th>几天前</th>
</tr>
</thead>
<tbody>
{volist name="profit" id="vo"}
<tr>
<td><span class="label label-success">{$vo.count_view}</span></td>
<td><span class="label label-success">{$vo.count_down}</span></td>
<td><span class="label label-success">{$vo.count_order}</span></td>
<td><span class="label label-success">{$vo.count_order_yes}</span></td>
<td><span class="label label-success">{$vo.count_reg}</span></td>
<td><span class="label label-success">{$vo.count_money}</span></td>
<td><span class="label label-success">{$vo.count_profit}</span></td>
<td>{$vo.create_time|date="Y-m-d"}</td>
<td>{:getWeekDay($vo.create_time)}</td>
<td>{:getTimeLastDay($vo.create_time)}天前</td>
</tr>
{/volist}
</tbody>
</table>
</div>
</body>
<script>
$(function () {
$('#container').highcharts({
title: {
text: '',
x: -20 //center
},
plotOptions: {
line: {
lineWidth: 3
},
tooltip: {
hideDelay: 200
}
},
subtitle: {
text: '',
x: -20
},
xAxis: {
categories: [
{$time_type|raw}
]
},
yAxis: {
title: {
text: ''
},
plotLines: [{
value: 0,
width: 1
}]
},
tooltip: {
valueSuffix: ' 个',
crosshairs: true,
shared: true
},
legend: {
layout: 'vertical',
align: 'right',
verticalAlign: 'middle',
borderWidth: 0
},
series: [
{
name: '注册',
color: 'rgba(0,242,59,246)', marker: { radius: 6 }, data: [
{$series_reg|raw}
]
},
{
name: '成功订单',
color: 'rgba(0,15,182,59)', marker: { radius: 6 }, data: [
{$series_order|raw}
]
},
{
name: '金额',
color: 'rgba(0,92,219,192)', marker: { radius: 6 }, data: [
{$series_money|raw}
]
},
]
});
});
</script>
</html>
+153
View File
@@ -0,0 +1,153 @@
{extend name="layout/user" /}
{block name="main"}
<link href="__STATIC__/font-awesome/css/font-awesome.min.css?page=index" rel="stylesheet" type="text/css">
<link href="__STATIC__/css/bootstrap-datetimepicker.min.css" rel="stylesheet" type="text/css">
<script src="__STATIC__/js/bootstrap-datetimepicker.js"></script>
<style>
@media (max-width:890px) {
.tabbable tbody tr td:nth-child(2){
display: inline-block;
width: 34px;
overflow: hidden;
height: 86px;
}
}
</style>
<div class="all-box">
<div class="wrap js-check-wrap">
<ul class="nav nav-tabs">
<li {eq name="url_path" value="share/index"}class="active"{/eq}><a href="{:url('share/index')}">今日收益</a></li>
<li {eq name="url_path" value="share/record"}class="active"{/eq}><a href="{:url('share/record')}">财务记录</a></li>
<li {eq name="url_path" value="share/withdraw"}class="active"{/eq}><a href="{:url('share/withdraw')}">提现记录</a></li>
</ul>
<fieldset>
<div class="tabbable">
<div class="tab-content">
<div class="tab-pane active">
<form class="well form-inline margin-top-20" method="get" action="{:url('share/index')}">
时间:
<input type="text" class="form-control input-group date form_date" data-date=""
data-date-format="" data-link-field="dtp_input2" data-link-format="yyyy-mm-dd"
name="time" value="{$time}" style="width: 140px;" autocomplete="off">
<input type="submit" class="btn btn-primary" value="搜索">&nbsp;
<a onclick="shiming()"
style="color: #333;text-decoration: none;">实名认证</a>&nbsp;&nbsp;|&nbsp;
<a onclick="tixianadd()" style="color: #333;text-decoration: none;">申请提现</a>
</form>
<table class="table table-hover table-bordered">
<thead>
<tr>
<th>ID</th>
<th>所属文件</th>
<th>浏览</th>
<th>下载</th>
<th>注册</th>
<th>总订单</th>
<th>成功订单</th>
<th>金额</th>
<th>收益</th>
<th class="hidden-xs">更新时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{volist name="list" id="vo"}
<tr>
<td>{$vo.id}</td>
<td>{:getFileName($vo.file_id)}</td>
<td>{$vo.count_view}</td>
<td>{$vo.count_down}</td>
<td>{$vo.count_reg}</td>
<td>{$vo.count_order}</td>
<td>{$vo.count_order_yes}</td>
<td>{$vo.count_money}</td>
<td >{$vo.count_profit}</td>
<td class="hidden-xs">{$vo.create_time|date="Y-m-d H:i"}</td>
<td>
<a href="#" onclick="zoushitu('{$vo.file_id} ({:getFileName($vo.file_id)})','{$vo.file_id}')">走势图</a>
</td>
</tr>
{/volist}
</tbody>
</table>
<div class="pag">
{$list|raw}
</div>
</div>
</div>
</div>
</fieldset>
</div>
</div>
<script type="text/javascript">
$('.form_date').datetimepicker({
language: 'zh-CN',
weekStart: 1,
todayBtn: 1,
autoclose: 1,
todayHighlight: 1,
startView: 2,
minView: 2,
forceParse: 0
});
function zoushitu(name = "", post_id = "") {
layer.open({
type: 2,
title: '30天走势图 ' + name,
area: ['98%', '90%'],
shadeClose: true,
fixed: true, //不固定
content: '/share/echarts?id=' + post_id,
});
}
</script>
<script>
function tixianadd() {
if (window.screen.width < 768) {
var w = '95%';
}
else {
var w = '450px';
}
layer.open({
type: 2,
shadeClose: true,
title: "申请提现",
area: [w, '380px'], // 宽高
content: "/user/withdraw",
end: function () {
//location.reload();
},
});
}
function shiming() {
if (window.screen.width < 768) {
var w = '95%';
}
else {
var w = '480px';
}
layer.open({
type: 2,
shadeClose: true,
title: "实名认证",
area: [w, '300px'], // 宽高
content: "/user/auth",
end: function () {
//location.reload();
},
});
}
</script>
{/block}
+69
View File
@@ -0,0 +1,69 @@
{extend name="layout/user" /}
{block name="main"}
<link href="__STATIC__/font-awesome/css/font-awesome.min.css?page=index" rel="stylesheet" type="text/css">
<link href="__STATIC__/css/bootstrap-datetimepicker.min.css" rel="stylesheet" type="text/css">
<script src="__STATIC__/js/bootstrap-datetimepicker.js"></script>
<div class="all-box">
<div class="wrap js-check-wrap">
<ul class="nav nav-tabs">
<li {eq name="url_path" value="share/index"}class="active"{/eq}><a href="{:url('share/index')}">今日收益</a></li>
<li {eq name="url_path" value="share/record"}class="active"{/eq}><a href="{:url('share/record')}">财务记录</a></li>
<li {eq name="url_path" value="share/withdraw"}class="active"{/eq}><a href="{:url('share/withdraw')}">提现记录</a></li>
</ul>
<fieldset>
<div class="tabbable">
<div class="tab-content">
<div class="tab-pane active">
<form class="well form-inline margin-top-20">
累计收益:0 </form>
<table class="table table-hover table-bordered">
<thead>
<tr>
<th>ID</th>
<th>原因</th>
<th>来源</th>
<th>变更金额</th>
<th>变更前</th>
<th>变更后</th>
<th>时间</th>
</tr>
</thead>
<tbody>
{volist name="list" id="vo"}
<tr>
<td>{$vo.id}</td>
<td>{$vo.remark}</td>
<td>{$vo.source}</td>
<td>
{eq name="$vo.type" value="0"}
<b style="color: #47a21a;font-weight: bold"> + {$vo.money}</b>
{else/}
<b style="color: #f70606;font-weight: bold"> - {$vo.money}</b>
{/eq}
</td>
<td>{$vo.before_money}</td>
<td>{$vo.after_money}</td>
<td>{$vo.create_time|date="Y-m-d H:i"}</td>
</tr>
{/volist}
</tbody>
</table>
<div class="pag">
{$list|raw}
</div>
</div>
</div>
</div>
</fieldset>
</div>
</div>
{/block}
+121
View File
@@ -0,0 +1,121 @@
{extend name="layout/user" /}
{block name="main"}
<link href="__STATIC__/font-awesome/css/font-awesome.min.css?page=index" rel="stylesheet" type="text/css">
<link href="__STATIC__/css/bootstrap-datetimepicker.min.css" rel="stylesheet" type="text/css">
<script src="__STATIC__/js/bootstrap-datetimepicker.js"></script>
<style>
@media (max-width:890px) {
.tabbable tbody tr td:nth-child(3){
display: inline-block;
width: 88px;
overflow: hidden;
height: 86px;
}
}
</style>
<div class="all-box">
<div class="wrap js-check-wrap">
<ul class="nav nav-tabs">
<li {eq name="url_path" value="share/index"}class="active"{/eq}><a href="{:url('share/index')}">今日收益</a></li>
<li {eq name="url_path" value="share/record"}class="active"{/eq}><a href="{:url('share/record')}">财务记录</a></li>
<li {eq name="url_path" value="share/withdraw"}class="active"{/eq}><a href="{:url('share/withdraw')}">提现记录</a></li>
</ul>
<fieldset>
<div class="tabbable">
<div class="tab-content">
<div class="tab-pane active">
<form class="well form-inline margin-top-20">
<a onclick="tixianadd()" style="color: #333;"><b>账户余额:{$amount}</b></a>
&nbsp;|&nbsp;&nbsp;累计提现:{$money} 元
&nbsp;|&nbsp;&nbsp;<a onclick="shiming()"
style="color: #333;text-decoration: none;">实名认证</a>
&nbsp;|&nbsp;&nbsp;<a onclick="tixianadd()"
style="color: #333;text-decoration: none;">申请提现</a>
</form>
<table class="table table-hover table-bordered">
<thead>
<tr>
<th>ID</th>
<th>提现金额</th>
<th>支付宝账号</th>
<th>支付宝姓名</th>
<th>状态</th>
<th>提现时间</th>
</tr>
</thead>
<tbody>
{volist name="list" id="vo"}
<tr>
<td>{$vo.id}</td>
<td>{$vo.money} ¥</td>
<td>{$vo.alipay_account}</td>
<td>{$vo.alipay_name}</td>
<td>
{eq name="$vo.status" value="0"}<span class="label label-info">等待处理</span>{/eq}
{eq name="$vo.status" value="1"}<span class="label label-success">提现成功</span>{/eq}
{eq name="$vo.status" value="2"}<span class="label label-danger">资金退回</span>{/eq}
</td>
<td>{$vo.create_time|date="Y-m-d H:i"}</td>
</tr>
{/volist}
</tbody>
</table>
<div class="pg">
{$list|raw}
</div>
</div>
</div>
</div>
</fieldset>
</div>
</div>
<script>
function tixianadd() {
if (window.screen.width < 768) {
var w = '95%';
}
else {
var w = '450px';
}
layer.open({
type: 2,
shadeClose: true,
title: "申请提现",
area: [w, '380px'], // 宽高
content: "/user/withdraw",
end: function () {
//location.reload();
},
});
}
function shiming() {
if (window.screen.width < 768) {
var w = '95%';
}
else {
var w = '480px';
}
layer.open({
type: 2,
shadeClose: true,
title: "实名认证",
area: [w, '300px'], // 宽高
content: "/user/auth",
end: function () {
//location.reload();
},
});
}
</script>
{/block}
+473
View File
@@ -0,0 +1,473 @@
<html>
<head>
<link href="__STATIC__/css/upload.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="__STATIC__/js/jquery.js"></script>
<script type="text/javascript" src="__STATIC__/js/file.js"></script>
<script src="https://cdn.jsdelivr.net/npm/js-base64@3.7.0/base64.min.js"></script>
<script type="text/javascript" src="__STATIC__/js/webuploader2.js"></script>
</head>
<body style="overflow:hidden;">
<div class="f_upb" style="top: 1px;">
<div class="f_upp">
<div id="uploader" class="wu-example">
<div class="statusBar" style="display:none;">
<div class="btns">
<div class="fileho">添加文件</div>
<div id="filePicker2" class="webuploader-container">
<div class="webuploader-pick">继续添加</div>
<div id="rt_rt_1es7kh60f1bfi12481v241lk814026"
style="position: absolute; top: 0px; left: 0px; width: 1px; height: 1px; overflow: hidden;">
<input type="file" name="file" class="webuploader-element-invisible" multiple="multiple"
accept=""><label
style="opacity: 0; width: 100%; height: 100%; display: block; cursor: pointer; background: rgb(255, 255, 255);"></label>
</div>
</div>
<div class="uploadBtn state-pedding">开始上传</div>
</div>
</div>
<div class="queueList">
<div id="dndArea" class="placeholder">
<div id="filePicker" class="webuploader-container">
<div class="webuploader-pick">点击选择文件</div>
<div id="rt_rt_1es7kh60dsi0109el3h10nf1d961" style="position: absolute; top: 0px; left: 0px; width: 118px; height: 38px; overflow: hidden; bottom: auto; right: auto;">
<input type="file" name="file" class="webuploader-element-invisible" multiple="multiple" accept="">
<label style="opacity: 0; width: 100%; height: 100%; display: block; cursor: pointer; background: rgb(255, 255, 255);"></label>
</div>
</div>
<p class="filep">或将文件拖到这里,单次最多可选{$upload_limit}个</p>
<p class="filep" style="color:red">凡是上传违反国家法律文件,一律封号处理!!!</p>
</div>
<ul class="filelist"></ul>
</div>
<div class="info"></div>
</div>
</div>
</div>
<script>
var isssl = 's';
var folder_id = '0';
try {
folder_id = $("#folder_id", window.parent.document).val(); //取父页面文件夹ID
}
catch (err) {
}
var upsizeb = {$upload_rule.upsize_byte};
var upsize = '{$upload_rule.upsize}';
var fsizeall = {$upload_rule.fsize_byte};
var fsizeallb = '{$upload_rule.fsize}';
var pgs = 1;
//上传类型1=头像,2=文件图标
var getque = '2';
var uploadError = "未知";
uppp();
function uppp() {
var $ = jQuery,
$wrap = $('#uploader'),
$queue = $('<ul class="filelist"></ul>').appendTo($wrap.find('.queueList')),
// 状态栏,包括进度和控制按钮
$statusBar = $wrap.find('.statusBar'),
// 文件总体选择信息。
$info = $wrap.find('.info'),
// 上传按钮
$upload = $wrap.find('.uploadBtn'),
// 没选择文件之前的内容。
$placeHolder = $wrap.find('.placeholder'),
$fileho = $wrap.find('.fileho'),
// 添加的文件数量
fileCount = 0,
// 添加的文件总大小
fileSize = 0,
// 优化retina, 在retina下这个值是2
ratio = window.devicePixelRatio || 1,
// 可能有pedding, ready, uploading, confirm, done.
state = 'pedding',
percentages = {},
uploader;
if (!WebUploader.Uploader.support()) {
alert('不支持您的浏览器!请使用360(极速模式),QQ等支持HTML5的浏览器');
throw new Error('WebUploader does not support the browser you are using.');
}
// 实例化
uploader = WebUploader.create({
pick: {
id: '#filePicker',
label: '点击选择文件'
},
dnd: '#uploader .queueList',
paste: document.body,
runtimeOrder: 'html5',
disableGlobalDnd: true,
chunked: true, //开启分片上传
chunkSize: 2 * 1024 * 1024,
duplicate: false,
server: "{$upload_api|raw}",
fileVal: 'file',
formData: { //自定义参数
'folder_id': folder_id,
},
accept: {
//指定文件后缀名
title: '文件上传', //文字描述
extensions: "*",//允许的文件后缀,不带点,多个用逗号分割
},
threads: 1, //并发
fileNumLimit: {$upload_limit}, //数量限制
fileSizeLimit: fsizeall, //1024 M
fileSingleSizeLimit: upsizeb, //400 M
});
// 添加“添加文件”的按钮,
uploader.addButton({
id: '#filePicker2',
label: '继续添加'
});
// 当有文件添加进来时执行
function addFile(file) {
var $li = $('<li id="' + file.id + '">' +
'<p class="progress"><span></span></p>' +
'<p class="title"><img src="//static.skpan.cn/user/file/' + getIcon(file.ext) +
'.png" class="f_img" align="absmiddle">' + file.name + '</p>' +
'<p class="fsize">' + WebUploader.formatSize(file.size) + '</p>' +
'<div class="fdecs2"><span class="finfo"></span><span class="fload"></span></div>' +
'</li>'),
$btns = $('<div class="fdecs">' +
'<span class="cancel">删除</span></div>').appendTo($li),
$prgress = $li.find('p.progress span'),
$prgresss = $li.find('span.fload'),
$finfo = $li.find('span.finfo'),
//$info = $('<div class="fdecs2"></div>'),
showError = function (code) {
//上传失败
$btns.css('display', 'block');
$finfo.text('上传失败');
$prgress.css({
'background-color': '#FFF8F0',
'border': '1px solid #F3DCD1',
'border-left': '0',
'width': '100%'
});
};
if (file.getStatus() === 'invalid') {
showError(file.statusText);
} else {
percentages[file.id] = [file.size, 0];
file.rotation = 0;
}
file.on('statuschange', function (cur, prev) {
if (prev === 'progress') {
//上传后标记
$prgress.show().width(0 + '%');
$prgresss.hide();
} else if (prev === 'queued') {
$li.off('mouseenter mouseleave');
$btns.hide();
}
// 成功
if (cur === 'error' || cur === 'invalid') {
console.log(file.statusText);
showError(file.statusText);
percentages[file.id][1] = 1;
} else if (cur === 'interrupt') {
showError('interrupt');
} else if (cur === 'queued') {
percentages[file.id][1] = 0;
} else if (cur === 'progress') {
//$info.hide();
$prgress.css('display', 'block');
} else if (cur === 'complete') {
$li.append('<span class="success"></span>');
//上传成功,清除此条记录
uploader.removeFile(file);
}
$li.removeClass('state-' + prev).addClass('state-' + cur);
});
$btns.on('click', function () {
uploader.removeFile(file);
return;
});
$li.appendTo($queue);
}
// 负责view的销毁
function removeFile(file) {
var $li = $('#' + file.id);
delete percentages[file.id];
updateStatus();
$li.off().find('.file-panel').off().end().remove();
}
function updateStatus() {
var text = '',
stats;
if (state === 'ready') { } else if (state === 'confirm') {
stats = uploader.getStats();
if (stats.uploadFailNum) {
text = '成功' + stats.successNum + '个,失败' +
stats.uploadFailNum + '个(' + uploadError + ')<font class="retry">重新上传</font> 或 <font class="ignore">忽略</font> '
}
} else if (state === 'finish') {
stats = uploader.getStats();
text = '已上传' + stats.successNum + '个,(' + WebUploader.formatSize(fileSize) + ')';
}
$info.html(text);
}
function setState(val) {
var file, stats;
if (val === state) {
return;
}
$upload.removeClass('state-' + state);
$upload.addClass('state-' + val);
state = val;
switch (state) {
case 'pedding':
$placeHolder.removeClass('element-invisible');
$queue.parent().removeClass('filled');
$queue.hide();
$statusBar.addClass('element-invisible');
uploader.refresh();
$upload.text('开始上传').removeClass('disabled');
$fileho.css('display', 'none');
break;
case 'ready':
$placeHolder.addClass('element-invisible');
$('#filePicker2').removeClass('element-invisible');
$queue.parent().addClass('filled');
$queue.show();
$statusBar.removeClass('element-invisible');
uploader.refresh();
break;
case 'uploading':
$('#filePicker2').addClass('element-invisible');
$fileho.css('display', 'inline-block');
$upload.text('正上传中').addClass('disabled');
break;
case 'confirm':
// 上传结束;
stats = uploader.getStats();
if (stats.successNum && !stats.uploadFailNum) {
//全部成功,标记
setState('finish');
return;
} else {
//部分成功
$('#filePicker2').removeClass('element-invisible');
$upload.text('开始上传').removeClass('disabled');
$fileho.css('display', 'none');
uploader.refresh();
}
break;
case 'finish':
//全部成功上传
stats = uploader.getStats();
if (stats.successNum) {
//复位
setState('pedding');
f_upc();
return;
}
break;
}
updateStatus();
}
//进度条
uploader.onUploadProgress = function (file, percentage) {
var $li = $('#' + file.id),
$percent = $li.find('.progress span');
$percents = $li.find('span.fload');
$percent.css('width', percentage * 100 + '%');
var percentagez = parseInt(percentage * 100);
$percents.text(percentagez + '%');
percentages[file.id][1] = percentage;
//updateTotalProgress();
updateStatus();
};
uploader.onFileQueued = function (file) {
fileCount++;
fileSize += file.size;
if (fileCount === 1) {
$placeHolder.addClass('element-invisible');
$statusBar.show();
}
addFile(file);
setState('ready');
updateStatus();
};
uploader.onFileDequeued = function (file) {
fileCount--;
fileSize -= file.size;
if (!fileCount) {
setState('pedding');
}
removeFile(file);
updateStatus();
};
uploader.on('all', function (type) {
var stats;
switch (type) {
case 'uploadFinished':
//所有文件上传完触发
setState('confirm');
break;
case 'startUpload':
setState('uploading');
break;
case 'stopUpload':
setState('paused');
break;
}
});
uploader.on('uploadStart',function(file){
uploader.option('formData',{
chunks_key:Base64.encode(file.__hash)
})
});
//前端判断
uploader.onError = function (code) {
if (code == 'Q_TYPE_DENIED') {
$info.html('未开放此格式的文件');
} else if (code == 'Q_EXCEED_NUM_LIMIT') {
$info.html('超过单次个数限制,请上传完在添加上传');
} else if (code == 'Q_EXCEED_SIZE_LIMIT') {
{eq name="$vip_info.is_vip" value="1"}
$info.html('尊敬的{$group.group_name}您好,单次总和大小超过了' + fsizeallb);
{else/}
$info.html('允许上传小于' + upsize +
'的文件,<a onclick="window.parent.vip()" href="#"><font>升级VIP 提升容量</font></a>');
{/eq}
} else if (code == 'F_DUPLICATE') {
$info.html('已经上传过或者已选择,忽重复');
} else if (code == 'F_EXCEED_SIZE') {
{eq name="$vip_info.is_vip" value="1"}
$info.html('尊敬的{$group.group_name}您好,允许上传小于' + upsize + '的文件');
{else/}
$info.html('允许上传小于' + upsize +
'的文件,<a onclick="window.parent.vip()" href="#"><font>升级VIP 提升容量</font></a>');
{/eq}
} else {
alert('Eroor: ' + code);
}
};
//上传后获取json
uploader.on('uploadAccept', function (file, response, reject) {
if (response.status == 0) {
console.log(response);
uploadError = response.msg;
return false;
}
else {
if(response.code == 0){
uploadError = response.msg;
return false;
}
}
});
$upload.on('click', function () {
if ($(this).hasClass('disabled')) {
return false;
}
if (state === 'ready') {
uploader.upload();
}
});
$info.on('click', '.retry', function () {
uploader.retry();
});
$info.on('click', '.ignore', function () {
//重置队列
setState('pedding');
return;
});
$upload.addClass('state-' + state);
updateStatus();
};
//关闭窗口
function f_upc() {
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
</script>
</body>
</html>
+85
View File
@@ -0,0 +1,85 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="__STATIC__/tixian/layui.js"></script>
<script src="__STATIC__/js/jquery.js"></script>
<script src="__STATIC__/pay/js/ui-choose.js" type="text/javascript"></script>
<script src="__STATIC__/pay/js/qrcode.min.js" type="text/javascript"></script>
<link rel='stylesheet' href='__STATIC__/tixian/layui.css' type='text/css' media='all' />
</head>
<body style="margin:20px;">
<article class="page-container">
<form class="layui-form layui-form-pane" id="renzheng">
<div class="layui-form-item">
<label class="layui-form-label">实名状态:</label>
<div class="layui-input-inline">
<input type="text" lay-verify="required" value="{eq name="$is_auth" value="1"}已实名{else/}未实名{/eq}" class="layui-input" disabled>
</div>
</div>
{eq name="$is_auth" value="1"}
<div class="layui-form-item">
<label class="layui-form-label">姓名:</label>
<div class="layui-input-inline">
<div class="layui-form-mid">{:getSafeNickname($info.name)}</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">身份证:</label>
<div class="layui-input-inline">
<div class="layui-form-mid">{:getSafeNickname($info.idcard)}</div>
</div>
</div>
{else/}
<div class="layui-form-item">
<label class="layui-form-label">姓名:</label>
<div class="layui-input-inline">
<input type="text" name="name" id="xingming" value="" placeholder="请输入姓名" class="layui-input" lay-verify="required" lay-vertype="tips">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">身份证:</label>
<div class="layui-input-inline">
<input type="text" name="idcard" id="shenfenzheng" value="" placeholder="请输入身份证号码" class="layui-input" lay-verify="required" lay-vertype="tips">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button type="button" class="layui-btn" lay-submit="" lay-filter="smsubmit">提交认证</button>
</div>
</div>
{/eq}
<hr>
</form>
</article>
<script>
layui.use(['form', 'layer','upload'], function () {
var form = layui.form, layer = layui.layer,$= layui.jquery,upload = layui.upload;
form.on('submit(smsubmit)', function (data) {
loading =layer.load(1, {shade: [0.1,'#fff']});
$.post("", data.field, function (res) {
layer.close(loading);
if (res.code > 0) {
layer.msg(res.msg, {time: 1500, icon: 1}, function () {
var index = parent.layer.getFrameIndex(window.name);
window.parent.location.reload();
parent.layer.close(index);
});
} else {
layer.msg(res.msg, {time: 1500, icon: 2});
}
});
});
});
</script>
</body>
</html>
+23
View File
@@ -0,0 +1,23 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0" />
<title>{$msg}</title>
</head>
<body>
<style>
body{margin: 20px;}
.off{text-align: center;font-size: 16px;color: #b3b3b3;}
.off0{background: #eee;width: 70px;height: 60px;margin: 10% auto 30px auto;border-radius: 3px;padding-top: 10px;}
.off1{border-top: 30px solid #b1b1b1;width: 10px;height: 10px;border-bottom: 10px solid #b1b1b1;margin: auto;}
</style>
<div class="off">
<div class="off0">
<div class="off1"></div>
</div>
{$msg}
</div>
</body>
</html>
+126
View File
@@ -0,0 +1,126 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0">
<title>找回密码 - {$Think.config.basic.site_title}</title>
<link href="__STATIC__/css/login.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="__STATIC__/js/jquery.js"></script>
<script src="__STATIC__/js/common.js"></script>
<script src="__STATIC__/js/layer.js"></script>
</head>
<body>
<div class="top">
<div class="d1">
<div class="d11" style="background-image: url({$Think.config.basic.site_logo});height: 18px; background-repeat: no-repeat; background-position: 15px 5px;">
<a href="{:url('index/index')}" class="d7">会分享有收获</a>
</div>
</div>
</div>
<div class="pc"></div>
<span class="bg"></span>
<div class="p9">
<div class="p5"> </div>
<div class="p6">为用户而变革,越简单越好,越快越好 </div>
<div class="p4">会分享,就会有收获!</div>
<div class="p1" style="margin-top: 15px;box-shadow: none;">
<!-- 注册账号 -->
<div id="reg">
<span class="main-title">找回密码</span>
<form onkeydown="if(event.keyCode==13){doReg();return false;}">
<br>
<div class="p3 pmob2">
<input class="input" id="reg_email" type="email" value="" tabindex="3" maxlength="64" placeholder="安全邮箱">
</div>
<div class="p3">
<div class="errorBox">请安全邮箱</div>
</div>
<div class="p3"></div>
</form>
<div class="p3">
<input onclick="doForget()" class="btn" type="submit" tabindex="4" value="找回密码">
</div>
<div class="p3" style="text-align:left;">
<a href="{:url('user/login')}">已经找回?点我登录</a>
</div>
</div>
<div class="p3" id="send_succ" style="display: none">
<h3 style="text-align: center;font-size: 20px;color: #2196f3;">找回密码邮件发送成功<br>请登录邮箱查看</h3>
<p style="text-align: center;font-size: 14px;color:#afafaf;">如果没收到邮件请查看回收站</p>
</div>
</div>
<script>
//提交注册
function doForget()
{
var email = $("#reg_email").val();
var msg = '';
if(!email){
$('#reg_email').focus();
msg = "请输入绑定的安全邮箱";
}
if(msg != ''){
return error(msg);
}
//提交注册
$.ajax({
type: "post",
url : "{:url('user/forget')}",
data: {
"email":email
},
dataType:'json',
success: function(data){
if (data.code == 1) {
ok(data.msg);
} else {
error(data.msg);
}
},
error: function (error) {
layer.alert("API请求失败,请联系客服",{icon:2});
}
});
}
//成功
function ok(msg)
{
$("#reg").hide();
$("#send_succ").show();
}
//失败
function error(msg)
{
$(".errorBox").html(msg);
$(".errorBox").show();
}
</script>
</div>
<div class="copyright">不得利用云存储发布,存储,传播违法信息</div>
<div class="foot_info"> © 2021 {$Think.config.basic.site_title} </div>
</body>
</html>
+334
View File
@@ -0,0 +1,334 @@
{extend name="layout/user" /}
{block name="main"}
<div class="all-box">
<div class="top space-between">
<div class="top-left align-center">
<!--[if lte IE 9]><div style="color: #FFFFFF;width: 770px;text-align: center;background: #FF4949;margin: auto;">升级提示:当您看到此信息,说明您的浏览器不支持上传接口,请使用360(极速模式),QQ(新版),Chrome等新一代浏览器。</div><![endif]-->
<div class="top-item flex-box upload" onclick="upload()">
<em class="icon icon-upload"></em>
<p class="text">上传</p>
</div>
<div class="top-item flex-box" onclick="mkdir()">
<em class="icon icon-newfolder" title="新建"></em>
<p class="text">新建</p>
</div>
<div id="CilckCheck" style="display: none;" class="align-center">
<div id="CheckTmp" style="display: none;"></div>
<div class="top-item flex-box" onclick="CheckDelete()"
style="margin-right: 0px;padding: 0 8px 0 8px;border-radius: 0px;">
<em class="icon icon-delete" title="删除"></em>
<p class="text">删除</p>
</div>
<div class="top-item flex-box" onclick="moveFiles()"
style="padding: 0 8px 0 8px;border-radius: 0px;">
<p class="text" style="margin-left: 0px;">移动到</p>
</div>
</div>
</div>
<div class="top-right space-between">
<div class="el-input">
<input id="sousuo" type="text" autocomplete="off" placeholder="搜索您的文件"
class="el-input__inner">
<span class="icon icon-search"
onclick="getTable('当前文件夹',$('#sousuo').val())"></span>
</div>
</div>
</div>
<div class="daohang">
<span class="daohang-all" style="display: block;">
<span onclick="getTable()" style="cursor:pointer;">全部文件</span>
<span style="float:right;top: 1px;">
<span style="color: #f0ad4e;font-size: 12px;margin-right: 5px;"
title="鼠标右键文件去试试~">
<span class="icon icon-tips-caution"></span>
文件操作可使用右键
</span>
<span>已全部加载,共<span class="daohang-count">0</span></span>
</span>
</span>
<ul class="daohang-path" style="display: none;">
<li>
<a id="daohang-shangyiji" onclick="getTable()" href="javascript:;">返回上一级</a>
<span class="fuhao">|</span>
</li>
<li>
<a href="javascript:;" onclick="getTable()">全部文件</a>
<span class="fuhao">&gt;</span>
<span id="daohang">
</span>
</li>
<span style="float:right;">已全部加载,共<span class="daohang-count">0</span></span>
</ul>
</div>
<input style="display: none;" id="folder_id" value="0" />
<div id="emptyFile" style="display: none;">
<div class="emptyFile" style="visibility: visible;">
<div class="emptyFile2">
<div class="img">
</div>
</div>
</div>
</div>
<div class="context-menu">
<ul class="list" data-id="" data-filename="" data-folder="" id="list1"
style="z-index: 100; left: 524px; top: 194px; display: none;">
<li>下载</li>
<li class="separate"></li>
<li>设置提取码</li>
<li>复制链接</li>
<li class="separate"></li>
<li>编辑文件</li>
<li>移动到</li>
<li class="separate"></li>
<li>重命名</li>
<li>删除</li>
</ul>
<ul class="list" id="list2"
style="z-index: 100; left: 524px; top: 194px; display: none;">
<li>重新加载页面</li>
<li class="separate"></li>
<li>新建文件夹</li>
<li class="separate"></li>
<li>刷新数据</li>
</ul>
</div>
<div id="mkdir" style="display: none;">
<div style='width:350px;'>
<div style='width:320px;margin-left: 3%;margin-top: 3%;'
class='form-group has-feedback'>
<span style="color: red;">*</span>文件夹名称
<input style="margin-top: 3%;" id='dirName' class='form-control' type='text'
placeholder="请输入文件夹名称..." value="" />
</div>
<div style='width:320px;margin-left: 3%;' class='form-group has-feedback'>
<p>文件夹描述</p>
<textarea style="margin-top: 3%;" id='dirMiaoshu' class='form-control' rows="3"
placeholder="(可选) 请输入文件夹描述..."></textarea>
</div>
<div style='width:320px;margin-left: 3%;' class='form-group has-feedback'>
<button style='margin-top:5%;' type='button' class='btn btn-block btn-success'
onclick='mkdirTo()'>保存</button>
</div>
</div>
</div>
<div id="setPass" style="display: none;">
<div class="modal-body" style="font-size: 14px;">
<form class="form-horizontal" role="form">
<fieldset>
<div class="form-group" style="margin-left: -3%;">
<label class="col-sm-7" style="font-size: 12px;"
style="margin-left: -2%;">Ps: 双击编辑框自动复制</label>
<textarea class="form-control" id="setPassUrl"
style="width: 300px;font-size: 13px;margin-top: 15px;margin-left: 2%;"
readonly="readonly"></textarea>
</div>
<div class="form-group">
<label class="col-sm-1 control-label"
style="margin-left: -1%;width: 88px;">提取码:</label>
<div class="col-sm-1" style="margin-left: -9%;">
<input class="form-control" id="setPassPass" type="text"
style="width: 80px;" maxlength="6" />
</div>
<label class="col-sm-1 control-label"
style="margin-left: 18%;width: 90px;">密码开关</label>
<div class="col-sm-3" style="margin-left: -18px;">
<label class="switch">
<input type="checkbox" id="setPassClick">
<div class="slider round"></div>
</label>
</div>
</div>
<div style='width:300px;margin-left: -1%;margin-top: 10%;'
class='form-group has-feedback'>
<button type='button' class='btn btn-block btn-success'
id="setPassBtn">保存</button>
</div>
</fieldset>
</form>
</div>
</div>
<div class="table-box">
<table id="table"></table>
<script src="__STATIC__/js/file.js"></script>
<script>
//table自适应
$(window).resize(function () {
$("#table").bootstrapTable('resetView', {
height: $(window).height() - 171
});
});
//搜索回车
$("#sousuo").keydown(function (e) {
if (e.keyCode == 13) {
getTable('当前文件夹', $(this).val());
}
});
function getTable(folder_id, sousuo) {
var folder_id = folder_id || 0;
var sousuo = sousuo || "";
if (folder_id == "当前文件夹") {
folder_id = $('#folder_id').val();
}
$("#folder_id").val(folder_id); //更新当前文件夹ID
$('#table').bootstrapTable('destroy'); //销毁数据
var queryUrl = "{:url('file/list')}?rnd=" + Math.random() + "&folder_id=" + folder_id + "&search=" + sousuo;
$("#table").bootstrapTable({
url: queryUrl, //请求后台的URL*
method: 'GET', //请求方式(*
pageNumber: 1, //初始化加载第一页1
pagination: true, //是否显示分页条1
pageSize: 20, //单页显示条数1
striped: true, //是否显示行间隔色
sortable: true, //是否启用排序
sortOrder: "asc", //排序方式
dataField: "data", //Json数据的字段
// clickToSelect: true, //点击选中
height: $(window).height() - 171, //高度
sidePagination: "server", //分页方式:client客户端分页,server服务端分页(*)
classes: "table table-hover",
queryParams : function (params) {
return {
rows: params.limit, //页面大小
page: (params.offset / params.limit) + 1, //页码
};
},
//无内容时
formatNoMatches: function () {
if (sousuo) {
$(".emptyFile2").addClass("emptySousuo");
var msg = '<p title="为什么不去问问神奇的海螺呢">在您的网盘中,未搜索到相应的文件</p>';
} else {
var msg = '<p>您还没上传过文件哦,点击<span style="cursor: pointer;color:#09AAFF;" onclick="upload()">上传</span>按钮~</p>';
}
$(".emptyFile2 div").html(msg);
$("#table").html($("#emptyFile").html());
return "";
},
//加载动画
loadingTemplate: function () {
return "<span class=\"loading-wrap\">\n <img src=\"__STATIC__/image/loading.gif\"/>\n</span>";
},
//加载失败
onLoadError: function () {
// layer.msg("数据加载失败!",{
// icon:2
// })
},
//加载完成
onLoadSuccess: function (data) {
$(".fixed-table-loading").remove();
daohang(data.parent, data.total, sousuo); //修改导航
rename(); //初始化行内编辑框
clickList(); //初始化右键菜单
clickFolder(); //初始化文件夹点击事件
HoverGengduo(); //鼠标悬浮显示更多按钮
},
//自定义css
rowStyle: function (row, index) {
var style = {};
style = {
css: {
'font-size': '13px'
}
};
return style;
},
//复选框点击事件
onCheckAll: function (rows) {
CilckCheck(); //复选框选中 更新菜单栏
},
onCheck: function (row) {
CilckCheck(); //复选框选中 更新菜单栏
},
onUncheck: function (row) {
CilckCheck(); //复选框选中 更新菜单栏
},
onUncheckAll: function (row) {
CilckCheck(); //复选框选中 更新菜单栏
},
//表头
columns: [{
checkbox: true,
visible: true //是否显示复选框
},
{
field: 'file_name',
title: '文件名',
sortable: true, //排序
width: '500px',
formatter: function (value, row, index) { //处理数据
return value;
},
}, {
field: 'file_size',
title: '文件大小',
sortable: true, //排序
}, {
field: 'count_open',
title: '浏览',
sortable: true, //排序
}, {
field: 'count_down',
title: '下载',
sortable: true, //排序
}, {
field: 'url',
title: '分享链接',
}, {
field: 'url_pass',
title: '提取码',
}, {
field: 'update_time',
title: '修改日期',
sortable: true, //排序
},
],
//填入个数据,要不然会显示没文件
data: [{
"file_name": "",
}],
})
}
getTable();
</script>
</div>
</div>
{/block}
+291
View File
@@ -0,0 +1,291 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!-- Set render engine for 360 browser -->
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- HTML5 shim for IE8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<![endif]-->
<link href="__STATIC__/themes/admin_simpleboot3/public/assets/themes/flatadmin/bootstrap.min.css" rel="stylesheet">
<link href="__STATIC__/themes/admin_simpleboot3/public/assets/simpleboot3/css/simplebootadmin.css" rel="stylesheet">
<link href="__STATIC__/static/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css">
<!--[if lt IE 9]>
<script src="https://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<style>
form .input-order {
margin-bottom: 0px;
padding: 0 2px;
width: 42px;
font-size: 12px;
}
form .input-order:focus {
outline: none;
}
.table-actions {
margin-top: 5px;
margin-bottom: 5px;
padding: 0px;
}
.table-list {
margin-bottom: 0px;
}
.form-required {
color: red;
}
</style>
<script type="text/javascript">
//全局变量
var GV = {
ROOT: "/",
WEB_ROOT: "/",
JS_ROOT: "static/js/",
APP: 'admin'/*当前应用名*/
};
</script>
<script src="__STATIC__/themes/admin_simpleboot3/public/assets/js/jquery-1.10.2.min.js"></script>
<script src="__STATIC__/static/js/wind.js"></script>
<script src="__STATIC__/themes/admin_simpleboot3/public/assets/js/bootstrap.min.js"></script>
<link href="__STATIC__/static/js/layer/skin/default/layer.css" rel="stylesheet">
<script src="__STATIC__/static/js/layer/layer.js"></script>
<script src="__STATIC__/js/layui.js"></script>
<script>
Wind.css('artDialog');
$(function () {
$("[data-toggle='tooltip']").tooltip({
container: 'body',
html: true,
});
$("li.dropdown").hover(function () {
$(this).addClass("open");
}, function () {
$(this).removeClass("open");
});
});
</script>
<style>
#think_page_trace_open {
z-index: 9999;
}
.layui-upload-file{
display: none!important;
}
</style>
</head>
<body>
<div class="wrap js-check-wrap">
<ul class="nav nav-tabs">
<li class="active"><a href="#A" data-toggle="tab">个人信息</a></li>
<li><a href="#B" data-toggle="tab">修改密码</a></li>
</ul>
<form class="form-horizontal">
<fieldset>
<div class="tabbable">
<div class="tab-content" style="margin-top: 20px;">
<div class="tab-pane active" id="A">
<div class="form-group">
<label class="col-sm-2 control-label">用户账号</label>
<div class="col-md-6 col-sm-10">
<input type="text" class="form-control" value="{$info.username}" readonly="readonly">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">VIP到期时间</label>
<div class="col-md-6 col-sm-10">
{eq name="$vip_info.is_vip" value="1"}
<a href="javascript:parent.vip()" class="tan" tan="点击开通/续费">VIP到期时间:{$vip_info.expire_time}</a>
{else/}
<a href="javascript:parent.vip()" class="tan" tan="点击开通/续费">未开通</a>
{/eq}
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label"><span class="form-required">*</span>设置昵称</label>
<div class="col-md-6 col-sm-10">
<input required type="text" id="user_nickname" class="form-control" name="nickname"
value="{$info.nickname}" autocomplete="off">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label"><span class="form-required">*</span>个性签名</label>
<div class="col-md-6 col-sm-10">
<input required type="text" id="user_desc" class="form-control" name="desc"
value="{$info.desc}" autocomplete="off">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label"><span class="form-required">*</span>设置头像</label>
<div class="col-md-6 col-sm-10">
<div class="layui-upload">
<div class="prv">
<img id="prv_avatar" src="{:getUserHead($info.avatar)}" style="width: 80px;height: 80px;display: block">
<button type="button" style="width: 80px;" class="btn btn-sm btn-success" id="test1">上传头像</button>
</div>
</div>
</div>
</div>
<br>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="button" id="submit_user" class="btn btn-success">提交修改</button>
</div>
</div>
</div>
<div class="tab-pane" id="B">
<div class="form-group">
<label class="col-sm-2 control-label">原密码</label>
<div class="col-md-6 col-sm-10">
<input required type="password" id="u_old_password" class="form-control" name="old_password"
autocomplete="new-password">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">新密码</label>
<div class="col-md-6 col-sm-10">
<input required type="password" id="u_password" class="form-control" name="password"
autocomplete="new-password">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">重复新密码</label>
<div class="col-md-6 col-sm-10">
<input required type="password" id="u_re_password" class="form-control" name="re_password"
autocomplete="new-password">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="button" id="submit_change" class="btn btn-success">修改密码</button>
</div>
</div>
</div>
</div>
</div>
</fieldset>
</form>
</div>
<script>
layui.use(['upload'],function(){
var upload = layui.upload;
var uploadInst = upload.render({
elem: '#test1'
,url: "{:url('user/upload_avatar')}"
,before: function(obj){
//预读本地文件示例,不支持ie8
obj.preview(function(index, file, result){
$('#prv_avatar').attr('src', result); //图片链接(base64
});
}
});
});
$("#submit_user").on('click',function(){
let nickname = $("#user_nickname").val();
let desc = $("#user_desc").val();
if(!nickname.length){
layer.msg("必须填写昵称~",{icon:2});
return false;
}
$.ajax({
url:"{:url('user/set_userinfo')}",
type:'post',
dataType:'JSON',
data:{
nickname:nickname,
desc:desc
},
success:function(result){
layer.msg(result.msg,{icon: result.code ? 1 : 2 },function(){
if(result.code === 1){
window.location.reload();
}
})
}
})
});
$("#submit_change").on('click',function(){
let old_password = $("#u_old_password").val(),
password = $("#u_password").val(),
re_password = $("#u_re_password").val();
if(!old_password){
layer.msg("请输入原密码",{icon:2});
return false;
}
if(!password){
layer.msg("请输入新密码",{icon:2});
return false;
}
if(!re_password){
layer.msg("请输入重复密码",{icon:2});
return false;
}
if(re_password != password){
layer.msg("两次输入的密码不一致,请重新输入",{icon:2});
return false;
}
$.ajax({
url:"{:url('user/change_pass')}",
type:'post',
dataType:'JSON',
data:{
old_password:old_password,
password:password
},
success:function(result){
layer.msg(result.msg,{icon: result.code ? 1 : 2 },function(){
if(result.code === 1){
parent.location.reload();
}
})
}
})
});
$('.tan').on({
mouseenter: function () {
var nei = $(this).attr("tan");
if (nei) {
var that = $(this);
tips = layer.tips("<span style='color:#000;font-size:17px;'>" + nei + "</span>", that, { tips: [2, '#fff'], time: 0, area: 'auto', maxWidth: 700 });
}
},
mouseleave: function () {
layer.close(tips);
}
});
</script>
</body>
</html>
+366
View File
@@ -0,0 +1,366 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0">
<title>会员登录 - {$Think.config.basic.site_title}</title>
<link href="__STATIC__/css/login.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="__STATIC__/js/jquery.js"></script>
<script src="__STATIC__/js/common.js"></script>
<script src="__STATIC__/js/layer.js"></script>
</head>
<body>
{eq name="layer" value="1"}
<div class="p1" style="margin-top: 5px;box-shadow: none">
<!-- 注册账号 -->
<div id="reg" style="display:none;">
<span class="main-title" style="margin-bottom: 10px;">注册新账号</span>
<form>
<div class="p3 pmob1">
<input class="input" type="text" id="reg_nickname" name="nickname" tabindex="1" maxlength="20" placeholder="昵称 (支持中文)">
</div>
<div class="p3 pmob1">
<input class="input" type="text" id="reg_username" name="username" tabindex="1" maxlength="20" placeholder="登录帐号">
</div>
<div class="p3 pmob2">
<input class="input pwd" id="reg_pass1" type="password" name="password" value="" tabindex="2" maxlength="32" placeholder="密码">
</div>
<div class="p3 pmob2">
<input class="input pwd" id="reg_pass2" type="password" value="" tabindex="3" maxlength="32" placeholder="确认密码">
</div>
<br>
<div class="p3 pmob2">
<input class="input" id="reg_email" type="email" value="" tabindex="3" maxlength="64" placeholder="安全邮箱">
</div>
<div class="p3">
<div class="errorBox">请输入密码</div>
</div>
<div class="p3"></div>
</form>
<div class="p3">
<input onclick="doReg()" class="btn" type="submit" tabindex="4" value="注 册">
</div>
<div class="p3" style="text-align:left;position:absolute">
<a onclick="login()" href="#">已有账号?点我登录</a>
</div>
</div>
<!-- 账号密码登录 -->
<div id="login" >
<form>
<div class="p3">
<div class="p2"> </div>
</div>
<div class="p3 pmob1">
<input class="input" type="text" id="user" name="username" tabindex="1" maxlength="20" placeholder="用户名">
</div>
<div class="p3 pmob2">
<input class="input pwd" type="password" id="pass" name="password" tabindex="2" maxlength="32" placeholder="密码">
</div>
<div class="p3">
<div class="errorBox">请输入密码</div>
</div>
<div class="p3"></div>
</form>
<div class="p3" class='btn'>
<input onclick="doLogin()" class="btn" type="submit" tabindex="4" value="登 录">
</div>
<div class="p3" style="text-align:left;">
<p><a onclick="reg()" href="#">没有账号?点我注册</a></p>
</div>
</div>
</div>
{/eq}
{eq name="layer" value="0"}
<div class="top">
<div class="d1">
<div class="d11" style="background-image: url({$Think.config.basic.site_logo});height: 18px; background-repeat: no-repeat; background-position: 15px 5px;">
<a href="{:url('index/index')}" class="d7">会分享有收获</a>
</div>
</div>
</div>
<div class="pc"></div>
<span class="bg"></span>
<div class="p9">
<div class="p5"> </div>
<div class="p6">为用户而变革,越简单越好,越快越好 </div>
<div class="p4">会分享,就会有收获!</div>
<div class="p1" style="margin-top: 15px;">
<!-- 注册账号 -->
<div id="reg" style="display:none;">
<span class="main-title">注册新账号</span>
<form>
<div class="p3 pmob1">
<input class="input" type="text" id="reg_nickname" name="nickname" tabindex="1" maxlength="20" placeholder="昵称 (支持中文)">
</div>
<div class="p3 pmob1">
<input class="input" type="text" id="reg_username" name="username" tabindex="1" maxlength="20" placeholder="登录帐号">
</div>
<div class="p3 pmob2">
<input class="input pwd" id="reg_pass1" type="password" name="password" value="" tabindex="2" maxlength="32" placeholder="密码">
</div>
<div class="p3 pmob2">
<input class="input pwd" id="reg_pass2" type="password" value="" tabindex="3" maxlength="32" placeholder="确认密码">
</div>
<br>
<div class="p3 pmob2">
<input class="input" id="reg_email" type="email" value="" tabindex="3" maxlength="64" placeholder="安全邮箱">
</div>
<div class="p3">
<div class="errorBox">请输入密码</div>
</div>
<div class="p3"></div>
</form>
<div class="p3">
<input onclick="doReg()" class="btn" type="submit" tabindex="4" value="注 册">
</div>
<div class="p3" style="text-align:left;position:absolute">
<a onclick="login()" href="#">已有账号?点我登录</a>
</div>
<!-- <div class="p3" style="text-align:right;">
<a onclick="wx()" href="#">微信扫码登录</a>
</div> -->
</div>
<!-- 账号密码登录 -->
<div id="login" >
<form>
<div class="p3">
<div class="p2"> </div>
</div>
<div class="p3 pmob1">
<input class="input" type="text" id="user" name="username" tabindex="1" maxlength="20" placeholder="用户名">
</div>
<div class="p3 pmob2">
<input class="input pwd" type="password" id="pass" name="password" tabindex="2" maxlength="32" placeholder="密码">
</div>
<div class="p3">
<div class="errorBox">请输入密码</div>
</div>
<div class="p3"></div>
</form>
<div class="p3" class='btn'>
<input onclick="doLogin()" class="btn" type="submit" tabindex="4" value="登 录">
</div>
<div class="p3" style="text-align:left;">
<p><a onclick="reg()" href="#">没有账号?点我注册</a></p>
<a href="{:url('user/forget')}">忘记密码?</a>
</div>
<!-- <div class="p3" style="text-align:right;">
<a onclick="wx()" href="#">微信扫码登录</a>
</div> -->
</div>
</div>
{/eq}
<script>
$(function () {
//setTimeout("check_login()", 1300);
});
function wx() {
$("#wx").show();
$("#login").hide();
$("#reg").hide();
}
function reg(){
$("#wx").hide();
$("#login").hide();
$("#reg").show();
}
function login(){
$("#wx").hide();
$("#login").show();
$("#reg").hide();
}
//判断是否扫码
function check_login() {
$.ajax({
type: "get",
url : "/user/login/wxLogin",
dataType:'json',
success: function(data){
if (data.status == 1) {
ok(data.msg);
} else if (data.status == -1) {
layer.alert(data.msg, {icon: 2});
}else{
setTimeout("check_login()", 1300);
}
},
error: function (error) {
layer.alert("API请求失败,请联系客服",{icon:2});
}
});
}
//提交登录
function doLogin()
{
var sacct = $("#user").val();
var pwd = $("#pass").val();
var msg = '';
if (!sacct) {
$("#user").focus();
msg = "请输入账号";
} else if (!pwd) {
$('#pass').focus();
msg = "请输入密码";
}
if(msg != ''){
return error(msg);
}
//提交登录
$.ajax({
type: "post",
url : "{:url('user/login')}",
data: {"username":sacct,"password":pwd},
dataType:'json',
success: function(data){
if (data.status == 1) {
ok(data.msg);
} else if (data.status == 0) {
error(data.msg);
}
},
error: function (error) {
layer.alert("API请求失败,请联系客服",{icon:2});
}
});
}
//提交注册
function doReg()
{
var sacct = $("#reg_username").val();
var pwd1 = $("#reg_pass1").val();
var pwd2 = $("#reg_pass2").val();
var nick = $("#reg_nickname").val();
var email = $("#reg_email").val();
var msg = '';
if(!nick){
$("#reg_nickname").focus();
msg = "请输入昵称";
} else if (!sacct) {
$("#reg_username").focus();
msg = "请输入账号";
} else if (!pwd1) {
$('#reg_pass1').focus();
msg = "请输入密码";
}
else if (pwd1.length < 6 || pwd1.length > 32) {
$('#reg_pass1').focus();
msg = "密码长度最短6位,最长32位!";
}else if (!pwd2) {
$('#reg_pass2').focus();
msg = "请重复输入密码";
}else if (pwd1 != pwd2) {
$('#reg_pass1').focus();
msg = "两次密码不一致!请检查";
}else if(!email){
$('#reg_email').focus();
msg = "请输入安全邮箱";
}
if(msg != ''){
return error(msg);
}
//提交注册
$.ajax({
type: "post",
url : "{:url('user/register')}?share_id={$share_id}",
data: {
"nickname":nick,
"username":sacct,
"password":pwd1,
"email":email
},
dataType:'json',
success: function(data){
if (data.code == 1) {
ok(data.msg);
} else {
error(data.msg);
}
},
error: function (error) {
layer.alert("API请求失败,请联系客服",{icon:2});
}
});
}
//成功
function ok(msg)
{
if (self != top) {
parent.layer.alert(msg,{
icon: 1,
end: function () {
parent.location.reload();
},
});
}else{
layer.alert(msg,{
icon: 1,
end: function () {
location.reload();
},
});
}
}
//失败
function error(msg)
{
//layer.msg(msg, function(){});
$(".errorBox").html(msg);
$(".errorBox").show();
}
</script>
</div>
{eq name="layer" value="0"}
<div class="copyright">不得利用云存储发布,存储,传播违法信息</div>
<div class="foot_info"> © 2021 {$Think.config.basic.site_title} </div>
{/eq}
</body>
</html>
+133
View File
@@ -0,0 +1,133 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0">
<title>重置密码 - {$Think.config.basic.site_title}</title>
<link href="__STATIC__/css/login.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="__STATIC__/js/jquery.js"></script>
<script src="__STATIC__/js/common.js"></script>
<script src="__STATIC__/js/layer.js"></script>
</head>
<body>
<div class="top">
<div class="d1">
<div class="d11" style="background-image: url({$Think.config.basic.site_logo});height: 18px; background-repeat: no-repeat; background-position: 15px 5px;">
<a href="{:url('index/index')}" class="d7">会分享有收获</a>
</div>
</div>
</div>
<div class="pc"></div>
<span class="bg"></span>
<div class="p9">
<div class="p5"> </div>
<div class="p6">为用户而变革,越简单越好,越快越好 </div>
<div class="p4">会分享,就会有收获!</div>
<div class="p1" style="margin-top: 15px;box-shadow: none;">
<!-- 注册账号 -->
<div id="reg">
<span class="main-title">设置密码</span>
<form onkeydown="if(event.keyCode==13){doReg();return false;}">
<br>
<div class="p3 pmob2">
<input class="input" id="reg_pwd" type="text" value="" tabindex="3" maxlength="64" placeholder="设置密码">
</div>
<div class="p3 pmob2">
<input class="input" id="reg_repwd" type="text" value="" tabindex="3" maxlength="64" placeholder="再次填写密码">
</div>
<div class="p3">
<div class="errorBox">请设置密码</div>
</div>
<div class="p3"></div>
</form>
<div class="p3">
<input onclick="doForget()" class="btn" type="submit" tabindex="4" value="设置密码">
</div>
</div>
</div>
<script>
//提交注册
function doForget()
{
var pwd = $("#reg_pwd").val();
var repwd = $("#reg_repwd").val();
var msg = '';
if(!pwd){
$('#reg_pwd').focus();
msg = "请设置密码";
}
if(!repwd){
$("#reg_repwd").focus();
msg = "请再次填写密码";
}
if(pwd !== repwd){
$('#reg_pwd').focus();
msg = "两次输入密码不一致";
}
if(msg != ''){
return error(msg);
}
//提交注册
$.ajax({
type: "post",
url : "{:url('user/reset')}?key={$key}&sign={$sign}",
data: {
"pwd":pwd
},
dataType:'json',
success: function(data){
if (data.code == 1) {
ok(data.msg);
} else {
error(data.msg);
}
},
error: function (error) {
layer.alert("API请求失败,请联系客服",{icon:2});
}
});
}
//成功
function ok(msg)
{
layer.msg(msg,{icon:1},function(){
window.location.href = "{:url('user/login')}"
});
}
//失败
function error(msg)
{
$(".errorBox").html(msg);
$(".errorBox").show();
}
</script>
</div>
<div class="copyright">不得利用云存储发布,存储,传播违法信息</div>
<div class="foot_info"> © 2021 {$Think.config.basic.site_title} </div>
</body>
</html>
+133
View File
@@ -0,0 +1,133 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="__STATIC__/js/jquery.js"></script>
<script src="__STATIC__/js/layer.js"></script>
<script src="__STATIC__/pay/js/ui-choose.js" type="text/javascript"></script>
<link rel='stylesheet' href='__STATIC__/pay/css/main.css' type='text/css' media='all' />
</head>
<body>
<div class="pay">
<!--主内容开始编辑-->
<div class="tr_recharge">
<div class="tr_rechbox">
<div class="tr_rechhead">
<img src="{:getUserHead($info.avatar)}">
<p>开通账号:
{eq name="$vip_info.is_vip" value="1"}
<b style="color: red;">{$info.nickname}</b>
{else/}
{$info.nickname}
{/eq}
</p>
<div class="tr_rechheadcion">
<span style="color: #cc1f00;">开通VIP会员,畅享极速下载!</span>
</div>
</div>
<div class="tr_rechli am-form-group">
<ul class="ui-choose am-form-group" id="uc_01">
{volist name="$rule" id="vo"}
<li>
<label class="am-radio-inline">
<input type="radio" name="vip" value="{$vo.id}" money="{:number_format($vo.money,2)}">
{$vo.name}
</label>
</li>
{/volist}
</ul>
</div>
<div class="tr_rechcho am-form-group am-form-success">
<span>支付方式:</span>
<label class="am-radio" style="margin-right:30px;">
<input type="radio" name="pay_type" value="alipay" checked="checked">
<img src="__STATIC__/pay/images/zfbpay.png">
</label>
<!--官方支付宝-->
<label class="am-radio">
<input type="radio" name="pay_type" value="wxpay">
<img src="__STATIC__/pay/images/wechatpay.png">
</label>
</div>
<div class="tr_rechnum">
<span>应付金额:</span>
<p class="rechnum">0.00元</p>
</div>
</div>
<div class="tr_paybox">
<input type="submit" value="确认支付" class="tr_pay am-btn" onclick="zhifu()">
<span>网盘运营需要成本。您的支持,就是我们更好的动力!</span>
</div>
</div>
</div>
<script>
// 将所有.ui-choose实例化
$('.ui-choose').ui_choose();
// uc_01 ul 单选
var vip = "{$rule[0]['id']}";
var uc_01 = $('#uc_01').data('ui-choose'); // 取回已实例化的对象
uc_01.click = function (index, item) {
//console.log('click', index, vip)
}
uc_01.change = function (index, item) {
//console.log('change', index, item.text())
}
$(function () {
$('#uc_01 li').click(function () {
var vipObj = $(this).find("input");
vip = vipObj.val();
xxx(vipObj.attr('money'));
});
$(document).ready(function () {
$('.othbox').on('input propertychange', function () {
var num = $(this).val();
if (num.indexOf(".") == -1) {
num += ".00";
}
$('.rechnum').html(num + "元");
});
});
//模拟点击
$("#uc_01 li:eq(0)").trigger("click");
})
function xxx(str) {
$('.tr_rechoth').hide();
$('.ui-choose').find("input").attr("name", "price");
$('.tr_rechoth').find("input").attr("name", "price2");
$('.rechnum').text(str + '元');
}
function zhifu() {
var pay_type = $(':radio[name="pay_type"]:checked').val();
parent.layer.open({
type: 2,
title: '支付页面',
closeBtn: 1,
area: ['650px', '774px'], // 宽高
content: "/user/payment?pay_type=" + pay_type + "&vip=" + vip + "&share_id={$share_id}",
end: function () {
//设置订单为已关闭
$.get("/user/vip_close");
},
cancel: function (index) {
parent.layer.confirm('确定要取消支付吗?', { icon: 3 }, function (index2) {
parent.layer.close(index2);
parent.layer.close(index);
parent.layer.msg("支付已关闭");
});
return false;
},
});
}
</script>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More