Compare commits

...

2 Commits

  1. 2
      .gitignore
  2. 56
      app/admin/controller/Admin.php
  3. 68
      app/admin/controller/Index.php
  4. 420
      app/admin/route/app.php
  5. 446
      app/admin/service/AdminService.php
  6. 80
      app/admin/service/ExportService.php
  7. 63
      app/admin/service/FlowService.php
  8. 3
      app/admin/service/RechargeService.php
  9. 11
      app/admin/service/VideoService.php
  10. 6
      app/admin/service/setting/BlockStockService.php
  11. 125
      app/admin/service/setting/IPOService.php
  12. 57
      app/command/ApiLogCommand.php
  13. 14
      app/home/controller/User.php
  14. 5
      app/home/lang/zh-cn.php
  15. 3
      app/home/lang/zh-jp.php
  16. 3
      app/home/lang/zh-us.php
  17. 76
      app/home/middleware/ApiLogMiddleware.php
  18. 47
      app/home/middleware/CheckUserMiddleware.php
  19. 26
      app/home/route/app.php
  20. 13
      app/home/service/BaseHomeService.php
  21. 31
      app/home/service/LoginService.php
  22. 484
      app/home/service/UserService.php
  23. 9
      app/model/ApiLogModel.php
  24. 79
      app/model/ForexListMode.php
  25. 9
      app/model/UserAccessLogModel.php
  26. 7
      app/model/VipCodeModel.php
  27. 8
      app/model/WatchVideoLogModel.php
  28. 4
      app/utility/SendSms.php
  29. 18
      app/utility/UnqId.php
  30. 9
      composer.json
  31. 1
      config/console.php

2
.gitignore

@ -1,6 +1,6 @@
/.idea
/.vscode
#/vendor/
/vendor/
/runtime/
*.log
.env

56
app/admin/controller/Admin.php

@ -1,4 +1,5 @@
<?php
namespace app\admin\controller;
use app\admin\service\AdminService;
@ -25,7 +26,7 @@ class Admin extends AdminBaseController
public function updateInfo()
{
$service = new AdminService();
$result = $service->updateInfo($this->request->user_id,$this->request->param());
$result = $service->updateInfo($this->request->user_id, $this->request->param());
return json($result);
}
public function getUserInfo()
@ -38,7 +39,7 @@ class Admin extends AdminBaseController
public function updatePassword()
{
$service = new AdminService();
$result = $service->updatePassword($this->request->user_id,$this->request->param());
$result = $service->updatePassword($this->request->user_id, $this->request->param());
return json($result);
}
@ -49,24 +50,28 @@ class Admin extends AdminBaseController
return json($returnData);
}
//编辑账号
public function updateAccount(){
$returnData = (new AdminService())->updateAccount($this->request->param('id'),$this->request->param());
public function updateAccount()
{
$returnData = (new AdminService())->updateAccount($this->request->param('id'), $this->request->param());
return json($returnData);
}
//更新账号状态
public function updateAccountStauts(){
$returnData = (new AdminService())->updateAccountStauts($this->request->param('id'),$this->request->param());
public function updateAccountStauts()
{
$returnData = (new AdminService())->updateAccountStauts($this->request->param('id'), $this->request->param());
return json($returnData);
}
//删除指定用户
public function del(){
public function del()
{
$returnData = (new AdminService())->del($this->request->param('id'));
return json($returnData);
}
//获取用户权限代码
public function getPermCode(){
public function getPermCode()
{
$returnData = (new AdminService())->getPermCode($this->request->user_id);
return json($returnData);
}
@ -85,7 +90,8 @@ class Admin extends AdminBaseController
return json($returnData);
}
public function inviteCode(){
public function inviteCode()
{
$returnData = (new AdminService())->inviteCode();
return json($returnData);
}
@ -133,11 +139,25 @@ class Admin extends AdminBaseController
$returnData = (new AdminService())->getUserAccessLog($this->request->user_id, $this->request->param());
return json($returnData);
}
public function getUserAccessLogSummary()
{
$returnData = (new AdminService())->getUserAccessLogSummary($this->request->user_id, $this->request->param());
return json($returnData);
}
public function getVisitorAccessLog()
{
$returnData = (new AdminService())->getVisitorAccessLog($this->request->user_id, $this->request->param());
return json($returnData);
}
public function getVisitorAccessLogSummary()
{
$returnData = (new AdminService())->getVisitorAccessLogSummary($this->request->user_id, $this->request->param());
return json($returnData);
}
// 获取admin的操作记录
public function getAdminOperationLog()
{
$returnData = (new AdminService())->getAdminOperationLog($this->request->user_id,$this->request->param());
$returnData = (new AdminService())->getAdminOperationLog($this->request->user_id, $this->request->param());
return json($returnData);
}
@ -155,6 +175,20 @@ class Admin extends AdminBaseController
return json($returnData);
}
// 生成vip兑换码
public function generateVipCode()
{
$returnData = (new AdminService())->generateVipCode($this->request->param());
return json($returnData);
}
// 获取vip兑换码列表
public function getVipCode()
{
$returnData = (new AdminService())->getVipCode($this->request->param());
return json($returnData);
}
// 单次发送邮件或短信消息
public function sendEmailOrSms()
{

68
app/admin/controller/Index.php

@ -35,6 +35,7 @@ use app\model\StockSgdListModel;
use app\model\StockThaListModel;
use app\model\StockThaTradeModel;
use app\model\StockTradeModel;
use app\model\UserAccessLogModel;
use app\model\UserModel;
use app\model\UserVerifyLogModel;
use app\model\UserWithdrawalModel;
@ -70,7 +71,7 @@ class Index extends AdminBaseController
return json(['code' => '500', 'message' => '当前账号数据为空', 'data' => []]);
}
// 查询当前账号的角色信息
$role = AuthRoleModel::where(['id'=>$account->role_id])->find();
$role = AuthRoleModel::where(['id' => $account->role_id])->find();
if (empty($role)) {
return json(['code' => '500', 'message' => '当前账号分配的角色数据为空', 'data' => []]);
}
@ -85,10 +86,10 @@ class Index extends AdminBaseController
$todayRegisterNum = UserModel::whereTime('create_time', 'between', [$today, $tomorrow])->count();
// 总注册人数(用户的总数)
$totalRegisterNum = UserModel::count();
// // 今日充值用户 完成状态
// $todayRechargeNum = RechargeApplyModel::where('status', 1)->whereTime('create_time', 'between', [$today, $tomorrow])->group('user_id')->count();
// // 今日充值用户 完成状态
// $todayRechargeNum = RechargeApplyModel::where('status', 1)->whereTime('create_time', 'between', [$today, $tomorrow])->group('user_id')->count();
// 总充值用户(充值用户的个数 以用户id分组)
// $totalRechargeNum = RechargeApplyModel::where('status', 1)->group('user_id')->count();
// $totalRechargeNum = RechargeApplyModel::where('status', 1)->group('user_id')->count();
break;
case AuthRoleModel::NAME_AGENT: // 代理 - 查看代理下可以查看的用户
// 今日注册用户
@ -198,8 +199,6 @@ class Index extends AdminBaseController
$todayRechargeAmount = Db::table($rechargeApplyTableName)
->whereTime('create_time', 'between', [$today, $tomorrow])->where($whereInUser)
->where('status', 1)->sum('recharge_num');
$todayRechargeAmountGroup = Db::table($rechargeApplyTableName)->whereTime('create_time', 'between', [$today, $tomorrow])->where($whereInUser)
->where('status', 1)->field('account_type, SUM(recharge_num) AS recharge_num')->group('recharge_num')->select();
// 今日提款金额 完成状态
$todayWithdrawAmount = Db::table($userWithdrawTableName)
@ -215,22 +214,29 @@ class Index extends AdminBaseController
$approvedRealName = UserVerifyLogModel::where('status', 2)->where($whereInUser)->count(); // 审核通过实名认证用户数
$failedRealName = UserVerifyLogModel::where('status', 3)->where($whereInUser)->count(); // 审核失败实名认证用户数
$todayIpVisit = UserAccessLogModel::where('user_id', null)
->whereTime('created_at', 'today')
->group('ip')
->count(); // 今日IP访问统计
$totalIpVisit = UserAccessLogModel::where('user_id', null)
->group('ip')
->count(); // 总IP访问统计
$data = [
'todayRegisterNum' => $todayRegisterNum, // 今日注册用户
'totalRegisterNum' => $totalRegisterNum, // 总注册人数
'todayRechargeNum' => $todayRechargeNum, // 今日充值用户
'totalRechargeNum' => $totalRechargeNum,// 总充值用户
'totalRechargeNum' => $totalRechargeNum, // 总充值用户
'todayTradeNum' => $todayTradeNum, // 今日交易用户
'totalTradeNum' => $totalTradeNum,// 总交易用户
'totalTradeNum' => $totalTradeNum, // 总交易用户
'todayWithdrawNum' => $todayWithdrawNum, // 今日提款用户
'totalWithdrawalNum' => $totalWithdrawalNum,// 总提现用户
'totalWithdrawalNum' => $totalWithdrawalNum, // 总提现用户
'todayRechargeAmount' => $todayRechargeAmount, // 今日充值金额
'todayRechargeAmountGroup' => $todayRechargeAmountGroup, // 今日充值金额 - 按充值类型分组统计
'totalRechargeAmount' => $totalRechargeAmount,// 总充值金额
'totalRechargeAmount' => $totalRechargeAmount, // 总充值金额
'todayWithdrawAmount' => $todayWithdrawAmount, // 今日提款金额
'totalWithdrawAmount' => $totalWithdrawAmount, // 总提款金额
@ -241,6 +247,10 @@ class Index extends AdminBaseController
'awaiting_real_name' => $awaitingRealName, // 等待实名审核用户数
'approved_real_name' => $approvedRealName, // 实名审核通过用户数
'failed_real_name' => $failedRealName, // 实名审核失败用户数
//ip游客访问统计
'todayIpVisit' => $todayIpVisit, // 今日IP访问统计
'totalIpVisit' => $totalIpVisit, // 总IP访问统计
];
return json(['code' => '0', 'message' => 'SUCCESS', 'data' => $data]);
@ -265,7 +275,7 @@ class Index extends AdminBaseController
return json(['code' => '500', 'message' => '当前账号数据为空', 'data' => []]);
}
// 查询当前账号的角色信息
$role = AuthRoleModel::where(['id'=>$account->role_id])->find();
$role = AuthRoleModel::where(['id' => $account->role_id])->find();
if (empty($role)) {
return json(['code' => '500', 'message' => '当前账号分配的角色数据为空', 'data' => []]);
}
@ -340,24 +350,24 @@ class Index extends AdminBaseController
return json(['code' => '500', 'message' => '当前账号数据为空', 'data' => []]);
}
// 查询当前账号的角色信息
$role = AuthRoleModel::where(['id'=>$account->role_id])->find();
$role = AuthRoleModel::where(['id' => $account->role_id])->find();
if (empty($role)) {
return json(['code' => '500', 'message' => '当前账号分配的角色数据为空', 'data' => []]);
}
switch ($role->name) {
case AuthRoleModel::NAME_ADMIN: // 超级管理员可以查看所有数据
// $query1 = 'select "合约" as subject, trade_id,order_id,user_id,null as stock_id,contract_id,null as digital_id,trade_type,deal_type,status,order_money,create_time from bot_contract_trade';
// $query2 = 'select "数字币" as subject, trade_id,order_id,user_id,null as stock_id,null as contract_id,digital_id,trade_type,deal_type,status,order_money,create_time from bot_digital_trade';
// $query3 = 'select "美股" as subject, trade_id,order_id,user_id,stock_id,null as contract_id,null as digital_id,trade_type,deal_type,status,order_money,create_time from bot_stock_trade';
// $query4 = 'select "马股" as subject, trade_id,order_id,user_id,stock_id,null as contract_id,null as digital_id,trade_type,deal_type,status,order_money,create_time from bot_stock_mys_trade';
// $query5 = 'select "泰股" as subject, trade_id,order_id,user_id,stock_id,null as contract_id,null as digital_id,trade_type,deal_type,status,order_money,create_time from bot_stock_tha_trade';
// $query6 = 'select "印尼股" as subject, trade_id,order_id,user_id,stock_id,null as contract_id,null as digital_id,trade_type,deal_type,status,order_money,create_time from bot_stock_idn_trade';
// $query7 = 'select "印度股" as subject, trade_id,order_id,user_id,stock_id,null as contract_id,null as digital_id,trade_type,deal_type,status,order_money,create_time from bot_stock_in_trade';
// $unionAllQuery = $query1.' union all '. $query2. ' union all '. $query3. ' union all '. $query4. ' union all '. $query5. ' union all '. $query6. ' union all '. $query7;
// $totalQuery = 'select count(*) as total from ( '. $unionAllQuery. ' ) as tmp;';
// $total = Db::query($totalQuery);
// $list = Db::query($unionAllQuery. ' order by create_time desc limit ?, ?;', [$offset, $param['limit']]);
// $query1 = 'select "合约" as subject, trade_id,order_id,user_id,null as stock_id,contract_id,null as digital_id,trade_type,deal_type,status,order_money,create_time from bot_contract_trade';
// $query2 = 'select "数字币" as subject, trade_id,order_id,user_id,null as stock_id,null as contract_id,digital_id,trade_type,deal_type,status,order_money,create_time from bot_digital_trade';
// $query3 = 'select "美股" as subject, trade_id,order_id,user_id,stock_id,null as contract_id,null as digital_id,trade_type,deal_type,status,order_money,create_time from bot_stock_trade';
// $query4 = 'select "马股" as subject, trade_id,order_id,user_id,stock_id,null as contract_id,null as digital_id,trade_type,deal_type,status,order_money,create_time from bot_stock_mys_trade';
// $query5 = 'select "泰股" as subject, trade_id,order_id,user_id,stock_id,null as contract_id,null as digital_id,trade_type,deal_type,status,order_money,create_time from bot_stock_tha_trade';
// $query6 = 'select "印尼股" as subject, trade_id,order_id,user_id,stock_id,null as contract_id,null as digital_id,trade_type,deal_type,status,order_money,create_time from bot_stock_idn_trade';
// $query7 = 'select "印度股" as subject, trade_id,order_id,user_id,stock_id,null as contract_id,null as digital_id,trade_type,deal_type,status,order_money,create_time from bot_stock_in_trade';
// $unionAllQuery = $query1.' union all '. $query2. ' union all '. $query3. ' union all '. $query4. ' union all '. $query5. ' union all '. $query6. ' union all '. $query7;
// $totalQuery = 'select count(*) as total from ( '. $unionAllQuery. ' ) as tmp;';
// $total = Db::query($totalQuery);
// $list = Db::query($unionAllQuery. ' order by create_time desc limit ?, ?;', [$offset, $param['limit']]);
$list = Db::table($tradeTables[$param['market_type']])->order('create_time', 'desc')->paginate([
'list_rows' => $param['limit'],
@ -1084,7 +1094,8 @@ class Index extends AdminBaseController
return json(['msg' => $exception->getMessage()]);
}
}
public function cacheForex(){
public function cacheForex()
{
$redis = (new AdminBaseService())->getRedis();
// 缓存外汇
$contractList = ForexListModel::where('status', '=', '1')->select();
@ -1147,7 +1158,7 @@ class Index extends AdminBaseController
* */
public function signStock()
{
$market_list = [3, 4, 5, 6, 7, 9, 12, 14, 15, 16,17,18];
$market_list = [3, 4, 5, 6, 7, 9, 12, 14, 15, 16, 17, 18];
foreach ($market_list as $market_type) {
(new IPOService())->signStockIPO($market_type);
}
@ -1261,8 +1272,6 @@ class Index extends AdminBaseController
// 提交事务
Db::commit();
}
return json($result);
}
@ -1298,5 +1307,4 @@ class Index extends AdminBaseController
return json([$exception->getMessage()]);
}
}
}
}

420
app/admin/route/app.php

