mirror of
https://github.com/v2board/v2board.git
synced 2024-11-14 07:29:13 +08:00
291 lines
11 KiB
PHP
291 lines
11 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Http\Requests\Admin\UserFetch;
|
|
use App\Http\Requests\Admin\UserGenerate;
|
|
use App\Http\Requests\Admin\UserSendMail;
|
|
use App\Http\Requests\Admin\UserUpdate;
|
|
use App\Jobs\SendEmailJob;
|
|
use App\Services\UserService;
|
|
use App\Utils\Helper;
|
|
use Illuminate\Http\Request;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\User;
|
|
use App\Models\Plan;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class UserController extends Controller
|
|
{
|
|
public function resetSecret(Request $request)
|
|
{
|
|
$user = User::find($request->input('id'));
|
|
if (!$user) abort(500, '用户不存在');
|
|
$user->token = Helper::guid();
|
|
$user->uuid = Helper::guid(true);
|
|
return response([
|
|
'data' => $user->save()
|
|
]);
|
|
}
|
|
|
|
private function filter(Request $request, $builder)
|
|
{
|
|
$filters = $request->input('filter');
|
|
if ($filters) {
|
|
foreach ($filters as $k => $filter) {
|
|
if ($filter['condition'] === '模糊') {
|
|
$filter['condition'] = 'like';
|
|
$filter['value'] = "%{$filter['value']}%";
|
|
}
|
|
if ($filter['key'] === 'd' || $filter['key'] === 'transfer_enable') {
|
|
$filter['value'] = $filter['value'] * 1073741824;
|
|
}
|
|
if ($filter['key'] === 'invite_by_email') {
|
|
$user = User::where('email', $filter['condition'], $filter['value'])->first();
|
|
$inviteUserId = isset($user->id) ? $user->id : 0;
|
|
$builder->where('invite_user_id', $inviteUserId);
|
|
unset($filters[$k]);
|
|
continue;
|
|
}
|
|
$builder->where($filter['key'], $filter['condition'], $filter['value']);
|
|
}
|
|
}
|
|
}
|
|
|
|
public function fetch(UserFetch $request)
|
|
{
|
|
$current = $request->input('current') ? $request->input('current') : 1;
|
|
$pageSize = $request->input('pageSize') >= 10 ? $request->input('pageSize') : 10;
|
|
$sortType = in_array($request->input('sort_type'), ['ASC', 'DESC']) ? $request->input('sort_type') : 'DESC';
|
|
$sort = $request->input('sort') ? $request->input('sort') : 'created_at';
|
|
$userModel = User::select(
|
|
DB::raw('*'),
|
|
DB::raw('(u+d) as total_used')
|
|
)
|
|
->orderBy($sort, $sortType);
|
|
$this->filter($request, $userModel);
|
|
$total = $userModel->count();
|
|
$res = $userModel->forPage($current, $pageSize)
|
|
->get();
|
|
$plan = Plan::get();
|
|
for ($i = 0; $i < count($res); $i++) {
|
|
for ($k = 0; $k < count($plan); $k++) {
|
|
if ($plan[$k]['id'] == $res[$i]['plan_id']) {
|
|
$res[$i]['plan_name'] = $plan[$k]['name'];
|
|
}
|
|
}
|
|
$res[$i]['subscribe_url'] = Helper::getSubscribeHost() . '/api/v1/client/subscribe?token=' . $res[$i]['token'];
|
|
}
|
|
return response([
|
|
'data' => $res,
|
|
'total' => $total
|
|
]);
|
|
}
|
|
|
|
public function getUserInfoById(Request $request)
|
|
{
|
|
if (empty($request->input('id'))) {
|
|
abort(500, '参数错误');
|
|
}
|
|
$user = User::find($request->input('id'));
|
|
if ($user->invite_user_id) {
|
|
$user['invite_user'] = User::find($user->invite_user_id);
|
|
}
|
|
return response([
|
|
'data' => $user
|
|
]);
|
|
}
|
|
|
|
public function update(UserUpdate $request)
|
|
{
|
|
$params = $request->validated();
|
|
$user = User::find($request->input('id'));
|
|
if (!$user) {
|
|
abort(500, '用户不存在');
|
|
}
|
|
if (User::where('email', $params['email'])->first() && $user->email !== $params['email']) {
|
|
abort(500, '邮箱已被使用');
|
|
}
|
|
if (isset($params['password'])) {
|
|
$params['password'] = password_hash($params['password'], PASSWORD_DEFAULT);
|
|
$params['password_algo'] = NULL;
|
|
} else {
|
|
unset($params['password']);
|
|
}
|
|
if (isset($params['plan_id'])) {
|
|
$plan = Plan::find($params['plan_id']);
|
|
if (!$plan) {
|
|
abort(500, '订阅计划不存在');
|
|
}
|
|
$params['group_id'] = $plan->group_id;
|
|
}
|
|
if ($request->input('invite_user_email')) {
|
|
$inviteUser = User::where('email', $request->input('invite_user_email'))->first();
|
|
if ($inviteUser) {
|
|
$params['invite_user_id'] = $inviteUser->id;
|
|
}
|
|
} else {
|
|
$params['invite_user_id'] = null;
|
|
}
|
|
|
|
try {
|
|
$user->update($params);
|
|
} catch (\Exception $e) {
|
|
abort(500, '保存失败');
|
|
}
|
|
return response([
|
|
'data' => true
|
|
]);
|
|
}
|
|
|
|
public function dumpCSV(Request $request)
|
|
{
|
|
$userModel = User::orderBy('id', 'asc');
|
|
$this->filter($request, $userModel);
|
|
$res = $userModel->get();
|
|
$plan = Plan::get();
|
|
for ($i = 0; $i < count($res); $i++) {
|
|
for ($k = 0; $k < count($plan); $k++) {
|
|
if ($plan[$k]['id'] == $res[$i]['plan_id']) {
|
|
$res[$i]['plan_name'] = $plan[$k]['name'];
|
|
}
|
|
}
|
|
}
|
|
|
|
$data = "邮箱,余额,推广佣金,总流量,剩余流量,套餐到期时间,订阅计划,订阅地址\r\n";
|
|
$baseUrl = config('v2board.subscribe_url', config('v2board.app_url', env('APP_URL')));
|
|
foreach($res as $user) {
|
|
$expireDate = $user['expired_at'] === NULL ? '长期有效' : date('Y-m-d H:i:s', $user['expired_at']);
|
|
$balance = $user['balance'] / 100;
|
|
$commissionBalance = $user['commission_balance'] / 100;
|
|
$transferEnable = $user['transfer_enable'] ? $user['transfer_enable'] / 1073741824 : 0;
|
|
$notUseFlow = (($user['transfer_enable'] - ($user['u'] + $user['d'])) / 1073741824) ?? 0;
|
|
$planName = $user['plan_name'] ?? '无订阅';
|
|
$subscribeUrl = $baseUrl . '/api/v1/client/subscribe?token=' . $user['token'];
|
|
$data .= "{$user['email']},{$balance},{$commissionBalance},{$transferEnable},{$notUseFlow},{$expireDate},{$planName},{$subscribeUrl}\r\n";
|
|
}
|
|
echo "\xEF\xBB\xBF" . $data;
|
|
}
|
|
|
|
public function generate(UserGenerate $request)
|
|
{
|
|
if ($request->input('email_prefix')) {
|
|
if ($request->input('plan_id')) {
|
|
$plan = Plan::find($request->input('plan_id'));
|
|
if (!$plan) {
|
|
abort(500, '订阅计划不存在');
|
|
}
|
|
}
|
|
$user = [
|
|
'email' => $request->input('email_prefix') . '@' . $request->input('email_suffix'),
|
|
'plan_id' => isset($plan->id) ? $plan->id : NULL,
|
|
'group_id' => isset($plan->group_id) ? $plan->group_id : NULL,
|
|
'transfer_enable' => isset($plan->transfer_enable) ? $plan->transfer_enable * 1073741824 : 0,
|
|
'expired_at' => $request->input('expired_at') ?? NULL,
|
|
'uuid' => Helper::guid(true),
|
|
'token' => Helper::guid()
|
|
];
|
|
if (User::where('email', $user['email'])->first()) {
|
|
abort(500, '邮箱已存在于系统中');
|
|
}
|
|
$user['password'] = password_hash($request->input('password') ?? $user['email'], PASSWORD_DEFAULT);
|
|
if (!User::create($user)) {
|
|
abort(500, '生成失败');
|
|
}
|
|
return response([
|
|
'data' => true
|
|
]);
|
|
}
|
|
if ($request->input('generate_count')) {
|
|
$this->multiGenerate($request);
|
|
}
|
|
}
|
|
|
|
private function multiGenerate(Request $request)
|
|
{
|
|
if ($request->input('plan_id')) {
|
|
$plan = Plan::find($request->input('plan_id'));
|
|
if (!$plan) {
|
|
abort(500, '订阅计划不存在');
|
|
}
|
|
}
|
|
$users = [];
|
|
for ($i = 0;$i < $request->input('generate_count');$i++) {
|
|
$user = [
|
|
'email' => Helper::randomChar(6) . '@' . $request->input('email_suffix'),
|
|
'plan_id' => isset($plan->id) ? $plan->id : NULL,
|
|
'group_id' => isset($plan->group_id) ? $plan->group_id : NULL,
|
|
'transfer_enable' => isset($plan->transfer_enable) ? $plan->transfer_enable * 1073741824 : 0,
|
|
'expired_at' => $request->input('expired_at') ?? NULL,
|
|
'uuid' => Helper::guid(true),
|
|
'token' => Helper::guid(),
|
|
'created_at' => time(),
|
|
'updated_at' => time()
|
|
];
|
|
$user['password'] = password_hash($request->input('password') ?? $user['email'], PASSWORD_DEFAULT);
|
|
array_push($users, $user);
|
|
}
|
|
DB::beginTransaction();
|
|
if (!User::insert($users)) {
|
|
DB::rollBack();
|
|
abort(500, '生成失败');
|
|
}
|
|
DB::commit();
|
|
$data = "账号,密码,过期时间,UUID,创建时间,订阅地址\r\n";
|
|
$baseUrl = config('v2board.subscribe_url', config('v2board.app_url', env('APP_URL')));
|
|
foreach($users as $user) {
|
|
$expireDate = $user['expired_at'] === NULL ? '长期有效' : date('Y-m-d H:i:s', $user['expired_at']);
|
|
$createDate = date('Y-m-d H:i:s', $user['created_at']);
|
|
$password = $request->input('password') ?? $user['email'];
|
|
$subscribeUrl = $baseUrl . '/api/v1/client/subscribe?token=' . $user['token'];
|
|
$data .= "{$user['email']},{$password},{$expireDate},{$user['uuid']},{$createDate},{$subscribeUrl}\r\n";
|
|
}
|
|
echo $data;
|
|
}
|
|
|
|
public function sendMail(UserSendMail $request)
|
|
{
|
|
$sortType = in_array($request->input('sort_type'), ['ASC', 'DESC']) ? $request->input('sort_type') : 'DESC';
|
|
$sort = $request->input('sort') ? $request->input('sort') : 'created_at';
|
|
$builder = User::orderBy($sort, $sortType);
|
|
$this->filter($request, $builder);
|
|
$users = $builder->get();
|
|
foreach ($users as $user) {
|
|
SendEmailJob::dispatch([
|
|
'email' => $user->email,
|
|
'subject' => $request->input('subject'),
|
|
'template_name' => 'notify',
|
|
'template_value' => [
|
|
'name' => config('v2board.app_name', 'V2Board'),
|
|
'url' => config('v2board.app_url'),
|
|
'content' => $request->input('content')
|
|
]
|
|
],
|
|
'send_email_mass');
|
|
}
|
|
|
|
return response([
|
|
'data' => true
|
|
]);
|
|
}
|
|
|
|
public function ban(Request $request)
|
|
{
|
|
$sortType = in_array($request->input('sort_type'), ['ASC', 'DESC']) ? $request->input('sort_type') : 'DESC';
|
|
$sort = $request->input('sort') ? $request->input('sort') : 'created_at';
|
|
$builder = User::orderBy($sort, $sortType);
|
|
$this->filter($request, $builder);
|
|
try {
|
|
$builder->update([
|
|
'banned' => 1
|
|
]);
|
|
} catch (\Exception $e) {
|
|
abort(500, '处理失败');
|
|
}
|
|
|
|
return response([
|
|
'data' => true
|
|
]);
|
|
}
|
|
}
|