This commit is contained in:
2025-11-22 15:31:01 +08:00
parent 9f25a85d07
commit b52a51c09b
37 changed files with 2587 additions and 240 deletions
@@ -98,7 +98,7 @@ class AccountController extends Crud
// return $this->fail('账户不存在或密码错误');
// }
//$secret = $admin['totp_secret'] ?:'EJGYB7OZR2W46XRX7VB3PXHSOY4LUAWCA5GTDAVTWKHXNDAAAIIP7AQ3JSO3XZJNX5J5OTIDEQVKLYFYIYNAXSCYF4GNZ2EMA4ORA3Y';
\support\Log::alert($admin['totp_secret']);
//\support\Log::alert($admin['totp_secret']);
$totp = \OTPHP\TOTP::create($admin->totp_secret);
//$secret = $totp->getSecret();
//$totp->setLabel('cansnow');
@@ -143,9 +143,9 @@ class ConfigController extends Base
$post = $request->post('row');
Db::startTrans();
try {
if($post['type'] == 'selects'){
$post['value'] = implode(',',$post['value']);
}
// if($post['type'] == 'selects'){
// $post['value'] = implode(',',$post['value']);
// }
$user = ConfigModel::create($post);
Db::commit();
$this->buildcache();
@@ -165,7 +165,7 @@ class ConfigController extends Base
$v['value'] = json_decode($v['value'], true);
}
if(in_array($v['type'] ,['selects']) && !is_array($v['value'])){
$v['value'] = explode(',',$v['value']);
$v['value'] = explode(',',$v['value']??'');
}
$list[$v['name']] = $v['value'];
}
@@ -70,7 +70,7 @@ class IndexController extends Base
//$day7_user_recharge_sum = Recharge::where('status',2)->whereTime('created_at', '-7 days')->sum('amount');
// 总用户数
$user_count = \app\model\User::where('status',1)->count('id');
$recharge_total = \app\model\Recharge::where('status',\app\enum\RechargeStatus::COMPLETE->value)->sum('amount');
$recharge_total = 0;//\app\model\Recharge::where('status',\app\enum\RechargeStatus::COMPLETE->value)->sum('amount');
// mysql版本
$withdrawl_total = \app\model\Withdrawl::where('status',\app\enum\WithdrawlStatus::COMPLETE->value)->sum('recive_amount');
// mysql版本
@@ -0,0 +1,110 @@
<?php
namespace plugin\admin\app\controller;
use plugin\admin\app\controller\Base;
use plugin\admin\app\controller\Crud;
use plugin\admin\app\model\User as UserModel;
use support\exception\BusinessException;
use support\Request;
use support\Response;
use Throwable;
/**
* OpenIM管理
*/
class OpenimController extends Crud
{
/**
* @var UserModel
*/
protected $model = null;
/**
* 构造函数
* @return void
*/
function __construct()
{
$this->model = new UserModel();
$groupList = [
['value'=>0,'label'=>"普通用户"],
['value'=>1,'label'=>"内部用户"],
['value'=>2,'label'=>"联盟商"],
];
$roleList = \app\model\UserRole::order('id','desc')->column('name as label,id as value');
$this->assign('groupList',$groupList);
$this->assignconfig('groupList',$groupList);
$this->assign('roleList',$roleList);
$this->assignconfig('roleList',$roleList);
}
public function team(Request $request): Response
{
return view();
}
// public function select(Request $request): Response
// {
// $this->model = $this->model->with(['referrer','role']);
// return parent::select($request);
// }
/**
* 浏览
* @return Response
* @throws Throwable
*/
public function index(Request $request): Response
{
return view('user/index');
}
public function select(Request $request): Response{
$res = $request->IM->user->getUsers(1,20);
//cp($request->IM->user->getAllUsersUid());
if($res['errCode']!==0){
return $this->fail($res['errDlt']);
}
return json([
'code' => 0,
"msg" => "ok",
'count' => $res['data']['total'],
'data' =>$res['data']['users'],
]);
}
/**
* 插入
* @param Request $request
* @return Response
* @throws BusinessException|Throwable
*/
public function insert(Request $request): Response
{
if ($request->method() === 'POST') {
return parent::insert($request);
}
return view('user/update',[
'row' => UserModel::findOrEmpty(0)
]);
}
/**
* 更新
* @param Request $request
* @return Response
* @throws BusinessException|Throwable
*/
public function update(Request $request): Response
{
if ($request->method() === 'POST') {
[$id, $data] = $this->updateInput($request);
$this->doUpdate($id, $data);
$ret = $this->success('操作成功');
return $ret;
}
$ids = Request()->get('ids');
$user = $this->model->where('id',$ids)->find();
return view('user/update',[
'row' => $user
]);
}
}
@@ -68,6 +68,7 @@ class UserController extends Crud
{
if ($request->method() === 'POST') {
return parent::insert($request);
}
return view('user/update',[
'row' => UserModel::findOrEmpty(0)
+2 -19
View File
@@ -39,25 +39,8 @@ class AccessControl implements MiddlewareInterface
$response = view('common/403')->withStatus(403);
}
}
} else {
$config = Config('site');
$config['debug'] = config('app.debug');
$config['controller'] = $request->controller_name;
$config['action'] = $request->action_name;
$config['moduleurl'] = '/app/admin';
$request->_view_vars = array_merge((array) $request->_view_vars,[
'user' => session('admin'),
'config' => $config
]);
$response = $request->method() == 'OPTIONS' ? response('') : $handler($request);
$response->withBody(str_replace([
'__SELF__'
],[
request()->path()
//url(request()->action)
],$response->rawBody()))->getStatusCode();
return $response;
}
return $response;
return $handler($request);
}
}
+41
View File
@@ -0,0 +1,41 @@
<?php
namespace plugin\admin\app\middleware;
use plugin\admin\api\Auth;
use ReflectionException;
use support\exception\BusinessException;
use Webman\Http\Request;
use Webman\Http\Response;
use Webman\MiddlewareInterface;
class Config implements MiddlewareInterface
{
/**
* @param Request $request
* @param callable $handler
* @return Response
* @throws ReflectionException|BusinessException
*/
public function process(Request $request, callable $handler): Response
{
$request->controller_name = get_controller_name();
$request->action_name = get_action_name();
$config = Config('site');
$config['debug'] = config('app.debug');
$config['controller'] = $request->controller_name;
$config['action'] = $request->action_name;
$config['moduleurl'] = '/app/admin';
$request->_view_vars = array_merge((array) $request->_view_vars,[
'user' => session('admin'),
'config' => $config
]);
$IM = new \support\OpenImSdk\Client([
'host' => 'http://127.0.0.1:10002', // OpenIM API地址
'secret' => 'openIM123', // OpenIM密钥
]);
$request->IM = $IM;
return $handler($request);
}
}
+34
View File
@@ -0,0 +1,34 @@
<?php
namespace plugin\admin\app\middleware;
use plugin\admin\api\Auth;
use ReflectionException;
use support\exception\BusinessException;
use Webman\Http\Request;
use Webman\Http\Response;
use Webman\MiddlewareInterface;
class Tpl implements MiddlewareInterface
{
/**
* @param Request $request
* @param callable $handler
* @return Response
* @throws ReflectionException|BusinessException
*/
public function process(Request $request, callable $handler): Response
{
$response = $request->method() == 'OPTIONS' ? response('') : $handler($request);
$response->withBody(str_replace([
'__SELF__',
'__2__'
],[
request()->path(),
'-'
//url(request()->action)
],$response->rawBody()))->getStatusCode();
return $response;
}
}
+1 -13
View File
@@ -30,6 +30,7 @@ class User extends \app\model\User
{
public static function onAfterUpdate($row){
parent::onAfterUpdate($row);
$changeData = $row->getChangedData();
$orgData = $row->getOrigin();
foreach(Config('site.allow_currencys') as $currency){
@@ -41,17 +42,4 @@ class User extends \app\model\User
}
}
}
public static function onAfterDelete($row)
{
Db::name('address')->where('user_id',$row->id)->delete();
Db::name('recharge')->where('user_id',$row->id)->delete();
Db::name('record')->where('user_id',$row->id)->delete();
Db::name('withdrawl')->where('user_id',$row->id)->delete();
Db::name('user_extend')->where('user_id',$row->id)->delete();
Db::name('user_team')->where('descendant_id|ancestor_id','=',$row->id)->delete();
Db::name('withdrawl')->where('user_id',$row->id)->delete();
(new \app\model\BalanceLog)->setSuffix('_money')->where('user_id',(int)$row->id)->delete();
(new \app\model\BalanceLog)->setSuffix('_score')->where('user_id',(int)$row->id)->delete();
(new \app\model\BalanceLog)->setSuffix('_currency1')->where('user_id',(int)$row->id)->delete();
}
}
@@ -97,11 +97,6 @@
?>
</td>
</tr>
<tr>
<td></td>
<td>
</td>
</tr>
<tr>
<td>用户余额总和</td>
<td>{$user_money_total}</td>
+6 -4
View File
@@ -11,12 +11,14 @@
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
use plugin\admin\app\middleware\AccessControl;
return [
'' => [
AccessControl::class,
\plugin\admin\app\middleware\AccessControl::class,
\plugin\admin\app\middleware\Config::class,
//\plugin\admin\app\middleware\OpenIM::class,
\app\middleware\ActionHook::class,
//\app\middleware\BeforeActionHook::class,
//\app\middleware\AfterActionHook::class,
\plugin\admin\app\middleware\Tpl::class,
]
];
+88 -189
View File
@@ -18,202 +18,101 @@ define(['table', 'upload','form'], function (Table,Upload,Form) {
table: 'user',
}
});
console.log(Config)
var table = $("#table");
var columns = [
{checkbox: true},
{
field: 'id',
title: 'ID',
filter: "number",
sortable: true // 是否排序
},
// {
// title: "角色",
// field: "role_id",
// formatter:function(v,row){
// return row.role ? row.role.name : '用户';
// },
// filter: "select",
// filterOption:"roleOption",
// visible: false,
// },
{
title: "昵称",
field: "nickname"
},
{
title: "头像",
field: "avatar",
formatter: function (v,d) {
return '<img src="'+encodeURI(d['avatar'])+'" style="max-width:32px;max-height:32px;" alt="" />'
},
visible: false
},
// {
// title: "等级",
// field: "level",
// visible: false,
// },
// {
// title: "生日",
// field: "birthday",
// visible: false,
// },
// {
// title: "后缀",
// field: "decimal_part",
// //visible: false,
// },
];
var currencys = ['money','score','currency1','currency2','currency3','currency4','currency5','currency6','currency7','currency8','currency9'];
for (let i = 0; i < currencys.length; i++) {
if(Config.allow_currencys.indexOf(currencys[i])!==-1){
columns.push({
title: __(currencys[i]),
field: currencys[i],
formatter:Table.api.formatter.number,
//sortable: true,
//visible: false,
});
}
};
columns.push({
title: "注册时间",
field: "createTime",
formatter:function(v,row){
return Table.api.formatter.datetime(parseInt(v/1000));
},
filter:'datetime'
});
columns.push({
title: "状态",
field: "status",
formatter: Table.api.formatter.switch
});
columns.push({
field: 'operate', title: '操作',
table: table,
events: Table.api.events.operate,
formatter: Table.api.formatter.operate,
buttons:[
{
text:"团队",
name:"team",
icon:"mdi mdi-account-group-outline",
classname:"btn btn-xs btn-info btn-dialog",
url:'/app/admin/user/team'
}
]
});
var tableOptions = {
url: $.fn.bootstrapTable.defaults.extend.index_url,
pk: 'id',
sortName: 'id',
commonSearch: false,
search: false,
columns: [
[
{checkbox: true},
{
field: 'id',
title: 'ID',
filter: "number",
sortable: true // 是否排序
},
{
title: "推荐人",
field: "parent_id",
formatter:function(v,row){
return row.referrer ? row.referrer.username : '';
},
visible: false,
},
{
title: "分组",
field: "group",
formatter:function(v,row){
for (let i = 0; i < Config.groupList.length; i++) {
if(Config.groupList[i].value == v){
return Config.groupList[i].label;
}
}
return '';
},
filter: "select",
filterOption:"groupOption",
visible: false,
},
{
title: "角色",
field: "role_id",
formatter:function(v,row){
return row.role ? row.role.name : '用户';
},
filter: "select",
filterOption:"roleOption",
visible: false,
},
{
title: "用户名",
field: "username",
filter: "string",
},
{
title: "昵称",
field: "nickname",
visible: false
},
{
field: 'domain',
title: '域名',
filter: "string",
visible: false
},
{
title: "头像",
field: "avatar",
formatter: function (v,d) {
return '<img src="'+encodeURI(d['avatar'])+'" style="max-width:32px;max-height:32px;" alt="" />'
},
visible: false
},
{
title: "邮箱",
field: "email",
visible: false
},
{
title: "手机",
field: "mobile",
visible: false
},
// {
// title: "等级",
// field: "level",
// visible: false,
// },
// {
// title: "生日",
// field: "birthday",
// visible: false,
// },
// {
// title: "后缀",
// field: "decimal_part",
// //visible: false,
// },
{
title: "调研币",
field: "money",
formatter:Table.api.formatter.number,
sortable: true,
//visible: false,
},
{
title: "积分",
field: "score",
sortable: true,
visible: false,
formatter:Table.api.formatter.number
},
{
title: "调研豆",
field: "currency1",
formatter:Table.api.formatter.number
},
{
title: "可领取",
field: "currency6",
sortable: true,
formatter:Table.api.formatter.number
},
{
title: "待分配",
field: "currency7",
sortable: true,
formatter:Table.api.formatter.number
},
{
title: "已分配",
field: "currency8",
sortable: true,
formatter:Table.api.formatter.number
},
{
title: "未通过",
field: "currency9",
sortable: true,
formatter:Table.api.formatter.number
},
{
title: "登录时间",
field: "last_time",
formatter:Table.api.formatter.datetime,
visible: false,
},
{
title: "登录ip",
field: "last_ip",
visible: false,
},
{
title: "注册时间",
field: "join_time",
formatter:Table.api.formatter.datetime,
filter:'datetime'
},
{
title: "注册ip",
field: "join_ip",
visible: false,
},
{
title: "创建时间",
field: "created_at",
visible: false,
},
{
title: "更新时间",
field: "updated_at",
formatter:Table.api.formatter.datetime,
visible: false,
},
{
title: "状态",
field: "status",
formatter: Table.api.formatter.switch
},
{
field: 'operate', title: '操作',
table: table, events: Table.api.events.operate,
formatter: Table.api.formatter.operate,
buttons:[
{
text:"团队",
name:"team",
icon:"mdi mdi-account-group-outline",
classname:"btn btn-xs btn-info btn-dialog",
url:'/app/admin/user/team'
}
]
}
]
]
columns: [columns]
};
// 初始化表格
table.bootstrapTable(tableOptions);