赞助模块完善! #13

Merged
XiaoLFeng merged 10 commits from feature into master 2023-07-24 14:37:54 +08:00
24 changed files with 5629 additions and 35 deletions

View File

@ -75,6 +75,7 @@ public function apiConsoleAdd(Request $request): JsonResponse
} else { } else {
if (empty($request->userEmail)) $request->userEmail = null; if (empty($request->userEmail)) $request->userEmail = null;
if (empty($request->checkRssJudge)) $request->checkRssJudge = 0; if (empty($request->checkRssJudge)) $request->checkRssJudge = 0;
if (empty($request->userRemark)) $request->userRemark = null;
if (empty($request->userRss)) $request->userRss = null; if (empty($request->userRss)) $request->userRss = null;
// 更新数据库 // 更新数据库
DB::table('blog_link') DB::table('blog_link')
@ -164,6 +165,7 @@ public function apiConsoleEdit(Request $request): JsonResponse
} else { } else {
if (empty($request->userEmail)) $request->userEmail = null; if (empty($request->userEmail)) $request->userEmail = null;
if (empty($request->checkRssJudge)) $request->checkRssJudge = 0; if (empty($request->checkRssJudge)) $request->checkRssJudge = 0;
if (empty($request->userRemark)) $request->userRemark = null;
if (empty($request->userRss)) $request->userRss = null; if (empty($request->userRss)) $request->userRss = null;
// 更新数据库 // 更新数据库
DB::table('blog_link') DB::table('blog_link')
@ -252,6 +254,9 @@ public function apiConsoleCheck(Request $request): JsonResponse
], ],
]; ];
} else { } else {
if (empty($request->checkRssJudge)) $request->checkRssJudge = 0;
if (empty($request->userRemark)) $request->userRemark = null;
if (empty($request->userRss)) $request->userRss = null;
// 更新数据库 // 更新数据库
DB::table('blog_link') DB::table('blog_link')
->where([['id', '=', $request->userId]]) ->where([['id', '=', $request->userId]])

View File

@ -0,0 +1,762 @@
<?php
/*
* Copyright © 2016 - 2023 筱锋xiao_lfeng. All Rights Reserved.
* 开发开源遵循 MIT 许可,若需商用请联系开发者
* https://www.x-lf.com/
*/
namespace App\Http\Controllers\Console;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Index;
use ErrorException;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\View\Factory;
use Illuminate\Contracts\View\View;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Validator;
class Sponsor extends Controller
{
private array $data;
public function __construct()
{
$data = new Index();
$this->data = $data->data;
}
public function apiEdit(Request $request, $sponsorId): JsonResponse
{
$getData = $request->all();
$getData['id'] = $sponsorId;
if (Auth::check()) {
if (Auth::user()->admin) {
$dataCheck = Validator::make($getData, [
'id' => 'required|int',
'name' => 'required|string',
'type' => 'required|int',
'money' => 'required|numeric',
'url' => 'regex:#[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?#',
'date' => 'required|string',
]);
// 检查是否符合规则
if ($dataCheck->fails()) {
$errorType = array_keys($dataCheck->failed());
$i = 0;
foreach ($dataCheck->failed() as $valueData) {
$errorInfo[$errorType[$i]] = array_keys($valueData);
if ($i == 0) {
$errorSingle = [
'info' => $errorType[$i],
'need' => $errorInfo[$errorType[$i]],
];
}
$i++;
}
$returnData = [
'output' => 'DataFormatError',
'code' => 403,
'data' => [
'message' => '输入内容有错误',
'errorSingle' => $errorSingle,
'error' => $errorInfo,
],
];
} else {
// 查询数据
$resultSponsor = (array)DB::table('sponsor')
->where([['id', '=', $getData['id']]])
->get()
->toArray()[0];
// 检查数据
if ($resultSponsor['id'] !== null) {
// 修改数据
DB::table('sponsor')
->where([['id', '=', $resultSponsor['id']]])
->update([
'name' => $request->name,
'type' => $request->type,
'money' => $request->money,
'url' => $request->url,
'time' => date('Y-m-d H:i:s', strtotime($request->date)),
]);
$returnData = [
'output' => 'Success',
'code' => 200,
'data' => [
'message' => '操作成功',
],
];
} else {
$returnData = [
'output' => 'NoData',
'code' => 403,
'data' => [
'message' => '数据不存在',
],
];
}
}
} else {
$returnData = [
'output' => 'NoPermission',
'code' => 403,
'data' => [
'message' => '没有权限',
],
];
}
} else {
$returnData = [
'output' => 'PleaseLogin',
'code' => 403,
'data' => [
'message' => '请登录',
],
];
}
return Response::json($returnData, $returnData['code']);
}
public function apiDelete($sponsorId): JsonResponse
{
$arrayData['sponsorId'] = $sponsorId;
if (Auth::check()) {
if (Auth::user()->admin) {
$checkData = Validator::make($arrayData, [
'sponsorId' => 'required|int'
]);// 检查是否符合规则
if ($checkData->fails()) {
$errorType = array_keys($checkData->failed());
$i = 0;
foreach ($checkData->failed() as $valueData) {
$errorInfo[$errorType[$i]] = array_keys($valueData);
if ($i == 0) {
$errorSingle = [
'info' => $errorType[$i],
'need' => $errorInfo[$errorType[$i]],
];
}
$i++;
}
$returnData = [
'output' => 'DataFormatError',
'code' => 403,
'data' => [
'message' => '输入内容有错误',
'errorSingle' => $errorSingle,
'error' => $errorInfo,
],
];
} else {
// 查询数据
$resultSponsor = (array)DB::table('sponsor')
->where([['id', '=', $sponsorId]])
->get()
->toArray()[0];
// 检查数据
if ($resultSponsor['id'] !== null) {
// 修改数据
DB::table('sponsor')
->where([['id', '=', $resultSponsor['id']]])
->delete();
$returnData = [
'output' => 'Success',
'code' => 200,
'data' => [
'message' => '删除成功',
],
];
} else {
$returnData = [
'output' => 'NoData',
'code' => 403,
'data' => [
'message' => '数据不存在',
],
];
}
}
} else {
$returnData = [
'output' => 'NoPermission',
'code' => 403,
'data' => [
'message' => '没有权限',
],
];
}
} else {
$returnData = [
'output' => 'PleaseLogin',
'code' => 403,
'data' => [
'message' => '请登录',
],
];
}
return Response::json($returnData, $returnData['code']);
}
public function apiAdd(Request $request): JsonResponse
{
if (Auth::check()) {
if (Auth::user()->admin) {
// 处理数据
$dataCheck = Validator::make($request->all(), [
'name' => 'required|string',
'type' => 'required|int',
'money' => 'required|numeric',
'date' => 'required|string',
'url' => 'regex:#[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?#',
]);
if ($dataCheck->fails()) {
$errorType = array_keys($dataCheck->failed());
$i = 0;
foreach ($dataCheck->failed() as $valueData) {
$errorInfo[$errorType[$i]] = array_keys($valueData);
if ($i == 0) {
$errorSingle = [
'info' => $errorType[$i],
'need' => $errorInfo[$errorType[$i]],
];
}
$i++;
}
$returnData = [
'output' => 'DataFormatError',
'code' => 403,
'data' => [
'message' => '输入内容有错误',
'errorSingle' => $errorSingle,
'error' => $errorInfo,
],
];
} else {
if (empty($request->url)) $request->url = null;
// 操作数据库
DB::table('sponsor')
->insert([
'name' => $request->name,
'url' => $request->url,
'type' => $request->type,
'money' => $request->money,
'time' => date('Y-m-d H:i:s', strtotime($request->date)),
]);
$returnData = [
'output' => 'Success',
'code' => 200,
'data' => [
'message' => '操作成功',
],
];
}
} else {
$returnData = [
'output' => 'NoPermission',
'code' => 403,
'data' => [
'message' => '没有权限',
],
];
}
} else {
$returnData = [
'output' => 'PleaseLogin',
'code' => 403,
'data' => [
'message' => '请登录',
],
];
}
return Response::json($returnData, $returnData['code']);
}
public function apiTypeAdd(Request $request): JsonResponse
{
if (Auth::check()) {
if (Auth::user()->admin) {
$dataCheck = Validator::make($request->all(), [
'name' => 'required|string',
'url' => 'required|regex:#[a-zA-z]+://[^\s]*#',
'include' => 'int',
'link' => 'int',
]);
if ($dataCheck->fails()) {
$errorType = array_keys($dataCheck->failed());
$i = 0;
foreach ($dataCheck->failed() as $valueData) {
$errorInfo[$errorType[$i]] = array_keys($valueData);
if ($i == 0) {
$errorSingle = [
'info' => $errorType[$i],
'need' => $errorInfo[$errorType[$i]],
];
}
$i++;
}
$returnData = [
'output' => 'DataFormatError',
'code' => 403,
'data' => [
'message' => '输入内容有错误',
'errorSingle' => $errorSingle,
'error' => $errorInfo,
],
];
} else {
// 处理数据
if (empty($request->include)) $request->include = 0;
if (empty($request->link)) $request->link = 0;
DB::table('sponsor_type')
->insert([
'name' => $request->name,
'url' => $request->url,
'include' => $request->include,
'link' => $request->link,
'created_at' => date('Y-m-d H:i:s'),
]);
$returnData = [
'output' => 'Success',
'code' => 200,
'data' => [
'message' => '创建成功',
],
];
}
} else {
$returnData = [
'output' => 'NoPermission',
'code' => 403,
'data' => [
'message' => '没有权限',
],
];
}
} else {
$returnData = [
'output' => 'PleaseLogin',
'code' => 403,
'data' => [
'message' => '请登录',
],
];
}
return Response::json($returnData, $returnData['code']);
}
public function apiTypeEdit(Request $request, $typeId = null): JsonResponse
{
if ((empty($typeId) && !empty($request->edit_id)) || (!empty($typeId) && empty($request->edit_id))) {
$getData = $request->all();
if (!empty($typeId) && empty($request->edit_id)) $getData['edit_id'] = $typeId;
if (Auth::check()) {
if (Auth::user()->admin) {
// 检查数据
$dataCheck = Validator::make($getData, [
'edit_id' => 'required|int',
'edit_name' => 'required|string',
'edit_url' => 'required|regex:#[a-zA-z]+://[^\s]*#',
'edit_include' => 'int',
'edit_link' => 'int',
]);
if ($dataCheck->fails()) {
$errorType = array_keys($dataCheck->failed());
$i = 0;
foreach ($dataCheck->failed() as $valueData) {
$errorInfo[$errorType[$i]] = array_keys($valueData);
if ($i == 0) {
$errorSingle = [
'info' => $errorType[$i],
'need' => $errorInfo[$errorType[$i]],
];
}
$i++;
}
$returnData = [
'output' => 'DataFormatError',
'code' => 403,
'data' => [
'message' => '输入内容有错误',
'errorSingle' => $errorSingle,
'error' => $errorInfo,
],
];
} else {
// 操作数据库
$resultSponsorType = (array)DB::table('sponsor_type')
->where([['id', '=', $getData['edit_id']]])
->get()
->toArray()[0];
if (!empty($resultSponsorType['id'])) {
if (empty($getData['edit_include'])) $getData['edit_include'] = 0;
if (empty($getData['edit_link'])) $getData['edit_link'] = 0;
// 操作数据库
DB::table('sponsor_type')
->where([['id', '=', $resultSponsorType['id']]])
->update([
'name' => $getData['edit_name'],
'url' => $getData['edit_url'],
'include' => $getData['edit_include'],
'link' => $getData['edit_link'],
'updated_at' => date('Y-m-d H:i:s'),
]);
$returnData = [
'output' => 'Success',
'code' => 200,
'data' => [
'message' => '修改成功',
],
];
} else {
$returnData = [
'output' => 'NoData',
'code' => 403,
'data' => [
'message' => '不存在数据',
],
];
}
}
} else {
$returnData = [
'output' => 'NoPermission',
'code' => 403,
'data' => [
'message' => '没有权限',
],
];
}
} else {
$returnData = [
'output' => 'PleaseLogin',
'code' => 403,
'data' => [
'message' => '请登录',
],
];
}
} else {
$returnData = [
'output' => 'InputError',
'code' => 403,
'data' => [
'message' => '不允许Url参数与表单参数同时输入',
],
];
}
return Response::json($returnData, $returnData['code']);
}
public function apiTypeDelete($typeId): JsonResponse
{
if (Auth::check()) {
if (Auth::user()->admin) {
// 检查ID
$arrayData['typeId'] = $typeId;
$dataCheck = Validator::make($arrayData, [
'typeId' => 'required|int',
]);
if ($dataCheck->fails()) {
$errorType = array_keys($dataCheck->failed());
$i = 0;
foreach ($dataCheck->failed() as $valueData) {
$errorInfo[$errorType[$i]] = array_keys($valueData);
if ($i == 0) {
$errorSingle = [
'info' => $errorType[$i],
'need' => $errorInfo[$errorType[$i]],
];
}
$i++;
}
$returnData = [
'output' => 'DataFormatError',
'code' => 403,
'data' => [
'message' => '输入内容有错误',
'errorSingle' => $errorSingle,
'error' => $errorInfo,
],
];
} else {
// 操作数据库
$resultSponsorType = (array)DB::table('sponsor_type')
->where([['id', '=', $typeId]])
->get()
->toArray()[0];
if (!empty($resultSponsorType['id'])) {
// 删除数据
DB::table('sponsor_type')
->where([['id', '=', $resultSponsorType['id']]])
->delete();
$returnData = [
'output' => 'Success',
'code' => 200,
'data' => [
'message' => '操作成功',
],
];
} else {
$returnData = [
'output' => 'NoData',
'code' => 403,
'data' => [
'message' => '不存在数据',
],
];
}
}
} else {
$returnData = [
'output' => 'NoPermission',
'code' => 403,
'data' => [
'message' => '没有权限',
],
];
}
} else {
$returnData = [
'output' => 'PleaseLogin',
'code' => 403,
'data' => [
'message' => '请登录',
],
];
}
return Response::json($returnData, $returnData['code']);
}
public function apiTypeSelect($typeId): JsonResponse
{
if (Auth::check()) {
if (Auth::user()->admin) {
// 检查ID
$arrayData['typeId'] = $typeId;
$dataCheck = Validator::make($arrayData, [
'typeId' => 'required|int',
]);
if ($dataCheck->fails()) {
$errorType = array_keys($dataCheck->failed());
$i = 0;
foreach ($dataCheck->failed() as $valueData) {
$errorInfo[$errorType[$i]] = array_keys($valueData);
if ($i == 0) {
$errorSingle = [
'info' => $errorType[$i],
'need' => $errorInfo[$errorType[$i]],
];
}
$i++;
}
$returnData = [
'output' => 'DataFormatError',
'code' => 403,
'data' => [
'message' => '输入内容有错误',
'errorSingle' => $errorSingle,
'error' => $errorInfo,
],
];
} else {
// 获取数据
$resultTypeSponsor = (array)DB::table('sponsor_type')
->where([['id', '=', $typeId]])
->get()
->toArray()[0];
if (!empty($resultTypeSponsor['id'])) {
$returnData = [
'output' => 'Success',
'code' => 200,
'data' => [
'message' => '查询成功',
'data' => $resultTypeSponsor,
],
];
} else {
$returnData = [
'output' => 'NoData',
'code' => 403,
'data' => [
'message' => '不存在数据',
],
];
}
}
} else {
$returnData = [
'output' => 'NoPermission',
'code' => 403,
'data' => [
'message' => '没有权限',
],
];
}
} else {
$returnData = [
'output' => 'PleaseLogin',
'code' => 403,
'data' => [
'message' => '请登录',
],
];
}
return Response::json($returnData, $returnData['code']);
}
protected function viewSponsorDashboard(): Factory|View|Application
{
$this->getAfadianData();
// 获取模块
$resultSponsorType = DB::table('sponsor_type')
->get()
->toArray();
$this->data['sponsorCountYear'] = 0;
$this->data['sponsorCount'] = 0;
$this->data['sponsorCountNumber'] = count($this->data['sponsor']);
foreach ($this->data['sponsor'] as $value) {
$this->data['sponsorCount'] += $value['money'];
if ($value['time'] >= date('Y') . '-01-01 00:00:00') {
$this->data['sponsorCountYear'] += $value['money'];
}
}
foreach ($resultSponsorType as $value) {
$this->data['sponsorType'][$value->id] = [
'id' => $value->id,
'name' => $value->name,
'url' => $value->url,
'include' => $value->include,
'link' => $value->link,
];
}
return view('console.sponsor.dashboard', $this->data);
}
private function getAfadianData(): void
{
$verify = ['verify' => true];
if ($_SERVER['SERVER_PORT'] != 443) $verify = ['verify' => false];
// 从数据库获取数据
$result = DB::table('info')
->get()
->toArray();
$sponsor = DB::table('sponsor')
->orderBy('time', 'desc')
->limit(50)
->get()
->toArray();
try {
for ($i = 0; $sponsor[$i] != null; $i++) {
$this->data['sponsor'][$i] = [
'id' => $sponsor[$i]->id,
'name' => $sponsor[$i]->name,
'url' => $sponsor[$i]->url,
'type' => $sponsor[$i]->type,
'money' => $sponsor[$i]->money,
'time' => date('Y-m-d', strtotime($sponsor[$i]->time)),
];
}
} catch (ErrorException $e) {
}
$userID = $result[20]->data;
$token = $result[21]->data;
$time = time();
$params = [
'page' => 1,
'per_page' => 100,
];
$sign = md5($token . 'params' . json_encode($params) . 'ts' . $time . 'user_id' . $userID);
$data = [
'query' => [
'user_id' => $userID,
'params' => json_encode($params),
'ts' => $time,
'sign' => $sign,
],
];
$client = new Client($verify);
try {
$response = $client->get('https://afdian.net/api/open/query-sponsor', $data);
$getData = json_decode($response->getBody()->getContents());
} catch (GuzzleException $e) {
return;
}
// 处理数据
$j = 0;
foreach ($getData->data->list as $value) {
// 整合数据
$data_elem[$j] = [
'id' => $value->last_pay_time,
'name' => $value->user->name,
'url' => null,
'type' => 5,
'money' => (double)$value->all_sum_amount,
'time' => date('Y-m-d', $value->last_pay_time),
];
$j++;
}
$this->data['sponsor'] = array_merge($this->data['sponsor'], $data_elem);
usort($this->data['sponsor'], function ($a, $b) {
return strtotime($b['time']) - strtotime($a['time']);
});
}
protected function viewEdit($sponsorId): Application|Factory|View|RedirectResponse
{
$getData['sponsorId'] = $sponsorId;
$checkData = Validator::make($getData, [
'sponsorId' => 'required|int'
]);
if ($checkData->fails()) {
return Response::redirectTo(route('console.sponsor.dashboard'));
} else {
$resultSponsor = DB::table('sponsor')
->where([['id', '=', $sponsorId]])
->get()
->toArray();
$resultSponsor = (array)$resultSponsor[0];
if (!empty($resultSponsor['id'])) {
$this->data['sponsor'] = $resultSponsor;
$this->data['sponsor']['time'] = date('m/d/Y', strtotime($resultSponsor['time']));
$resultSponsorType = DB::table('sponsor_type')
->get()
->toArray();
foreach ($resultSponsorType as $value) {
$this->data['sponsorType'][$value->id] = [
'id' => $value->id,
'name' => $value->name,
'url' => $value->url,
'include' => $value->include,
'link' => $value->link,
];
}
return view('console.sponsor.edit', $this->data);
} else {
return Response::redirectTo(route('console.sponsor.dashboard'));
}
}
}
protected function viewMode(): Factory|View|Application
{
$this->data['sponsorTypeCount'] = DB::table('sponsor_type')->count('id');
$this->data['sponsorType'] = DB::table('sponsor_type')
->get()
->toArray();
return view('console.sponsor.mode', $this->data);
}
}

View File

@ -15,16 +15,20 @@ class DataBase extends Controller
public function __construct() public function __construct()
{ {
DB::statement("TRUNCATE TABLE `xf_index`.`blog_link`"); DB::statement("TRUNCATE TABLE `xf_index`.`blog_link`");
$result = DB::table('xf_blog_friends') $resultBlog = DB::table('xf_blog_friends')
->orderBy('id') ->orderBy('id')
->get() ->get()
->toArray(); ->toArray();
foreach ($result as $value) { foreach ($resultBlog as $value) {
$value->blog_rss_judge ? $value->blog_rss_judge = 1 : $value->blog_rss_judge = 0; $value->blog_rss_judge ? $value->blog_rss_judge = 1 : $value->blog_rss_judge = 0;
if ($value->blog_sel_color == 8) $value->blog_sel_color = 6; if ($value->blog_sel_color == 8) $value->blog_sel_color = 6;
if ($value->blog_sel_color == 2) $value->blog_sel_color = 8; if ($value->blog_sel_color == 2) $value->blog_sel_color = 8;
if ($value->blog_sel_color == 7) $value->blog_sel_color = 4; if ($value->blog_sel_color == 7) $value->blog_sel_color = 4;
if ($value->blog_sel_color == 5) $value->blog_sel_color = 3; if ($value->blog_sel_color == 5) $value->blog_sel_color = 3;
if (empty($value->blog_owner_email)) $value->blog_owner_email = null;
if (empty($value->blog_rss)) $value->blog_rss = null;
if (empty($value->blog_serverhost)) $value->blog_serverhost = null;
DB::table('blog_link') DB::table('blog_link')
->insert([ ->insert([
'blogName' => $value->blog_name, 'blogName' => $value->blog_name,
@ -37,8 +41,69 @@ public function __construct()
'blogServerHost' => $value->blog_serverhost, 'blogServerHost' => $value->blog_serverhost,
'blogLocation' => $value->blog_location, 'blogLocation' => $value->blog_location,
'blogSetColor' => $value->blog_sel_color, 'blogSetColor' => $value->blog_sel_color,
'created_at' => date('Y-m-d H:i:s'), 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'),
]); ]);
} }
DB::statement("TRUNCATE TABLE `xf_index`.`sponsor`");
$resultSponsor = DB::table('xf_sponsor')
->orderBy('id')
->get()
->toArray();
foreach ($resultSponsor as $value) {
if ($value->mode == 'AliPay') $value->mode = 1;
if ($value->mode == 'WeChat') $value->mode = 2;
if ($value->mode == 'QQ') $value->mode = 3;
if ($value->mode == 'PayPal') $value->mode = 4;
if (empty($value->url)) $value->url = null;
DB::table('sponsor')
->insert([
'name' => $value->name,
'url' => $value->url,
'type' => $value->mode,
'money' => $value->count,
'time' => $value->time,
]);
}
DB::statement("TRUNCATE TABLE `xf_index`.`sponsor_type`");
DB::table('sponsor_type')
->insert([
[
'name' => '支付宝',
'url' => 'https://i-cdn.akass.cn/2023/07/64ba859272bc9.jpg',
'include' => 1,
'link' => 0,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s')],
[
'name' => '微信',
'url' => 'https://i-cdn.akass.cn/2023/07/64ba67c9d08ab.jpg',
'include' => 1,
'link' => 0,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s')],
[
'name' => '扣扣',
'url' => 'https://i-cdn.akass.cn/2023/07/64ba8817b179b.png',
'include' => 1,
'link' => 0,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s')],
[
'name' => 'PayPal',
'url' => 'https://www.paypal.com/paypalme/xiaolfeng',
'include' => 1,
'link' => 1,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s')],
[
'name' => '爱发电',
'url' => 'https://afdian.net/a/xiao_lfeng',
'include' => 1,
'link' => 1,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s')],
]);
} }
} }

View File

@ -86,9 +86,9 @@ public function apiCustomAdd(HttpRequest $request): JsonResponse
]; ];
} else { } else {
// 检查数据 // 检查数据
if (empty($request->checkRssJudge)) { if (empty($request->checkRssJudge)) $request->checkRssJudge = 0;
$request->checkRssJudge = 0; if (empty($request->userRemark)) $request->userRemark = null;
} if (empty($request->userRss)) $request->userRss = null;
// 根据数据库检查邮箱用户是否已存在 // 根据数据库检查邮箱用户是否已存在
$resultBlog = DB::table('blog_link') $resultBlog = DB::table('blog_link')
@ -616,9 +616,10 @@ public function apiCustomEdit(HttpRequest $request, string $friendId): JsonRespo
]; ];
} else { } else {
// 检查数据 // 检查数据
if (empty($request->checkRssJudge)) { if (empty($request->checkRssJudge)) $request->checkRssJudge = 0;
$request->checkRssJudge = 0; if (empty($request->userRemark)) $request->userRemark = null;
} if (empty($request->userRss)) $request->userRss = null;
// 数据载入数组 // 数据载入数组
$this->data['oldBlog'] = (object)[ $this->data['oldBlog'] = (object)[
'blogOwnEmail' => $resultBlog->blogOwnEmail, 'blogOwnEmail' => $resultBlog->blogOwnEmail,

View File

@ -0,0 +1,165 @@
<?php
/*
* Copyright © 2016 - 2023 筱锋xiao_lfeng. All Rights Reserved.
* 开发开源遵循 MIT 许可,若需商用请联系开发者
* https://www.x-lf.com/
*/
namespace App\Http\Controllers\Function;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Index;
use ErrorException;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\View\Factory;
use Illuminate\Contracts\View\View;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Validator;
class Sponsor extends Controller
{
private array $data;
public function __construct()
{
$data = new Index();
$this->data = $data->data;
}
protected function viewSponsor(): Application|Factory|View
{
// 获取赞助信息
$this->getAfadianData();
$this->data['sponsorCountNumber'] = count($this->data['sponsor']);
$resultSponsorType = DB::table('sponsor_type')
->get()
->toArray();
foreach ($resultSponsorType as $value) {
$this->data['sponsorType'][$value->id] = [
'id' => $value->id,
'name' => $value->name,
'url' => $value->url,
'include' => $value->include,
'link' => $value->link,
];
}
$this->data['sponsorInfo'] = (new Index())->MarkdownToStringReplace(DB::table('info')->find(20)->data);
$this->data['sponsorCountYear'] = 0;
$this->data['sponsorCount'] = 0;
foreach ($this->data['sponsorType'] as $value) {
$this->data['sponsorURL'] = $value['url'];
break;
};
foreach ($this->data['sponsor'] as $value) {
$this->data['sponsorCount'] += $value['money'];
if ($value['time'] >= date('Y') . '-01-01 00:00:00') {
$this->data['sponsorCountYear'] += $value['money'];
}
}
return view('function.sponsor', $this->data);
}
public function apiSponsorType(Request $request): JsonResponse
{
$checkData = Validator::make($request->all(), [
'id' => 'required|int',
]);
if (!$checkData->fails()) {
$resultSponsorType = DB::table('sponsor_type')
->where([['id', '=', $request->id]])
->get()
->toArray();
$returnData = [
'output' => 'Success',
'code' => 200,
'data' => $resultSponsorType[0],
];
} else {
$returnData = [
'output' => 'CheckFail',
'code' => 403,
'data' => [
'message' => '输入参数有误',
],
];
}
return Response::json($returnData, $returnData['code']);
}
private function getAfadianData(): void
{
$verify = ['verify' => true];
if ($_SERVER['SERVER_PORT'] != 443) $verify = ['verify' => false];
// 从数据库获取数据
$result = DB::table('info')
->get()
->toArray();
$sponsor = DB::table('sponsor')
->orderBy('time', 'desc')
->limit(50)
->get()
->toArray();
try {
for ($i = 0; $sponsor[$i] != null; $i++) {
$this->data['sponsor'][$i] = [
'id' => $sponsor[$i]->id,
'name' => $sponsor[$i]->name,
'url' => $sponsor[$i]->url,
'type' => $sponsor[$i]->type,
'money' => $sponsor[$i]->money,
'time' => date('Y-m-d', strtotime($sponsor[$i]->time)),
];
}
} catch (ErrorException $e) {
}
$userID = $result[20]->data;
$token = $result[21]->data;
$time = time();
$params = [
'page' => 1,
'per_page' => 50,
];
$sign = md5($token . 'params' . json_encode($params) . 'ts' . $time . 'user_id' . $userID);
$data = [
'query' => [
'user_id' => $userID,
'params' => json_encode($params),
'ts' => $time,
'sign' => $sign,
],
];
$client = new Client($verify);
try {
$response = $client->get('https://afdian.net/api/open/query-sponsor', $data);
$getData = json_decode($response->getBody()->getContents());
} catch (GuzzleException $e) {
return;
}
// 处理数据
$j = 0;
foreach ($getData->data->list as $value) {
// 整合数据
$data_elem[$j] = [
'id' => $value->last_pay_time,
'name' => $value->user->name,
'url' => null,
'type' => 5,
'money' => (double)$value->all_sum_amount,
'time' => date('Y-m-d', $value->last_pay_time),
];
$j++;
}
$this->data['sponsor'] = array_merge($this->data['sponsor'], $data_elem);
usort($this->data['sponsor'], function ($a, $b) {
return strtotime($b['time']) - strtotime($a['time']);
});
}
}

View File

@ -72,7 +72,7 @@
| |
*/ */
'timezone' => 'UTC', 'timezone' => 'Asia/Shanghai',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------

View File

@ -38,6 +38,11 @@ public function up()
DB::table('info')->insert(['value' => 'applicationRule', 'created_at' => date('Y-m-d H:i:s')]); DB::table('info')->insert(['value' => 'applicationRule', 'created_at' => date('Y-m-d H:i:s')]);
DB::table('info')->insert(['value' => 'applicationInfo', 'created_at' => date('Y-m-d H:i:s')]); DB::table('info')->insert(['value' => 'applicationInfo', 'created_at' => date('Y-m-d H:i:s')]);
DB::table('info')->insert(['value' => 'email', 'created_at' => date('Y-m-d H:i:s')]); DB::table('info')->insert(['value' => 'email', 'created_at' => date('Y-m-d H:i:s')]);
DB::table('info')->insert(['value' => 'sponsorPayCodeType', 'created_at' => date('Y-m-d H:i:s')]);
DB::table('info')->insert(['value' => 'sponsorPayAll', 'created_at' => date('Y-m-d H:i:s')]);
DB::table('info')->insert(['value' => 'sponsorInfo', 'created_at' => date('Y-m-d H:i:s')]);
DB::table('info')->insert(['value' => 'afadianUserId', 'created_at' => date('Y-m-d H:i:s')]);
DB::table('info')->insert(['value' => 'afadianToken', 'created_at' => date('Y-m-d H:i:s')]);
}); });
} }