@ -97,89 +97,89 @@ Route::group('/', function () {
Route::post('/order/forex_clear', 'Order/forexClear');
// 股票-废弃
// Route::post('/order/stock_hold', 'Order/stockHold');
// Route::post('/order/stock_place', 'Order/stockPlace');
// Route::post('/order/stock_back', 'Order/stockBack');
// Route::post('/order/stock_clear', 'Order/stockClear');
// Route::post('/order/stock_hold', 'Order/stockHold');
// Route::post('/order/stock_place', 'Order/stockPlace');
// Route::post('/order/stock_back', 'Order/stockBack');
// Route::post('/order/stock_clear', 'Order/stockClear');
// 美股
Route::post('/order/us_stock_hold', 'Order/StockHold')->append(['market_type' =>3]);
Route::post('/order/us_stock_place', 'Order/StockPlace')->append(['market_type' =>3]);
Route::post('/order/us_stock_back', 'Order/StockBack')->append(['market_type' =>3]);
Route::post('/order/us_stock_clear', 'Order/StockClear')->append(['market_type' =>3]);
Route::post('/order/us_stock_hold', 'Order/StockHold')->append(['market_type' => 3]);
Route::post('/order/us_stock_place', 'Order/StockPlace')->append(['market_type' => 3]);
Route::post('/order/us_stock_back', 'Order/StockBack')->append(['market_type' => 3]);
Route::post('/order/us_stock_clear', 'Order/StockClear')->append(['market_type' => 3]);
// 印尼股票
Route::post('/order/idn_stock_hold', 'Order/StockHold')->append(['market_type' =>4]);
Route::post('/order/idn_stock_place', 'Order/StockPlace')->append(['market_type' =>4]);
Route::post('/order/idn_stock_back', 'Order/StockBack')->append(['market_type' =>4]);
Route::post('/order/idn_stock_clear', 'Order/StockClear')->append(['market_type' =>4]);
Route::post('/order/idn_stock_hold', 'Order/StockHold')->append(['market_type' => 4]);
Route::post('/order/idn_stock_place', 'Order/StockPlace')->append(['market_type' => 4]);
Route::post('/order/idn_stock_back', 'Order/StockBack')->append(['market_type' => 4]);
Route::post('/order/idn_stock_clear', 'Order/StockClear')->append(['market_type' => 4]);
// 马来西亚股票
Route::post('/order/mys_stock_hold', 'Order/StockHold')->append(['market_type' =>5]);
Route::post('/order/mys_stock_place', 'Order/StockPlace')->append(['market_type' =>5]);
Route::post('/order/mys_stock_back', 'Order/StockBack')->append(['market_type' =>5]);
Route::post('/order/mys_stock_clear', 'Order/StockClear')->append(['market_type' =>5]);
Route::post('/order/mys_stock_hold', 'Order/StockHold')->append(['market_type' => 5]);
Route::post('/order/mys_stock_place', 'Order/StockPlace')->append(['market_type' => 5]);
Route::post('/order/mys_stock_back', 'Order/StockBack')->append(['market_type' => 5]);
Route::post('/order/mys_stock_clear', 'Order/StockClear')->append(['market_type' => 5]);
// 泰国股票
Route::post('/order/tha_stock_hold', 'Order/StockHold')->append(['market_type' =>6]);
Route::post('/order/tha_stock_place', 'Order/StockPlace')->append(['market_type' =>6]);
Route::post('/order/tha_stock_back', 'Order/StockBack')->append(['market_type' =>6]);
Route::post('/order/tha_stock_clear', 'Order/StockClear')->append(['market_type' =>6]);
Route::post('/order/tha_stock_hold', 'Order/StockHold')->append(['market_type' => 6]);
Route::post('/order/tha_stock_place', 'Order/StockPlace')->append(['market_type' => 6]);
Route::post('/order/tha_stock_back', 'Order/StockBack')->append(['market_type' => 6]);
Route::post('/order/tha_stock_clear', 'Order/StockClear')->append(['market_type' => 6]);
// 印度股票订单
Route::post('/order/in_stock_hold', 'Order/StockHold')->append(['market_type' =>7]); // 印度股票持仓
Route::post('/order/in_stock_place', 'Order/stockPlace')->append(['market_type' =>7]); // 印度股票挂单
Route::post('/order/in_stock_back', 'Order/stockBack')->append(['market_type' =>7]); // 印度股票撤单
Route::post('/order/in_stock_clear', 'Order/stockClear')->append(['market_type' =>7]); // 印度股票平仓
Route::post('/order/in_stock_hold', 'Order/StockHold')->append(['market_type' => 7]); // 印度股票持仓
Route::post('/order/in_stock_place', 'Order/stockPlace')->append(['market_type' => 7]); // 印度股票挂单
Route::post('/order/in_stock_back', 'Order/stockBack')->append(['market_type' => 7]); // 印度股票撤单
Route::post('/order/in_stock_clear', 'Order/stockClear')->append(['market_type' => 7]); // 印度股票平仓
// 新加坡股票
Route::post('/order/sgd_stock_hold', 'Order/StockHold')->append(['market_type' =>9]);
Route::post('/order/sgd_stock_place', 'Order/stockPlace')->append(['market_type' =>9]);
Route::post('/order/sgd_stock_back', 'Order/stockBack')->append(['market_type' =>9]);
Route::post('/order/sgd_stock_clear', 'Order/stockClear')->append(['market_type' =>9]);
Route::post('/order/sgd_stock_hold', 'Order/StockHold')->append(['market_type' => 9]);
Route::post('/order/sgd_stock_place', 'Order/stockPlace')->append(['market_type' => 9]);
Route::post('/order/sgd_stock_back', 'Order/stockBack')->append(['market_type' => 9]);
Route::post('/order/sgd_stock_clear', 'Order/stockClear')->append(['market_type' => 9]);
// 香港股票
Route::post('/order/hk_stock_hold', 'Order/StockHold')->append(['market_type' =>12]);
Route::post('/order/hk_stock_place', 'Order/stockPlace')->append(['market_type' =>12]);
Route::post('/order/hk_stock_back', 'Order/stockBack')->append(['market_type' =>12]);
Route::post('/order/hk_stock_clear', 'Order/stockClear')->append(['market_type' =>12]);
Route::post('/order/hk_stock_hold', 'Order/StockHold')->append(['market_type' => 12]);
Route::post('/order/hk_stock_place', 'Order/stockPlace')->append(['market_type' => 12]);
Route::post('/order/hk_stock_back', 'Order/stockBack')->append(['market_type' => 12]);
Route::post('/order/hk_stock_clear', 'Order/stockClear')->append(['market_type' => 12]);
// 英国股票
Route::post('/order/uk_stock_hold', 'Order/StockHold')->append(['market_type' =>14]); // 股票持仓
Route::post('/order/uk_stock_place', 'Order/StockPlace')->append(['market_type' =>14]); // 股票挂单
Route::post('/order/uk_stock_back', 'Order/StockBack')->append(['market_type' =>14]); // 股票撤单
Route::post('/order/uk_stock_clear', 'Order/StockClear')->append(['market_type' =>14]); // 股票平仓
Route::post('/order/uk_stock_hold', 'Order/StockHold')->append(['market_type' => 14]); // 股票持仓
Route::post('/order/uk_stock_place', 'Order/StockPlace')->append(['market_type' => 14]); // 股票挂单
Route::post('/order/uk_stock_back', 'Order/StockBack')->append(['market_type' => 14]); // 股票撤单
Route::post('/order/uk_stock_clear', 'Order/StockClear')->append(['market_type' => 14]); // 股票平仓
// 法国股票
Route::post('/order/fur_stock_hold', 'Order/StockHold')->append(['market_type' =>15]); // 股票持仓
Route::post('/order/fur_stock_place', 'Order/StockPlace')->append(['market_type' =>15]); // 股票挂单
Route::post('/order/fur_stock_back', 'Order/StockBack')->append(['market_type' =>15]); // 股票撤单
Route::post('/order/fur_stock_clear', 'Order/StockClear')->append(['market_type' =>15]); // 股票平仓
Route::post('/order/fur_stock_hold', 'Order/StockHold')->append(['market_type' => 15]); // 股票持仓
Route::post('/order/fur_stock_place', 'Order/StockPlace')->append(['market_type' => 15]); // 股票挂单
Route::post('/order/fur_stock_back', 'Order/StockBack')->append(['market_type' => 15]); // 股票撤单
Route::post('/order/fur_stock_clear', 'Order/StockClear')->append(['market_type' => 15]); // 股票平仓
// 德国股票
Route::post('/order/eur_stock_hold', 'Order/StockHold')->append(['market_type' =>16]); // 股票持仓
Route::post('/order/eur_stock_place', 'Order/StockPlace')->append(['market_type' =>16]); // 股票挂单
Route::post('/order/eur_stock_back', 'Order/StockBack')->append(['market_type' =>16]); // 股票撤单
Route::post('/order/eur_stock_clear', 'Order/StockClear')->append(['market_type' =>16]); // 股票平仓
Route::post('/order/eur_stock_hold', 'Order/StockHold')->append(['market_type' => 16]); // 股票持仓
Route::post('/order/eur_stock_place', 'Order/StockPlace')->append(['market_type' => 16]); // 股票挂单
Route::post('/order/eur_stock_back', 'Order/StockBack')->append(['market_type' => 16]); // 股票撤单
Route::post('/order/eur_stock_clear', 'Order/StockClear')->append(['market_type' => 16]); // 股票平仓
// 巴西股票
Route::post('/order/eur_stock_hold', 'Order/StockHold')->append(['market_type' =>17]); // 股票持仓
Route::post('/order/eur_stock_place', 'Order/StockPlace')->append(['market_type' =>17]); // 股票挂单
Route::post('/order/eur_stock_back', 'Order/StockBack')->append(['market_type' =>17]); // 股票撤单
Route::post('/order/eur_stock_clear', 'Order/StockClear')->append(['market_type' =>17]); // 股票平仓
Route::post('/order/eur_stock_hold', 'Order/StockHold')->append(['market_type' => 17]); // 股票持仓
Route::post('/order/eur_stock_place', 'Order/StockPlace')->append(['market_type' => 17]); // 股票挂单
Route::post('/order/eur_stock_back', 'Order/StockBack')->append(['market_type' => 17]); // 股票撤单
Route::post('/order/eur_stock_clear', 'Order/StockClear')->append(['market_type' => 17]); // 股票平仓
// 巴西股票
Route::post('/order/jp_stock_hold', 'Order/StockHold')->append(['market_type' =>18]); // 股票持仓
Route::post('/order/jp_stock_place', 'Order/StockPlace')->append(['market_type' =>18]); // 股票挂单
Route::post('/order/jp_stock_back', 'Order/StockBack')->append(['market_type' =>18]); // 股票撤单
Route::post('/order/jp_stock_clear', 'Order/StockClear')->append(['market_type' =>18]); // 股票平仓
Route::post('/order/jp_stock_hold', 'Order/StockHold')->append(['market_type' => 18]); // 股票持仓
Route::post('/order/jp_stock_place', 'Order/StockPlace')->append(['market_type' => 18]); // 股票挂单
Route::post('/order/jp_stock_back', 'Order/StockBack')->append(['market_type' => 18]); // 股票撤单
Route::post('/order/jp_stock_clear', 'Order/StockClear')->append(['market_type' => 18]); // 股票平仓
// 印度股指订单
Route::post('order/inr_stock_index_hold', 'Order/StockHold')->append(['market_type' =>20]); // 印度股指持仓
Route::post('order/inr_stock_index_place', 'Order/stockPlace')->append(['market_type' =>20]); // 印度股指挂单
Route::post('order/inr_stock_index_back', 'Order/stockBack')->append(['market_type' =>20]); // 印度股指撤单
Route::post('order/inr_stock_index_clear', 'Order/stockClear')->append(['market_type' =>20]); // 印度股指平仓
Route::post('order/inr_stock_index_hold', 'Order/StockHold')->append(['market_type' => 20]); // 印度股指持仓
Route::post('order/inr_stock_index_place', 'Order/stockPlace')->append(['market_type' => 20]); // 印度股指挂单
Route::post('order/inr_stock_index_back', 'Order/stockBack')->append(['market_type' => 20]); // 印度股指撤单
Route::post('order/inr_stock_index_clear', 'Order/stockClear')->append(['market_type' => 20]); // 印度股指平仓
// 黄金期货订单
Route::post('order/gold_futures_hold', 'Order/StockHold')->append(['market_type' =>21]); // 黄金期货持仓
Route::post('order/gold_futures_place', 'Order/stockPlace')->append(['market_type' =>21]); // 黄金期货挂单
Route::post('order/gold_futures_back', 'Order/stockBack')->append(['market_type' =>21]); // 黄金期货撤单
Route::post('order/gold_futures_clear', 'Order/stockClear')->append(['market_type' =>21]); // 黄金期货平仓
Route::post('order/gold_futures_hold', 'Order/StockHold')->append(['market_type' => 21]); // 黄金期货持仓
Route::post('order/gold_futures_place', 'Order/stockPlace')->append(['market_type' => 21]); // 黄金期货挂单
Route::post('order/gold_futures_back', 'Order/stockBack')->append(['market_type' => 21]); // 黄金期货撤单
Route::post('order/gold_futures_clear', 'Order/stockClear')->append(['market_type' => 21]); // 黄金期货平仓
// 印度期权
Route::post('/order/in_option_hold', 'Order/inOptionHold'); // 股票持仓
@ -247,6 +247,8 @@ Route::group('/', function () {
// 送会员
Route::post('admin/give_vip', 'Admin/giveVip')->middleware('admin_log'); //赠送用户vip
Route::post('admin/buy_vip_log', 'Admin/buyVipLog')->middleware('admin_log'); //用户购买VIP记录
Route::post('admin/generate_vip_code', 'Admin/generateVipCode')->middleware('admin_log'); //生成vip兑换码
Route::post('admin/get_vip_code', 'Admin/getVipCode')->middleware('admin_log'); //获取vip兑换码列表
// 配置管理
// 外汇插针行情
@ -309,65 +311,65 @@ Route::group('/', function () {
Route::post('/setting/digital_select', 'setting.Digital/getTradeNameList');
// 美股股票配置
Route::post('/setting/us_stock_index', 'setting.Stock/index')->append(['market_type' =>3]);
Route::post('/setting/us_stock_add', 'setting.Stock/add')->append(['market_type' =>3])->middleware('admin_log');
Route::post('/setting/us_stock_edit', 'setting.Stock/edit')->append(['market_type' =>3])->middleware('admin_log');
Route::post('/setting/us_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' =>3]);
Route::post('/setting/us_stock_index', 'setting.Stock/index')->append(['market_type' => 3]);
Route::post('/setting/us_stock_add', 'setting.Stock/add')->append(['market_type' => 3])->middleware('admin_log');
Route::post('/setting/us_stock_edit', 'setting.Stock/edit')->append(['market_type' => 3])->middleware('admin_log');
Route::post('/setting/us_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' => 3]);
// 印尼股票配置
Route::post('/setting/idn_stock_index', 'setting.Stock/index')->append(['market_type' =>4]);
Route::post('/setting/idn_stock_add', 'setting.Stock/add')->append(['market_type' =>4])->middleware('admin_log');
Route::post('/setting/idn_stock_edit', 'setting.Stock/edit')->append(['market_type' =>4])->middleware('admin_log');
Route::post('/setting/idn_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' =>4]);
Route::post('/setting/idn_stock_index', 'setting.Stock/index')->append(['market_type' => 4]);
Route::post('/setting/idn_stock_add', 'setting.Stock/add')->append(['market_type' => 4])->middleware('admin_log');
Route::post('/setting/idn_stock_edit', 'setting.Stock/edit')->append(['market_type' => 4])->middleware('admin_log');
Route::post('/setting/idn_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' => 4]);
// 马股股票配置
Route::post('/setting/mys_stock_index', 'setting.Stock/index')->append(['market_type' =>5]);
Route::post('/setting/mys_stock_add', 'setting.Stock/add')->append(['market_type' =>5])->middleware('admin_log');
Route::post('/setting/mys_stock_edit', 'setting.Stock/edit')->append(['market_type' =>5])->middleware('admin_log');
Route::post('/setting/mys_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' =>5]);
Route::post('/setting/mys_stock_index', 'setting.Stock/index')->append(['market_type' => 5]);
Route::post('/setting/mys_stock_add', 'setting.Stock/add')->append(['market_type' => 5])->middleware('admin_log');
Route::post('/setting/mys_stock_edit', 'setting.Stock/edit')->append(['market_type' => 5])->middleware('admin_log');
Route::post('/setting/mys_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' => 5]);
// 泰股股票配置
Route::post('/setting/tha_stock_index', 'setting.Stock/index')->append(['market_type' =>6]);
Route::post('/setting/tha_stock_add', 'setting.Stock/add')->append(['market_type' =>6])->middleware('admin_log');
Route::post('/setting/tha_stock_edit', 'setting.Stock/edit')->append(['market_type' =>6])->middleware('admin_log');
Route::post('/setting/tha_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' =>6]);
Route::post('/setting/tha_stock_index', 'setting.Stock/index')->append(['market_type' => 6]);
Route::post('/setting/tha_stock_add', 'setting.Stock/add')->append(['market_type' => 6])->middleware('admin_log');
Route::post('/setting/tha_stock_edit', 'setting.Stock/edit')->append(['market_type' => 6])->middleware('admin_log');
Route::post('/setting/tha_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' => 6]);
// 印度股票配置
Route::post('/setting/in_stock_index', 'setting.Stock/index')->append(['market_type' =>7]);
Route::post('/setting/in_stock_add', 'setting.Stock/add')->append(['market_type' =>7])->middleware('admin_log');
Route::post('/setting/in_stock_edit', 'setting.Stock/edit')->append(['market_type' =>7])->middleware('admin_log');
Route::post('/setting/in_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' =>7]);
Route::post('/setting/in_stock_index', 'setting.Stock/index')->append(['market_type' => 7]);
Route::post('/setting/in_stock_add', 'setting.Stock/add')->append(['market_type' => 7])->middleware('admin_log');
Route::post('/setting/in_stock_edit', 'setting.Stock/edit')->append(['market_type' => 7])->middleware('admin_log');
Route::post('/setting/in_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' => 7]);
// 新加坡股票配置
Route::post('/setting/sgd_stock_index', 'setting.Stock/index')->append(['market_type' =>9]);
Route::post('/setting/sgd_stock_add', 'setting.Stock/add')->append(['market_type' =>9])->middleware('admin_log');
Route::post('/setting/sgd_stock_edit', 'setting.Stock/edit')->append(['market_type' =>9])->middleware('admin_log');
Route::post('/setting/sgd_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' =>9]);
Route::post('/setting/sgd_stock_index', 'setting.Stock/index')->append(['market_type' => 9]);
Route::post('/setting/sgd_stock_add', 'setting.Stock/add')->append(['market_type' => 9])->middleware('admin_log');
Route::post('/setting/sgd_stock_edit', 'setting.Stock/edit')->append(['market_type' => 9])->middleware('admin_log');
Route::post('/setting/sgd_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' => 9]);
// 香港股票配置
Route::post('/setting/hk_stock_index', 'setting.Stock/index')->append(['market_type' =>12]);
Route::post('/setting/hk_stock_add', 'setting.Stock/add')->append(['market_type' =>12])->middleware('admin_log');
Route::post('/setting/hk_stock_edit', 'setting.Stock/edit')->append(['market_type' =>12])->middleware('admin_log');
Route::post('/setting/hk_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' =>12]);
Route::post('/setting/hk_stock_index', 'setting.Stock/index')->append(['market_type' => 12]);
Route::post('/setting/hk_stock_add', 'setting.Stock/add')->append(['market_type' => 12])->middleware('admin_log');
Route::post('/setting/hk_stock_edit', 'setting.Stock/edit')->append(['market_type' => 12])->middleware('admin_log');
Route::post('/setting/hk_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' => 12]);
// 英国股票配置
Route::post('/setting/uk_stock_index', 'setting.Stock/index')->append(['market_type' =>14]);
Route::post('/setting/uk_stock_add', 'setting.Stock/add')->append(['market_type' =>14])->middleware('admin_log');
Route::post('/setting/uk_stock_edit', 'setting.Stock/edit')->append(['market_type' =>14])->middleware('admin_log');
Route::post('/setting/uk_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' =>14]);
Route::post('/setting/uk_stock_index', 'setting.Stock/index')->append(['market_type' => 14]);
Route::post('/setting/uk_stock_add', 'setting.Stock/add')->append(['market_type' => 14])->middleware('admin_log');
Route::post('/setting/uk_stock_edit', 'setting.Stock/edit')->append(['market_type' => 14])->middleware('admin_log');
Route::post('/setting/uk_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' => 14]);
// 法国股票配置
Route::post('/setting/fur_stock_index', 'setting.Stock/index')->append(['market_type' =>15]);
Route::post('/setting/fur_stock_add', 'setting.Stock/add')->append(['market_type' =>15])->middleware('admin_log');
Route::post('/setting/fur_stock_edit', 'setting.Stock/edit')->append(['market_type' =>15])->middleware('admin_log');
Route::post('/setting/fur_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' =>15]);
Route::post('/setting/fur_stock_index', 'setting.Stock/index')->append(['market_type' => 15]);
Route::post('/setting/fur_stock_add', 'setting.Stock/add')->append(['market_type' => 15])->middleware('admin_log');
Route::post('/setting/fur_stock_edit', 'setting.Stock/edit')->append(['market_type' => 15])->middleware('admin_log');
Route::post('/setting/fur_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' => 15]);
// 德国股票配置
Route::post('/setting/eur_stock_index', 'setting.Stock/index')->append(['market_type' =>16]);
Route::post('/setting/eur_stock_add', 'setting.Stock/add')->append(['market_type' =>16])->middleware('admin_log');
Route::post('/setting/eur_stock_edit', 'setting.Stock/edit')->append(['market_type' =>16])->middleware('admin_log');
Route::post('/setting/eur_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' =>16]);
Route::post('/setting/eur_stock_index', 'setting.Stock/index')->append(['market_type' => 16]);
Route::post('/setting/eur_stock_add', 'setting.Stock/add')->append(['market_type' => 16])->middleware('admin_log');
Route::post('/setting/eur_stock_edit', 'setting.Stock/edit')->append(['market_type' => 16])->middleware('admin_log');
Route::post('/setting/eur_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' => 16]);
// 巴西股票配置
Route::post('/setting/brl_stock_index', 'setting.Stock/index')->append(['market_type' =>17]);
Route::post('/setting/brl_stock_add', 'setting.Stock/add')->append(['market_type' =>17])->middleware('admin_log');
Route::post('/setting/brl_stock_edit', 'setting.Stock/edit')->append(['market_type' =>17])->middleware('admin_log');
Route::post('/setting/brl_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' =>17]);
Route::post('/setting/brl_stock_index', 'setting.Stock/index')->append(['market_type' => 17]);
Route::post('/setting/brl_stock_add', 'setting.Stock/add')->append(['market_type' => 17])->middleware('admin_log');
Route::post('/setting/brl_stock_edit', 'setting.Stock/edit')->append(['market_type' => 17])->middleware('admin_log');
Route::post('/setting/brl_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' => 17]);
// 日本股票配置
Route::post('/setting/jp_stock_index', 'setting.Stock/index')->append(['market_type' =>18]);
Route::post('/setting/jp_stock_add', 'setting.Stock/add')->append(['market_type' =>18])->middleware('admin_log');
Route::post('/setting/jp_stock_edit', 'setting.Stock/edit')->append(['market_type' =>18])->middleware('admin_log');
Route::post('/setting/jp_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' =>18]);
Route::post('/setting/jp_stock_index', 'setting.Stock/index')->append(['market_type' => 18]);
Route::post('/setting/jp_stock_add', 'setting.Stock/add')->append(['market_type' => 18])->middleware('admin_log');
Route::post('/setting/jp_stock_edit', 'setting.Stock/edit')->append(['market_type' => 18])->middleware('admin_log');
Route::post('/setting/jp_stock_select', 'setting.Stock/getTradeNameList')->append(['market_type' => 18]);
// 印度期权配置
Route::post('/setting/in_option_index', 'setting.Option/indexIn');
@ -431,106 +433,106 @@ Route::group('/', function () {
Route::post('/setting/payment_info', 'setting.Payment/info');
// 美股新股设置
Route::post('/setting/pre_us_stock_index', 'setting.PreStock/index')->append(['market_type' =>3]);
Route::post('/setting/pre_us_stock_add', 'setting.PreStock/add')->append(['market_type' =>3])->middleware('admin_log'); // 美股新股配置 - 新增
Route::post('/setting/pre_us_stock_edit', 'setting.PreStock/edit')->append(['market_type' =>3])->middleware('admin_log');
Route::post('/setting/pre_us_stock_open', 'setting.PreStock/open')->append(['market_type' =>3])->middleware('admin_log'); // 股票上市
Route::post('/setting/pre_us_stock_del', 'setting.PreStock/del')->append(['market_type' =>3])->middleware('admin_log');
Route::post('/setting/pre_us_stock_note', 'setting.PreStock/note')->append(['market_type' =>3])->middleware('admin_log');
Route::post('/setting/pre_us_stock_cancel', 'setting.PreStock/cancel')->append(['market_type' =>3])->middleware('admin_log');//取消IPO
Route::post('/setting/pre_us_stock_index', 'setting.PreStock/index')->append(['market_type' => 3]);
Route::post('/setting/pre_us_stock_add', 'setting.PreStock/add')->append(['market_type' => 3])->middleware('admin_log'); // 美股新股配置 - 新增
Route::post('/setting/pre_us_stock_edit', 'setting.PreStock/edit')->append(['market_type' => 3])->middleware('admin_log');
Route::post('/setting/pre_us_stock_open', 'setting.PreStock/open')->append(['market_type' => 3])->middleware('admin_log'); // 股票上市
Route::post('/setting/pre_us_stock_del', 'setting.PreStock/del')->append(['market_type' => 3])->middleware('admin_log');
Route::post('/setting/pre_us_stock_note', 'setting.PreStock/note')->append(['market_type' => 3])->middleware('admin_log');
Route::post('/setting/pre_us_stock_cancel', 'setting.PreStock/cancel')->append(['market_type' => 3])->middleware('admin_log'); //取消IPO
// 印尼股新股设置
Route::post('/setting/pre_idn_stock_index', 'setting.PreStock/index')->append(['market_type' =>4]);
Route::post('/setting/pre_idn_stock_add', 'setting.PreStock/add')->append(['market_type' =>4])->middleware('admin_log');
Route::post('/setting/pre_idn_stock_edit', 'setting.PreStock/edit')->append(['market_type' =>4])->middleware('admin_log');
Route::post('/setting/pre_idn_stock_open', 'setting.PreStock/open')->append(['market_type' =>4])->middleware('admin_log');
Route::post('/setting/pre_idn_stock_del', 'setting.PreStock/del')->append(['market_type' =>4])->middleware('admin_log');
Route::post('/setting/pre_idn_stock_note', 'setting.PreStock/note')->append(['market_type' =>4])->middleware('admin_log');
Route::post('/setting/pre_idn_stock_cancel', 'setting.PreStock/cancel')->append(['market_type' =>4])->middleware('admin_log');
Route::post('/setting/pre_idn_stock_index', 'setting.PreStock/index')->append(['market_type' => 4]);
Route::post('/setting/pre_idn_stock_add', 'setting.PreStock/add')->append(['market_type' => 4])->middleware('admin_log');
Route::post('/setting/pre_idn_stock_edit', 'setting.PreStock/edit')->append(['market_type' => 4])->middleware('admin_log');
Route::post('/setting/pre_idn_stock_open', 'setting.PreStock/open')->append(['market_type' => 4])->middleware('admin_log');
Route::post('/setting/pre_idn_stock_del', 'setting.PreStock/del')->append(['market_type' => 4])->middleware('admin_log');
Route::post('/setting/pre_idn_stock_note', 'setting.PreStock/note')->append(['market_type' => 4])->middleware('admin_log');
Route::post('/setting/pre_idn_stock_cancel', 'setting.PreStock/cancel')->append(['market_type' => 4])->middleware('admin_log');
// 马来股新股设置
Route::post('/setting/pre_mys_stock_index', 'setting.PreStock/index')->append(['market_type' =>5]);
Route::post('/setting/pre_mys_stock_add', 'setting.PreStock/add')->append(['market_type' =>5])->middleware('admin_log');
Route::post('/setting/pre_mys_stock_edit', 'setting.PreStock/edit')->append(['market_type' =>5])->middleware('admin_log');
Route::post('/setting/pre_mys_stock_open', 'setting.PreStock/open')->append(['market_type' =>5])->middleware('admin_log');
Route::post('/setting/pre_mys_stock_del', 'setting.PreStock/del')->append(['market_type' =>5])->middleware('admin_log');
Route::post('/setting/pre_mys_stock_note', 'setting.PreStock/note')->append(['market_type' =>5])->middleware('admin_log');
Route::post('/setting/pre_mys_stock_cancel', 'setting.PreStock/cancel')->append(['market_type' =>5])->middleware('admin_log');
Route::post('/setting/pre_mys_stock_index', 'setting.PreStock/index')->append(['market_type' => 5]);
Route::post('/setting/pre_mys_stock_add', 'setting.PreStock/add')->append(['market_type' => 5])->middleware('admin_log');
Route::post('/setting/pre_mys_stock_edit', 'setting.PreStock/edit')->append(['market_type' => 5])->middleware('admin_log');
Route::post('/setting/pre_mys_stock_open', 'setting.PreStock/open')->append(['market_type' => 5])->middleware('admin_log');
Route::post('/setting/pre_mys_stock_del', 'setting.PreStock/del')->append(['market_type' => 5])->middleware('admin_log');
Route::post('/setting/pre_mys_stock_note', 'setting.PreStock/note')->append(['market_type' => 5])->middleware('admin_log');
Route::post('/setting/pre_mys_stock_cancel', 'setting.PreStock/cancel')->append(['market_type' => 5])->middleware('admin_log');
// 泰股新股设置
Route::post('/setting/pre_tha_stock_index', 'setting.PreStock/index')->append(['market_type' =>6]);
Route::post('/setting/pre_tha_stock_add', 'setting.PreStock/add')->append(['market_type' =>6])->middleware('admin_log');
Route::post('/setting/pre_tha_stock_edit', 'setting.PreStock/edit')->append(['market_type' =>6])->middleware('admin_log');
Route::post('/setting/pre_tha_stock_open', 'setting.PreStock/open')->append(['market_type' =>6])->middleware('admin_log');
Route::post('/setting/pre_tha_stock_del', 'setting.PreStock/del')->append(['market_type' =>6])->middleware('admin_log');
Route::post('/setting/pre_tha_stock_note', 'setting.PreStock/note')->append(['market_type' =>6])->middleware('admin_log');
Route::post('/setting/pre_tha_stock_cancel', 'setting.PreStock/cancel')->append(['market_type' =>6])->middleware('admin_log');
Route::post('/setting/pre_tha_stock_index', 'setting.PreStock/index')->append(['market_type' => 6]);
Route::post('/setting/pre_tha_stock_add', 'setting.PreStock/add')->append(['market_type' => 6])->middleware('admin_log');
Route::post('/setting/pre_tha_stock_edit', 'setting.PreStock/edit')->append(['market_type' => 6])->middleware('admin_log');
Route::post('/setting/pre_tha_stock_open', 'setting.PreStock/open')->append(['market_type' => 6])->middleware('admin_log');
Route::post('/setting/pre_tha_stock_del', 'setting.PreStock/del')->append(['market_type' => 6])->middleware('admin_log');
Route::post('/setting/pre_tha_stock_note', 'setting.PreStock/note')->append(['market_type' => 6])->middleware('admin_log');
Route::post('/setting/pre_tha_stock_cancel', 'setting.PreStock/cancel')->append(['market_type' => 6])->middleware('admin_log');
// 印度股新股设置
Route::post('/setting/pre_in_stock_index', 'setting.PreStock/index')->append(['market_type' =>7]);
Route::post('/setting/pre_in_stock_add', 'setting.PreStock/add')->append(['market_type' =>7])->middleware('admin_log');
Route::post('/setting/pre_in_stock_edit', 'setting.PreStock/edit')->append(['market_type' =>7])->middleware('admin_log');
Route::post('/setting/pre_in_stock_open', 'setting.PreStock/open')->append(['market_type' =>7])->middleware('admin_log');
Route::post('/setting/pre_in_stock_del', 'setting.PreStock/del')->append(['market_type' =>7])->middleware('admin_log');
Route::post('/setting/pre_in_stock_note', 'setting.PreStock/note')->append(['market_type' =>7])->middleware('admin_log');
Route::post('/setting/pre_in_stock_cancel', 'setting.PreStock/cancel')->append(['market_type' =>7])->middleware('admin_log');
Route::post('/setting/pre_in_stock_index', 'setting.PreStock/index')->append(['market_type' => 7]);
Route::post('/setting/pre_in_stock_add', 'setting.PreStock/add')->append(['market_type' => 7])->middleware('admin_log');
Route::post('/setting/pre_in_stock_edit', 'setting.PreStock/edit')->append(['market_type' => 7])->middleware('admin_log');
Route::post('/setting/pre_in_stock_open', 'setting.PreStock/open')->append(['market_type' => 7])->middleware('admin_log');
Route::post('/setting/pre_in_stock_del', 'setting.PreStock/del')->append(['market_type' => 7])->middleware('admin_log');
Route::post('/setting/pre_in_stock_note', 'setting.PreStock/note')->append(['market_type' => 7])->middleware('admin_log');
Route::post('/setting/pre_in_stock_cancel', 'setting.PreStock/cancel')->append(['market_type' => 7])->middleware('admin_log');
// 新加坡股新股设置
Route::post('/setting/pre_sgd_stock_index', 'setting.PreStock/index')->append(['market_type' =>9]);
Route::post('/setting/pre_sgd_stock_add', 'setting.PreStock/add')->append(['market_type' =>9])->middleware('admin_log');
Route::post('/setting/pre_sgd_stock_edit', 'setting.PreStock/edit')->append(['market_type' =>9])->middleware('admin_log');
Route::post('/setting/pre_sgd_stock_open', 'setting.PreStock/open')->append(['market_type' =>9])->middleware('admin_log');
Route::post('/setting/pre_sgd_stock_del', 'setting.PreStock/del')->append(['market_type' =>9])->middleware('admin_log');
Route::post('/setting/pre_sgd_stock_note', 'setting.PreStock/note')->append(['market_type' =>9])->middleware('admin_log');
Route::post('/setting/pre_sgd_stock_cancel', 'setting.PreStock/cancel')->append(['market_type' =>9])->middleware('admin_log');
Route::post('/setting/pre_sgd_stock_index', 'setting.PreStock/index')->append(['market_type' => 9]);
Route::post('/setting/pre_sgd_stock_add', 'setting.PreStock/add')->append(['market_type' => 9])->middleware('admin_log');
Route::post('/setting/pre_sgd_stock_edit', 'setting.PreStock/edit')->append(['market_type' => 9])->middleware('admin_log');
Route::post('/setting/pre_sgd_stock_open', 'setting.PreStock/open')->append(['market_type' => 9])->middleware('admin_log');
Route::post('/setting/pre_sgd_stock_del', 'setting.PreStock/del')->append(['market_type' => 9])->middleware('admin_log');
Route::post('/setting/pre_sgd_stock_note', 'setting.PreStock/note')->append(['market_type' => 9])->middleware('admin_log');
Route::post('/setting/pre_sgd_stock_cancel', 'setting.PreStock/cancel')->append(['market_type' => 9])->middleware('admin_log');
// 香港新股设置
Route::post('/setting/pre_hk_stock_index', 'setting.PreStock/index')->append(['market_type' =>12]);
Route::post('/setting/pre_hk_stock_add', 'setting.PreStock/add')->append(['market_type' =>12])->middleware('admin_log');
Route::post('/setting/pre_hk_stock_edit', 'setting.PreStock/edit')->append(['market_type' =>12])->middleware('admin_log');
Route::post('/setting/pre_hk_stock_open', 'setting.PreStock/open')->append(['market_type' =>12])->middleware('admin_log');
Route::post('/setting/pre_hk_stock_del', 'setting.PreStock/del')->append(['market_type' =>12])->middleware('admin_log');
Route::post('/setting/pre_hk_stock_note', 'setting.PreStock/note')->append(['market_type' =>12])->middleware('admin_log');
Route::post('/setting/pre_hk_stock_cancel', 'setting.PreStock/cancel')->append(['market_type' =>12])->middleware('admin_log');
Route::post('/setting/pre_hk_stock_index', 'setting.PreStock/index')->append(['market_type' => 12]);
Route::post('/setting/pre_hk_stock_add', 'setting.PreStock/add')->append(['market_type' => 12])->middleware('admin_log');
Route::post('/setting/pre_hk_stock_edit', 'setting.PreStock/edit')->append(['market_type' => 12])->middleware('admin_log');
Route::post('/setting/pre_hk_stock_open', 'setting.PreStock/open')->append(['market_type' => 12])->middleware('admin_log');
Route::post('/setting/pre_hk_stock_del', 'setting.PreStock/del')->append(['market_type' => 12])->middleware('admin_log');
Route::post('/setting/pre_hk_stock_note', 'setting.PreStock/note')->append(['market_type' => 12])->middleware('admin_log');
Route::post('/setting/pre_hk_stock_cancel', 'setting.PreStock/cancel')->append(['market_type' => 12])->middleware('admin_log');
// 英国新股设置
Route::post('/setting/pre_uk_stock_index', 'setting.PreStock/index')->append(['market_type' =>14]);
Route::post('/setting/pre_uk_stock_add', 'setting.PreStock/add')->append(['market_type' =>14])->middleware('admin_log');
Route::post('/setting/pre_uk_stock_edit', 'setting.PreStock/edit')->append(['market_type' =>14])->middleware('admin_log');
Route::post('/setting/pre_uk_stock_open', 'setting.PreStock/open')->append(['market_type' =>14])->middleware('admin_log');
Route::post('/setting/pre_uk_stock_del', 'setting.PreStock/del')->append(['market_type' =>14])->middleware('admin_log');
Route::post('/setting/pre_uk_stock_note', 'setting.PreStock/note')->append(['market_type' =>14])->middleware('admin_log');
Route::post('/setting/pre_uk_stock_cancel', 'setting.PreStock/cancel')->append(['market_type' =>14])->middleware('admin_log');
Route::post('/setting/pre_fur_stock_index', 'setting.PreStock/index')->append(['market_type' =>15]);
Route::post('/setting/pre_fur_stock_add', 'setting.PreStock/add')->append(['market_type' =>15])->middleware('admin_log');
Route::post('/setting/pre_fur_stock_edit', 'setting.PreStock/edit')->append(['market_type' =>15])->middleware('admin_log');
Route::post('/setting/pre_fur_stock_open', 'setting.PreStock/open')->append(['market_type' =>15])->middleware('admin_log');
Route::post('/setting/pre_fur_stock_del', 'setting.PreStock/del')->append(['market_type' =>15])->middleware('admin_log');
Route::post('/setting/pre_fur_stock_note', 'setting.PreStock/note')->append(['market_type' =>15])->middleware('admin_log');
Route::post('/setting/pre_fur_stock_cancel', 'setting.PreStock/cancel')->append(['market_type' =>15])->middleware('admin_log');
Route::post('/setting/pre_eur_stock_index', 'setting.PreStock/index')->append(['market_type' =>16]);
Route::post('/setting/pre_eur_stock_add', 'setting.PreStock/add')->append(['market_type' =>16])->middleware('admin_log');
Route::post('/setting/pre_eur_stock_edit', 'setting.PreStock/edit')->append(['market_type' =>16])->middleware('admin_log');
Route::post('/setting/pre_eur_stock_open', 'setting.PreStock/open')->append(['market_type' =>16])->middleware('admin_log');
Route::post('/setting/pre_eur_stock_del', 'setting.PreStock/del')->append(['market_type' =>16])->middleware('admin_log');
Route::post('/setting/pre_eur_stock_note', 'setting.PreStock/note')->append(['market_type' =>16])->middleware('admin_log');
Route::post('/setting/pre_eur_stock_cancel', 'setting.PreStock/cancel')->append(['market_type' =>16])->middleware('admin_log');
Route::post('/setting/pre_brl_stock_index', 'setting.PreStock/index')->append(['market_type' =>17]);
Route::post('/setting/pre_brl_stock_add', 'setting.PreStock/add')->append(['market_type' =>17])->middleware('admin_log');
Route::post('/setting/pre_brl_stock_edit', 'setting.PreStock/edit')->append(['market_type' =>17])->middleware('admin_log');
Route::post('/setting/pre_brl_stock_open', 'setting.PreStock/open')->append(['market_type' =>17])->middleware('admin_log');
Route::post('/setting/pre_brl_stock_del', 'setting.PreStock/del')->append(['market_type' =>17])->middleware('admin_log');
Route::post('/setting/pre_brl_stock_note', 'setting.PreStock/note')->append(['market_type' =>17])->middleware('admin_log');
Route::post('/setting/pre_jp_stock_index', 'setting.PreStock/index')->append(['market_type' =>18]);
Route::post('/setting/pre_jp_stock_add', 'setting.PreStock/add')->append(['market_type' =>18])->middleware('admin_log');
Route::post('/setting/pre_jp_stock_edit', 'setting.PreStock/edit')->append(['market_type' =>18])->middleware('admin_log');
Route::post('/setting/pre_jp_stock_open', 'setting.PreStock/open')->append(['market_type' =>18])->middleware('admin_log');
Route::post('/setting/pre_jp_stock_del', 'setting.PreStock/del')->append(['market_type' =>18])->middleware('admin_log');
Route::post('/setting/pre_jp_stock_note', 'setting.PreStock/note')->append(['market_type' =>18])->middleware('admin_log');
Route::post('/setting/pre_uk_stock_index', 'setting.PreStock/index')->append(['market_type' => 14]);
Route::post('/setting/pre_uk_stock_add', 'setting.PreStock/add')->append(['market_type' => 14])->middleware('admin_log');
Route::post('/setting/pre_uk_stock_edit', 'setting.PreStock/edit')->append(['market_type' => 14])->middleware('admin_log');
Route::post('/setting/pre_uk_stock_open', 'setting.PreStock/open')->append(['market_type' => 14])->middleware('admin_log');
Route::post('/setting/pre_uk_stock_del', 'setting.PreStock/del')->append(['market_type' => 14])->middleware('admin_log');
Route::post('/setting/pre_uk_stock_note', 'setting.PreStock/note')->append(['market_type' => 14])->middleware('admin_log');
Route::post('/setting/pre_uk_stock_cancel', 'setting.PreStock/cancel')->append(['market_type' => 14])->middleware('admin_log');
Route::post('/setting/pre_fur_stock_index', 'setting.PreStock/index')->append(['market_type' => 15]);
Route::post('/setting/pre_fur_stock_add', 'setting.PreStock/add')->append(['market_type' => 15])->middleware('admin_log');
Route::post('/setting/pre_fur_stock_edit', 'setting.PreStock/edit')->append(['market_type' => 15])->middleware('admin_log');
Route::post('/setting/pre_fur_stock_open', 'setting.PreStock/open')->append(['market_type' => 15])->middleware('admin_log');
Route::post('/setting/pre_fur_stock_del', 'setting.PreStock/del')->append(['market_type' => 15])->middleware('admin_log');
Route::post('/setting/pre_fur_stock_note', 'setting.PreStock/note')->append(['market_type' => 15])->middleware('admin_log');
Route::post('/setting/pre_fur_stock_cancel', 'setting.PreStock/cancel')->append(['market_type' => 15])->middleware('admin_log');
Route::post('/setting/pre_eur_stock_index', 'setting.PreStock/index')->append(['market_type' => 16]);
Route::post('/setting/pre_eur_stock_add', 'setting.PreStock/add')->append(['market_type' => 16])->middleware('admin_log');
Route::post('/setting/pre_eur_stock_edit', 'setting.PreStock/edit')->append(['market_type' => 16])->middleware('admin_log');
Route::post('/setting/pre_eur_stock_open', 'setting.PreStock/open')->append(['market_type' => 16])->middleware('admin_log');
Route::post('/setting/pre_eur_stock_del', 'setting.PreStock/del')->append(['market_type' => 16])->middleware('admin_log');
Route::post('/setting/pre_eur_stock_note', 'setting.PreStock/note')->append(['market_type' => 16])->middleware('admin_log');
Route::post('/setting/pre_eur_stock_cancel', 'setting.PreStock/cancel')->append(['market_type' => 16])->middleware('admin_log');
Route::post('/setting/pre_brl_stock_index', 'setting.PreStock/index')->append(['market_type' => 17]);
Route::post('/setting/pre_brl_stock_add', 'setting.PreStock/add')->append(['market_type' => 17])->middleware('admin_log');
Route::post('/setting/pre_brl_stock_edit', 'setting.PreStock/edit')->append(['market_type' => 17])->middleware('admin_log');
Route::post('/setting/pre_brl_stock_open', 'setting.PreStock/open')->append(['market_type' => 17])->middleware('admin_log');
Route::post('/setting/pre_brl_stock_del', 'setting.PreStock/del')->append(['market_type' => 17])->middleware('admin_log');
Route::post('/setting/pre_brl_stock_note', 'setting.PreStock/note')->append(['market_type' => 17])->middleware('admin_log');
Route::post('/setting/pre_jp_stock_index', 'setting.PreStock/index')->append(['market_type' => 18]);
Route::post('/setting/pre_jp_stock_add', 'setting.PreStock/add')->append(['market_type' => 18])->middleware('admin_log');
Route::post('/setting/pre_jp_stock_edit', 'setting.PreStock/edit')->append(['market_type' => 18])->middleware('admin_log');
Route::post('/setting/pre_jp_stock_open', 'setting.PreStock/open')->append(['market_type' => 18])->middleware('admin_log');
Route::post('/setting/pre_jp_stock_del', 'setting.PreStock/del')->append(['market_type' => 18])->middleware('admin_log');
Route::post('/setting/pre_jp_stock_note', 'setting.PreStock/note')->append(['market_type' => 18])->middleware('admin_log');
Route::post('/setting/pre_stock_cancel', 'setting.PreStock/cancel')->middleware('admin_log');
@ -563,18 +565,18 @@ Route::group('/', function () {
Route::post('/flow/fee', 'Flow/fee');
Route::post('/flow/brokerage', 'Flow/brokerage');
Route::post('/flow/us_stock', 'Flow/StockLogs')->append(['market_type' =>3]);
Route::post('/flow/idn_stock', 'Flow/StockLogs')->append(['market_type' =>4]);
Route::post('/flow/mys_stock', 'Flow/StockLogs')->append(['market_type' =>5]);
Route::post('/flow/tha_stock', 'Flow/StockLogs')->append(['market_type' =>6]);
Route::post('/flow/in_stock', 'Flow/StockLogs')->append(['market_type' =>7]);
Route::post('/flow/sgd_stock', 'Flow/StockLogs')->append(['market_type' =>9]);
Route::post('/flow/hk_stock', 'Flow/StockLogs')->append(['market_type' =>12]);
Route::post('/flow/uk_stock', 'Flow/StockLogs')->append(['market_type' =>14]);
Route::post('/flow/fur_stock', 'Flow/StockLogs')->append(['market_type' =>15]);
Route::post('/flow/eur_stock', 'Flow/StockLogs')->append(['market_type' =>16]);
Route::post('/flow/eur_stock', 'Flow/StockLogs')->append(['market_type' =>17]);
// Route::post('/flow/jp_stock', 'Flow/StockLogs')->append(['market_type' =>18]); // 原有的日股资产流水
Route::post('/flow/us_stock', 'Flow/StockLogs')->append(['market_type' => 3]);
Route::post('/flow/idn_stock', 'Flow/StockLogs')->append(['market_type' => 4]);
Route::post('/flow/mys_stock', 'Flow/StockLogs')->append(['market_type' => 5]);
Route::post('/flow/tha_stock', 'Flow/StockLogs')->append(['market_type' => 6]);
Route::post('/flow/in_stock', 'Flow/StockLogs')->append(['market_type' => 7]);
Route::post('/flow/sgd_stock', 'Flow/StockLogs')->append(['market_type' => 9]);
Route::post('/flow/hk_stock', 'Flow/StockLogs')->append(['market_type' => 12]);
Route::post('/flow/uk_stock', 'Flow/StockLogs')->append(['market_type' => 14]);
Route::post('/flow/fur_stock', 'Flow/StockLogs')->append(['market_type' => 15]);
Route::post('/flow/eur_stock', 'Flow/StockLogs')->append(['market_type' => 16]);
Route::post('/flow/eur_stock', 'Flow/StockLogs')->append(['market_type' => 17]);
// Route::post('/flow/jp_stock', 'Flow/StockLogs')->append(['market_type' =>18]); // 原有的日股资产流水
Route::post('/flow/jp_stock', 'Flow/jpStock'); // 新版的日股资产流水
Route::post('/flow/forex_stock', 'Flow/forexStock'); //大宗资产流水
Route::post('/flow/forex_list', 'Flow/forexList'); //外汇流水
@ -655,7 +657,10 @@ Route::group('/', function () {
Route::post('account/translator_bind_customer_list', 'Admin/translatorBindCustomerList')->middleware('admin_log'); // 翻译员绑定的客服列表
Route::post('account/group_leader_with_user', 'Admin/groupLeaderWithUser'); // 组长与用户添加chat好友
Route::post('account/seller_with_user', 'Admin/sellerWithUser'); // 电销与用户添加chat好友
Route::post('admin/get_user_access_log', 'Admin/getUserAccessLog'); //获取用户访问页面的记录
Route::any('admin/get_user_access_log', 'Admin/getUserAccessLog'); //获取用户访问页面的记录
Route::post('admin/get_user_access_log_summary', 'Admin/getUserAccessLogSummary'); //获取用户访问页面的记录
Route::any('admin/get_visitor_access_log', 'Admin/getVisitorAccessLog'); //获取游客访问页面的记录
Route::post('admin/get_visitor_access_log_summary', 'Admin/getVisitorAccessLogSummary'); //获取用户访问页面的记录
Route::post('admin/get_admin_operation_log', 'Admin/getAdminOperationLog'); //获取管理员admin的操作记录
//权限菜单
@ -738,4 +743,3 @@ Route::get('/setting/in_option_refresh', 'setting.Option/refresh');
// 修改 印度股-source
Route::post('/update_source', 'Index/updateSource');

446
app/admin/service/AdminService.php

@ -17,6 +17,8 @@ use app\model\UserAccessLogModel;
use app\model\UserChatGroupModel;
use app\model\UserChatLinkModel;
use app\model\UserModel;
use app\model\VipCodeModel;
use itinysun\model\helper\Service;
use think\facade\Cache;
use think\exception\ValidateException;
use app\utility\UnqId;
@ -36,12 +38,12 @@ class AdminService extends AdminBaseService
if (!isset($param['role_name'])) {
return $this->toData('400', '缺少参数');
}
$role = AuthRoleModel::where(['name'=>$param['role_name']])->find();
$role = AuthRoleModel::where(['name' => $param['role_name']])->find();
if (empty($role)) {
return $this->toData('500', '没有目标角色信息');
}
// 根据角色查询账号列表
$users = AdminModel::where(['role_id'=>$role->id])->select()->toArray();
$users = AdminModel::where(['role_id' => $role->id])->select()->toArray();
return $this->toData('0', 'ok', $users);
} catch (\Exception $e) {
return $this->toData('500', '系统错误', [$e->getMessage(), $e->getTrace()]);
@ -66,7 +68,7 @@ class AdminService extends AdminBaseService
return $this->toData('1', '添加失败');
}
// 检测一下是否注册过聊天账号,没有的话就注册一下聊天账号
$isRegChat = UserChatLinkModel::where(['user_id'=>$resAdmin->id, 'user_type'=>UserChatLinkModel::USER_CHAT_LINK_USER_TYPE_ADMIN])->find();
$isRegChat = UserChatLinkModel::where(['user_id' => $resAdmin->id, 'user_type' => UserChatLinkModel::USER_CHAT_LINK_USER_TYPE_ADMIN])->find();
if (empty($isRegChat)) {
$chatData = [
'Username' => $resAdmin->user_name, //用account.id + account.user_name 拼接作为聊天账号注册的Username
@ -87,13 +89,13 @@ class AdminService extends AdminBaseService
]);
}
// 检测一下是否创建过聊天群组,没有的话创建一个
$chatGroup = UserChatGroupModel::where(['user_id'=>$resAdmin->id,'remark'=>UserChatGroupModel::USER_CHAT_GROUP_REMARK_ADMIN_INIT])->find();
$chatGroup = UserChatGroupModel::where(['user_id' => $resAdmin->id, 'remark' => UserChatGroupModel::USER_CHAT_GROUP_REMARK_ADMIN_INIT])->find();
if (empty($chatGroup)) {
$groupName = 'ivs-group'.$resAdmin->id;
$groupName = 'ivs-group' . $resAdmin->id;
$chatGroupData = [
'Name' => $groupName,
];
$chatGroupUrl = env('CHAT_SERVER.BASE_URL') . '/api/group/'.$regChat['data']['uuid'];
$chatGroupUrl = env('CHAT_SERVER.BASE_URL') . '/api/group/' . $regChat['data']['uuid'];
$chatGroupRes = (new \app\utility\RequestChatServer())->ReqChatServer($chatGroupUrl, $chatGroupData);
if (!isset($chatGroupRes['data']['group_uuid'])) {
return $this->toData('100400', '创建聊天群组失败');
@ -113,7 +115,6 @@ class AdminService extends AdminBaseService
} catch (\Exception $exception) {
return $this->toData('100500', '系统繁忙.', [$exception->getMessage()]);
}
}
/**
@ -147,7 +148,7 @@ class AdminService extends AdminBaseService
$list[$i]['role_name'] = $roleList[$index]['name'];
}
$list[$i]['url'] = $host . '/register/index?=agent_code='.$list[$i]['invite_code'];
$list[$i]['url'] = $host . '/register/index?=agent_code=' . $list[$i]['invite_code'];
}
}
return $this->toData('0', 'SUCCESS', ['total' => $total, 'list' => $list]);
@ -183,7 +184,7 @@ class AdminService extends AdminBaseService
}
$infoArr['role_name'] = $role->name;
// 获取用户的聊天账号信息
$chatInfo = UserChatLinkModel::where(['user_id'=>$userId, 'user_type'=>UserChatLinkModel::USER_CHAT_LINK_USER_TYPE_ADMIN])->find();
$chatInfo = UserChatLinkModel::where(['user_id' => $userId, 'user_type' => UserChatLinkModel::USER_CHAT_LINK_USER_TYPE_ADMIN])->find();
$chat_uuid = 0;
if (!empty($chatInfo)) {
$chat_uuid = $chatInfo->chat_uuid;
@ -232,7 +233,6 @@ class AdminService extends AdminBaseService
} catch (\Exception $exception) {
return $this->toData('200500', 'The system is busy.', [$exception->getMessage()]);
}
}
/**
@ -273,7 +273,6 @@ class AdminService extends AdminBaseService
} catch (\Exception $exception) {
return $this->toData('200500', 'The system is busy.', [$exception->getMessage()]);
}
}
public function updateAccountStauts($accountId, $param): array
@ -300,7 +299,6 @@ class AdminService extends AdminBaseService
} catch (\Exception $exception) {
return $this->toData('200500', 'The system is busy.', [$exception->getMessage()]);
}
}
@ -336,7 +334,6 @@ class AdminService extends AdminBaseService
} catch (\Exception $exception) {
return $this->toData('200500', 'The system is busy.', [$exception->getMessage()]);
}
}
public function del($id): array
@ -352,7 +349,6 @@ class AdminService extends AdminBaseService
} catch (\Exception $exception) {
return $this->toData('200500', 'The system is busy.', [$exception->getMessage()]);
}
}
/**
@ -370,9 +366,9 @@ class AdminService extends AdminBaseService
if ($rules) {
$rules = explode(",", $rules);
//字符串转换为数字类型
// $rules=array_map(function ($value){
// return (int)$value;
// },$rules);
// $rules=array_map(function ($value){
// return (int)$value;
// },$rules);
}
// 返回
return $this->toData('0', 'Modification successful.', $rules);
@ -404,7 +400,6 @@ class AdminService extends AdminBaseService
} catch (\Exception $exception) {
return $this->toData('200500', 'The system is busy.', [$exception->getMessage()]);
}
}
public function logList($param)
@ -421,7 +416,7 @@ class AdminService extends AdminBaseService
$list = $adminLogModel->order('id', 'desc')->page($param['page'], $param['limit'])->select()->toArray();
$accountIds = array_column($list, "admin_id");
$accountList = AdminModel::where('id', 'in', $accountIds)->column('user_name', 'id');
// $menuList = AuthRuleModel::column('title', 'path');
// $menuList = AuthRuleModel::column('title', 'path');
if (!empty($list)) {
foreach ($list as &$v) {
$v['admin_name'] = $accountList[$v['admin_id']] ?? '-';
@ -438,11 +433,10 @@ class AdminService extends AdminBaseService
{
try {
$user = AdminModel::select();
foreach ($user as $v){
foreach ($user as $v) {
$inviteCode = (new BaseHomeService())->getUniqInviteCode();
AdminModel::where('id',$v->id)->update(['invite_code'=>$inviteCode]);
AdminModel::where('id', $v->id)->update(['invite_code' => $inviteCode]);
}
} catch (\Exception $exception) {
return $this->toData('500', 'The system is busy.', [$exception->getMessage(), $exception->getTrace()]);
}
@ -456,14 +450,14 @@ class AdminService extends AdminBaseService
return $this->toData('400', '缺少分页参数');
}
// 查询角色表中翻译角色的id
$role = AuthRoleModel::where(['name'=>'翻译'])->find();
$role = AuthRoleModel::where(['name' => '翻译'])->find();
if (empty($role)) {
return $this->toData('400', '系统不存在翻译角色,请先创建');
}
// 查询属于翻译角色的所有账号
$where = ['role_id'=>$role->id];
$where = ['role_id' => $role->id];
if (!empty($param['user_name'])) {
$list = AdminModel::where($where)->whereLike('user_name', '%'.$param['user_name'].'%')->order('id', 'desc')->paginate([
$list = AdminModel::where($where)->whereLike('user_name', '%' . $param['user_name'] . '%')->order('id', 'desc')->paginate([
'list_rows' => $param['limit'],
'page' => $param['page'],
]);
@ -497,24 +491,24 @@ class AdminService extends AdminBaseService
}
// 翻译员的聊天账号信息
$translatorChatInfo = UserChatLinkModel::where(['user_id'=>$param['translator_id'], 'user_type'=>UserChatLinkModel::USER_CHAT_LINK_USER_TYPE_ADMIN])->find();
$translatorChatInfo = UserChatLinkModel::where(['user_id' => $param['translator_id'], 'user_type' => UserChatLinkModel::USER_CHAT_LINK_USER_TYPE_ADMIN])->find();
if (empty($translatorChatInfo)) {
return $this->toData('500', '翻译员的聊条账号信息错误');
}
// 翻译员创建的聊天群组信息
$chatGroup = UserChatGroupModel::where(['user_id'=>$param['translator_id'], 'remark'=>UserChatGroupModel::USER_CHAT_GROUP_REMARK_ADMIN_INIT])->find();
$chatGroup = UserChatGroupModel::where(['user_id' => $param['translator_id'], 'remark' => UserChatGroupModel::USER_CHAT_GROUP_REMARK_ADMIN_INIT])->find();
if (empty($chatGroup)) {
return $this->toData('500', 'The chat group is error.');
}
foreach ($param['customer_id'] as $customerId) {
// 记录好友关系
$translatorCustomer = TranslatorCustomerModel::where(['translator_id'=>$param['translator_id'], 'customer_id'=>$customerId])->find();
$translatorCustomer = TranslatorCustomerModel::where(['translator_id' => $param['translator_id'], 'customer_id' => $customerId])->find();
if (empty($translatorCustomer)) {
TranslatorCustomerModel::create(['translator_id'=>$param['translator_id'], 'customer_id'=>$customerId]);
TranslatorCustomerModel::create(['translator_id' => $param['translator_id'], 'customer_id' => $customerId]);
}
//查询客服的聊天账号uuid
$customerChatInfo = UserChatLinkModel::where(['user_id'=>$customerId, 'user_type'=>UserChatLinkModel::USER_CHAT_LINK_USER_TYPE_ADMIN])->find();
$customerChatInfo = UserChatLinkModel::where(['user_id' => $customerId, 'user_type' => UserChatLinkModel::USER_CHAT_LINK_USER_TYPE_ADMIN])->find();
if (empty($customerChatInfo)) {
return $this->toData('500', '客服的聊天账号信息错误');
}
@ -524,11 +518,11 @@ class AdminService extends AdminBaseService
];
$chatFriendsUrl = env('CHAT_SERVER.BASE_URL') . '/api/eachOtherFriends';
$chatFriendsRes = (new \app\utility\RequestChatServer())->ReqChatServer($chatFriendsUrl, $chatFriendsData);
Log::info("翻译员添加客服好友结果:". json_encode($chatFriendsRes));
Log::info("翻译员添加客服好友结果:" . json_encode($chatFriendsRes));
// 将客服添加到翻译员的聊天群组中
$joinChatGroupUrl = env('CHAT_SERVER.BASE_URL') . '/api/group/join/'.$customerChatInfo->chat_uuid.'/'.$chatGroup->group_uuid;
$joinChatGroupUrl = env('CHAT_SERVER.BASE_URL') . '/api/group/join/' . $customerChatInfo->chat_uuid . '/' . $chatGroup->group_uuid;
$joinChatGroupRes = (new \app\utility\RequestChatServer())->ReqChatServer($joinChatGroupUrl, []);
Log::info("翻译员添加客服到聊天群组结果:". json_encode($joinChatGroupRes));
Log::info("翻译员添加客服到聊天群组结果:" . json_encode($joinChatGroupRes));
}
return $this->toData('0', 'SUCCESS', []);
@ -547,7 +541,7 @@ class AdminService extends AdminBaseService
if (empty($param['page']) || empty($param['limit'])) {
return $this->toData('400', '缺少分页参数');
}
$list = TranslatorCustomerModel::where(['translator_id'=>$param['translator_id']])->order('id', 'desc')->paginate([
$list = TranslatorCustomerModel::where(['translator_id' => $param['translator_id']])->order('id', 'desc')->paginate([
'list_rows' => $param['limit'],
'page' => $param['page'],
]);
@ -571,19 +565,19 @@ class AdminService extends AdminBaseService
}
// 总监及以上角色才有权限分配用户与组长角色绑定
$account = AdminModel::where(['id'=>$adminId])->find();
$account = AdminModel::where(['id' => $adminId])->find();
if (empty($account)) {
return $this->toData('500', '当前账号数据为空');
}
$role = AuthRoleModel::where(['id'=>$account->role_id])->find();
$role = AuthRoleModel::where(['id' => $account->role_id])->find();
if (empty($role)) {
return $this->toData('500', '当前账号分配的角色为空');
}
if (!in_array($role->name, [AuthRoleModel::NAME_ADMIN,AuthRoleModel::NAME_AGENT,AuthRoleModel::NAME_DIRECTOR])) {
if (!in_array($role->name, [AuthRoleModel::NAME_ADMIN, AuthRoleModel::NAME_AGENT, AuthRoleModel::NAME_DIRECTOR])) {
return $this->toData('500', '当前账号无权分配用户与组长角色绑定');
}
$relation = GroupLeaderWithUserModel::where(['user_id'=>$param['user_id']])->find();
$relation = GroupLeaderWithUserModel::where(['user_id' => $param['user_id']])->find();
if (empty($relation)) {
$res = GroupLeaderWithUserModel::create([
'user_id' => $param['user_id'],
@ -594,11 +588,11 @@ class AdminService extends AdminBaseService
}
}
$adminUserChat = UserChatLinkModel::where(['user_id'=>$param['group_leader_id'], 'user_type'=>UserChatLinkModel::USER_CHAT_LINK_USER_TYPE_ADMIN])->find();
$adminUserChat = UserChatLinkModel::where(['user_id' => $param['group_leader_id'], 'user_type' => UserChatLinkModel::USER_CHAT_LINK_USER_TYPE_ADMIN])->find();
if (empty($adminUserChat)) {
return $this->toData('400', '管理端账号缺少chat信息');
}
$frontUserChat = UserChatLinkModel::where(['user_id'=>$param['user_id'], 'user_type'=>UserChatLinkModel::USER_CHAT_LINK_USER_TYPE_PC])->find();
$frontUserChat = UserChatLinkModel::where(['user_id' => $param['user_id'], 'user_type' => UserChatLinkModel::USER_CHAT_LINK_USER_TYPE_PC])->find();
if (empty($frontUserChat)) {
return $this->toData('400', '用户账号缺少chat信息');
}
@ -622,19 +616,19 @@ class AdminService extends AdminBaseService
return $this->toData('400', '缺少参数');
}
// 组长及以上角色才有权限分配用户与电销角色绑定
$account = AdminModel::where(['id'=>$adminId])->find();
$account = AdminModel::where(['id' => $adminId])->find();
if (empty($account)) {
return $this->toData('500', '当前账号数据为空');
}
$role = AuthRoleModel::where(['id'=>$account->role_id])->find();
$role = AuthRoleModel::where(['id' => $account->role_id])->find();
if (empty($role)) {
return $this->toData('500', '当前账号分配的角色为空');
}
if (!in_array($role->name, [AuthRoleModel::NAME_ADMIN,AuthRoleModel::NAME_AGENT,AuthRoleModel::NAME_DIRECTOR, AuthRoleModel::NAME_TEAM_HEADER])) {
if (!in_array($role->name, [AuthRoleModel::NAME_ADMIN, AuthRoleModel::NAME_AGENT, AuthRoleModel::NAME_DIRECTOR, AuthRoleModel::NAME_TEAM_HEADER])) {
return $this->toData('500', '当前账号无权分配用户与电销角色绑定');
}
$relation = SellerWithUserModel::where(['user_id'=>$param['user_id']])->find();
$relation = SellerWithUserModel::where(['user_id' => $param['user_id']])->find();
if (empty($relation)) {
$res = SellerWithUserModel::create([
'user_id' => $param['user_id'],
@ -645,11 +639,11 @@ class AdminService extends AdminBaseService
}
}
$adminUserChat = UserChatLinkModel::where(['user_id'=>$param['seller_id'], 'user_type'=>UserChatLinkModel::USER_CHAT_LINK_USER_TYPE_ADMIN])->find();
$adminUserChat = UserChatLinkModel::where(['user_id' => $param['seller_id'], 'user_type' => UserChatLinkModel::USER_CHAT_LINK_USER_TYPE_ADMIN])->find();
if (empty($adminUserChat)) {
return $this->toData('400', '管理端账号缺少chat信息');
}
$frontUserChat = UserChatLinkModel::where(['user_id'=>$param['user_id'], 'user_type'=>UserChatLinkModel::USER_CHAT_LINK_USER_TYPE_PC])->find();
$frontUserChat = UserChatLinkModel::where(['user_id' => $param['user_id'], 'user_type' => UserChatLinkModel::USER_CHAT_LINK_USER_TYPE_PC])->find();
if (empty($frontUserChat)) {
return $this->toData('400', '用户账号缺少chat信息');
}
@ -665,6 +659,118 @@ class AdminService extends AdminBaseService
}
}
// 用户访问页面的记录汇总
public function getUserAccessLogSummary($adminId, $param)
{
try {
if (empty($param['page']) || empty($param['limit'])) {
return $this->toData('400', '缺少分页参数');
}
// 获取账号信息
$account = AdminModel::where('id', $adminId)->find();
if (empty($account)) {
return $this->toData('400', '当前账号数据为空');
}
// 获取账号角色信息
$role = AuthRoleModel::where(['id' => $account->role_id])->find();
if (empty($role)) {
return $this->toData('400', '当前账号分配的角色数据为空');
}
// 构建可查看的用户ID筛选条件
$whereUser = [
['ual.user_id', '>', 0]
];
switch ($role->name) {
case AuthRoleModel::NAME_ADMIN:
if (!empty($param['user_id'])) {
$whereUser[] = ['user_id', '=', $param['user_id']];
}
break;
case AuthRoleModel::NAME_AGENT:
$userIds = UserModel::where('agent_id', $adminId)->column('user_id');
if (!empty($param['user_id']) && in_array($param['user_id'], $userIds)) {
$whereUser[] = ['ual.user_id', '=', $param['user_id']];
} else {
$whereUser[] = ['ual.user_id', 'in', $userIds];
}
break;
case AuthRoleModel::NAME_DIRECTOR:
$teamHeaders = AdminModel::where('parent_id', $adminId)->column('id');
$userIds = [];
if (!empty($teamHeaders)) {
$customer = AdminModel::whereIn('parent_id', $teamHeaders)->column('id');
if (!empty($customer)) {
$userIds = UserModel::whereIn('customer_id', $customer)->column('user_id');
}
}
if (!empty($param['user_id']) && in_array($param['user_id'], $userIds)) {
$whereUser[] = ['ual.user_id', '=', $param['user_id']];
} else {
$whereUser[] = ['ual.user_id', 'in', $userIds];
}
break;
case AuthRoleModel::NAME_TEAM_HEADER:
$customer = AdminModel::where('parent_id', $adminId)->column('id');
$userIds = [];
if (!empty($customer)) {
$userIds = UserModel::whereIn('customer_id', $customer)->column('user_id');
}
if (!empty($param['user_id']) && in_array($param['user_id'], $userIds)) {
$whereUser[] = ['ual.user_id', '=', $param['user_id']];
} else {
$whereUser[] = ['ual.user_id', 'in', $userIds];
}
break;
case AuthRoleModel::NAME_CUSTOMER:
$userIds = UserModel::where(['customer_id' => $adminId])->column('user_id');
if (!empty($param['user_id']) && in_array($param['user_id'], $userIds)) {
$whereUser[] = ['ual.user_id', '=', $param['user_id']];
} else {
$whereUser[] = ['ual.user_id', 'in', $userIds];
}
break;
default:
return $this->toData('500', '普通角色没有关联用户账号,不能查看用户数');
}
// 组装主查询条件
$where = [];
if (!empty($param['module'])) {
$where[] = ['module', '=', $param['module']];
}
if (!empty($param['ip'])) {
$where['ip'] = $param['ip'];
}
// 构建查询(按 user_id 分组统计访问次数)
$query = Db::name('user_access_log')
->alias('ual')
->field('ual.user_id, u.user_no, COUNT(*) as access_count, MAX(ual.created_at) as created_at')
->join('users u', 'ual.user_id = u.user_id', 'LEFT')
->where($where)
->where($whereUser)
->group('ual.user_id')
->order('access_count', 'desc');
$list = $query->paginate([
'list_rows' => $param['limit'],
'page' => $param['page'],
]);
return $this->toData('0', 'SUCCESS', [
'list' => $list->items(),
'page' => $list->currentPage(),
'total' => $list->total(),
'last_page' => $list->lastPage(),
]);
} catch (\Exception $exception) {
return $this->toData('500', 'The system is busy.', [$exception->getMessage(), $exception->getTrace()]);
}
}
// 用户访问页面的记录
public function getUserAccessLog($adminId, $param)
{
@ -678,12 +784,14 @@ class AdminService extends AdminBaseService
return $this->toData('400', '当前账号数据为空');
}
// 获取账号角色信息
$role = AuthRoleModel::where(['id'=>$account->role_id])->find();
$role = AuthRoleModel::where(['id' => $account->role_id])->find();
if (empty($role)) {
return $this->toData('400', '当前账号分配的角色数据为空');
}
// 根据账号角色限制数据查看范围, 超级管理员可以查看所有用户数据,代理可以查看自己所属用户的数据,总监、组长以此类推
$whereUser = [];
$whereUser = [
['user_id', '>', 0]
];
switch ($role->name) {
case AuthRoleModel::NAME_ADMIN: // 超级管理员可以查看所有数据
if (!empty($param['user_id'])) {
@ -741,10 +849,163 @@ class AdminService extends AdminBaseService
if (!empty($param['module'])) {
$where['module'] = $param['module'];
}
$list = UserAccessLogModel::where($where)->where($whereUser)->order('id', 'desc')->paginate([
if (!empty($param['ip'])) {
$where['ip'] = $param['ip'];
}
if (!empty($param['start_time']) && !empty($param['end_time'])) {
$whereUser[] = ['created_at', 'between time', [$param['start_time'], $param['end_time']]];
}
if ($param['export'] ?? false) {
//太多了 只取10000条
$list = UserAccessLogModel::with(['user'])->where($where)->where($whereUser)->order('id', 'desc')->limit(10000)->select();
$exportData = [['ID', '用户id', '用户编号', '访问时间', 'IP地址', '访问页面', '模块', '备注']];
foreach ($list as $item) {
$exportData[] = [$item->id, $item->user_id, $item->user->user_no ?? '', $item->created_at, $item->ip, $item->page_url, $item->module, $item->remark];
}
return ExportService::exportCsv($exportData, '用户浏览信息导出.csv');
} else {
$list = UserAccessLogModel::with(['user'])->where($where)->where($whereUser)->order('id', 'desc')->paginate([
'list_rows' => $param['limit'],
'page' => $param['page'],
]);
foreach ($list->items() as $item) {
$data[] = [
'id' => $item->id,
'user_id' => $item->user_id,
'created_at' => $item->created_at,
'ip' => $item->ip,
'page_url' => $item->page_url,
'module' => $item->module,
'remark' => $item->remark,
'updated_at' => $item->updated_at,
// 关联字段
'user_no' => $item->user->user_no ?? '',
];
}
return $this->toData('0', 'SUCCESS', [
'list' => $data,
'page' => $list->currentPage(),
'total' => $list->total(),
'last_page' => $list->lastPage(),
]);
}
} catch (\Exception $exception) {
return $this->toData('500', 'The system is busy.', [$exception->getMessage(), $exception->getTrace()]);
}
}
// 游客访问页面的记录
public function getVisitorAccessLog($adminId, $param)
{
try {
if (empty($param['page']) || empty($param['limit'])) {
return $this->toData('400', '缺少分页参数');
}
// 获取账号信息
$account = AdminModel::where('id', $adminId)->find();
if (empty($account)) {
return $this->toData('400', '当前账号数据为空');
}
// 获取账号角色信息
$role = AuthRoleModel::where(['id' => $account->role_id])->find();
if (empty($role)) {
return $this->toData('400', '当前账号分配的角色数据为空');
}
// 根据账号角色限制数据查看范围, 超级管理员可以查看所有用户数据,代理可以查看自己所属用户的数据,总监、组长以此类推
$whereUser = [
['user_id', '=', null]
];
$where = [];
if (!empty($param['module'])) {
$where['module'] = $param['module'];
}
if (!empty($param['ip'])) {
$where['ip'] = $param['ip'];
}
if (!empty($param['start_time']) && !empty($param['end_time'])) {
$whereUser[] = ['created_at', 'between time', [$param['start_time'], $param['end_time']]];
}
if ($param['export'] ?? false) {
//太多了 只取10000条
$list = UserAccessLogModel::where($where)->where($whereUser)->order('id', 'desc')->limit(10000)->select();
$exportData = [['ID', '访问时间', 'IP地址', '访问页面', '模块', '备注']];
foreach ($list as $item) {
$exportData[] = [$item->id, $item->created_at, $item->ip, $item->page_url, $item->module, $item->remark];
}
return ExportService::exportCsv($exportData, '访客浏览信息导出.csv');
} else {
$list = UserAccessLogModel::where($where)->where($whereUser)->order('id', 'desc')->paginate([
'list_rows' => $param['limit'],
'page' => $param['page'],
]);
return $this->toData('0', 'SUCCESS', [
'list' => $list->items(),
'page' => $list->currentPage(),
'total' => $list->total(),
'last_page' => $list->lastPage(),
]);
}
} catch (\Exception $exception) {
return $this->toData('500', 'The system is busy.', [$exception->getMessage(), $exception->getTrace()]);
}
}
// 访问页面的记录汇总
public function getVisitorAccessLogSummary($adminId, $param)
{
try {
if (empty($param['page']) || empty($param['limit'])) {
return $this->toData('400', '缺少分页参数');
}
// 获取账号信息
$account = AdminModel::where('id', $adminId)->find();
if (empty($account)) {
return $this->toData('400', '当前账号数据为空');
}
// 获取账号角色信息
$role = AuthRoleModel::where(['id' => $account->role_id])->find();
if (empty($role)) {
return $this->toData('400', '当前账号分配的角色数据为空');
}
// 构建可查看的用户ID筛选条件
$whereUser = [
['ual.user_id', '=', null],
];
// 组装主查询条件
$where = [];
if (!empty($param['module'])) {
$where[] = ['module', '=', $param['module']];
}
if (!empty($param['ip'])) {
$where[] = ['ip', '=', $param['ip']];
}
// 构建查询(按 user_id 分组统计访问次数)
$query = Db::name('user_access_log')
->alias('ual')
// ->field('user_id, COUNT(*) as access_count, MAX(create_time) as last_visit_time')
->field('ip,COUNT(*) as access_count, MAX(ual.created_at) as created_at')
->where($where)
->where($whereUser)
->group('ip')
->order('access_count', 'desc');
$list = $query->paginate([
'list_rows' => $param['limit'],
'page' => $param['page'],
]);
return $this->toData('0', 'SUCCESS', [
'list' => $list->items(),
'page' => $list->currentPage(),
@ -755,7 +1016,6 @@ class AdminService extends AdminBaseService
return $this->toData('500', 'The system is busy.', [$exception->getMessage(), $exception->getTrace()]);
}
}
public function getAdminOperationLog($adminId, $param)
{
try {
@ -768,7 +1028,7 @@ class AdminService extends AdminBaseService
return $this->toData('400', '当前账号数据为空');
}
// 获取账号角色信息
$role = AuthRoleModel::where(['id'=>$account->role_id])->find();
$role = AuthRoleModel::where(['id' => $account->role_id])->find();
if (empty($role)) {
return $this->toData('400', '当前账号分配的角色数据为空');
}
@ -783,12 +1043,12 @@ class AdminService extends AdminBaseService
case AuthRoleModel::NAME_AGENT: // 代理 - 查看自己以及下属账号的操作数据
$ids = [$adminId];
$directors = AdminModel::where('parent_id', $adminId)->column('id');
if (!empty($directors)){
if (!empty($directors)) {
$ids = array_merge($ids, $directors);
$teamHeader = AdminModel::where('parent_id', 'in', $directors)->column('id');
if (!empty($teamHeader)) {
$ids = array_merge($ids, $teamHeader);
$customer = AdminModel::where('parent_id','in', $teamHeader)->column('id');
$customer = AdminModel::where('parent_id', 'in', $teamHeader)->column('id');
if (!empty($customer)) {
$ids = array_merge($ids, $customer);
}
@ -803,15 +1063,15 @@ class AdminService extends AdminBaseService
case AuthRoleModel::NAME_DIRECTOR: // 总监 - 查看自己以及下属账号的操作数据
$ids = [$adminId];
$teamHeader = AdminModel::where('parent_id', $adminId)->column('id');
if (!empty($teamHeader)){
if (!empty($teamHeader)) {
$ids = array_merge($ids, $teamHeader);
$customer = AdminModel::where('parent_id','in', $teamHeader)->column('id');
$customer = AdminModel::where('parent_id', 'in', $teamHeader)->column('id');
if (!empty($customer)) {
$ids = array_merge($ids, $customer);
}
}
if (!empty($param['admin_id']) && in_array($param['admin_id'], $ids)) {
$where[] = ['admin_id', '=',$param['admin_id']];
$where[] = ['admin_id', '=', $param['admin_id']];
} else {
$where[] = ['admin_id', 'in', $ids];
}
@ -857,7 +1117,7 @@ class AdminService extends AdminBaseService
if (empty($param['user_id'])) {
return $this->toData('400', '请指定用户ID');
}
if (empty($param['days']) || $param['days'] <= 0 ) {
if (empty($param['days']) || $param['days'] <= 0) {
return $this->toData('400', '赠送时间错误');
}
$userId = $param['user_id'];
@ -870,7 +1130,7 @@ class AdminService extends AdminBaseService
// 记录赠送vip信息
Db::transaction(function () use ($userId, $giveDay) {
// 查询用户是否开通过vip,更新用户vip到期时间
$vipLog = PurchaseVipModel::where(['user_id'=>$userId])->find();
$vipLog = PurchaseVipModel::where(['user_id' => $userId])->find();
$expireTimestamp = strtotime("+$giveDay day");
$expireTime = date("Y-m-d H:i:s", $expireTimestamp);
if (!empty($vipLog)) {
@ -911,7 +1171,7 @@ class AdminService extends AdminBaseService
if (!isset($param['page']) || !isset($param['limit']) || !isset($param['user_id'])) {
return $this->toData('400', lang('parameter_error'));
}
$list = PurchaseVipLogModel::where(['user_id'=>$param['user_id']])->order('id', 'desc')->paginate([
$list = PurchaseVipLogModel::where(['user_id' => $param['user_id']])->order('id', 'desc')->paginate([
'list_rows' => $param['limit'],
'page' => $param['page'],
]);
@ -926,6 +1186,65 @@ class AdminService extends AdminBaseService
}
}
// 生成vip兑换码
public function generateVipCode($param)
{
try {
if (!isset($param['day']) || $param['day'] <= 0) {
return $this->toData('400', lang('parameter_error'));
}
// 一次性生成10个兑换码
$resArr = [];
for ($i = 1; $i <= 10; $i++) {
$code = (new UnqId())->generateRandomCode(15);
$exists = VipCodeModel::where(['vip_code' => $code])->find();
if (!empty($exists) && $exists->vip_code == $code) {
for ($j = 1; $j <= 5; $j++) { // 如果存在相同code,本轮再试5次
$code = (new UnqId())->generateRandomCode(15);
$exists = VipCodeModel::where(['vip_code' => $code])->find();
if (empty($exists)) {
VipCodeModel::create(['vip_code' => $code, 'day' => $param['day'], 'status' => 0, 'uid' => 0]);
$resArr[] = $code;
break;
}
}
} else {
VipCodeModel::create(['vip_code' => $code, 'day' => $param['day'], 'status' => 0, 'uid' => 0]);
$resArr[] = $code;
}
}
return $this->toData('0', 'successful', [$resArr]);
} catch (\Exception $e) {
return $this->toData('500', 'The system is busy.', [$e->getMessage(), $e->getTrace()]);
}
}
public function getVipCode($param)
{
try {
if (!isset($param['page']) || !isset($param['limit'])) {
return $this->toData('400', lang('parameter_error'));
}
$where = [];
if (isset($param['status'])) {
$where['status'] = $param['status'];
}
$list = VipCodeModel::where($where)->order('id', 'desc')->paginate([
'list_rows' => $param['limit'],
'page' => $param['page'],
]);
return $this->toData('0', 'SUCCESS', [
'list' => $list->items(),
'page' => $list->currentPage(),
'total' => $list->total(),
'last_page' => $list->lastPage(),
]);
} catch (\Exception $e) {
return $this->toData('500', 'The system is busy.', [$e->getMessage(), $e->getTrace()]);
}
}
// 单次发送邮件或短信
public function sendEmailOrSms($param)
{
@ -933,11 +1252,11 @@ class AdminService extends AdminBaseService
if (empty($param['user_id']) || empty($param['type']) || empty($param['content'])) {
return $this->toData('400', '参数错误');
}
if (!in_array($param['type'], [1,2])) {
if (!in_array($param['type'], [1, 2])) {
return $this->toData('400', '参数错误');
}
$user = UserModel::where(['user_id'=>$param['user_id']])->find();
$user = UserModel::where(['user_id' => $param['user_id']])->find();
if (empty($user)) {
return $this->toData('500', '用户不存在');
}
@ -990,7 +1309,7 @@ class AdminService extends AdminBaseService
{
try {
// type: 1-短信,2-邮件
if (!in_array($param['type'], [1,2])) {
if (!in_array($param['type'], [1, 2])) {
return $this->toData('400', '发送类型不在支持范围内');
}
// content: 发送的消息内容
@ -1015,7 +1334,7 @@ class AdminService extends AdminBaseService
}
$jobName = 'app\admin\job\SendSmsFromBackend';
Queue::push($jobName, [
'mobile' => $v['country_code'].$v['phone_number'],
'mobile' => $v['country_code'] . $v['phone_number'],
'message' => $param['content'],
], 'sendSmsFromBackend');
}
@ -1050,5 +1369,4 @@ class AdminService extends AdminBaseService
return $this->toData('500', 'The system is busy', [$e->getMessage(), $e->getTrace()]);
}
}
}

80
app/admin/service/ExportService.php

@ -0,0 +1,80 @@
<?php
namespace app\admin\service;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
class ExportService extends AdminBaseService
{
/**
* 导出 Excel
* @param array $data 二维数组(含表头)
* @param string $filename 导出文件名
*/
public static function exportExcel(array $data, string $filename = '')
{
if (empty($data)) {
throw new \Exception('导出数据不能为空');
}
$filename = $filename ?: '导出_' . date('Ymd_His') . '.xlsx';
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// 列号转字母函数
$colIndexToLetter = function ($index) {
$letters = '';
while ($index >= 0) {
$letters = chr($index % 26 + 65) . $letters;
$index = intval($index / 26) - 1;
}
return $letters;
};
// 写入数据
foreach ($data as $rowIndex => $row) {
foreach ($row as $colIndex => $value) {
$cell = $colIndexToLetter($colIndex) . ($rowIndex + 1); // 例如 A1, B1...
$sheet->setCellValue($cell, $value);
}
}
// 输出到浏览器
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header("Content-Disposition: attachment; filename=\"{$filename}\"");
header('Cache-Control: max-age=0');
$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
exit;
}
/**
* 导出 CSV
* @param array $data 二维数组(含表头)
* @param string $filename 导出文件名
*/
public static function exportCsv(array $data, string $filename = '')
{
if (empty($data)) {
throw new \Exception('导出数据不能为空');
}
$filename = $filename ?: '导出_' . date('Ymd_His') . '.csv';
header('Content-Type: text/csv');
header("Content-Disposition: attachment; filename={$filename}");
$fp = fopen('php://output', 'w');
fwrite($fp, chr(0xEF) . chr(0xBB) . chr(0xBF)); // 防止中文乱码
foreach ($data as $row) {
fputcsv($fp, $row);
}
fclose($fp);
exit;
}
}

63
app/admin/service/FlowService.php

@ -43,7 +43,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -89,7 +89,6 @@ class FlowService extends AdminBaseService
}
return $this->toData('0', 'SUCCESS', ['total' => $total, 'list' => $rows, 'extend' => (new BaseHomeService())->getCapitalTypeList($changeTypeArr)]);
} catch (ValidateException $validateException) {
// 参数校验失败
$message = $validateException->getError();
@ -111,7 +110,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -157,7 +156,6 @@ class FlowService extends AdminBaseService
}
return $this->toData('0', 'SUCCESS', ['total' => $total, 'list' => $rows, 'extend' => (new BaseHomeService())->getCapitalTypeList($changeTypeArr)]);
} catch (ValidateException $validateException) {
// 参数校验失败
$message = $validateException->getError();
@ -180,7 +178,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -224,9 +222,7 @@ class FlowService extends AdminBaseService
$rows[$key]['user_no'] = $userNoArr[$item['user_id']] ?? '-'; // 用户号
}
}
return $this->toData('0', 'SUCCESS', ['total' => $total, 'list' => $rows, 'extend' => (new BaseHomeService())->getCapitalTypeList($changeTypeArr)]);
} catch (ValidateException $validateException) {
// 参数校验失败
$message = $validateException->getError();
@ -249,7 +245,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -295,7 +291,6 @@ class FlowService extends AdminBaseService
}
return $this->toData('0', 'SUCCESS', ['total' => $total, 'list' => $rows, 'extend' => (new BaseHomeService())->getCapitalTypeList($changeTypeArr)]);
} catch (ValidateException $validateException) {
// 参数校验失败
$message = $validateException->getError();
@ -318,7 +313,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -378,7 +373,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -424,7 +419,6 @@ class FlowService extends AdminBaseService
}
return $this->toData('0', 'SUCCESS', ['total' => $total, 'list' => $rows, 'extend' => (new BaseHomeService())->getCapitalTypeList($changeTypeArr)]);
} catch (ValidateException $validateException) {
// 参数校验失败
$message = $validateException->getError();
@ -446,7 +440,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -492,7 +486,6 @@ class FlowService extends AdminBaseService
}
return $this->toData('0', 'SUCCESS', ['total' => $total, 'list' => $rows, 'extend' => (new BaseHomeService())->getCapitalTypeList($changeTypeArr)]);
} catch (ValidateException $validateException) {
// 参数校验失败
$message = $validateException->getError();
@ -514,7 +507,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -560,7 +553,6 @@ class FlowService extends AdminBaseService
}
return $this->toData('0', 'SUCCESS', ['total' => $total, 'list' => $rows, 'extend' => (new BaseHomeService())->getCapitalTypeList($changeTypeArr)]);
} catch (ValidateException $validateException) {
// 参数校验失败
$message = $validateException->getError();
@ -582,7 +574,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -631,7 +623,6 @@ class FlowService extends AdminBaseService
}
return $this->toData('0', 'SUCCESS', ['total' => $total, 'list' => $rows]);
} catch (ValidateException $validateException) {
// 参数校验失败
$message = $validateException->getError();
@ -653,7 +644,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -708,7 +699,6 @@ class FlowService extends AdminBaseService
}
return $this->toData('0', 'SUCCESS', ['total' => $total, 'list' => $rows]);
} catch (ValidateException $validateException) {
// 参数校验失败
$message = $validateException->getError();
@ -730,7 +720,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -781,7 +771,6 @@ class FlowService extends AdminBaseService
}
return $this->toData('0', 'SUCCESS', ['total' => $total, 'list' => $rows]);
} catch (ValidateException $validateException) {
// 参数校验失败
$message = $validateException->getError();
@ -806,7 +795,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -877,7 +866,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -948,7 +937,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -1019,7 +1008,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -1090,7 +1079,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -1160,7 +1149,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -1229,7 +1218,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -1298,7 +1287,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -1367,7 +1356,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -1382,8 +1371,8 @@ class FlowService extends AdminBaseService
if (!empty($param['change_type']) && in_array($param['change_type'], $changeTypeArr)) $where['change_type'] = $param['change_type'];
$market_type=intval($param['market_type']);
$table_obj=(new IPOService())->getStockModel($market_type);
$market_type = intval($param['market_type']);
$table_obj = (new IPOService())->getStockModel($market_type);
if (empty($table_obj)) {
return $this->toData('1', '数据异常');
}
@ -1426,7 +1415,7 @@ class FlowService extends AdminBaseService
$message = $validateException->getError();
return $this->toData('1', $message);
} catch (\Exception $exception) {
return $this->toData('1', '系统异常 请稍后重试', [$exception->getMessage(),$exception->getTrace()]);
return $this->toData('1', '系统异常 请稍后重试', [$exception->getMessage(), $exception->getTrace()]);
}
}
@ -1443,7 +1432,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -1514,7 +1503,7 @@ class FlowService extends AdminBaseService
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [],]);
}
$userId = $user['user_id'];
}
@ -1570,4 +1559,4 @@ class FlowService extends AdminBaseService
return $this->toData('1', '系统异常 请稍后重试', [$exception->getMessage()]);
}
}
}
}