View File

@ -0,0 +1,40 @@
<?php
/*
* Copyright © 2016 - 2023 筱锋xiao_lfeng. All Rights Reserved.
* 开发开源遵循 MIT 许可,若需商用请联系开发者
* https://www.x-lf.com/
*/
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateSponsorTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('sponsor', function (Blueprint $table) {
$table->id();
$table->string('name')->comment('赞助者名称');
$table->string('url')->nullable()->comment('地址');
$table->integer('type')->comment('赞助方式');
$table->double('money')->comment('赞助金额');
$table->timestamp('time')->comment('时间戳');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('sponsor');
}
}

View File

@ -0,0 +1,40 @@
<?php
/*
* Copyright © 2016 - 2023 筱锋xiao_lfeng. All Rights Reserved.
* 开发开源遵循 MIT 许可,若需商用请联系开发者
* https://www.x-lf.com/
*/
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateSponsorTypeTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('sponsor_type', function (Blueprint $table) {
$table->id();
$table->string('name')->comment('赞助类型名称');
$table->text('url')->comment('图片或跳转地址');
$table->boolean('include')->default(true)->comment('是否计入总数');
$table->boolean('link')->default(false)->comment('是否是跳转链接');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('sponsor_type');
}
}

19
package-lock.json generated
View File