3
app/admin/service/RechargeService.php

@ -59,7 +59,6 @@ class RechargeService extends AdminBaseService
$total = RechargeApplyModel::where($where)->where($whereU)->count();
// 统计 充值成功
$sum = RechargeApplyModel::where($where)->where($whereU)->where('status', 1)->sum('recharge_num');
$groupSum = RechargeApplyModel::where($where)->where($whereU)->where('status', 1)->field('account_type, SUM(recharge_num) AS recharge_num')->group('recharge_num')->select();
$rows = [];
@ -92,7 +91,7 @@ class RechargeService extends AdminBaseService
}
}
return $this->toData('0', 'SUCCESS', ['total' => $total, 'list' => $rows, 'sum' => $sum . 'USD', 'extend' => $statusList, 'groupSum'=>$groupSum]);
return $this->toData('0', 'SUCCESS', ['total' => $total, 'list' => $rows, 'sum' => $sum . 'USD', 'extend' => $statusList,'groupSum'=>$groupSum]);
} catch (\Exception $exception) {
return $this->toData('1', '系统异常 请稍后重试', [$exception->getMessage(), $exception->getTrace()]);
}

11
app/admin/service/VideoService.php

@ -1,5 +1,7 @@
<?php
namespace app\admin\service;
use app\model\BlockedWordModel;
use app\model\VideoOnDemandModel;
@ -65,7 +67,7 @@ class VideoService extends AdminBaseService
if (empty($param['id'])) {
return $this->toData('400', 'Missing param id');
}
if (empty($param['title']) || empty($param['cover_url']) || empty($param['state']) || empty($param['video_collection']) || empty($param['video_type'])) {
if (empty($param['title']) || empty($param['cover_url']) || !in_array($param['state'], [0, 1]) || empty($param['video_collection']) || empty($param['video_type'])) {
return $this->toData('400', '参错错误');
}
$ckInfo = VideoOnDemandModel::where('id', $param['id'])->find();
@ -120,7 +122,7 @@ class VideoService extends AdminBaseService
if (empty($param['word'])) {
return $this->toData('400', '参错错误');
}
$blockedWord = BlockedWordModel::where(['word'=>$param['word']])->find();
$blockedWord = BlockedWordModel::where(['word' => $param['word']])->find();
if (!empty($blockedWord)) {
return $this->toData('400', '已存在相同屏蔽词');
}
@ -143,7 +145,7 @@ class VideoService extends AdminBaseService
if (empty($param['id']) || empty($param['word'])) {
return $this->toData('400', '参错错误');
}
$blockedWord = BlockedWordModel::where(['id'=>$param['id']])->find();
$blockedWord = BlockedWordModel::where(['id' => $param['id']])->find();
if (empty($blockedWord)) {
return $this->toData('400', '数据不存在');
}
@ -162,7 +164,7 @@ class VideoService extends AdminBaseService
if (empty($param['id'])) {
return $this->toData('400', '参错错误');
}
$blockedWord = BlockedWordModel::where(['id'=>$param['id']])->find();
$blockedWord = BlockedWordModel::where(['id' => $param['id']])->find();
if (empty($blockedWord)) {
return $this->toData('400', '数据不存在');
}
@ -173,5 +175,4 @@ class VideoService extends AdminBaseService
return $this->toData('500', 'The system is busy.', [$exception->getMessage(), $exception->getTrace()]);
}
}
}