@ -11,10 +11,11 @@
"autoprefixer": "^10.4.14", "autoprefixer": "^10.4.14",
"axios": "^0.21", "axios": "^0.21",
"flowbite": "^1.6.5", "flowbite": "^1.6.5",
"flowbite-datepicker": "^1.2.2",
"laravel-mix": "^6.0.6", "laravel-mix": "^6.0.6",
"lodash": "^4.17.19", "lodash": "^4.17.19",
"postcss": "^8.4.24", "postcss": "^8.4.24",
"tailwindcss": "^3.3.2" "tailwindcss": "^3.3.3"
} }
}, },
"node_modules/@alloc/quick-lru": { "node_modules/@alloc/quick-lru": {
@ -4605,6 +4606,15 @@
"mini-svg-data-uri": "^1.4.3" "mini-svg-data-uri": "^1.4.3"
} }
}, },
"node_modules/flowbite-datepicker": {
"version": "1.2.2",
"resolved": "https://registry.npmmirror.com/flowbite-datepicker/-/flowbite-datepicker-1.2.2.tgz",
"integrity": "sha512-qOKDVtwkiOa0RrhD3sRtT45H8efAtyLiswuFIAV0UBhWSRYonzL0g1gAZwHiRRKtSmbET/8RQpQXlSEmAgadkg==",
"dev": true,
"dependencies": {
"flowbite": "^1.4.5"
}
},
"node_modules/follow-redirects": { "node_modules/follow-redirects": {
"version": "1.15.2", "version": "1.15.2",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
@ -8305,9 +8315,9 @@
} }
}, },
"node_modules/tailwindcss": { "node_modules/tailwindcss": {
"version": "3.3.2", "version": "3.3.3",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", "resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.3.3.tgz",
"integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==",
"dependencies": { "dependencies": {
"@alloc/quick-lru": "^5.2.0", "@alloc/quick-lru": "^5.2.0",
"arg": "^5.0.2", "arg": "^5.0.2",
@ -8329,7 +8339,6 @@
"postcss-load-config": "^4.0.1", "postcss-load-config": "^4.0.1",
"postcss-nested": "^6.0.1", "postcss-nested": "^6.0.1",
"postcss-selector-parser": "^6.0.11", "postcss-selector-parser": "^6.0.11",
"postcss-value-parser": "^4.2.0",
"resolve": "^1.22.2", "resolve": "^1.22.2",
"sucrase": "^3.32.0" "sucrase": "^3.32.0"
}, },

View File

@ -13,10 +13,11 @@
"autoprefixer": "^10.4.14", "autoprefixer": "^10.4.14",
"axios": "^0.21", "axios": "^0.21",
"flowbite": "^1.6.5", "flowbite": "^1.6.5",
"flowbite-datepicker": "^1.2.2",
"laravel-mix": "^6.0.6", "laravel-mix": "^6.0.6",
"lodash": "^4.17.19", "lodash": "^4.17.19",
"postcss": "^8.4.24", "postcss": "^8.4.24",
"tailwindcss": "^3.3.2" "tailwindcss": "^3.3.3"
}, },
"dependencies": { "dependencies": {
"@tailwindcss/forms": "^0.5.3" "@tailwindcss/forms": "^0.5.3"

View File

@ -5,6 +5,7 @@
*/ */
@import url("https://npm.akass.cn/bootstrap-icons@1.10.0/font/bootstrap-icons.css"); @import url("https://npm.akass.cn/bootstrap-icons@1.10.0/font/bootstrap-icons.css");
@tailwind base; @tailwind base;
@tailwind components; @tailwind components;
@tailwind utilities; @tailwind utilities;

BIN
resources/images/256.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

3210
resources/js/datepicker.js Normal file

File diff suppressed because it is too large Load Diff

View File

@ -347,12 +347,6 @@ class="z-[9999] fixed top-5 left-5 hidden items-center w-full max-w-xs p-4 space
</div> </div>
</div> </div>
<!-- Modal --> <!-- Modal -->
<button class="block text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none
focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800" type="button">
Toggle modal
</button>
<div id="Modal" tabindex="-1" class="fixed top-0 left-0 right-0 z-50 hidden p-4 overflow-x-hidden overflow-y-auto md:inset-0 h-[calc(100%-1rem)] max-h-full"> <div id="Modal" tabindex="-1" class="fixed top-0 left-0 right-0 z-50 hidden p-4 overflow-x-hidden overflow-y-auto md:inset-0 h-[calc(100%-1rem)] max-h-full">
<div class="relative w-full max-w-md max-h-full"> <div class="relative w-full max-w-md max-h-full">
<div class="relative bg-white rounded-lg shadow dark:bg-gray-700"> <div class="relative bg-white rounded-lg shadow dark:bg-gray-700">

View File

@ -63,7 +63,7 @@ class="flex items-center w-full p-2 text-gray-900 transition duration-75 rounded
</ul> </ul>
</li> </li>
<li> <li>
<a href="#" <a href="{{ route('console.sponsor.dashboard') }}"
class="flex items-center p-2 text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700"> class="flex items-center p-2 text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700">
<i class="bi bi-piggy-bank"></i> <i class="bi bi-piggy-bank"></i>
<span class="flex-1 ml-3 whitespace-nowrap">赞助管理</span> <span class="flex-1 ml-3 whitespace-nowrap">赞助管理</span>

View File

@ -0,0 +1,288 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="{{ asset('css/app.css') }}">
<link rel="stylesheet" href="{{ asset('css/flowbite.css') }}">
@include('modules.head')
{!! $webHeader !!}
</head>
<body>
<button data-drawer-target="sidebar-multi-level-sidebar" data-drawer-toggle="sidebar-multi-level-sidebar"
aria-controls="sidebar-multi-level-sidebar" type="button"
class="inline-flex items-center p-2 mt-2 ml-3 text-sm text-gray-500 rounded-lg sm:hidden hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-gray-200 dark:text-gray-400 dark:hover:bg-gray-700 dark:focus:ring-gray-600">
<span class="sr-only">Open sidebar</span>
<svg class="w-6 h-6" aria-hidden="true" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path clip-rule="evenodd" fill-rule="evenodd"
d="M2 4.75A.75.75 0 012.75 4h14.5a.75.75 0 010 1.5H2.75A.75.75 0 012 4.75zm0 10.5a.75.75 0 01.75-.75h7.5a.75.75 0 010 1.5h-7.5a.75.75 0 01-.75-.75zM2 10a.75.75 0 01.75-.75h14.5a.75.75 0 010 1.5H2.75A.75.75 0 012 10z"></path>
</svg>
</button>
@include('console.modules.aside')
<div class="p-4 sm:ml-64">
<div class="p-4 border-gray-200 border-dashed rounded-lg dark:border-gray-700">
@include('console.modules.personal')
<div class="grid grid-cols-1 gap-4 mb-4">
<div class="text-2xl text-gray-400 dark:text-gray-500"><i class="bi bi-piggy-bank"></i> 赞助管理</div>
<div class="grid grid-cols-10 gap-4">
<div class="col-span-10 lg:col-span-7 items-center justify-center rounded bg-white dark:bg-gray-800 shadow-lg">
@if(!empty($sponsor[0]['id']))
<ul class="w-full divide-y divide-gray-200 dark:divide-gray-700 px-5">
@foreach($sponsor as $value)
<li class="py-3 sm:py-4">
<div class="flex items-center space-x-4">
<div class="flex-1 min-w-0">
<p class="text-sm font-bold text-gray-900 truncate dark:text-white">
{{ $value['name'] }}
</p>
<p class="text-sm text-gray-500 truncate dark:text-gray-400 grid grid-cols-2 lg:grid-cols-3 gap-4">
<span class="font-bold">{{ $value['time'] }}</span>
<span>{{ $sponsorType[$value['type']]['name'] }}</span>
</p>
</div>
<div class="inline-flex">
<div class="grid grid-cols-3 gap-4 items-center justify-center">
<div class="text-end col-span-2 text-base font-semibold text-gray-900 dark:text-white">
{{ $value['money'] }} CNY
</div>
<div class="text-end col-span-1 text-base font-semibold text-gray-900 dark:text-white">
@if($value['type'] == 5)
<button type="button" class="focus:outline-none text-white bg-red-800 hover:bg-red-800 focus:ring-4
focus:ring-red-300 font-medium rounded-lg text-sm px-5 py-2.5 dark:bg-red-700
dark:hover:bg-red-700 dark:focus:ring-red-900" disabled>无法操作
</button>
@else
<a href="{{ route('console.sponsor.edit', $value['id']) }}" type="button" class="text-white bg-blue-700
hover:bg-blue-800 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5
dark:bg-blue-600 dark:hover:bg-blue-700 focus:outline-none dark:focus:ring-blue-800">点击编辑</a>
@endif
</div>
</div>
</div>
</div>
</li>
@endforeach
</ul>
@endif
</div>
<div class="col-span-10 lg:col-span-3">
<div class="items-center justify-center rounded bg-white dark:bg-gray-800 grid grid-cols-1 gap-4">
<button data-modal-target="Modal" data-modal-toggle="Modal" type="submit" class="text-white bg-green-500 hover:bg-green-600 focus:ring-4
focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-green-600
dark:hover:bg-green-700 dark:focus:ring-blue-800 shadow-lg">
<i class="bi bi-currency-yen"></i>
<span class="ps-1">新增赞助</span>
</button>
<a href="{{ route('console.sponsor.mode') }}" class="text-white bg-blue-500 hover:bg-blue-600 focus:ring-4
focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-blue-600
dark:hover:bg-blue-700 dark:focus:ring-blue-800 shadow-lg">
<i class="bi bi-currency-yen"></i>
<span class="ps-1">赞助方式列表</span>
</a>
<div class="p-6 bg-white border border-gray-200 rounded-lg shadow-lg dark:bg-gray-800 dark:border-gray-700 grid grid-cols-1 gap-4">
<div class="p-2 bg-green-50 rounded-lg shadow sm:p-4 dark:bg-gray-800 dark:border-gray-700 text-center">
今年({{ date('Y') }})收款 <b>{{ $sponsorCountYear }}</b>
</div>
<div class="p-2 bg-pink-50 rounded-lg shadow sm:p-4 dark:bg-gray-800 dark:border-gray-700 text-center">
总计金额 <b>{{ $sponsorCount }}</b>
</div>
<div class="p-2 bg-blue-50 rounded-lg shadow sm:p-4 dark:bg-gray-800 dark:border-gray-700 text-center">
目前站长收到了 <b>{{ $sponsorCountNumber }}</b> 份赞助
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Toast -->
<div id="toast"
class="z-[9999] fixed top-5 left-5 hidden items-center w-full max-w-xs p-4 space-x-4 text-gray-500 bg-white divide-x divide-gray-200 rounded-lg shadow dark:text-gray-400 dark:divide-gray-700 space-x dark:bg-gray-800"
role="alert">
<div class="pl-4 text-sm font-normal">
<span id="toast-icon" class="pe-1"><i class="bi bi-info-circle text-blue-500"></i></span>
<span id="toast-info">Message sent successfully.</span>
</div>
</div>
<!-- Modal -->
<div id="Modal" tabindex="-1" aria-hidden="true" class="fixed top-0 left-0 right-0 z-50 hidden w-full p-4 overflow-x-hidden overflow-y-auto md:inset-0 h-[calc
(100%-1rem)] max-h-full">
<div class="relative w-full max-w-2xl max-h-full">
<!-- Modal content -->
<div class="relative bg-white rounded-lg shadow dark:bg-gray-700">
<!-- Modal header -->
<div class="flex items-start justify-between p-4 border-b rounded-t dark:border-gray-600">
<h3 class="text-xl font-semibold text-gray-900 dark:text-white">
新增赞助
</h3>
<button type="button" class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm w-8 h-8 ml-auto
inline-flex justify-center items-center dark:hover:bg-gray-600 dark:hover:text-white" data-modal-hide="Modal">
<svg class="w-3 h-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14">
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"/>
</svg>
<span class="sr-only">Close modal</span>
</button>
</div>
<!-- Modal body -->
<div class="p-6 space-y-6">
<form id="FormData" action="#" onsubmit="return false" method="POST">
<div class="grid grid-cols-2 gap-4">
<div>
<label for="name" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">
赞助者名字 <span class="text-red-500">*</span>
</label>
<div class="relative">
<div class="absolute inset-y-0 left-0 flex items-center pl-3.5 pointer-events-none">
<i class="bi bi-person"></i>
</div>
<input type="text" name="name" id="name" placeholder="筱锋" class="bg-gray-50 border border-gray-300 text-sm
text-gray-900 rounded-lg focus:ring-blue-500 focus:border-blue-500 block p-2.5 dark:bg-gray-700 dark:border-gray-600
dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 w-full pl-10">
</div>
</div>
<div>
<label for="type" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">
赞助方式 <span class="text-red-500">*</span>
</label>
<select id="type" name="type" class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500
focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white
dark:focus:ring-blue-500 dark:focus:border-blue-500">
@if($sponsorType === null)
<option>还未创建赞助方式</option>
@else
@foreach($sponsorType as $value)
<option value="{{ $value['id'] }}"
@if($value['id'] == 5) disabled @endif>
{{ $value['name'] }}</option>
@endforeach
@endif
</select>
</div>
<div>
<label for="money" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">
赞助金额 <span class="text-red-500">*</span>
</label>
<div class="relative">
<div class="absolute inset-y-0 left-0 flex items-center pl-3.5 pointer-events-none">
<i class="bi bi-piggy-bank"></i>
</div>
<input type="number" name="money" id="money" placeholder="13.14" class="bg-gray-50 border border-gray-300
text-sm text-gray-900 rounded-lg focus:ring-blue-500 focus:border-blue-500 block p-2.5 dark:bg-gray-700 dark:border-gray-600
dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 w-full pl-10">
</div>
</div>
<div>
<label for="date" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">
赞助时间 <span class="text-red-500">*</span>
</label>
<div class="relative max-w-sm">
<div class="absolute inset-y-0 left-0 flex items-center pl-3.5 pointer-events-none">
<i class="bi bi-calendar-date"></i>
</div>
<input datepicker type="text" name="date" id="date" value="{{ date('m/d/Y') }}" class="bg-gray-50 border border-gray-300
text-gray-900 text-sm p-2.5 rounded-lg focus:ring-blue-500 focus:border-blue-500 block dark:bg-gray-700 dark:border-gray-600
dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 w-full pl-10 dark:focus:border-blue-500">
</div>
</div>
<div class="col-span-2">
<label for="url" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">赞助者网站</label>
<div class="relative">
<div class="absolute inset-y-0 left-0 flex items-center pl-3.5 pointer-events-none">
<i class="bi bi-link-45deg"></i>
</div>
<input type="text" name="url" id="url" placeholder="https://www.x-lf.com/" class="bg-gray-50 border border-gray-300 text-sm
text-gray-900 rounded-lg focus:ring-blue-500 focus:border-blue-500 block p-2.5 dark:bg-gray-700 dark:border-gray-600
dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 w-full pl-10">
</div>
</div>
</div>
</form>
</div>
<!-- Modal footer -->
<div class="flex items-center p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600">
<button type="button" id="SubmitSend" onclick="submit()" class="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none
focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700
dark:focus:ring-blue-800">
<i class="bi bi-currency-yen"></i>
<span class="ps-1">新增赞助</span>
</button>
<button data-modal-hide="Modal" type="button" onclick="location.reload()" class="text-gray-500 bg-white hover:bg-gray-100 focus:ring-4
focus:outline-none focus:ring-blue-300 rounded-lg border border-gray-200 text-sm font-medium px-5 py-2.5 hover:text-gray-900 focus:z-10
dark:bg-gray-700 dark:text-gray-300 dark:border-gray-500 dark:hover:text-white dark:hover:bg-gray-600 dark:focus:ring-gray-600">
<i class="bi bi-x-circle"></i>
<span class="ps-1">取消新增</span>
</button>
</div>
</div>
</div>
</div>
</body>
<script src="{{ asset('js/app.js') }}"></script>
<script src="{{ asset('js/jquery.js') }}"></script>
<script src="{{ asset('js/datepicker.js') }}"></script>
<script type="text/javascript">
function submit() {
$.ajax({
async: true,
method: "POST",
data: $('#FormData').serialize(),
url: '{{ route('api.sponsor.add') }}',
dataType: "json",
beforeSend: function () {
$('#SubmitSend').prop('disabled', true).removeClass('bg-blue-500').addClass('bg-blue-600')
.html('<svg aria-hidden="true" role="status" class="inline w-4 h-4 text-white animate-spin" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="#E5E7EB"/> <path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentColor"/></svg>' +
'<span class="ps-1">正在操作</span>');
},
success: function (returnData) {
if (returnData.output === "Success") {
$('#SubmitSend').html('<i class="bi bi-check2-circle"></i><span class="ps-1">操作成功</span>')
Toast.toggle('操作成功', '<i class="bi bi-check-circle text-green-500"></i>');
setTimeout(function () {
location.href = '{{ route('console.sponsor.dashboard') }}';
}, 3000);
} else {
$('#SubmitSend').html('<i class="bi bi-currency-yen"></i><span class="ps-1">新增赞助</span>')
.prop('disabled', false).removeClass('bg-blue-600').addClass('bg-blue-500');
Toast('未知错误', '<i class="bi bi-x-circle text-red-500"></i>');
}
},
error: function (returnData) {
Toast.set('其他错误', '<i class="bi bi-x-circle text-red-500"></i>');
if (returnData.responseJSON.output === 'DataFormatError') {
for (let key in Enum) {
if (returnData.responseJSON.data.errorSingle.info === key) {
Toast.toggle(Enum[key] + '错误,注意格式', '<i class="bi bi-x-circle text-red-500"></i>');
}
}
} else {
Toast.toggle('未知错误', '<i class="bi bi-x-circle text-red-500"></i>');
}
$('#SubmitSend').html('<i class="bi bi-currency-yen"></i><span class="ps-1">新增赞助</span>')
.prop('disabled', false).removeClass('bg-blue-600').addClass('bg-blue-500');
}
});
}
class Toast {
static toggle(data, icon) {
this.set(data, icon);
$('#toast').fadeIn(300);
setTimeout(function () {
$('#toast').fadeOut(300);
}, 3000);
}
static set(data, icon) {
$('#toast-icon').html(icon);
$('#toast-info').text(data);
}
}
</script>
</html>

View File

@ -0,0 +1,298 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="{{ asset('css/app.css') }}">
<link rel="stylesheet" href="{{ asset('css/flowbite.css') }}">
@include('modules.head')
{!! $webHeader !!}
</head>
<body>
<button data-drawer-target="sidebar-multi-level-sidebar" data-drawer-toggle="sidebar-multi-level-sidebar"
aria-controls="sidebar-multi-level-sidebar" type="button"
class="inline-flex items-center p-2 mt-2 ml-3 text-sm text-gray-500 rounded-lg sm:hidden hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-gray-200 dark:text-gray-400 dark:hover:bg-gray-700 dark:focus:ring-gray-600">
<span class="sr-only">Open sidebar</span>
<svg class="w-6 h-6" aria-hidden="true" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path clip-rule="evenodd" fill-rule="evenodd"
d="M2 4.75A.75.75 0 012.75 4h14.5a.75.75 0 010 1.5H2.75A.75.75 0 012 4.75zm0 10.5a.75.75 0 01.75-.75h7.5a.75.75 0 010 1.5h-7.5a.75.75 0 01-.75-.75zM2 10a.75.75 0 01.75-.75h14.5a.75.75 0 010 1.5H2.75A.75.75 0 012 10z"></path>
</svg>
</button>
@include('console.modules.aside')
<div class="p-4 sm:ml-64">
<div class="p-4 border-gray-200 border-dashed rounded-lg dark:border-gray-700">
@include('console.modules.personal')
<div class="grid grid-cols-1 gap-4 mb-4">
<div class="text-2xl text-gray-400 dark:text-gray-500"><i class="bi bi-link-45deg"></i> 修改赞助</div>
</div>
<div class="grid grid-cols-10 gap-4 mb-4">
<div class="col-span-10 lg:col-span-7 items-center justify-center rounded bg-white dark:bg-gray-800 shadow-lg">
<div class="p-10">
<form id="FormData" action="#" onsubmit="return false" method="POST">
<div class="grid grid-cols-2 gap-4">
<div>
<label for="id" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">序列号</label>
<div class="relative">
<div class="absolute inset-y-0 left-0 flex items-center pl-3.5 pointer-events-none">
<i class="bi bi-app"></i>
</div>
<input type="number" name="id" id="id" value="{{ $sponsor['id'] }}" class="bg-gray-100 border border-gray-300 text-gray-900
text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 p-2.5 dark:bg-gray-700 dark:border-gray-600
dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" disabled>
</div>
</div>
<div>
<label for="name" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">赞助者名字</label>
<div class="relative">
<div class="absolute inset-y-0 left-0 flex items-center pl-3.5 pointer-events-none">
<i class="bi bi-person"></i>
</div>
<input type="text" name="name" id="name" value="{{ $sponsor['name'] }}" class="bg-gray-50 border border-gray-300 text-sm
text-gray-900 rounded-lg focus:ring-blue-500 focus:border-blue-500 block p-2.5 dark:bg-gray-700 dark:border-gray-600
dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 w-full pl-10">
</div>
</div>
<div>
<label for="type" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">赞助方式</label>
<select id="type" name="type" class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500
focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white
dark:focus:ring-blue-500 dark:focus:border-blue-500">
@if($sponsorType === null)
<option>还未创建赞助方式</option>
@else
@foreach($sponsorType as $value)
<option value="{{ $value['id'] }}"
@if($sponsor['type'] == $value['id']) selected @endif
@if($value['id'] == 5) disabled @endif>
{{ $value['name'] }}</option>
@endforeach
@endif
</select>
</div>
<div>
<label for="name" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">赞助金额</label>
<div class="relative">
<div class="absolute inset-y-0 left-0 flex items-center pl-3.5 pointer-events-none">
<i class="bi bi-piggy-bank"></i>
</div>
<input type="number" name="money" id="money" value="{{ $sponsor['money'] }}" class="bg-gray-50 border border-gray-300
text-sm text-gray-900 rounded-lg focus:ring-blue-500 focus:border-blue-500 block p-2.5 dark:bg-gray-700 dark:border-gray-600
dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 w-full pl-10">
</div>
</div>
<div>
<label for="url" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">赞助网站</label>
<div class="relative">
<div class="absolute inset-y-0 left-0 flex items-center pl-3.5 pointer-events-none">
<i class="bi bi-link-45deg"></i>
</div>
<input type="text" name="url" id="url" value="{{ $sponsor['url'] }}" class="bg-gray-50 border border-gray-300 text-sm
text-gray-900 rounded-lg focus:ring-blue-500 focus:border-blue-500 block p-2.5 dark:bg-gray-700 dark:border-gray-600
dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 w-full pl-10">
</div>
</div>
<div>
<label for="date" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">赞助时间</label>
<div class="relative max-w-sm">
<div class="absolute inset-y-0 left-0 flex items-center pl-3.5 pointer-events-none">
<i class="bi bi-calendar-date"></i>
</div>
<input datepicker type="text" name="date" id="date" class="bg-gray-50 border border-gray-300 text-gray-900 text-sm p-2.5
rounded-lg focus:ring-blue-500 focus:border-blue-500 block dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400
dark:text-white dark:focus:ring-blue-500 w-full pl-10 dark:focus:border-blue-500" value="{{ $sponsor['time'] }}">
</div>
</div>
</div>
</form>
</div>
</div>
<div class="col-span-10 lg:col-span-3">
<div class="items-center justify-center rounded bg-white dark:bg-gray-800 shadow-lg grid grid-cols-1 mb-4">
<div class="p-2 xl:p-8 grid grid-cols-2">
<button onclick="ajax()" id="SubmitSend" type="submit" class="m-2 text-white bg-green-500 hover:bg-green-600 focus:ring-4
focus:outline-none
focus:ring-blue-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-green-600 dark:hover:bg-green-700
dark:focus:ring-blue-800">
<i class="bi bi-send"></i>
<span class="ps-1">提交修改</span>
</button>
<button data-modal-target="Modal" data-modal-toggle="Modal" id="SubmitRefuse" type="submit" class="m-2 text-white bg-red-500
hover:bg-red-600
focus:ring-4 focus:outline-none
focus:ring-blue-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-red-600 dark:hover:bg-red-700
dark:focus:ring-blue-800">
<i class="bi bi-trash3"></i>
<span class="ps-1">删除赞助</span>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Toast -->
<div id="toast"
class="z-[9999] fixed top-5 left-5 hidden items-center w-full max-w-xs p-4 space-x-4 text-gray-500 bg-white divide-x divide-gray-200 rounded-lg shadow dark:text-gray-400 dark:divide-gray-700 space-x dark:bg-gray-800"
role="alert">
<div class="pl-4 text-sm font-normal">
<span id="toast-icon" class="pe-1"><i class="bi bi-info-circle text-blue-500"></i></span>
<span id="toast-info">Message sent successfully.</span>
</div>
</div>
<!-- Modal -->
<div id="Modal" tabindex="-1" class="fixed top-0 left-0 right-0 z-50 hidden p-4 overflow-x-hidden overflow-y-auto md:inset-0 h-[calc(100%-1rem)] max-h-full">
<div class="relative w-full max-w-md max-h-full">
<div class="relative bg-white rounded-lg shadow dark:bg-gray-700">
<button type="button" class="absolute top-3 right-2.5 text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm w-8
h-8 ml-auto inline-flex justify-center items-center dark:hover:bg-gray-600 dark:hover:text-white" data-modal-hide="Modal">
<svg class="w-3 h-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14">
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"/>
</svg>
<span class="sr-only">Close modal</span>
</button>
<div class="p-6 text-center">
<svg class="mx-auto mb-4 text-gray-400 w-12 h-12 dark:text-gray-200" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none"
viewBox="0 0 20 20">
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M10 11V6m0 8h.01M19 10a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"/>
</svg>
<form id="FormDataCancel" action="#" onsubmit="return false" method="POST">
<div class="mb-5 text-md font-normal text-gray-500 dark:text-gray-400">
<div class="mb-3">您确认删除该赞助内容吗?</div>
</div>
</form>
<button data-modal-hide="Modal" onclick="deleted()" type="button" class="text-white bg-red-600 hover:bg-red-800 focus:ring-4 focus:outline-none
focus:ring-red-300 dark:focus:ring-red-800 font-medium rounded-lg text-sm inline-flex items-center px-5 py-2.5 text-center mr-2">
确认删除
</button>
<button data-modal-hide="Modal" onclick="location.reload()" type="button" class="text-gray-500 bg-white hover:bg-gray-100 focus:ring-4
focus:outline-none focus:ring-gray-200 rounded-lg border border-gray-200 text-sm font-medium px-5 py-2.5 hover:text-gray-900 focus:z-10
dark:bg-gray-700 dark:text-gray-300 dark:border-gray-500 dark:hover:text-white dark:hover:bg-gray-600 dark:focus:ring-gray-600">
取消操作
</button>
</div>
</div>
</div>
</div>
</body>
<script src="{{ asset('js/app.js') }}"></script>
<script src="{{ asset('js/jquery.js') }}"></script>
<script src="{{ asset('js/datepicker.js') }}"></script>
<script type="text/javascript">
function ajax() {
$.ajax({
async: true,
method: "POST",
data: $('#FormData').serialize(),
url: '{{ route('api.sponsor.edit', $sponsor['id']) }}',
dataType: "json",
beforeSend: function () {
$('#SubmitSend').prop('disabled', true).removeClass('bg-green-500').addClass('bg-green-600')
.html('<svg aria-hidden="true" role="status" class="inline w-4 h-4 text-white animate-spin" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="#E5E7EB"/> <path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentColor"/></svg>' +
'<span class="ps-1">正在操作</span>');
$('#SubmitRefuse').prop('disabled', true).removeClass('bg-red-500').addClass('bg-red-600');
},
success: function (returnData) {
if (returnData.output === "Success") {
$('#SubmitSend').html('<i class="bi bi-check2-circle"></i><span class="ps-1">操作成功</span>')
Toast.toggle('操作成功', '<i class="bi bi-check-circle text-green-500"></i>');
setTimeout(function () {
location.href = '{{ route('console.sponsor.dashboard') }}';
}, 3000);
} else {
$('#SubmitSend').html('<i class="bi bi-send"></i><span class="ps-1">提交修改</span>')
.prop('disabled', false).removeClass('bg-green-600').addClass('bg-green-500');
$('#SubmitRefuse').html('<i class="bi bi-trash3"></i><span class="ps-1">提交修改</span>')
.prop('disabled', false).removeClass('bg-red-600').addClass('bg-red-500');
Toast('未知错误', '<i class="bi bi-x-circle text-red-500"></i>');
}
},
error: function (returnData) {
Toast.set('其他错误', '<i class="bi bi-x-circle text-red-500"></i>');
if (returnData.responseJSON.output === 'DataFormatError') {
for (let key in Enum) {
if (returnData.responseJSON.data.errorSingle.info === key) {
Toast.toggle(Enum[key] + '错误,注意格式', '<i class="bi bi-x-circle text-red-500"></i>');
}
}
} else {
Toast.toggle('未知错误', '<i class="bi bi-x-circle text-red-500"></i>');
}
$('#SubmitSend').html('<i class="bi bi-send"></i><span class="ps-1">提交修改</span>')
.prop('disabled', false).removeClass('bg-green-600').addClass('bg-green-500');
$('#SubmitRefuse').html('<i class="bi bi-trash3"></i><span class="ps-1">提交修改</span>')
.prop('disabled', false).removeClass('bg-red-600').addClass('bg-red-500');
}
});
}
function deleted() {
$.ajax({
async: true,
method: "POST",
data: $('#FormDataCancel').serialize(),
url: '{{ route('api.sponsor.delete', $sponsor['id']) }}',
dataType: "json",
beforeSend: function () {
$('#SubmitSend').prop('disabled', true).removeClass('bg-green-500').addClass('bg-green-600');
$('#SubmitRefuse').prop('disabled', true).removeClass('bg-red-500').addClass('bg-red-600')
.html('<svg aria-hidden="true" role="status" class="inline w-4 h-4 text-white animate-spin" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="#E5E7EB"/> <path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentColor"/></svg>' +
'<span class="ps-1">正在操作</span>');
},
success: function (returnData) {
$('#SubmitRefuse').html('<i class="bi bi-check2-circle"></i><span class="ps-1">操作成功</span>')
if (returnData.output === "Success") {
Toast.toggle('操作成功', '<i class="bi bi-check-circle text-green-500"></i>');
setTimeout(function () {
location.href = '{{ route('console.sponsor.dashboard') }}';
}, 3000);
} else {
Toast('未知错误', '<i class="bi bi-x-circle text-red-500"></i>');
$('#SubmitSend').html('<i class="bi bi-send"></i><span class="ps-1">提交修改</span>')
.prop('disabled', false).removeClass('bg-green-600').addClass('bg-green-500');
$('#SubmitRefuse').html('<i class="bi bi-trash3"></i><span class="ps-1">提交修改</span>')
.prop('disabled', false).removeClass('bg-red-600').addClass('bg-red-500');
}
},
error: function (returnData) {
Toast.set('其他错误', '<i class="bi bi-x-circle text-red-500"></i>');
if (returnData.responseJSON.output === 'DataFormatError') {
for (let key in Enum) {
if (returnData.responseJSON.data.errorSingle.info === key) {
Toast.toggle(Enum[key] + '错误,注意格式', '<i class="bi bi-x-circle text-red-500"></i>');
}
}
} else {
Toast.toggle('未知错误', '<i class="bi bi-x-circle text-red-500"></i>');
}
$('#SubmitSend').html('<i class="bi bi-send"></i><span class="ps-1">提交修改</span>')
.prop('disabled', false).removeClass('bg-green-600').addClass('bg-green-500');
$('#SubmitRefuse').html('<i class="bi bi-trash3"></i><span class="ps-1">提交修改</span>')
.prop('disabled', false).removeClass('bg-red-600').addClass('bg-red-500');
}
});
}
class Toast {
static toggle(data, icon) {
this.set(data, icon);
$('#toast').fadeIn(300);
setTimeout(function () {
$('#toast').fadeOut(300);
}, 3000);
}
static set(data, icon) {
$('#toast-icon').html(icon);
$('#toast-info').text(data);
}
}
</script>
</html>

View File

@ -0,0 +1,500 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="{{ asset('css/app.css') }}">
<link rel="stylesheet" href="{{ asset('css/flowbite.css') }}">
@include('modules.head')
{!! $webHeader !!}
</head>
<body>
<button data-drawer-target="sidebar-multi-level-sidebar" data-drawer-toggle="sidebar-multi-level-sidebar"
aria-controls="sidebar-multi-level-sidebar" type="button"
class="inline-flex items-center p-2 mt-2 ml-3 text-sm text-gray-500 rounded-lg sm:hidden hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-gray-200 dark:text-gray-400 dark:hover:bg-gray-700 dark:focus:ring-gray-600">
<span class="sr-only">Open sidebar</span>
<svg class="w-6 h-6" aria-hidden="true" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path clip-rule="evenodd" fill-rule="evenodd"
d="M2 4.75A.75.75 0 012.75 4h14.5a.75.75 0 010 1.5H2.75A.75.75 0 012 4.75zm0 10.5a.75.75 0 01.75-.75h7.5a.75.75 0 010 1.5h-7.5a.75.75 0 01-.75-.75zM2 10a.75.75 0 01.75-.75h14.5a.75.75 0 010 1.5H2.75A.75.75 0 012 10z"></path>
</svg>
</button>
@include('console.modules.aside')
<div class="p-4 sm:ml-64">
<div class="p-4 border-gray-200 border-dashed rounded-lg dark:border-gray-700">
@include('console.modules.personal')
<div class="grid grid-cols-1 gap-4 mb-4">
<div class="text-2xl text-gray-400 dark:text-gray-500"><i class="bi bi-piggy-bank"></i> 赞助方式管理</div>
<div class="grid grid-cols-10 gap-4">
<div class="col-span-10 lg:col-span-7">
<div class="items-center justify-center rounded dark:bg-gray-800 shadow-lg">
<div class="relative overflow-x-auto shadow-md sm:rounded-lg">
<table class="w-full text-sm text-left text-gray-500 dark:text-gray-400">
<thead class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400">
<tr>
<th scope="col" class="px-6 py-3">别名</th>
<th scope="col" class="px-6 py-3">计入收入</th>
<th scope="col" class="px-6 py-3">跳转(链接)</th>
<th scope="col" class="px-6 py-3">修改时间</th>
<th scope="col" class="px-6 py-3 text-end">操作</th>
</tr>
</thead>
<tbody>
@php $i = 0; @endphp
@foreach($sponsorType as $value)
<tr class="@if($i%2 == 0)bg-white dark:bg-gray-900 @else bg-gray-50 dark:bg-gray-800 @endif border-b dark:border-gray-700">
<th scope="row" class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap dark:text-white">
{{ $value->name }}
</th>
<td class="px-6 py-4">
@if($value->include)
<span class="inline-flex items-center bg-green-100 text-green-800 text-xs font-medium mr-2 px-2.5 py-0.5
rounded-full dark:bg-green-900 dark:text-green-300">
<span class="w-2 h-2 mr-1 bg-green-500 rounded-full"></span>
TRUE
</span>
@else
<span class="inline-flex items-center bg-red-100 text-red-800 text-xs font-medium mr-2 px-2.5 py-0.5
rounded-full dark:bg-red-900 dark:text-red-300">
<span class="w-2 h-2 mr-1 bg-red-500 rounded-full"></span>
FALSE
</span>
@endif
</td>
<td class="px-6 py-4">
@if($value->link)
<span class="inline-flex items-center bg-green-100 text-green-800 text-xs font-medium mr-2 px-2.5 py-0.5
rounded-full dark:bg-green-900 dark:text-green-300">
<span class="w-2 h-2 mr-1 bg-green-500 rounded-full"></span>
TRUE
</span>
@else
<span class="inline-flex items-center bg-red-100 text-red-800 text-xs font-medium mr-2 px-2.5 py-0.5
rounded-full dark:bg-red-900 dark:text-red-300">
<span class="w-2 h-2 mr-1 bg-red-500 rounded-full"></span>
FALSE
</span>
@endif
</td>
<td class="px-6 py-4">
@if($value->updated_at === null)
暂无修改
@else
{{ $value->updated_at }}
@endif
</td>
<td class="px-6 py-4 text-end">
<button data-modal-target="EditModal" data-modal-toggle="EditModal" id="editButton"
onclick="select({{ $value->id }})" class="font-medium text-blue-600 dark:text-blue-500
hover:underline">编辑
</button>
@if($value->id > 5)
<button id="delButton" onclick="deleted({{ $value->id }})" class="font-medium text-red-600 dark:text-red-500
hover:underline ps-1">删除
</button>
@else
<button class="font-medium text-gray-600 dark:text-gray-500 ps-1" disabled>删除</button>
@endif
</td>
</tr>
@php $i ++; @endphp
@endforeach
</tbody>
</table>
</div>
</div>
</div>
<div class="col-span-10 lg:col-span-3">
<div class="items-center justify-center rounded bg-white dark:bg-gray-800 grid grid-cols-1 gap-4">
<button data-modal-target="AddModal" data-modal-toggle="AddModal" class="text-white bg-green-500 hover:bg-green-600 focus:ring-4
focus:outline-none focus:ring-green-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-green-600
dark:hover:bg-green-700 dark:focus:ring-green-800 shadow-lg">
<i class="bi bi-folder-plus"></i>
<span class="ps-1">添加赞助方式</span>
</button>
<a href="{{ route('console.sponsor.dashboard') }}" class="text-white bg-blue-500 hover:bg-blue-600 focus:ring-4
focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-blue-600
dark:hover:bg-blue-700 dark:focus:ring-blue-800 shadow-lg">
<i class="bi bi-currency-yen"></i>
<span class="ps-1">返回赞助列表</span>
</a>
<div class="p-6 bg-white border border-gray-200 rounded-lg shadow-lg dark:bg-gray-800 dark:border-gray-700 grid grid-cols-1 gap-4">
<div class="p-2 bg-green-50 rounded-lg shadow sm:p-4 dark:bg-gray-800 dark:border-gray-700 text-center">
当前分类有 <b>{{ $sponsorTypeCount }}</b>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Toast -->
<div id="toast"
class="z-[9999] fixed top-5 left-5 hidden items-center w-full max-w-xs p-4 space-x-4 text-gray-500 bg-white divide-x divide-gray-200 rounded-lg shadow dark:text-gray-400 dark:divide-gray-700 space-x dark:bg-gray-800"
role="alert">
<div class="pl-4 text-sm font-normal">
<span id="toast-icon" class="pe-1"><i class="bi bi-info-circle text-blue-500"></i></span>
<span id="toast-info">Message sent successfully.</span>
</div>
</div>
<!-- Modal -->
<div id="AddModal" tabindex="-1" aria-hidden="true" class="fixed top-0 left-0 right-0 z-50 hidden w-full p-4 overflow-x-hidden overflow-y-auto md:inset-0
h-[calc(100%-1rem)] max-h-full">
<div class="relative w-full max-w-2xl max-h-full">
<!-- Modal content -->
<div class="relative bg-white rounded-lg shadow dark:bg-gray-700">
<!-- Modal header -->
<div class="flex items-start justify-between p-4 border-b rounded-t dark:border-gray-600">
<h3 class="text-xl font-semibold text-gray-900 dark:text-white">
新增赞助方式
</h3>
<button type="button" class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm w-8 h-8 ml-auto
inline-flex justify-center items-center dark:hover:bg-gray-600 dark:hover:text-white" data-modal-hide="AddModal">
<svg class="w-3 h-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14">
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"/>
</svg>
<span class="sr-only">Close modal</span>
</button>
</div>
<!-- Modal body -->
<div class="p-6 space-y-6">
<form id="FormData" action="#" onsubmit="return false" method="POST">
<div class="grid grid-cols-2 gap-4">
<div>
<label for="name" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">
别名 <span class="text-red-500">*</span>
</label>
<div class="relative">
<div class="absolute inset-y-0 left-0 flex items-center pl-3.5 pointer-events-none">
<i class="bi bi-type"></i>
</div>
<input type="text" name="name" id="name" class="bg-gray-50 border border-gray-300 text-sm
text-gray-900 rounded-lg focus:ring-blue-500 focus:border-blue-500 block p-2.5 dark:bg-gray-700 dark:border-gray-600
dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 w-full pl-10">
</div>
</div>
<div>
<label for="url" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">
链接地址 <span class="text-red-500">*</span>
</label>
<div class="relative">
<div class="absolute inset-y-0 left-0 flex items-center pl-3.5 pointer-events-none">
<i class="bi bi-link-45deg"></i>
</div>
<input type="text" name="url" id="url" class="bg-gray-50 border border-gray-300 text-sm
text-gray-900 rounded-lg focus:ring-blue-500 focus:border-blue-500 block p-2.5 dark:bg-gray-700 dark:border-gray-600
dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 w-full pl-10">
</div>
</div>
<div class="col-span-2">
<label class="relative inline-flex items-center cursor-pointer">
<input type="checkbox" value="1" id="include" name="include" class="sr-only peer" checked>
<div
class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600"></div>
<span class="ml-3 text-sm font-medium text-gray-900 dark:text-gray-300">计入收入</span>
</label>
</div>
<div class="col-span-2">
<label class="relative inline-flex items-center cursor-pointer">
<input type="checkbox" value="1" id="link" name="link" class="sr-only peer">
<div
class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600"></div>
<span class="ml-3 text-sm font-medium text-gray-900 dark:text-gray-300">跳转(连接)</span>
</label>
</div>
<div>
</div>
</div>
</form>
</div>
<!-- Modal footer -->
<div class="flex items-center p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600">
<button type="button" id="SubmitSend" onclick="submit()" class="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none
focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700
dark:focus:ring-blue-800">
<i class="bi bi-folder-plus"></i>
<span class="ps-1">新增方式</span>
</button>
<button data-modal-hide="AddModal" type="button" class="text-gray-500 bg-white hover:bg-gray-100 focus:ring-4
focus:outline-none focus:ring-blue-300 rounded-lg border border-gray-200 text-sm font-medium px-5 py-2.5 hover:text-gray-900 focus:z-10
dark:bg-gray-700 dark:text-gray-300 dark:border-gray-500 dark:hover:text-white dark:hover:bg-gray-600 dark:focus:ring-gray-600">
<i class="bi bi-x-circle"></i>
<span class="ps-1">取消新增</span>
</button>
</div>
</div>
</div>
</div>
<!-- Modal -->
<div id="EditModal" tabindex="-1" aria-hidden="true" class="fixed top-0 left-0 right-0 z-50 hidden w-full p-4 overflow-x-hidden overflow-y-auto md:inset-0
h-[calc(100%-1rem)] max-h-full">
<div class="relative w-full max-w-2xl max-h-full">
<!-- Modal content -->
<div class="relative bg-white rounded-lg shadow dark:bg-gray-700">
<!-- Modal header -->
<div class="flex items-start justify-between p-4 border-b rounded-t dark:border-gray-600">
<h3 class="text-xl font-semibold text-gray-900 dark:text-white">
赞助方式修改
</h3>
<button type="button" class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm w-8 h-8 ml-auto
inline-flex justify-center items-center dark:hover:bg-gray-600 dark:hover:text-white" data-modal-hide="EditModal">
<svg class="w-3 h-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14">
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"/>
</svg>
<span class="sr-only">Close modal</span>
</button>
</div>
<!-- Modal body -->
<div class="p-6 space-y-6">
<form id="FormDataEdit" action="#" onsubmit="return false" method="POST">
<div class="grid grid-cols-2 gap-4">
<div>
<label>
<input type="number" name="edit_id" id="edit_id" hidden="hidden"/>
</label>
<label for="edit_name" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">
别名 <span class="text-red-500">*</span>
</label>
<div class="relative">
<div class="absolute inset-y-0 left-0 flex items-center pl-3.5 pointer-events-none">
<i class="bi bi-type"></i>
</div>
<input type="text" name="edit_name" id="edit_name" class="bg-gray-50 border border-gray-300 text-sm
text-gray-900 rounded-lg focus:ring-blue-500 focus:border-blue-500 block p-2.5 dark:bg-gray-700 dark:border-gray-600
dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 w-full pl-10">
</div>
</div>
<div>
<label for="edit_url" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">
链接地址 <span class="text-red-500">*</span>
</label>
<div class="relative">
<div class="absolute inset-y-0 left-0 flex items-center pl-3.5 pointer-events-none">
<i class="bi bi-link-45deg"></i>
</div>
<input type="text" name="edit_url" id="edit_url" class="bg-gray-50 border border-gray-300 text-sm
text-gray-900 rounded-lg focus:ring-blue-500 focus:border-blue-500 block p-2.5 dark:bg-gray-700 dark:border-gray-600
dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 w-full pl-10">
</div>
</div>
<div class="col-span-2">
<label class="relative inline-flex items-center cursor-pointer">
<input type="checkbox" value="1" id="edit_include" name="edit_include" class="sr-only peer">
<div
class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600"></div>
<span class="ml-3 text-sm font-medium text-gray-900 dark:text-gray-300">计入收入</span>
</label>
</div>
<div class="col-span-2">
<label class="relative inline-flex items-center cursor-pointer">
<input type="checkbox" value="1" id="edit_link" name="edit_link" class="sr-only peer">
<div
class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600"></div>
<span class="ml-3 text-sm font-medium text-gray-900 dark:text-gray-300">跳转(连接)</span>
</label>
</div>
<div>
</div>
</div>
</form>
</div>
<!-- Modal footer -->
<div class="flex items-center p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600">
<button type="button" id="EditSubmitSend" onclick="edit()" class="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none
focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700
dark:focus:ring-blue-800">
<i class="bi bi-folder-plus"></i>
<span class="ps-1">修改内容</span>
</button>
<button data-modal-hide="EditModal" type="button" class="text-gray-500 bg-white hover:bg-gray-100 focus:ring-4
focus:outline-none focus:ring-blue-300 rounded-lg border border-gray-200 text-sm font-medium px-5 py-2.5 hover:text-gray-900 focus:z-10
dark:bg-gray-700 dark:text-gray-300 dark:border-gray-500 dark:hover:text-white dark:hover:bg-gray-600 dark:focus:ring-gray-600">
<i class="bi bi-x-circle"></i>
<span class="ps-1">取消新增</span>
</button>
</div>
</div>
</div>
</div>
</body>
<script src="{{ asset('js/app.js') }}"></script>
<script src="{{ asset('js/jquery.js') }}"></script>
<script src="{{ asset('js/datepicker.js') }}"></script>
<script type="text/javascript">
function submit() {
$.ajax({
async: true,
method: "POST",
data: $('#FormData').serialize(),
url: '{{ route('api.sponsor.type.add') }}',
dataType: "json",
beforeSend: function () {
$('#SubmitSend').prop('disabled', true).removeClass('bg-blue-500').addClass('bg-blue-600')
.html('<svg aria-hidden="true" role="status" class="inline w-4 h-4 text-white animate-spin" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="#E5E7EB"/> <path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentColor"/></svg>' +
'<span class="ps-1">正在操作</span>');
},
success: function (returnData) {
if (returnData.output === "Success") {
$('#SubmitSend').html('<i class="bi bi-check2-circle"></i><span class="ps-1">操作成功</span>')
Toast.toggle('操作成功', '<i class="bi bi-check-circle text-green-500"></i>');
setTimeout(function () {
location.href = '{{ route('console.sponsor.mode') }}';
}, 3000);
} else {
$('#SubmitSend').html('<i class="bi bi-folder-plus"></i><span class="ps-1">新增方式</span>')
.prop('disabled', false).removeClass('bg-blue-600').addClass('bg-blue-500');
Toast('未知错误', '<i class="bi bi-x-circle text-red-500"></i>');
}
},
error: function (returnData) {
Toast.set('其他错误', '<i class="bi bi-x-circle text-red-500"></i>');
if (returnData.responseJSON.output === 'DataFormatError') {
for (let key in Enum) {
if (returnData.responseJSON.data.errorSingle.info === key) {
Toast.toggle(Enum[key] + '错误,注意格式', '<i class="bi bi-x-circle text-red-500"></i>');
}
}
} else {
Toast.toggle('未知错误', '<i class="bi bi-x-circle text-red-500"></i>');
}
$('#SubmitSend').html('<i class="bi bi-folder-plus"></i><span class="ps-1">新增方式</span>')
.prop('disabled', false).removeClass('bg-blue-600').addClass('bg-blue-500');
}
});
}
function select(ElemData) {
$.ajax({
async: true,
method: "GET",
url: '{{ route('api.sponsor.type.select','') }}/' + ElemData,
dataType: "json",
success: function (returnData) {
if (returnData.output === "Success") {
$('#edit_id').val(returnData.data.data.id);
$('#edit_name').val(returnData.data.data.name);
$('#edit_url').val(returnData.data.data.url);
if (returnData.data.data.include) {
$('#edit_include').prop('checked', true);
} else {
$('#edit_include').prop('checked', false);
}
if (returnData.data.data.link) {
$('#edit_link').prop('checked', true);
} else {
$('#edit_link').prop('checked', false);
}
} else {
Toast.toggle('获取失败', '<i class="bi bi-x-circle text-red-500"></i>');
}
},
error: function () {
Toast.toggle('获取失败', '<i class="bi bi-x-circle text-red-500"></i>');
}
});
}
function edit() {
$.ajax({
async: true,
method: "POST",
data: $('#FormDataEdit').serialize(),
url: '{{ route('api.sponsor.type.edit') }}',
dataType: "json",
beforeSend: function () {
$('#EditSubmitSend').prop('disabled', true).removeClass('bg-blue-500').addClass('bg-blue-600')
.html('<svg aria-hidden="true" role="status" class="inline w-4 h-4 text-white animate-spin" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="#E5E7EB"/> <path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentColor"/></svg>' +
'<span class="ps-1">正在操作</span>');
},
success: function (returnData) {
if (returnData.output === "Success") {
$('#EditSubmitSend').html('<i class="bi bi-check2-circle"></i><span class="ps-1">修改内容</span>')
Toast.toggle('操作成功', '<i class="bi bi-check-circle text-green-500"></i>');
setTimeout(function () {
location.href = '{{ route('console.sponsor.mode') }}';
}, 3000);
} else {
$('#EditSubmitSend').html('<i class="bi bi-folder-plus"></i><span class="ps-1">修改内容</span>')
.prop('disabled', false).removeClass('bg-blue-600').addClass('bg-blue-500');
Toast('未知错误', '<i class="bi bi-x-circle text-red-500"></i>');
}
},
error: function (returnData) {
Toast.set('其他错误', '<i class="bi bi-x-circle text-red-500"></i>');
if (returnData.responseJSON.output === 'DataFormatError') {
for (let key in Enum) {
if (returnData.responseJSON.data.errorSingle.info === key) {
Toast.toggle(Enum[key] + '错误,注意格式', '<i class="bi bi-x-circle text-red-500"></i>');
}
}
} else {
Toast.toggle('未知错误', '<i class="bi bi-x-circle text-red-500"></i>');
}
$('#EditSubmitSend').html('<i class="bi bi-folder-plus"></i><span class="ps-1">修改内容</span>')
.prop('disabled', false).removeClass('bg-blue-600').addClass('bg-blue-500');
}
});
}
function deleted(ElemData) {
$.ajax({
async: true,
method: "POST",
url: '{{ route('api.sponsor.type.delete','') }}/' + ElemData,
dataType: "json",
success: function (returnData) {
if (returnData.output === "Success") {
$('#SubmitSend').html('<i class="bi bi-check2-circle"></i><span class="ps-1">操作成功</span>')
Toast.toggle('操作成功', '<i class="bi bi-check-circle text-green-500"></i>');
setTimeout(function () {
location.href = '{{ route('console.sponsor.mode') }}';
}, 3000);
} else {
Toast('未知错误', '<i class="bi bi-x-circle text-red-500"></i>');
}
},
error: function (returnData) {
Toast.set('其他错误', '<i class="bi bi-x-circle text-red-500"></i>');
if (returnData.responseJSON.output === 'DataFormatError') {
for (let key in Enum) {
if (returnData.responseJSON.data.errorSingle.info === key) {
Toast.toggle(Enum[key] + '错误,注意格式', '<i class="bi bi-x-circle text-red-500"></i>');
}
}
} else {
Toast.toggle('未知错误', '<i class="bi bi-x-circle text-red-500"></i>');
}
}
});
}
class Enum {
static name = '别名';
static url = '链接地址';
}
class Toast {
static toggle(data, icon) {
this.set(data, icon);
$('#toast').fadeIn(300);
setTimeout(function () {
$('#toast').fadeOut(300);
}, 3000);
}
static set(data, icon) {
$('#toast-icon').html(icon);
$('#toast-info').text(data);
}
}
</script>
</html>

View File

@ -1 +1,188 @@
<?php <!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="{{ asset('css/app.css') }}">
<link rel="stylesheet" href="{{ asset('css/flowbite.css') }}">
@include('modules.head')
{!! $webHeader !!}
</head>
<body style="height: 100vh">
<div class="bg-white">
@include('modules.navbar')
<div class="relative isolate px-6 lg:px-8">
<div class="absolute inset-x-0 -top-40 -z-10 transform-gpu overflow-hidden blur-3xl sm:-top-80"
aria-hidden="true">
<div
class="relative left-[calc(50%-11rem)] aspect-[1155/678] w-[36.125rem] -translate-x-1/2 rotate-[30deg] bg-gradient-to-tr from-[#ff80b5] to-[#9089fc] opacity-30 sm:left-[calc(50%-30rem)] sm:w-[72.1875rem]"
style="clip-path: polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)"></div>
</div>
<div class="mx-auto my-10 max-w-6xl py-8 sm:py-16 lg:py-16 grid grid-cols-12 gap-4">
<div class="col-span-12 lg:col-span-4">
@csrf
<div class="p-4 bg-white border border-gray-200 rounded-lg shadow-lg sm:p-8 dark:bg-gray-800 dark:border-gray-700 grid grid-cols-1">
<img class="h-auto w-auto mx-auto rounded-lg mb-6" src="{{ $webIcon }}" alt="image description">
<div class="text-xl font-bold text-center mb-1">{{ $sqlAuthor }}</div>
<div class="text-center mb-3">{{ $webDescription }}</div>
<div class="grid grid-cols-1 md:grid-cols-2">
<button data-modal-target="Modal" data-modal-toggle="Modal" type="button" class="text-white bg-gradient-to-r from-cyan-500 to-blue-500 hover:bg-gradient-to-bl focus:ring-4
focus:outline-none focus:ring-cyan-300 dark:focus:ring-cyan-800 font-medium rounded-lg text-sm px-5 py-2.5 text-center mr-2 mb-2">
详情
</button>
<button data-modal-target="ModalPay" data-modal-toggle="ModalPay" type="button" class="text-white bg-gradient-to-br from-green-400
to-blue-600 hover:bg-gradient-to-bl focus:ring-4 focus:outline-none focus:ring-green-200 dark:focus:ring-green-800 font-medium
rounded-lg text-sm px-5 py-2.5 text-center mr-2 mb-2">
赞助
</button>
</div>
<hr class="w-48 h-1 mx-auto my-1 bg-gray-100 border-0 rounded md:my-10 dark:bg-gray-700">
<div class="p-2 bg-green-50 rounded-lg shadow-sm sm:p-4 dark:bg-gray-800 dark:border-gray-700 text-center mb-3">
今年({{ date('Y') }})收款 <b>{{ $sponsorCountYear }}</b>
</div>
<div class="p-2 bg-pink-50 rounded-lg shadow-sm sm:p-4 dark:bg-gray-800 dark:border-gray-700 text-center mb-3">
总计金额 <b>{{ $sponsorCount }}</b>
</div>
<div class="p-2 bg-blue-50 rounded-lg shadow-sm sm:p-4 dark:bg-gray-800 dark:border-gray-700 text-center">
目前站长收到了 <b>{{ $sponsorCountNumber }}</b> 份赞助
</div>
</div>
</div>
<div class="col-span-12 lg:col-span-8">
<div class="flex p-4 bg-white border border-gray-200 rounded-lg shadow-lg sm:p-8 dark:bg-gray-800 dark:border-gray-700">
@if($sponsor[0] != null)
<ol class="w-full relative border-l border-gray-200 dark:border-gray-700">
@foreach($sponsor as $value)
<li class="mb-10 ml-6">
<span class="absolute flex items-center justify-center w-6 h-6 bg-blue-100 rounded-full -left-3 ring-8 ring-white
dark:ring-gray-900 dark:bg-blue-900">
<i class="bi bi-calendar-check"></i>
</span>
<h3 class="flex items-center mb-1 text-lg font-semibold text-gray-900 dark:text-white">
@if(!empty($value['url']))
<a target="_blank" href="https://{{ $value['url'] }}">{{ $value['name'] }}</a>
@else
{{ $value['name'] }}
@endif
</h3>
<time class="mb-2 text-sm font-normal leading-none text-gray-400 dark:text-gray-500 grid grid-cols-3">
<div>{{ $value['time'] }}</div>
<div class="text-center">{{ $sponsorType[$value['type']]['name'] }}</div>
<div class="text-end"><b>{{ $value['money'] }}</b> CNY</div>
</time>
</li>
@endforeach
</ol>
@endif
</div>
</div>
</div>
<div
class="absolute inset-x-0 top-[calc(100%-13rem)] -z-10 transform-gpu overflow-hidden blur-3xl sm:top-[calc(100%-30rem)]"
aria-hidden="true">
<div
class="relative left-[calc(50%+3rem)] aspect-[1155/678] w-[36.125rem] -translate-x-1/2 bg-gradient-to-tr from-[#ff80b5] to-[#9089fc] opacity-30 sm:left-[calc(50%+36rem)] sm:w-[72.1875rem]"
style="clip-path: polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)"></div>
</div>
@include('modules.footer')
</div>
</div>
<!-- Modal -->
<div id="Modal" tabindex="-1" aria-hidden="true" class="fixed top-0 left-0 right-0 z-50 hidden w-full p-4 overflow-x-hidden overflow-y-auto md:inset-0
h-[calc(100%-1rem)] max-h-full">
<div class="relative w-full max-w-2xl max-h-full">
<!-- Modal content -->
<div class="relative bg-white rounded-lg shadow dark:bg-gray-700">
<!-- Modal header -->
<div class="flex items-start justify-between p-4 border-b rounded-t dark:border-gray-600">
<h3 class="text-xl font-semibold text-gray-900 dark:text-white">
赞助说明
</h3>
<button type="button" class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm w-8 h-8 ml-auto
inline-flex justify-center items-center dark:hover:bg-gray-600 dark:hover:text-white" data-modal-hide="Modal">
<svg class="w-3 h-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14">
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"/>
</svg>
<span class="sr-only">Close modal</span>
</button>
</div>
<!-- Modal body -->
<div class="p-6 space-y-6">
{!! $sponsorInfo !!}
</div>
<!-- Modal footer -->
<div class="flex items-center p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600">
<button data-modal-hide="Modal" type="button" class="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none
focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700
dark:focus:ring-blue-800">
我知道了
</button>
</div>
</div>
</div>
</div>
<div id="ModalPay" tabindex="-1" aria-hidden="true" class="fixed top-0 left-0 right-0 z-50 hidden w-full p-4 overflow-x-hidden overflow-y-auto md:inset-0
h-[calc(100%-1rem)] max-h-full">
<div class="relative w-full max-w-2xl max-h-full">
<!-- Modal content -->
<div class="relative bg-white rounded-lg shadow dark:bg-gray-700">
<!-- Modal header -->
<div class="flex items-start justify-between p-4 border-b rounded-t dark:border-gray-600">
<h3 class="text-xl font-semibold text-gray-900 dark:text-white">
赞助方法
</h3>
<button type="button" class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm w-8 h-8 ml-auto
inline-flex justify-center items-center dark:hover:bg-gray-600 dark:hover:text-white" data-modal-hide="ModalPay">
<svg class="w-3 h-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14">
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"/>
</svg>
<span class="sr-only">Close modal</span>
</button>
</div>
<!-- Modal body -->
<div class="p-6 space-y-6 grid grid-cols-1">
<img class="max-w-[256px] h-auto mx-auto" id="Image" src="{{ $sponsorURL }}" alt="">
<div class="grid grid-cols-5 gap-4">
@foreach($sponsorType as $value)
<button @if(!$value['link']) onclick="clickType({{ $value['id'] }})" @endif type="button" class="text-white bg-gradient-to-r
from-cyan-400 via-cyan-500 to-cyan-600 hover:bg-gradient-to-br focus:ring-4 focus:outline-none focus:ring-cyan-300
dark:focus:ring-cyan-800 font-medium rounded-lg text-sm px-5 py-2.5 text-center mr-2 mb-2">
<a @if($value['link'])href="{{ $value['url'] }}" target="_blank" @endif class="w-full">
{{ $value['name'] }}
</a>
</button>
@endforeach
</div>
</div>
<!-- Modal footer -->
<div class="flex items-center p-6 space-x-2 bor border-t border-gray-200 rounded-b dark:border-gray-600">
<button data-modal-hide="ModalPay" type="button" class="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none
focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700
dark:focus:ring-blue-800">
关闭页面
</button>
</div>
</div>
</div>
</div>
</body>
<script src="{{ asset('js/app.js') }}"></script>
<script async src="{{ asset('js/jquery.js') }}"></script>
<script type="text/javascript">
function clickType(sponsorType) {
$.ajax({
async: true,
method: "GET",
url: '{{ route('api.sponsor.get-type','id=') }}' + sponsorType,
dataType: "json",
success: function (returnData) {
$('#Image').attr('src', returnData.data.url);
}
});
}
</script>
{!! $webFooter !!}
</html>

View File

@ -3,7 +3,7 @@
<div class="flex lg:flex-1"> <div class="flex lg:flex-1">
<a href="#" class="-m-1.5 p-1.5"> <a href="#" class="-m-1.5 p-1.5">
<span class="sr-only">Your Company</span> <span class="sr-only">Your Company</span>
<img class="h-8 w-auto rounded-full" src="{{ asset('images/logo.jpg') }}" alt=""> <img class="h-8 w-auto rounded-full" src="{{ $webIcon }}" alt="">
</a> </a>
</div> </div>
<div class="flex lg:hidden"> <div class="flex lg:hidden">

View File

@ -7,7 +7,9 @@
use App\Http\Controllers\Authme; use App\Http\Controllers\Authme;
use App\Http\Controllers\Console\Link as ConsoleLink; use App\Http\Controllers\Console\Link as ConsoleLink;
use App\Http\Controllers\Console\Sponsor as ConsoleSponsor;
use App\Http\Controllers\Function\Link; use App\Http\Controllers\Function\Link;
use App\Http\Controllers\Function\Sponsor;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Response; use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
@ -25,9 +27,9 @@
// 登陆类 // 登陆类
Route::prefix('auth')->group(function () { Route::prefix('auth')->group(function () {
Route::post('login',[Authme::class,'Login'])->name('api.auth.login'); Route::post('login', [Authme::class, 'Login'])->name('api.auth.login');
Route::post('register',[Authme::class,'Register'])->name('api.auth.register'); Route::post('register', [Authme::class, 'Register'])->name('api.auth.register');
Route::match(['get','post'],'logout',function () { Route::match(['get', 'post'], 'logout', function () {
Auth::logout(); Auth::logout();
return Response::redirectTo(''); return Response::redirectTo('');
})->name('logout'); })->name('logout');
@ -46,7 +48,21 @@
Route::post('add', [Link::class, 'apiCustomAdd'])->name('api.link.custom.add'); Route::post('add', [Link::class, 'apiCustomAdd'])->name('api.link.custom.add');
Route::post('edit/{friendId}', [Link::class, 'apiCustomEdit'])->name('api.link.custom.edit'); Route::post('edit/{friendId}', [Link::class, 'apiCustomEdit'])->name('api.link.custom.edit');
Route::get('search', [Link::class, 'apiCustomSearch'])->name('api.link.custom.search'); Route::get('search', [Link::class, 'apiCustomSearch'])->name('api.link.custom.search');
Route::post('blogCheck',[Link::class,'apiCustomBlogCheck'])->name('api.link.custom.blogCheck'); Route::post('blogCheck', [Link::class, 'apiCustomBlogCheck'])->name('api.link.custom.blogCheck');
Route::post('blogVerify',[Link::class,'apiCustomBlogVerify'])->name('api.link.custom.blogVerify'); Route::post('blogVerify', [Link::class, 'apiCustomBlogVerify'])->name('api.link.custom.blogVerify');
});
});
Route::prefix('sponsor')->group(function () {
Route::get('get-type', [Sponsor::class, 'apiSponsorType'])->name('api.sponsor.get-type');
Route::post('add', [ConsoleSponsor::class, 'apiAdd'])->name('api.sponsor.add');
Route::post('edit/{sponsorId}', [ConsoleSponsor::class, 'apiEdit'])->name('api.sponsor.edit');
Route::post('delete/{sponsorId}', [ConsoleSponsor::class, 'apiDelete'])->name('api.sponsor.delete');
Route::prefix('type')->group(function () {
Route::post('add', [ConsoleSponsor::class, 'apiTypeAdd'])->name('api.sponsor.type.add');
Route::post('edit/{typeId}', [ConsoleSponsor::class, 'apiTypeEdit'])->name('api.sponsor.type.edit-number');
Route::post('edit', [ConsoleSponsor::class, 'apiTypeEdit'])->name('api.sponsor.type.edit');
Route::post('delete/{typeId}', [ConsoleSponsor::class, 'apiTypeDelete'])->name('api.sponsor.type.delete');
Route::get('select/{typeId}', [ConsoleSponsor::class, 'apiTypeSelect'])->name('api.sponsor.type.select');
}); });
}); });

View File

@ -7,7 +7,10 @@
use App\Http\Controllers\Console\Dashboard; use App\Http\Controllers\Console\Dashboard;
use App\Http\Controllers\Console\Link as ConsoleLink; use App\Http\Controllers\Console\Link as ConsoleLink;
use App\Http\Controllers\Console\Sponsor as ConsoleSponsor;
use App\Http\Controllers\DataBase;
use App\Http\Controllers\Function\Link as UserLink; use App\Http\Controllers\Function\Link as UserLink;
use App\Http\Controllers\Function\Sponsor;
use App\Http\Controllers\Index; use App\Http\Controllers\Index;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Response; use Illuminate\Support\Facades\Response;
@ -28,7 +31,7 @@
Route::get('about', [Index::class, 'ViewAboutMe'])->name('about'); Route::get('about', [Index::class, 'ViewAboutMe'])->name('about');
Route::get('404', [Index::class, 'viewPageNotFounded'])->name('404'); Route::get('404', [Index::class, 'viewPageNotFounded'])->name('404');
Route::get('no-permission', [Index::class, 'viewNoPermission'])->name('no-permission'); Route::get('no-permission', [Index::class, 'viewNoPermission'])->name('no-permission');
Route::get('backup', [\App\Http\Controllers\DataBase::class, '__construct']); Route::get('backup', [DataBase::class, '__construct']);
Route::prefix('function')->group(function () { Route::prefix('function')->group(function () {
Route::get('link', [UserLink::class, 'viewLink'])->name('function.link'); Route::get('link', [UserLink::class, 'viewLink'])->name('function.link');
@ -36,9 +39,7 @@
Route::get('edit-search', [UserLink::class, 'viewSearchFriends'])->name('function.edit-search'); Route::get('edit-search', [UserLink::class, 'viewSearchFriends'])->name('function.edit-search');
Route::get('edit-search/{friendId}', [UserLink::class, 'viewSearchFriend'])->name('function.edit-searchOnly'); Route::get('edit-search/{friendId}', [UserLink::class, 'viewSearchFriend'])->name('function.edit-searchOnly');
Route::get('edit-friend/{friendId}', [UserLink::class, 'viewEditFriend'])->name('function.edit-friend'); Route::get('edit-friend/{friendId}', [UserLink::class, 'viewEditFriend'])->name('function.edit-friend');
Route::get('sponsor', function () { Route::get('sponsor', [Sponsor::class, 'viewSponsor'])->name('function.sponsor');
return view('function.sponsor');
})->name('function.sponsor');
Route::get('music', function () { Route::get('music', function () {
return view('function.music'); return view('function.music');
})->name('function.music'); })->name('function.music');
@ -64,6 +65,11 @@
Route::get('sort', [ConsoleLink::class, 'viewSort'])->name('console.friends-link.sort'); Route::get('sort', [ConsoleLink::class, 'viewSort'])->name('console.friends-link.sort');
Route::get('color', [ConsoleLink::class, 'viewColor'])->name('console.friends-link.color'); Route::get('color', [ConsoleLink::class, 'viewColor'])->name('console.friends-link.color');
}); });
Route::prefix('sponsor')->group(function () {
Route::get('dashboard', [ConsoleSponsor::class, 'viewSponsorDashboard'])->name('console.sponsor.dashboard');
Route::get('edit/{sponsorId}', [ConsoleSponsor::class, 'viewEdit'])->name('console.sponsor.edit');
Route::get('mode', [ConsoleSponsor::class, 'viewMode'])->name('console.sponsor.mode');
});
}); });
Route::prefix('auth')->group(function () { Route::prefix('auth')->group(function () {

View File

@ -18,7 +18,8 @@ const mix = require('laravel-mix');
*/ */
mix.js('resources/js/app.js', 'public/js') mix.js('resources/js/app.js', 'public/js')
.js('resources/js/datepicker.js', 'public/js')
.postCss('resources/css/app.css', 'public/css', [ .postCss('resources/css/app.css', 'public/css', [
require("tailwindcss") require("tailwindcss"),
]) ])
.copy('resources/images/*', 'public/images'); .copy('resources/images/*', 'public/images');