6
app/admin/service/setting/BlockStockService.php

@ -51,7 +51,6 @@ class BlockStockService extends AdminBaseService
$list = $query->order('id', 'desc')->page($param['page'], $param['limit'])->select();
$total = $totalQuery->order('id', 'desc')->count();
return $this->toData('0', 'SUCCESS', ['list' => $list, 'total' => $total, 'extend' => [
// 'tape_list' => StockBlockListModel::$tapeList,
// 'stock_type_list' => StockBlockListModel::$typeList,
@ -302,7 +301,8 @@ class BlockStockService extends AdminBaseService
}
// 可出售时间时间
if (empty($param['today_add']) || !is_numeric($param['today_add'])) {
// if (empty($param['today_add']) || !is_numeric($param['today_add'])) {
if (!is_numeric($param['today_add'])) {
return $this->toData('1', 'T+n 无效');
}
@ -350,7 +350,7 @@ class BlockStockService extends AdminBaseService
return $this->toData('0', 'SUCCESS');
} catch (\Exception $exception) {
return $this->toData('0', '系统繁忙', [$exception->getMessage()]);
return $this->toData('0', '系统繁忙', [$exception->getMessage(), $exception->getTrace()]);
}
}

125
app/admin/service/setting/IPOService.php

@ -32,12 +32,10 @@ use app\model\StockSgdListModel;
use app\model\StockThaListModel;
use app\model\UserArrearsModel;
use app\model\UserModel;
use app\model\UserUsPreStockOrderModel;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\Log;
use think\facade\Queue;
use function app\admin\service\getTreeMenu;
class IPOService extends AdminBaseService
{
@ -65,7 +63,8 @@ class IPOService extends AdminBaseService
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], 'extent' => [
'tape_list' => $stockTypeList['tape'],
'stock_type_list' => $stockTypeList['type'],
'symbol' => $table_obj['stock_id']]]);
'symbol' => $table_obj['stock_id']
]]);
}
$userId = $user['user_id'];
}
@ -76,24 +75,31 @@ class IPOService extends AdminBaseService
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], 'extent' => [
'tape_list' => $stockTypeList['tape'],
'stock_type_list' => $stockTypeList['type'],
'symbol' => $table_obj['stock_id']]]);
'symbol' => $table_obj['stock_id']
]]);
}
// 未删除
$where[] = [
'is_delete', '=', 1
'is_delete',
'=',
1
];
// 股票号
if (!empty($param['stock_code']) && is_string($param['stock_code'])) {
$where[] = [
'stock_code', 'like', '%' . $param['stock_code']
'stock_code',
'like',
'%' . $param['stock_code']
];
}
// 状态
if (!empty($param['status']) && in_array($param['status'], [1, 2])) {
$where[] = [
'status', '=', $param['status']
'status',
'=',
$param['status']
];
}
@ -291,9 +297,9 @@ class IPOService extends AdminBaseService
}
// 后支付截止时间 > 中签时间 && 后支付截止时间 < 上市时间
// if ($param['is_post_pay'] == 2 && (empty($param['pay_deadline_time']) || strtotime($param['pay_deadline_time']) <= strtotime($param['get_time']) || strtotime($param['pay_deadline_time']) >= strtotime($param['open_time']))) {
// return $this->toData('1', '后支付截止时间 要大于 中签时间 且 后支付截止时间 要小于 上市时间');
// }
// if ($param['is_post_pay'] == 2 && (empty($param['pay_deadline_time']) || strtotime($param['pay_deadline_time']) <= strtotime($param['get_time']) || strtotime($param['pay_deadline_time']) >= strtotime($param['open_time']))) {
// return $this->toData('1', '后支付截止时间 要大于 中签时间 且 后支付截止时间 要小于 上市时间');
// }
if (strpos($param['stock_code'], ':') !== false) {
$param['stock_code'] = explode(':', $param['stock_code'])[1];
@ -476,9 +482,9 @@ class IPOService extends AdminBaseService
}
// 后支付截止时间 > 中签时间 && 后支付截止时间 < 上市时间
// if ($param['is_post_pay'] == 2 && (empty($param['pay_deadline_time']) || strtotime($param['pay_deadline_time']) <= strtotime($param['get_time']) || strtotime($param['pay_deadline_time']) >= strtotime($param['open_time']))) {
// return $this->toData('1', '后支付截止时间 要大于 中签时间 且 后支付截止时间 要小于 上市时间');
// }
// if ($param['is_post_pay'] == 2 && (empty($param['pay_deadline_time']) || strtotime($param['pay_deadline_time']) <= strtotime($param['get_time']) || strtotime($param['pay_deadline_time']) >= strtotime($param['open_time']))) {
// return $this->toData('1', '后支付截止时间 要大于 中签时间 且 后支付截止时间 要小于 上市时间');
// }
if (strpos($param['stock_code'], ':') !== false) {
$param['stock_code'] = explode(':', $param['stock_code'])[1];
@ -563,7 +569,6 @@ class IPOService extends AdminBaseService
} catch (\Exception $exception) {
return $this->toData('0', '系统繁忙', [$exception->getMessage()]);
}
}
/**
@ -600,7 +605,6 @@ class IPOService extends AdminBaseService
} else {
return $this->toData('1', 'FAIL');
}
} catch (\Exception $exception) {
return $this->toData('1', '系统繁忙', [$exception->getMessage()]);
}
@ -624,7 +628,6 @@ class IPOService extends AdminBaseService
if (isset($param['is_real']) && is_numeric($param['is_real']) && $param['is_real'] == '2') {
$isReal = 2;
}
$preInStock = Db::table($table_obj['stock_table'])->where('id', $param['id'])->where('is_delete', 1)->find();
if (empty($preInStock)) {
return $this->toData('1', '主键 无效');
@ -637,9 +640,9 @@ class IPOService extends AdminBaseService
}
// 未签名 上市
// if ($preInStock['open_status'] != 1 || strtotime($preInStock['get_time']) < date('Y-m-d H:i:s')) {
// return $this->toData('1', '无法操作');
// }
// if ($preInStock['open_status'] != 1 || strtotime($preInStock['get_time']) < date('Y-m-d H:i:s')) {
// return $this->toData('1', '无法操作');
// }
if ($preInStock['open_status'] != 1) {
return $this->toData('1', '无法操作');
}
@ -647,9 +650,11 @@ class IPOService extends AdminBaseService
Db::startTrans();
// 修改股票状态
$num = Db::table($table_obj['stock_table'])->where('id', $preInStock['id'])->update(['open_status' => 2,
$num = Db::table($table_obj['stock_table'])->where('id', $preInStock['id'])->update([
'open_status' => 2,
'open_time' => date('Y-m-d H:i:s'),
'update_time' => date('Y-m-d H:i:s')]);
'update_time' => date('Y-m-d H:i:s')
]);
if ($num <= 0) {
Db::rollback();
return $this->toData('1', '股票状态修改失败');
@ -719,11 +724,11 @@ class IPOService extends AdminBaseService
Db::commit();
// 查询bot_user_us_pre_stock_order表,即所有申购了该股票的订单记录,修改其status状态为3
Log::info("新股上市 - 修改股票申购状态:pre_stock_id = ".$preInStock['id']);
$stockOrderList = UserUsPreStockOrderModel::where(['pre_stock_id'=>$preInStock['id']])->select()->toArray();
Log::info("新股上市 - 修改股票申购状态:pre_stock_id = " . $preInStock['id']);
$stockOrderList = Db::table($table_obj['order_table'])->where(['pre_stock_id' => $preInStock['id']])->select()->toArray();
if (!empty($stockOrderList)) {
foreach ($stockOrderList as $itm) {
UserUsPreStockOrderModel::update(['status'=>3], ['id'=>$itm['id']]);
Db::table($table_obj['order_table'])->where('id', $itm['id'])->update(['status' => 3]);
}
}
@ -817,7 +822,6 @@ class IPOService extends AdminBaseService
], 'sendGo');
}
return $this->toData('0', 'SUCCESS');
}
@ -874,7 +878,8 @@ class IPOService extends AdminBaseService
'get_amount' => $get_amount,
'get_fee' => $get_fee,
'get_time' => $now,
'update_time' => $now]);
'update_time' => $now
]);
if ($num <= 0) {
Db::rollback();
@ -950,7 +955,6 @@ class IPOService extends AdminBaseService
}
}
}
}
// 更新股票数据
$bool = Db::table($table_obj['stock_table'])->where('id', $preStock['id'])->update(['sign_status' => 1, 'update_time' => $now]);
@ -961,7 +965,6 @@ class IPOService extends AdminBaseService
}
// 提交事务
Db::commit();
} catch (\Exception $exception) {
Db::rollback();
trace("股票签名失败-exception 股票市场:" . $market_type . $exception->getMessage(), 'error');
@ -1331,7 +1334,8 @@ class IPOService extends AdminBaseService
/**
* 取消上市
*/
public function cancelIPO($market_type,$param){
public function cancelIPO($market_type, $param)
{
$table_obj = $this->getStockModel($market_type);
$redis = $this->getRedis();
if (empty($table_obj)) {
@ -1344,60 +1348,60 @@ class IPOService extends AdminBaseService
->where('sign_status', 1)
->where('open_status', 1)
->find();
if(empty($preStock)){
if (empty($preStock)) {
return $this->toData('1', '数据异常');
}
//1、2已支付,5、6未支付可能存在借款
$order_list = Db::table($table_obj['order_table'])->where('pre_stock_id', $param['pre_id'])
->whereIn('status',[1,2,5,6])
->whereIn('status', [1, 2, 5, 6])
->select();
$now = date('Y-m-d H:i:s');
foreach ($order_list as $order){
foreach ($order_list as $order) {
Db::startTrans();
$total_num=$order['amount']+$order['fee'];
$total_num = $order['amount'] + $order['fee'];
//查询订单有没有欠款
$user_arrears=UserArrearsModel::where('order_no', $order['order_no'])->where('status',0)->where('user_id', $order['user_id'])->find();
if($user_arrears){
$user_arrears=$user_arrears->toArray();
if($user_arrears['is_add']==1){
$user_arrears = UserArrearsModel::where('order_no', $order['order_no'])->where('status', 0)->where('user_id', $order['user_id'])->find();
if ($user_arrears) {
$user_arrears = $user_arrears->toArray();
if ($user_arrears['is_add'] == 1) {
//扣除冻结,不加可用
$updateNum = Db::table($table_obj['user_table'])->where('stock_id', $table_obj['stock_id'])->where('user_id', $order['user_id'])
->where('frozen_num', '>=', $total_num)
->dec('frozen_num',$total_num)
->dec('frozen_num', $total_num)
->update(['update_time' => $now]);
if(!$updateNum){
if (!$updateNum) {
Db::rollback();
trace('给用户ID:' . $order['user_id'] . "解冻资金异常" . $order['order_no'], 'error');
continue;
}
}
$update_bool=UserArrearsModel::where('order_no', $order['order_no'])->where('user_id', $order['user_id'])
->update([
'update_time'=>$now,
'status'=>1
]);
if(!$update_bool){
$update_bool = UserArrearsModel::where('order_no', $order['order_no'])->where('user_id', $order['user_id'])
->update([
'update_time' => $now,
'status' => 1
]);
if (!$update_bool) {
Db::rollback();
trace('给用户ID:' . $order['user_id'] . "更新贷款订单异常" . $order['order_no'], 'error');
continue;
}
$status=8;
}else{
$status = 8;
} else {
//扣除冻结 加可用
$updateNum = Db::table($table_obj['user_table'])->where('stock_id', $table_obj['stock_id'])->where('user_id', $order['user_id'])
->where('frozen_num', '>=', $total_num)
->inc('usable_num', $total_num)
->dec('frozen_num',$total_num)
->dec('frozen_num', $total_num)
->update(['update_time' => $now]);
if(!$updateNum){
if (!$updateNum) {
Db::rollback();
trace('给用户ID:' . $order['user_id'] . "解冻资金异常" . $order['order_no'], 'error');
continue;
}
$status=7;
$status = 7;
}
//更新状态
$bool_status = Db::table($table_obj['order_table'])->where('id', $order['id'])->update([
@ -1415,12 +1419,12 @@ class IPOService extends AdminBaseService
Db::commit();
}
$bool = Db::table($table_obj['stock_table'])->where('id', $param['pre_id'])->update([
'is_delete'=>2,
'is_delete' => 2,
'update_time' => $now
]);
if($bool){
if ($bool) {
return $this->toData('0', 'SUCCESS');
}else{
} else {
return $this->toData('1', '数据异常');
}
}
@ -1626,16 +1630,16 @@ class IPOService extends AdminBaseService
break;
case 19:
$result = [
// 'stock_table' => $prefix . 'pre_jp_stock',
// 'order_table' => $prefix . 'user_jp_pre_stock_order',
// 'stock_table' => $prefix . 'pre_jp_stock',
// 'order_table' => $prefix . 'user_jp_pre_stock_order',
'user_table' => $prefix . 'user_forex',
'log_table' => $prefix . 'user_forex_log',
'list_table' => $prefix . 'forex_list',
'trade_table' => $prefix . 'forex_trade',
// 'give_order_table' => $prefix . 'user_jp_give_stock_order',
// 'give_order_table' => $prefix . 'user_jp_give_stock_order',
'redis_key' => 'FOREX:STOCK:LIST:',
'stock_id' => 'FOREX',
// 'country' => 'Japan',
// 'country' => 'Japan',
'check' => 'forex_stock_',
];
break;
@ -1659,8 +1663,8 @@ class IPOService extends AdminBaseService
'trade_table' => $prefix . 'gold_futures_trade',
'redis_key' => 'GoldFutures:STOCK:LIST:',
'stock_id' => 'USD', // 黄金期货资产表中contract_id对应的值,即 bot_user_gold_futures.contract_id
// 'country' => '',
// 'check' => '',
// 'country' => '',
// 'check' => '',
];
break;
default:
@ -1758,7 +1762,7 @@ class IPOService extends AdminBaseService
case 20:
// 印度股指
$result = [
'tape' =>[
'tape' => [
1 => "NSE",
2 => "BSE"
],
@ -1778,5 +1782,4 @@ class IPOService extends AdminBaseService
}
return $result;
}
}

57
app/command/ApiLogCommand.php

@ -0,0 +1,57 @@
<?php
declare(strict_types=1);
namespace app\command;
use app\model\ApiLogModel;
use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\facade\Cache;
use think\facade\Log;
class ApiLogCommand extends Command
{
protected function configure()
{
// 指令配置
$this->setName('api_log')
->setDescription('the api_log command');
}
/**
* Execute the console command.
*
* @param Input $input
* @param Output $output
* @return void
*/
protected function execute(Input $input, Output $output)
{
while (true) {
try {
$redis = Cache::store('redis')->handler();
$result = $redis->blpop(['api_log'], 5);
if ($result) {
$logData = json_decode($result[1], true);
if (!is_array($logData) || empty($logData)) {
continue;
}
if ($logData) {
$logData['params'] = json_encode($logData['params'] ?? [], JSON_UNESCAPED_UNICODE);
$logData['response'] = json_encode($logData['response'] ?? [], JSON_UNESCAPED_UNICODE);
ApiLogModel::create($logData);
}
} else {
// 如果没有数据,休眠一段时间再继续
sleep(10);
}
} catch (\Throwable $e) {
Log::error('ApiLogCommand error: ' . $e->getMessage());
sleep(3);
}
}
}
}

14
app/home/controller/User.php

@ -32,6 +32,20 @@ class User extends HomeBaseController
return json($returnData);
}
// 使用vip兑换码兑换vip
public function redeemVip(): Json
{
$returnData = (new UserService())->redeemVip($this->request->userId, $this->request->post());
return json($returnData);
}
// 观看视频记录
public function watchVideo(): Json
{
$returnData = (new UserService())->watchVideo($this->request->userId, $this->request->post());
return json($returnData);
}
public function getAnchorForAgent(): Json
{
$returnData = (new UserService())->getAnchorForAgent($this->request->userId);

5
app/home/lang/zh-cn.php

@ -40,7 +40,8 @@ return [
'chat_group_is_empty' => '聊天群组为空',
'missing_user_id' => '缺少用户ID',
'data_configuration_error' => '数据配置错误',
'user_usd_balance_is_insufficient' => '用户余额不足',
'user_usd_balance_is_insufficient' => '用户美元余额不足',
'user_balance_is_insufficient' => '用户余额不足',
'vip_expiration_time_error' => 'VIP过期时间错误',
'anchor_information_is_empty' => '主播信息为空',
'avatar_information_error' => '头像信息错误',
@ -68,4 +69,4 @@ return [
'setting_error' => '设置错误',
'create_order_error' => '创建订单错误',
'success' => '成功',
];
];

3
app/home/lang/zh-jp.php

@ -41,7 +41,8 @@ return [
'chat_group_is_empty' => 'チャットグループは空です',
'missing_user_id' => 'ユーザーIDがありません',
'data_configuration_error' => 'データ構成エラー',
'user_usd_balance_is_insufficient' => 'ユーザー残高が不足しています',
'user_usd_balance_is_insufficient' => 'USDでのユーザー残高が不足しています',
'user_balance_is_insufficient' => 'ユーザー残高が不足しています',
'vip_expiration_time_error' => 'VIP有効期限エラー',
'anchor_information_is_empty' => 'アンカー情報が空です',
'avatar_information_error' => 'アバター情報エラー',

3
app/home/lang/zh-us.php

@ -41,7 +41,8 @@ return [
'chat_group_is_empty' => 'Chat group is empty',
'missing_user_id' => 'Missing User ID',
'data_configuration_error' => 'Data configuration error',
'user_usd_balance_is_insufficient' => 'The user balance is insufficient',
'user_usd_balance_is_insufficient' => 'The user USD balance is insufficient',
'user_balance_is_insufficient' => 'The user balance is insufficient',
'vip_expiration_time_error' => 'VIP expiration time error',
'anchor_information_is_empty' => 'The anchor information is empty',
'avatar_information_error' => 'Avatar information error',

76
app/home/middleware/ApiLogMiddleware.php

@ -0,0 +1,76 @@
<?php
namespace app\home\middleware;
use app\home\service\BaseHomeService;
use app\model\UserModel;
use think\Response;
use think\facade\Log;
use think\Request;
/**
* @desc 记录接口日志
*/
class ApiLogMiddleware
{
// 配置需要记录日志的接口(路径部分)
protected $logRoutes = [
'phone_login',
'email_login',
'email',
'email_reg',
'sms',
'sms_reg',
'forget_email',
'forget_sms',
'user_recharge',
'transfer',
'user_drawal',
'pre_stock/order',
'fund/order',
];
public function handle(Request $request, \Closure $next)
{
// OPTIONS 请求直接返回空响应
if ($request->method(true) === 'OPTIONS') {
return response()->send();
}
$path = $request->pathinfo();
$shouldLog = in_array($path, $this->logRoutes);
$logData = [];
if ($shouldLog) {
$ip = (new BaseHomeService())->getClientRealIp();
$params = $request->param();
$logData = [
'url' => $request->url(),
'method' => $request->method(),
'params' => $params,
'ip' => $ip,
];
// 如果登录了,记录 user_id
if (!empty($request->user_id)) {
$logData['user_id'] = $request->user_id;
}
}
$response = $next($request);
if ($shouldLog && $response instanceof Response) {
$logData['response'] = $response->getData();
}
//写入redis
if (!empty($logData)) {
$logData['user_agent'] = $request->header('user-agent');
$logData['created_at'] = date('Y-m-d H:i:s');
// 记录日志到 Redis
\think\facade\Cache::store('redis')->lpush('api_log', json_encode($logData));
}
return $response;
}
}

47
app/home/middleware/CheckUserMiddleware.php

@ -0,0 +1,47 @@
<?php
namespace app\home\middleware;
use app\model\UserModel;
use think\facade\Cache;
use think\facade\Config;
use think\facade\Lang;
use think\facade\Log;
use think\Request;
/**
* @desc 必须要登陆的接口 校验是否登陆
*/
class CheckUserMiddleware
{
public function handle(Request $request, \Closure $next)
{
// OPTIONS 请求直接返回空响应
if ($request->method(true) === 'OPTIONS') {
return response()->send();
}
// 设置多语言
Config::set(['default_lang' => 'zh-jp'], 'lang'); // P2 默认设置日语
$request->lang = Config::get('lang.default_lang');
$header = $request->header();
if (isset($header['language'])) {
$lang_list = Config::get('lang.allow_lang_list');
$lang = strtolower($header['language']);
if (in_array($lang, $lang_list)) {
Lang::setLangSet($lang);
$request->lang = $lang;
}
}
if (!empty($header['token']) && is_string($header['token'])) {
$tokenUserKey = 'TOKEN:USER:' . $header['token'];
$userId = Cache::store('redis')->get($tokenUserKey);
if ($userId && $userId >= 0) {
$request->userId = $userId;
}
}
return $next($request);
}
}

26
app/home/route/app.php

@ -21,8 +21,8 @@ $header = [
/**
* 不需要登陆的路由
*/
Route::group('/',function (){
Route::group('/',function (){
Route::group('/', function () {
Route::group('/', function () {
// 邮箱 登录
Route::post('/email_login', 'Login/loginEmail');
// 发送邮件
@ -101,7 +101,7 @@ Route::group('/',function (){
//数字币充值
Route::post('pay_notify', 'Pay/payNotify')->name('pay_notify'); //充值通知接口
Route::post('order_confirm', 'Pay/OrderConfirm')->name('order_confirm'); //充值通知接口
Route::get('get_wallet', 'Pay/wallet')->name('get_wallet');//获取钱包地址
Route::get('get_wallet', 'Pay/wallet')->name('get_wallet'); //获取钱包地址
Route::post('htpay_notify', 'Pay/htPayNotify')->name('htpay_notify'); //充值通知接口
Route::post('arpay_notify', 'Pay/arPayNotify')->name('arpay_notify'); //充值通知接口
@ -140,9 +140,10 @@ Route::group('/',function (){
//基金
Route::post('fund/index', 'Fund/index');
Route::post('auto_login', 'Login/autoLogin');
Route::post('user/user_access_log', 'User/userAccessLog')->middleware(\app\home\middleware\CheckUserMiddleware::class); //记录用户访问每个页面日志
// 需要登陆的操作
Route::group('/',function (){
Route::group('/', function () {
// 需要防止重复操作的路由
Route::group('', function () {
// 设置国家码
@ -202,6 +203,9 @@ Route::group('/',function (){
Route::post('user/info', 'User/getUserInfo');
Route::post('user/purchase_vip', 'User/purchaseVip'); //用户购买VIP
Route::post('user/purchase_vip_log', 'User/purchaseVipLog'); //用户购买VIP记录列表
Route::post('user/redeem_vip', 'User/redeemVip'); //使用vip兑换码兑换vip
// 观看点播视频记录
Route::post('user/watch_video', 'User/watchVideo');
// 获取用户的代理创建的群聊信息
Route::post('user/get_anchor_for_agent', 'User/getAnchorForAgent');
// 获取登陆记录
@ -212,7 +216,7 @@ Route::group('/',function (){
Route::post('user/apply_test', 'User/applyTest');
Route::post('user/test_login', 'User/testLogin');
Route::post('user/formal_login', 'User/formalLogin');
Route::post('user/user_access_log', 'User/userAccessLog'); //记录用户访问每个页面日志
Route::post('payment_list', 'Pay/payChannel'); //获取充值渠道
Route::post('user_recharge', 'Pay/rechargeApply')->middleware(\app\home\middleware\RepeatOperateMiddleware::class); // 用户提交充值订单
@ -257,7 +261,7 @@ Route::group('/',function (){
Route::post('trade_fee', 'Market/tradeFee');
Route::post('contract_setting', 'Market/ContractSetting');
Route::post('team_collect', 'Team/userTeamCollect');// 获取团队汇总
Route::post('team_collect', 'Team/userTeamCollect'); // 获取团队汇总
Route::post('team_back', 'Team/userTeamBack'); // 获取团队人数
Route::post('team_list', 'Team/userTeamList'); // 获取团队人数
// 根据邮箱重新设置密码
@ -298,11 +302,5 @@ Route::group('/',function (){
Route::post('stock/stock_analysis', 'Stock/stockAnalysis'); // 股票分析
})->middleware(\app\home\middleware\AuthMiddleware::class);
})->allowCrossDomain($header);
})->allowCrossDomain($header)
->middleware(\app\home\middleware\ApiLogMiddleware::class);

13
app/home/service/BaseHomeService.php

@ -76,6 +76,7 @@ class BaseHomeService
{
$code = random_int(1000, 9999);
$subject = "【Acm】あなたの認証コード[$code],有効10分以内";
// $subject = "your code is [$code], valid for 5 minutes";
return ['subject' => $subject, 'code' => $code];
}
@ -999,7 +1000,17 @@ class BaseHomeService
} else {
$result = [];
foreach ($type_arr as $v) {
$result[$v] = $type_list[$v];
$result[$v] = $type_list[$v] ?? [
'zh-cn' => '未知类型',
'zh-zh' => '未知类型',
'zh-us' => 'Unknown Type',
'zh-cs' => 'Neznámý typ',
'zh-sp' => 'Tipo desconocido',
'zh-eu' => 'Tipo Desconocido',
'zh-th' => 'ประเภทที่ไม่รู้จัก',
'zh-in' => 'अज्ञात प्रकार',
'zh-jp' => '不明なタイプ'
];
}
return $result;
}

31
app/home/service/LoginService.php

@ -193,7 +193,7 @@ class LoginService extends BaseHomeService
$userId = $regUser->user_id;
// 生成钱包地址
(new UserService())->doRegInitUserInfo($userId, $parentUserId);
// (new UserService())->doRegInitUserInfo($userId, $parentUserId);
// 请求聊天服务,注册聊天账号
$chatData = [
'Username' => $userNo,
@ -372,7 +372,10 @@ class LoginService extends BaseHomeService
if ($this->checkForbidNation($param['nation'])) {
return $this->toData('500', lang('unsupported_country_or_region'));
}
//日本手机号 不加国家码是10位
if (strlen($param['phone']) != 10) {
return $this->toData('500', lang('unsupported_country_or_region'));
}
// 判断国家码是否有效
$nationExists = CountryModel::checkCodeExists($param['nation']);
if (!$nationExists) {
@ -452,17 +455,15 @@ class LoginService extends BaseHomeService
// 校验验证码
$mobile = $param['nation'] . $param['phone'];
$smsKey = 'DB:USER:UNLOGIN:SMS_CODE:' . $mobile;
if ($param['sms_code'] != 8888) { // 方便测试,8888为万能验证码
if (!$this->checkCode($smsKey, $param['sms_code'])) {
if (!$this->checkCode($smsKey, $param['sms_code'])) {
//注册验证码
$reg_key = "USER:REG:CODE";
if (!$this->checkCode($reg_key, $param['sms_code'])) {
return $this->toData('500', lang('incorrect_verification_code'));
//注册验证码
// $reg_key = "USER:REG:CODE";
// if (!$this->checkCode($reg_key, $param['sms_code'])) {
// return $this->toData('100300', 'The verification code is incorrect.', []);
// }
}
}
// 手机号是否已经存在
$phoneExists = UserModel::checkPhoneExists($param['phone']);
if ($phoneExists) {
@ -656,11 +657,15 @@ class LoginService extends BaseHomeService
// 验证短信验证码
$mobile = $param['nation'] . $param['phone'];
$smsKey = 'DB:USER:UNLOGIN:SMS_CODE:' . $mobile;
if ($param['sms_code'] != 8888) {
if (!$this->checkCode($smsKey, $param['sms_code'])) {
if (!$this->checkCode($smsKey, $param['sms_code'])) {
//注册验证码
$reg_key = "USER:REG:CODE";
if (!$this->checkCode($reg_key, $param['sms_code'])) {
return $this->toData('500', lang('incorrect_verification_code'));
};
}
}
};
// 查找手机号
$userId = UserModel::getUserIdByNationAndPhone($param['nation'], $param['phone']);

484
app/home/service/UserService.php

File diff suppressed because it is too large

9
app/model/ApiLogModel.php

@ -0,0 +1,9 @@
<?php
namespace app\model;
class ApiLogModel extends BaseModel
{
protected $name = 'api_log';
}

79
app/model/ForexListMode.php

@ -0,0 +1,79 @@
<?php
namespace app\model;
/**
* @property int id
* @property string trade_name
* @property string status
* @property string is_owner
* @property string logo_link
* @property string face_value
* @property string info
* @property string sort
* @property string min_pry
* @property string max_pry
* @property string compel_num
* @property string keep_decimal
* @property string create_time
* @property string update_time
*/
class ForexListMode extends BaseModel
{
protected $name = 'forex_list';
protected $pk = 'id';
public static function getMarketList($data): array
{
$where=[
['status','=',1]
];
if(!empty($data['trade_name'])){
$where[]=[
'trade_name','like',strtoupper($data['trade_name']).'%'
];
}
if($data['page']<1){
$data['page']=1;
}
if($data['page_size']<1){
$data['page_size']=10;
}
$count=self::where($where)->count();
$list = self::where($where)->field('trade_name as name,trade_name as code')->page($data['page'],$data['page_size'])->select();
if(empty($list)){
return [];
}
return [
'total'=>$count,
'list'=>$list->toArray(),
];
}
public static function existMarket($trade_name):bool
{
$id=self::where('trade_name',$trade_name)->value('id');
return $id >0;
}
public static function getMarketFaceList($type=0)
{
$list=self::where('status',1)->field('face_value,trade_name as name,trade_name as code,sort,max_pry,min_pry')->select();
if(empty($list)){
return [];
}
$list=$list->toArray();
if($type==1){
foreach ($list as $val){
$face_list[$val['name']]=$val['face_value'];
}
}else{
$face_list=$list;
}
return $face_list;
}
}

9
app/model/UserAccessLogModel.php

@ -1,7 +1,14 @@
<?php
namespace app\model;
class UserAccessLogModel extends BaseModel
{
protected $name = 'user_access_log';
}
// 关联 User 模型
public function user()
{
return $this->belongsTo(UserModel::class, 'user_id', 'user_id');
}
}

7
app/model/VipCodeModel.php

@ -0,0 +1,7 @@
<?php
namespace app\model;
class VipCodeModel extends BaseModel
{
protected $name = 'vip_code';
}

8
app/model/WatchVideoLogModel.php

@ -0,0 +1,8 @@
<?php
namespace app\model;
class WatchVideoLogModel extends BaseModel
{
protected $name = 'watch_video_log';
}

4
app/utility/SendSms.php

@ -80,8 +80,8 @@ class SendSms
// ])
// ->request();
// $res = $result->toArray();
// trace('短信发送结果:'.json_encode([$res]), 'error');
// if(!isset($res['ResponseCode']) || $res['ResponseCode'] != 'OK'){
// trace('短信发送结果:' . json_encode([$res]), 'error');
// if (!isset($res['ResponseCode']) || $res['ResponseCode'] != 'OK') {
// return false;
// }
return true;

18
app/utility/UnqId.php

@ -35,4 +35,22 @@ class UnqId
$encryptPassword = $this->encryptPassword($string, $salt);
return $encryptPassword == $password;
}
// 生成随机字符
public function generateRandomCode($length = 15): string
{
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
$charLength = strlen($chars);
$code = '';
// 生成足够长度的安全随机数
$randomBytes = random_bytes($length);
for ($i = 0; $i < $length; $i++) {
$code .= $chars[random_int(0, $charLength - 1)];
}
return $code;
}
}

9
composer.json

@ -33,13 +33,8 @@
"geoip2/geoip2": "2.13",
"guzzlehttp/guzzle": "^7.7",
"lcobucci/jwt": "^4.0",
"phpoffice/phpspreadsheet": "^1.29",
"ext-json": "*",
"aws/aws-sdk-php": "^3.337",
"workerman/gatewayclient": "^3.1",
"pusher/pusher-push-notifications": "^2.0",
"mongodb/mongodb": "^1.21",
"ext-mongodb": "*"
"phpoffice/phpspreadsheet": "^4.3",
"ext-json": "*"
},
"require-dev": {
"symfony/var-dumper": "^4.2",

1
config/console.php

@ -5,5 +5,6 @@
return [
// 指令定义
'commands' => [
\app\command\ApiLogCommand::class,
],
];

Loading…
Cancel
Save