forked from XiaoLFeng/XF_Index
Merge pull request 'feature' (#10) from feature into master
Reviewed-on: https://git.x-lf.cn/XiaoLFeng/XF_Index/pulls/10
This commit is contained in:
commit
47e362bcf8
41
.gitea/workflows/laravel.yaml
Normal file
41
.gitea/workflows/laravel.yaml
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
name: Tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- '*.x'
|
||||||
|
pull_request:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * *'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
tests:
|
||||||
|
runs-on: centos
|
||||||
|
|
||||||
|
name: PHP
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: '检查代码'
|
||||||
|
uses: https://github.com/actions/checkout@v3
|
||||||
|
|
||||||
|
- name: '安装PHP'
|
||||||
|
uses: XiaoLFeng/setup-php@v2
|
||||||
|
with:
|
||||||
|
coverage: none
|
||||||
|
tools: phpmd
|
||||||
|
|
||||||
|
- name: '检查命名问题'
|
||||||
|
run: phpmd ./ text naming
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
|
- name: '检查设计问题'
|
||||||
|
run: phpmd ./ text naming design
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
|
- name: '检查代码规模是否过大'
|
||||||
|
run: phpmd ./ text codesize
|
||||||
|
continue-on-error: true
|
@ -18,7 +18,6 @@
|
|||||||
use Illuminate\Mail\Message;
|
use Illuminate\Mail\Message;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
use Illuminate\Support\Facades\Mail;
|
use Illuminate\Support\Facades\Mail;
|
||||||
use Illuminate\Support\Facades\Request;
|
|
||||||
use Illuminate\Support\Facades\Response;
|
use Illuminate\Support\Facades\Response;
|
||||||
use Illuminate\Support\Facades\Validator;
|
use Illuminate\Support\Facades\Validator;
|
||||||
|
|
||||||
@ -264,119 +263,149 @@ public function apiCustomBlogCheck(HttpRequest $request): JsonResponse
|
|||||||
{
|
{
|
||||||
/** @var array $returnData Json的 return 返回值 */
|
/** @var array $returnData Json的 return 返回值 */
|
||||||
// 验证数据
|
// 验证数据
|
||||||
$resultBlog = DB::table('blog_link')
|
$dataCheck = Validator::make($request->all(), [
|
||||||
->select('id', 'blogOwnEmail')
|
'id' => 'required|int',
|
||||||
->find((int)$request->id);
|
'userEmail' => 'required|email',
|
||||||
if (!empty($resultBlog->id)) {
|
'userCode' => 'string|min:6|max:64|regex:#^[0-9A-Za-z]+$#',
|
||||||
// 检查输入博客是否对应
|
]);
|
||||||
if (!empty($resultBlog->blogOwnEmail)) {
|
|
||||||
if (strcmp($resultBlog->blogOwnEmail, $request->email) == 0) {
|
|
||||||
// 生成验证码(筛查内容)
|
|
||||||
$resultVerifyCode = DB::table('code')
|
|
||||||
->where([
|
|
||||||
['email', '=', $resultBlog->blogOwnEmail],
|
|
||||||
['type', '=', 'CODE-CUSTOM-CHECK'],
|
|
||||||
['time', '>', time()]])
|
|
||||||
->get()
|
|
||||||
->toArray();
|
|
||||||
// 不存在验证码,生成验证码并存入数据库中
|
|
||||||
if (empty($resultVerifyCode[0]->id)) {
|
|
||||||
// 生成6位数验证码
|
|
||||||
$verifyCode = null;
|
|
||||||
for ($i = 0; $i < 6; $i++)
|
|
||||||
$verifyCode .= rand(0, 9);
|
|
||||||
|
|
||||||
// 存入数据库
|
if (!$dataCheck->fails()) {
|
||||||
DB::table('code')
|
$resultBlog = DB::table('blog_link')
|
||||||
->insert([
|
->select('id', 'blogOwnEmail')
|
||||||
'email' => $resultBlog->blogOwnEmail,
|
->find((int)$request->id);
|
||||||
'code' => $verifyCode,
|
if (!empty($resultBlog->id)) {
|
||||||
'type' => 'CODE-CUSTOM-CHECK',
|
// 检查输入博客是否对应
|
||||||
'sendTime' => time(),
|
if (!empty($resultBlog->blogOwnEmail)) {
|
||||||
'time' => time()+900,
|
if (strcmp($resultBlog->blogOwnEmail, $request->userEmail) == 0) {
|
||||||
]);
|
// 生成验证码(筛查内容)
|
||||||
// 数据整理
|
$resultVerifyCode = DB::table('code')
|
||||||
$this->sendEmail = [
|
|
||||||
'userEmail' => $resultBlog->blogOwnEmail,
|
|
||||||
'verifyCode' => $verifyCode,
|
|
||||||
'sendTime' => time(),
|
|
||||||
];
|
|
||||||
$this->apiCustomBlogCheckSendEmail();
|
|
||||||
$returnData = [
|
|
||||||
'output' => 'Success',
|
|
||||||
'code' => 200,
|
|
||||||
'data' => [
|
|
||||||
'message' => '发送成功',
|
|
||||||
],
|
|
||||||
];
|
|
||||||
} else {
|
|
||||||
// 存在验证码,检查验证码是否需要重新发送
|
|
||||||
$data = DB::table('code')
|
|
||||||
->where([
|
->where([
|
||||||
['email','=',$resultBlog->blogOwnEmail],
|
['email', '=', $resultBlog->blogOwnEmail],
|
||||||
['type','=','CODE-CUSTOM-CHECK'],
|
['type', '=', 'CODE-CUSTOM-CHECK'],
|
||||||
['time','>',time()]])
|
['time', '>', time()]])
|
||||||
->get()
|
->get()
|
||||||
->toArray();
|
->toArray();
|
||||||
$this->sendEmail = [
|
// 不存在验证码,生成验证码并存入数据库中
|
||||||
'userEmail' => $data[0]->email,
|
if (empty($resultVerifyCode[0]->id)) {
|
||||||
'verifyCode' => $data[0]->code,
|
// 生成6位数验证码
|
||||||
'sendTime' => time(),
|
$verifyCode = null;
|
||||||
];
|
for ($i = 0; $i < 6; $i++)
|
||||||
if ($resultVerifyCode[0]->sendTime < time()-60) {
|
$verifyCode .= rand(0, 9);
|
||||||
// 发送验证码
|
|
||||||
|
// 存入数据库
|
||||||
DB::table('code')
|
DB::table('code')
|
||||||
->where([
|
->insert([
|
||||||
['email','=',$resultBlog->blogOwnEmail],
|
'email' => $resultBlog->blogOwnEmail,
|
||||||
['type','=','CODE-CUSTOM-CHECK'],
|
'code' => $verifyCode,
|
||||||
['time','>',time()]])
|
'type' => 'CODE-CUSTOM-CHECK',
|
||||||
->update(['sendTime' => time()]);
|
'sendTime' => time(),
|
||||||
|
'time' => time() + 900,
|
||||||
|
]);
|
||||||
|
// 数据整理
|
||||||
|
$this->sendEmail = [
|
||||||
|
'userEmail' => $resultBlog->blogOwnEmail,
|
||||||
|
'verifyCode' => $verifyCode,
|
||||||
|
'sendTime' => time(),
|
||||||
|
];
|
||||||
$this->apiCustomBlogCheckSendEmail();
|
$this->apiCustomBlogCheckSendEmail();
|
||||||
$returnData = [
|
$returnData = [
|
||||||
'output' => 'Success',
|
'output' => 'Success',
|
||||||
'code' => 200,
|
'code' => 200,
|
||||||
'data' => [
|
'data' => [
|
||||||
'message' => '重新发送成功',
|
'message' => '发送成功',
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
} else {
|
} else {
|
||||||
// 避免重复发送
|
// 存在验证码,检查验证码是否需要重新发送
|
||||||
$returnData = [
|
$data = DB::table('code')
|
||||||
'output' => 'SendingTimeTooFast',
|
->where([
|
||||||
'code' => 403,
|
['email', '=', $resultBlog->blogOwnEmail],
|
||||||
'data' => [
|
['type', '=', 'CODE-CUSTOM-CHECK'],
|
||||||
'message' => '邮件重新发送时间过快',
|
['time', '>', time()]])
|
||||||
'data' => [
|
->get()
|
||||||
'time' => 60 - (time() - $resultVerifyCode[0]->sendTime),
|
->toArray();
|
||||||
],
|
$this->sendEmail = [
|
||||||
],
|
'userEmail' => $data[0]->email,
|
||||||
|
'verifyCode' => $data[0]->code,
|
||||||
|
'sendTime' => time(),
|
||||||
];
|
];
|
||||||
|
if ($resultVerifyCode[0]->sendTime < time() - 60) {
|
||||||
|
// 发送验证码
|
||||||
|
DB::table('code')
|
||||||
|
->where([
|
||||||
|
['email', '=', $resultBlog->blogOwnEmail],
|
||||||
|
['type', '=', 'CODE-CUSTOM-CHECK'],
|
||||||
|
['time', '>', time()]])
|
||||||
|
->update(['sendTime' => time()]);
|
||||||
|
$this->apiCustomBlogCheckSendEmail();
|
||||||
|
$returnData = [
|
||||||
|
'output' => 'Success',
|
||||||
|
'code' => 200,
|
||||||
|
'data' => [
|
||||||
|
'message' => '重新发送成功',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
} else {
|
||||||
|
// 避免重复发送
|
||||||
|
$returnData = [
|
||||||
|
'output' => 'SendingTimeTooFast',
|
||||||
|
'code' => 403,
|
||||||
|
'data' => [
|
||||||
|
'message' => '邮件重新发送时间过快',
|
||||||
|
'data' => [
|
||||||
|
'time' => 60 - (time() - $resultVerifyCode[0]->sendTime),
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
$returnData = [
|
||||||
|
'output' => 'EmailMismatch',
|
||||||
|
'code' => 403,
|
||||||
|
'data' => [
|
||||||
|
'message' => '邮箱与对应ID不匹配',
|
||||||
|
],
|
||||||
|
];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$returnData = [
|
$returnData = [
|
||||||
'output' => 'EmailMismatch',
|
'output' => 'NoEmail',
|
||||||
'code' => 403,
|
'code' => 403,
|
||||||
'data' => [
|
'data' => [
|
||||||
'message' => '邮箱与对应ID不匹配',
|
'message' => '对应ID没有绑定邮箱,请联系管理员',
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$returnData = [
|
$returnData = [
|
||||||
'output' => 'NoEmail',
|
'output' => 'NoBlog',
|
||||||
'code' => 403,
|
'code' => 403,
|
||||||
'data' => [
|
'data' => [
|
||||||
'message' => '对应ID没有绑定邮箱,请联系管理员',
|
'message' => '没有ID对应博客',
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
$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 = [
|
$returnData = [
|
||||||
'output' => 'NoBlog',
|
'output' => 'DataFormatError',
|
||||||
'code' => 403,
|
'code' => 403,
|
||||||
'data' => [
|
'data' => [
|
||||||
'message' => '没有ID对应博客',
|
'message' => '输入内容有错误',
|
||||||
|
'errorSingle' => $errorSingle,
|
||||||
|
'error' => $errorInfo,
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@ -386,8 +415,7 @@ public function apiCustomBlogCheck(HttpRequest $request): JsonResponse
|
|||||||
/**
|
/**
|
||||||
* 站长认证邮件发送模板
|
* 站长认证邮件发送模板
|
||||||
*
|
*
|
||||||
* @param array $data
|
* @return void 发送链接,不做返回内容
|
||||||
* @return void
|
|
||||||
*/
|
*/
|
||||||
private function apiCustomBlogCheckSendEmail(): void
|
private function apiCustomBlogCheckSendEmail(): void
|
||||||
{
|
{
|
||||||
@ -399,7 +427,123 @@ private function apiCustomBlogCheckSendEmail(): void
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public function viewEditFriend($friendId): Application|Factory|View|RedirectResponse
|
/**
|
||||||
|
* 验证是否为站长
|
||||||
|
*
|
||||||
|
* @param HttpRequest $request 获取HTTP中 Request 数据
|
||||||
|
* @return JsonResponse 返回JSON数据
|
||||||
|
*/
|
||||||
|
public function apiCustomBlogVerify(HttpRequest $request): JsonResponse
|
||||||
|
{
|
||||||
|
/** @var array $returnData Json的 return 返回值 */
|
||||||
|
/** @var mixed $cookie 保存Cookie数据 */
|
||||||
|
//数据验证
|
||||||
|
$dataCheck = Validator::make($request->all(), [
|
||||||
|
'id' => 'required|int',
|
||||||
|
'userEmail' => 'required|email',
|
||||||
|
'userCode' => 'required|string|min:6|max:64|regex:#^[0-9A-Za-z]+$#',
|
||||||
|
]);
|
||||||
|
// 验证数据是否合法
|
||||||
|
if (!$dataCheck->fails()) {
|
||||||
|
$cookie = cookie('friend_edit', '', -1, '/');
|
||||||
|
// 检查内容是否存在
|
||||||
|
$resultBlog = DB::table('blog_link')
|
||||||
|
->select('id', 'blogOwnEmail')
|
||||||
|
->find((int)$request->id);
|
||||||
|
if (!empty($resultBlog->id)) {
|
||||||
|
if (!empty($resultBlog->blogOwnEmail)) {
|
||||||
|
// 验证此邮箱是否与该博客一致
|
||||||
|
if (strcmp($resultBlog->blogOwnEmail, $request->userEmail) == 0) {
|
||||||
|
// 检查验证码是否存在
|
||||||
|
$resultCode = DB::table('code')
|
||||||
|
->select('id')
|
||||||
|
->where([
|
||||||
|
['code.code', '=', $request->userCode],
|
||||||
|
['email', '=', $request->userEmail],
|
||||||
|
['type', '=', 'CODE-CUSTOM-CHECK'],
|
||||||
|
['time', '>', time()]])
|
||||||
|
->get()
|
||||||
|
->toArray();
|
||||||
|
if (!empty($resultCode[0]->id)) {
|
||||||
|
// 配置Cookie
|
||||||
|
$cookie = cookie('friend_edit', password_hash($resultBlog->id, PASSWORD_DEFAULT), 15, '/',);
|
||||||
|
// 完成验证删除验证码
|
||||||
|
DB::table('code')
|
||||||
|
->delete((int)$resultCode[0]->id);
|
||||||
|
// Json
|
||||||
|
$returnData = [
|
||||||
|
'output' => 'Success',
|
||||||
|
'code' => 200,
|
||||||
|
'data' => [
|
||||||
|
'message' => '验证成功',
|
||||||
|
'id' => $resultBlog->id
|
||||||
|
],
|
||||||
|
];
|
||||||
|
} else {
|
||||||
|
// 验证码验证失败
|
||||||
|
$returnData = [
|
||||||
|
'output' => 'NoVerifyCode',
|
||||||
|
'code' => 403,
|
||||||
|
'data' => [
|
||||||
|
'message' => '没有这个验证码',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$returnData = [
|
||||||
|
'output' => 'EmailMismatch',
|
||||||
|
'code' => 403,
|
||||||
|
'data' => [
|
||||||
|
'message' => '邮箱与对应ID不匹配',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$returnData = [
|
||||||
|
'output' => 'NoEmail',
|
||||||
|
'code' => 403,
|
||||||
|
'data' => [
|
||||||
|
'message' => '对应ID没有绑定邮箱,请联系管理员',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$returnData = [
|
||||||
|
'output' => 'NoBlog',
|
||||||
|
'code' => 403,
|
||||||
|
'data' => [
|
||||||
|
'message' => '没有ID对应博客',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$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,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
return Response::json($returnData, $returnData['code'])
|
||||||
|
->cookie($cookie);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function viewEditFriend(HttpRequest $request, $friendId): Application|Factory|View|RedirectResponse
|
||||||
{
|
{
|
||||||
// 检查内容是否为空
|
// 检查内容是否为空
|
||||||
if (!empty($friendId)) {
|
if (!empty($friendId)) {
|
||||||
@ -410,19 +554,27 @@ public function viewEditFriend($friendId): Application|Factory|View|RedirectResp
|
|||||||
->find($friendId);
|
->find($friendId);
|
||||||
if (!empty($resultBlog->id)) {
|
if (!empty($resultBlog->id)) {
|
||||||
// 检查是否存在Cookie作为已验证
|
// 检查是否存在Cookie作为已验证
|
||||||
if (Request::hasCookie('friend_edit')) {
|
if ($request->hasCookie('friend_edit')) {
|
||||||
// 检查COOKIE与所验证ID是否匹配
|
// 检查COOKIE与所验证ID是否匹配
|
||||||
if (password_verify($friendId, Request::cookie('friend_edit'))) {
|
if (password_verify($resultBlog->id, $request->cookie('friend_edit'))) {
|
||||||
|
$this->data['blog'] = $resultBlog;
|
||||||
|
$this->data['blogColor'] = DB::table('blog_color')
|
||||||
|
->orderBy('id')
|
||||||
|
->get()
|
||||||
|
->toArray();
|
||||||
|
$this->data['blogSort'] = DB::table('blog_sort')
|
||||||
|
->orderBy('sort')
|
||||||
|
->get()
|
||||||
|
->toArray();
|
||||||
return view('function.edit-friend', $this->data);
|
return view('function.edit-friend', $this->data);
|
||||||
} else {
|
} else {
|
||||||
response()->withCookie(cookie('friend_edit', null, time() - 1));
|
$cookie = cookie('friend_edit', '', -1, '/');
|
||||||
return Response::redirectTo(route('function.edit-search'));
|
return Response::redirectTo(route('function.edit-search'))
|
||||||
|
->cookie($cookie);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 验证页面
|
// 验证页面
|
||||||
// 加密用户邮箱
|
return Response::redirectTo(route('function.edit-searchOnly', $resultBlog->id));
|
||||||
$this->data['blog'] = $resultBlog;
|
|
||||||
return view('function.edit-check', $this->data);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 不存在这一个ID用户
|
// 不存在这一个ID用户
|
||||||
@ -469,13 +621,29 @@ protected function viewSearchFriends(): Factory|View|Application
|
|||||||
|
|
||||||
protected function viewSearchFriend($friendId): Factory|View|Application|RedirectResponse
|
protected function viewSearchFriend($friendId): Factory|View|Application|RedirectResponse
|
||||||
{
|
{
|
||||||
|
/** @var $dataEmail array 获取修改邮箱后的值 */
|
||||||
$this->data['webSubTitle'] = '查询列表';
|
$this->data['webSubTitle'] = '查询列表';
|
||||||
if (!empty($friendId)) {
|
if (!empty($friendId)) {
|
||||||
// 检查 friendId 是否存在
|
// 检查 friendId 是否存在
|
||||||
$resultBlog = DB::table('blog_link')
|
$resultBlog = DB::table('blog_link')
|
||||||
->select('id','blogOwnEmail')
|
->select('id', 'blogOwnEmail', 'blogName')
|
||||||
->find($friendId);
|
->find($friendId);
|
||||||
if (!empty($resultBlog->id)) {
|
if (!empty($resultBlog->id)) {
|
||||||
|
// 处理加密邮箱
|
||||||
|
$strlenEmail = strlen($resultBlog->blogOwnEmail);
|
||||||
|
($strlenEmail > 4) ? $j = 1 : $j = 0;
|
||||||
|
for ($i = 0; $i < $strlenEmail; $i++) {
|
||||||
|
if ($resultBlog->blogOwnEmail[$i] != '@') {
|
||||||
|
if ($i > $j && $i < $strlenEmail - ($j + 1)) {
|
||||||
|
$dataEmail[$i] = '*';
|
||||||
|
} else {
|
||||||
|
$dataEmail[$i] = $resultBlog->blogOwnEmail[$i];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$dataEmail[$i] = $resultBlog->blogOwnEmail[$i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$resultBlog->blogOwnEmail = implode($dataEmail);
|
||||||
$this->data['blog'] = $resultBlog;
|
$this->data['blog'] = $resultBlog;
|
||||||
return view('function.edit-check', $this->data);
|
return view('function.edit-check', $this->data);
|
||||||
} else {
|
} else {
|
||||||
|
@ -17,6 +17,6 @@ class EncryptCookies extends Middleware
|
|||||||
* @var array<int, string>
|
* @var array<int, string>
|
||||||
*/
|
*/
|
||||||
protected $except = [
|
protected $except = [
|
||||||
//
|
'friend_edit',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
18
phpunit.xml
18
phpunit.xml
@ -24,14 +24,14 @@
|
|||||||
</include>
|
</include>
|
||||||
</coverage>
|
</coverage>
|
||||||
<php>
|
<php>
|
||||||
<server name="APP_ENV" valueLink="testing"/>
|
<server name="APP_ENV" value="testing"/>
|
||||||
<server name="BCRYPT_ROUNDS" valueLink="4"/>
|
<server name="BCRYPT_ROUNDS" value="4"/>
|
||||||
<server name="CACHE_DRIVER" valueLink="array"/>
|
<server name="CACHE_DRIVER" value="array"/>
|
||||||
<!-- <server name="DB_CONNECTION" valueLink="sqlite"/> -->
|
<!-- <server name="DB_CONNECTION" value="sqlite"/> -->
|
||||||
<!-- <server name="DB_DATABASE" valueLink=":memory:"/> -->
|
<!-- <server name="DB_DATABASE" value=":memory:"/> -->
|
||||||
<server name="MAIL_MAILER" valueLink="array"/>
|
<server name="MAIL_MAILER" value="array"/>
|
||||||
<server name="QUEUE_CONNECTION" valueLink="sync"/>
|
<server name="QUEUE_CONNECTION" value="sync"/>
|
||||||
<server name="SESSION_DRIVER" valueLink="array"/>
|
<server name="SESSION_DRIVER" value="array"/>
|
||||||
<server name="TELESCOPE_ENABLED" valueLink="false"/>
|
<server name="TELESCOPE_ENABLED" value="false"/>
|
||||||
</php>
|
</php>
|
||||||
</phpunit>
|
</phpunit>
|
||||||
|
287
resources/views/function/edit-check.blade.php
Normal file
287
resources/views/function/edit-check.blade.php
Normal file
@ -0,0 +1,287 @@
|
|||||||
|
<!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>
|
||||||
|
<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-4xl py-8 sm:py-16 lg:py-16">
|
||||||
|
<div class="flex">
|
||||||
|
<label for="location_search" class="mb-2 text-sm font-medium text-gray-900 sr-only dark:text-white">Your
|
||||||
|
Email</label>
|
||||||
|
<button id="dropdown-button-2" data-dropdown-toggle="dropdown-search-city"
|
||||||
|
class="flex-shrink-0 z-10 inline-flex items-center py-2.5 px-4 text-sm font-medium text-center text-gray-500 bg-gray-100 border border-gray-300 rounded-l-lg hover:bg-gray-200 focus:ring-4 focus:outline-none focus:ring-gray-100 dark:bg-gray-700 dark:hover:bg-gray-600 dark:focus:ring-gray-700 dark:text-white dark:border-gray-600"
|
||||||
|
type="button">
|
||||||
|
<span id="search-data">
|
||||||
|
<i class="bi bi-arrow-up-circle pe-1"></i>综合搜索
|
||||||
|
</span>
|
||||||
|
<svg aria-hidden="true" class="w-4 h-4 ml-1" fill="currentColor" viewBox="0 0 20 20"
|
||||||
|
xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd"
|
||||||
|
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
|
||||||
|
clip-rule="evenodd"></path>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<div id="dropdown-search-city"
|
||||||
|
class="z-10 hidden bg-white divide-y divide-gray-100 rounded-lg shadow w-44 dark:bg-gray-700">
|
||||||
|
<ul class="py-2 text-sm text-gray-700 dark:text-gray-200" aria-labelledby="dropdown-button-2">
|
||||||
|
<li>
|
||||||
|
<button type="button" onclick="Check.Click(1)"
|
||||||
|
class="inline-flex w-full px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-600 dark:hover:text-white"
|
||||||
|
role="menuitem">
|
||||||
|
<div class="inline-flex items-center">
|
||||||
|
<i class="bi bi-1-circle pe-1"></i>博客名字
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<button type="button" onclick="Check.Click(2)"
|
||||||
|
class="inline-flex w-full px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-600 dark:hover:text-white"
|
||||||
|
role="menuitem">
|
||||||
|
<div class="inline-flex items-center">
|
||||||
|
<i class="bi bi-2-circle pe-1"></i>博客地址
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="relative w-full">
|
||||||
|
<input type="search" id="location_search" name="location_search"
|
||||||
|
class="block p-2.5 w-full z-20 text-sm text-gray-900 bg-gray-50 rounded-r-lg border-l-gray-50 border-l-2 border border-gray-300 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:border-l-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:border-blue-500"
|
||||||
|
placeholder="输入内容进行友链筛查" required>
|
||||||
|
<button onclick="Search.ajax()"
|
||||||
|
class="absolute top-0 right-0 p-2.5 text-sm font-medium text-white bg-blue-700 rounded-r-lg border border-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800">
|
||||||
|
<i class="bi bi-search"></i>
|
||||||
|
<span class="sr-only">搜索</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mx-auto my-10 max-w-4xl pb-8 sm:pb-16 lg:pb-16">
|
||||||
|
<form id="FormData" action="#" onsubmit="return false" method="POST">
|
||||||
|
<div
|
||||||
|
class="col-span-10 lg:col-span-7 items-center justify-center rounded bg-gray-50 dark:bg-gray-800 shadow">
|
||||||
|
<div id="screen" class="px-10 py-5">
|
||||||
|
<h1 class="text-center mb-4 text-3xl font-bold leading-none tracking-tight text-gray-900 md:text-3xl lg:text-4xl dark:text-white mt-5">
|
||||||
|
身份验证</h1>
|
||||||
|
<p class="mb-6 text-lg font-normal text-gray-500 sm:px-16 xl:px-48 dark:text-gray-400 text-center">
|
||||||
|
您好 <b>{{ $blog->blogName }}</b> 的站长</p>
|
||||||
|
<label>
|
||||||
|
<input name="id" type="number" class="hidden" value="{{ $blog->id }}">
|
||||||
|
</label>
|
||||||
|
<div class="mb-6">
|
||||||
|
<label for="userEmail" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">
|
||||||
|
<span>邮箱验证</span>
|
||||||
|
<span class="text-gray-400 dark:text-gray-300">(邮箱提示:{{ $blog->blogOwnEmail }})</span>
|
||||||
|
<span data-tooltip-target="userEmail-Tooltip" class="bi bi-info-circle mx-1 text-blue-700"></span>
|
||||||
|
<span class="text-red-700">*</span>
|
||||||
|
</label>
|
||||||
|
<div id="userEmail-Tooltip" role="tooltip" class="absolute z-10 invisible inline-block px-3 py-2 text-sm font-medium text-white
|
||||||
|
transition-opacity duration-300 bg-gray-900 rounded-lg shadow-sm opacity-0 tooltip dark:bg-gray-700">
|
||||||
|
(请输入您在本站预留的有效邮箱)为了保证用户不会恶意收到验证邮箱,需要用户自行输入完整邮箱进行验证
|
||||||
|
<div class="tooltip-arrow" data-popper-arrow></div>
|
||||||
|
</div>
|
||||||
|
<div class="relative">
|
||||||
|
<div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
|
||||||
|
<i class="bi bi-mailbox"></i>
|
||||||
|
</div>
|
||||||
|
<input type="email" name="userEmail" id="userEmail" placeholder="xxx@xx.xx" class="bg-white 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"
|
||||||
|
required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mb-6">
|
||||||
|
<label for="userCode" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">
|
||||||
|
<span>邮箱验证码</span>
|
||||||
|
<span class="text-red-700">*</span>
|
||||||
|
</label>
|
||||||
|
<div class="relative">
|
||||||
|
<div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
|
||||||
|
<i class="bi bi-chat-right-dots"></i>
|
||||||
|
</div>
|
||||||
|
<input type="text" name="userCode" id="userCode" placeholder="000000" class="bg-white 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"
|
||||||
|
required>
|
||||||
|
<button id="sendVerifyCode" onclick="Check.ajaxSendCode()" class="text-white absolute right-[3px] bottom-[3px] bg-blue-700 hover:bg-blue-800
|
||||||
|
focus:ring-4
|
||||||
|
focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm px-4 py-2 dark:bg-blue-600 dark:hover:bg-blue-700
|
||||||
|
dark:focus:ring-blue-800">发送验证码
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="pt-6 text-center">
|
||||||
|
<button id="sendCheckCode" onclick="Check.ajaxVerifyCode()" class="focus:outline-none text-white bg-green-700 hover:bg-green-800
|
||||||
|
focus:ring-4 focus:ring-green-300
|
||||||
|
font-medium rounded-lg text-sm px-5 py-2.5 mr-2 mb-2 dark:bg-green-600 dark:hover:bg-green-700 dark:focus:ring-green-800">
|
||||||
|
<i class="bi bi-send"></i>
|
||||||
|
<span class="ps-1">验证</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="mb-20"></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>
|
||||||
|
<!-- 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>
|
||||||
|
</body>
|
||||||
|
<script src="{{ asset('js/app.js') }}"></script>
|
||||||
|
<script src="{{ asset('js/jquery.js') }}"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
class Check {
|
||||||
|
static searchType = 'all';
|
||||||
|
|
||||||
|
static Click(type) {
|
||||||
|
if (type === 1) {
|
||||||
|
$('#search-data').html('<i class="bi bi-1-circle pe-1"></i>博客名字');
|
||||||
|
this.searchType = 'blogName';
|
||||||
|
} else if (type === 2) {
|
||||||
|
$('#search-data').html('<i class="bi bi-2-circle pe-1"></i>博客地址');
|
||||||
|
this.searchType = 'blogUrl';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static ajaxSendCode() {
|
||||||
|
$.ajax({
|
||||||
|
async: true,
|
||||||
|
method: "POST",
|
||||||
|
data: $('#FormData').serialize(),
|
||||||
|
url: '{{ route('api.link.custom.blogCheck') }}',
|
||||||
|
dataType: "json",
|
||||||
|
beforeSend: function () {
|
||||||
|
$('#sendVerifyCode').prop('disabled', true);
|
||||||
|
$('#sendVerifyCode').addClass('bg-blue-800');
|
||||||
|
$('#sendVerifyCode').html('<div role="status"><svg aria-hidden="true" class="w-auto h-5 mx-5 text-gray-200 animate-spin dark:text-gray-600 ' +
|
||||||
|
'fill-blue-600" 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="currentColor"/> <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="currentFill"/> </svg> <span class="sr-only">Loading...</span> </div>');
|
||||||
|
},
|
||||||
|
success: function (returnData) {
|
||||||
|
if (returnData.output === "Success") {
|
||||||
|
Toast.toggle('验证码发送成功', '<i class="bi bi-check-circle text-green-500"></i>');
|
||||||
|
$('#sendVerifyCode').text('已发送 (60s)');
|
||||||
|
setTimeout(function () {
|
||||||
|
$('#sendVerifyCode').prop('disabled', false);
|
||||||
|
$('#sendVerifyCode').removeClass('bg-blue-800');
|
||||||
|
}, 60000);
|
||||||
|
} else {
|
||||||
|
Toast('未知错误', '<i class="bi bi-x-circle text-red-500"></i>');
|
||||||
|
$('#sendVerifyCode').text('未知错误,请刷新');
|
||||||
|
$('#sendVerifyCode').removeClass('bg-blue-800').addClass('bg-red-700');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function (returnData) {
|
||||||
|
Toast.set('其他错误', '<i class="bi bi-x-circle text-red-500"></i>');
|
||||||
|
if (returnData.responseJSON.output !== 'SendingTimeTooFast') {
|
||||||
|
Toast.toggle(returnData.responseJSON.data.message, '<i class="bi bi-x-circle text-red-500"></i>')
|
||||||
|
$('#sendVerifyCode').prop('disabled', false);
|
||||||
|
$('#sendVerifyCode').removeClass('bg-blue-800');
|
||||||
|
$('#sendVerifyCode').text('发送验证码');
|
||||||
|
} else {
|
||||||
|
Toast.toggle(returnData.responseJSON.data.message + '(' + returnData.responseJSON.data.data.time + 's)', '<i class="bi bi-x-circle ' +
|
||||||
|
'text-red-500"></i>');
|
||||||
|
$('#sendVerifyCode').text('已发送 (' + returnData.responseJSON.data.data.time + 's)');
|
||||||
|
setTimeout(function () {
|
||||||
|
$('#sendVerifyCode').prop('disabled', false);
|
||||||
|
$('#sendVerifyCode').removeClass('bg-blue-800');
|
||||||
|
}, returnData.responseJSON.data.data.time*1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
static ajaxVerifyCode() {
|
||||||
|
$.ajax({
|
||||||
|
async: true,
|
||||||
|
method: "POST",
|
||||||
|
data: $('#FormData').serialize(),
|
||||||
|
url: '{{ route('api.link.custom.blogVerify') }}',
|
||||||
|
dataType: "json",
|
||||||
|
beforeSend: function () {
|
||||||
|
$('#sendCheckCode').html('<div role="status"><svg aria-hidden="true" class="w-auto h-5 mx-5 text-gray-200 animate-spin dark:text-gray-600 ' +
|
||||||
|
'fill-blue-600" 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="currentColor"/> <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="currentFill"/> </svg> <span class="sr-only">Loading...</span> </div>');
|
||||||
|
},
|
||||||
|
success: function (returnData) {
|
||||||
|
if (returnData.output === "Success") {
|
||||||
|
Toast.toggle(returnData.data.message, '<i class="bi bi-check-circle text-green-500"></i>');
|
||||||
|
|
||||||
|
setTimeout(function () {
|
||||||
|
location.href = '{{ route('function.edit-friend','') }}/' + returnData.data.id
|
||||||
|
}, 3000);
|
||||||
|
} else {
|
||||||
|
Toast('未知错误', '<i class="bi bi-x-circle text-red-500"></i>');
|
||||||
|
$('#sendCheckCode').text('未知错误,请刷新');
|
||||||
|
$('#sendCheckCode').removeClass('bg-blue-800').addClass('bg-red-700');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function (returnData) {
|
||||||
|
Toast.toggle(returnData.responseJSON.data.message, '<i class="bi bi-x-circle text-red-500"></i>')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理Toast
|
||||||
|
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>
|
||||||
|
{!! $webFooter !!}
|
||||||
|
</html>
|
390
resources/views/function/edit-friend.blade.php
Normal file
390
resources/views/function/edit-friend.blade.php
Normal file
@ -0,0 +1,390 @@
|
|||||||
|
<!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>
|
||||||
|
<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-4xl py-8 sm:py-16 lg:py-16">
|
||||||
|
<div class="w-full p-4 bg-white border border-gray-200 rounded-lg shadow-lg sm:p-8 dark:bg-gray-800 dark:border-gray-700">
|
||||||
|
<h1 class="text-center mb-4 text-3xl font-bold leading-none tracking-tight text-gray-900 md:text-3xl lg:text-4xl dark:text-white mt-5">
|
||||||
|
自助友链修改系统</h1>
|
||||||
|
<p class="mb-6 text-lg font-normal text-gray-500 sm:px-16 xl:px-48 dark:text-gray-400 text-center">
|
||||||
|
您好 <b>{{ $blog->blogName }}</b> 的站长</p>
|
||||||
|
<form id="FormData" action="#" onsubmit="return false" method="POST">
|
||||||
|
<div class="grid gap-6 mb-6 md:grid-cols-2">
|
||||||
|
<div>
|
||||||
|
<label for="userEmail" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">博主邮箱 <span
|
||||||
|
class="text-red-700">*</span></label>
|
||||||
|
<div class="relative">
|
||||||
|
<div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
|
||||||
|
<i class="bi bi-envelope"></i>
|
||||||
|
</div>
|
||||||
|
<input type="email" name="userEmail" id="userEmail" value="{{ $blog->blogOwnEmail }}" placeholder="gm@x-lf.cn" 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 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"
|
||||||
|
required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="userServerHost" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">所用主机服务商<span
|
||||||
|
data-tooltip-target="userServerHost-Tooltip" class="bi bi-info-circle mx-1 text-blue-700"></span> <span
|
||||||
|
class="text-red-700">*</span></label>
|
||||||
|
<div id="userServerHost-Tooltip" role="tooltip"
|
||||||
|
class="absolute z-10 invisible inline-block px-3 py-2 text-sm font-medium text-white transition-opacity duration-300 bg-gray-900 rounded-lg shadow-sm opacity-0 tooltip dark:bg-gray-700">
|
||||||
|
这个我只是想确定能否贵站确认长久开下去(如果不是大型服务商填写地址嗷),如果是“跑路”云会麻烦网友访问~
|
||||||
|
<div class="tooltip-arrow" data-popper-arrow></div>
|
||||||
|
</div>
|
||||||
|
<div class="relative">
|
||||||
|
<div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
|
||||||
|
<i class="bi bi-hdd-network"></i>
|
||||||
|
</div>
|
||||||
|
<input type="text" name="userServerHost" id="userServerHost" value="{{ $blog->blogServerHost }}" placeholder="阿里云" 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 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"
|
||||||
|
required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<hr class="w-48 h-1 mx-auto my-4 bg-gray-100 border-0 rounded md:my-6 dark:bg-gray-700">
|
||||||
|
<div class="grid gap-6 mb-6 md:grid-cols-2">
|
||||||
|
<div>
|
||||||
|
<label for="userBlog" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">博客名称 <span
|
||||||
|
class="text-red-700">*</span></label>
|
||||||
|
<div class="relative">
|
||||||
|
<div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
|
||||||
|
<i class="bi bi-person"></i>
|
||||||
|
</div>
|
||||||
|
<input type="text" name="userBlog" id="userBlog" value="{{ $blog->blogName }}" placeholder="凌中的锋雨"
|
||||||
|
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 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"
|
||||||
|
required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="userUrl" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">博客地址<span
|
||||||
|
data-tooltip-target="userUrl-Tooltip" class="bi bi-info-circle mx-1 text-blue-700"></span> <span
|
||||||
|
class="text-red-700">*</span></label>
|
||||||
|
<div id="userUrl-Tooltip" role="tooltip"
|
||||||
|
class="absolute z-10 invisible inline-block px-3 py-2 text-sm font-medium text-white transition-opacity duration-300 bg-gray-900 rounded-lg shadow-sm opacity-0 tooltip dark:bg-gray-700">
|
||||||
|
携带”http(s)://“
|
||||||
|
<div class="tooltip-arrow" data-popper-arrow></div>
|
||||||
|
</div>
|
||||||
|
<div class="relative">
|
||||||
|
<div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
|
||||||
|
<i class="bi bi-link-45deg"></i>
|
||||||
|
</div>
|
||||||
|
<input type="text" name="userUrl" id="userUrl" value="{{ $blog->blogUrl }}" placeholder="https://www.x-lf.com/"
|
||||||
|
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 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"
|
||||||
|
required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mb-6">
|
||||||
|
<label for="userDescription" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">博客介绍<span
|
||||||
|
data-tooltip-target="userDescription-Tooltip" class="bi bi-info-circle mx-1 text-blue-700"></span> <span
|
||||||
|
class="text-red-700">*</span></label>
|
||||||
|
<div id="userDescription-Tooltip" role="tooltip"
|
||||||
|
class="absolute z-10 invisible inline-block px-3 py-2 text-sm font-medium text-white transition-opacity duration-300 bg-gray-900 rounded-lg shadow-sm opacity-0 tooltip dark:bg-gray-700">
|
||||||
|
博客的一句话表述(例如):“不为如何,只为在茫茫人海中有自己的一片天空”
|
||||||
|
<div class="tooltip-arrow" data-popper-arrow></div>
|
||||||
|
</div>
|
||||||
|
<div class="relative">
|
||||||
|
<div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
|
||||||
|
<i class="bi bi-chat-left-text"></i>
|
||||||
|
</div>
|
||||||
|
<input type="text" name="userDescription" id="userDescription" value="{{ $blog->blogDescription }}"
|
||||||
|
placeholder="不为如何,只为在茫茫人海中有自己的一片天空~"
|
||||||
|
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 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"
|
||||||
|
required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mb-6">
|
||||||
|
<label for="userIcon" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">博客图片<span
|
||||||
|
data-tooltip-target="userIcon-Tooltip" class="bi bi-info-circle mx-1 text-blue-700"></span> <span class="text-red-700">*</span></label>
|
||||||
|
<div id="userIcon-Tooltip" role="tooltip"
|
||||||
|
class="absolute z-10 invisible inline-block px-3 py-2 text-sm font-medium text-white transition-opacity duration-300 bg-gray-900 rounded-lg shadow-sm opacity-0 tooltip dark:bg-gray-700">
|
||||||
|
携带”http(s)://“
|
||||||
|
<div class="tooltip-arrow" data-popper-arrow></div>
|
||||||
|
</div>
|
||||||
|
<div class="relative">
|
||||||
|
<div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
|
||||||
|
<i class="bi bi-image"></i>
|
||||||
|
</div>
|
||||||
|
<input type="text" name="userIcon" id="userIcon" value="{{ $blog->blogIcon }}" placeholder="https://api.x-lf.cn/avatar/?uid=1"
|
||||||
|
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 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"
|
||||||
|
required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mb-6 grid grid-cols-1 md:grid-cols-3 items-end">
|
||||||
|
<div class="col-span-1 mb-3 md:mb-0">
|
||||||
|
<label class="relative inline-flex">
|
||||||
|
<input type="checkbox" id="checkRssJudge" name="checkRssJudge" value="1" class="sr-only peer"
|
||||||
|
@if($blog->blogRssJudge)checked @endif>
|
||||||
|
<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">我的博客拥有 RSS 地址</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="col-span-2">
|
||||||
|
<label for="userRss" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">RSS 地址 <a target="_blank"
|
||||||
|
href="https://blog.x-lf.com/atom.xml"><span
|
||||||
|
data-tooltip-target="userRss-Tooltip" class="bi bi-info-circle mx-1 text-blue-700"></span></a></label>
|
||||||
|
<div id="userRss-Tooltip" role="tooltip"
|
||||||
|
class="absolute z-10 invisible inline-block px-3 py-2 text-sm font-medium text-white transition-opacity duration-300 bg-gray-900 rounded-lg shadow-sm opacity-0 tooltip dark:bg-gray-700">
|
||||||
|
例如(可点击):https://blog.x-lf.com/atom.xml<br/>
|
||||||
|
(注:下框内容需要选择后才可填写)
|
||||||
|
<div class="tooltip-arrow" data-popper-arrow></div>
|
||||||
|
</div>
|
||||||
|
<div class="relative">
|
||||||
|
<div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
|
||||||
|
<i class="bi bi-link-45deg"></i>
|
||||||
|
</div>
|
||||||
|
<input type="text" name="userRss" id="userRss" value="{{ $blog->blogRSS }}" placeholder="https://blog.x-lf.com/atom.xml"
|
||||||
|
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 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>
|
||||||
|
<hr class="w-48 h-1 mx-auto my-4 bg-gray-100 border-0 rounded md:my-6 dark:bg-gray-700">
|
||||||
|
<div class="grid gap-6 mb-6 md:grid-cols-2">
|
||||||
|
<div>
|
||||||
|
<label for="userLocation" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">期望板块 <span
|
||||||
|
class="text-red-700">*</span></label>
|
||||||
|
<select id="userLocation" name="userLocation"
|
||||||
|
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">
|
||||||
|
<option>请选择一个板块</option>
|
||||||
|
@if(empty($blogSort[0]))
|
||||||
|
<option>站长没有设置可用板块呢</option>
|
||||||
|
@else
|
||||||
|
@foreach($blogSort as $blogValue)
|
||||||
|
<option value="{{ $blogValue->id }}" @if($blogValue->id == $blog->blogLocation)selected @endif>{!! $blogValue->title
|
||||||
|
!!}</option>
|
||||||
|
@endforeach
|
||||||
|
@endif
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="userSelColor" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">期望颜色<span id="DemoCheck"
|
||||||
|
data-tooltip-target="userSelColor-Tooltip"
|
||||||
|
class="bi bi-info-circle mx-1 text-blue-700"></span>
|
||||||
|
<span class="text-red-700">*</span></label>
|
||||||
|
<div id="userSelColor-Tooltip" role="tooltip"
|
||||||
|
class="absolute z-10 invisible inline-block px-3 py-2 text-sm font-medium text-white transition-opacity duration-300 bg-gray-900 rounded-lg shadow-sm opacity-0 tooltip dark:bg-gray-700">
|
||||||
|
<div
|
||||||
|
class="flex p-2 hover:bg-gray-100 bg-white border-4 border-blue-500 rounded-lg shadow-lg sm:p-4 dark:bg-gray-800 dark:border-gray-700 grid-cols-2 m-1">
|
||||||
|
<img id="userDemo"
|
||||||
|
class="w-16 h-16 p-1 rounded-full ring-2 ring-gray-300 dark:ring-gray-500 me-2 sm:me-4"
|
||||||
|
src="" alt="Bordered avatar">
|
||||||
|
<div class="grid grid-cols-1">
|
||||||
|
<p id="userDemoName" class="text-xl text-black font-bold"></p>
|
||||||
|
<p id="userDemoDescription" class="text-sm text-gray-500 truncate"></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="tooltip-arrow" data-popper-arrow></div>
|
||||||
|
</div>
|
||||||
|
<select id="userSelColor" name="userSelColor"
|
||||||
|
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">
|
||||||
|
<option>请选择一个颜色</option>
|
||||||
|
@if(empty($blogColor[0]))
|
||||||
|
<option>站长没有设置可用颜色呢</option>
|
||||||
|
@else
|
||||||
|
@foreach($blogColor as $blogValue)
|
||||||
|
<option value="{{ $blogValue->id }}"
|
||||||
|
@if($blogValue->id == $blog->blogSetColor)selected @endif>{!! $blogValue->comment !!}</option>
|
||||||
|
@endforeach
|
||||||
|
@endif
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<hr class="h-px my-8 bg-gray-200 border-0 dark:bg-gray-700">
|
||||||
|
<div class="flex items-start mb-6">
|
||||||
|
<div class="flex items-center h-5">
|
||||||
|
<input id="remember" type="checkbox" value="1"
|
||||||
|
class="w-4 h-4 border border-gray-300 rounded bg-gray-50 focus:ring-3 focus:ring-blue-300 dark:bg-gray-700 dark:border-gray-600 dark:focus:ring-blue-600 dark:ring-offset-gray-800"
|
||||||
|
required>
|
||||||
|
</div>
|
||||||
|
<label for="remember" class="ml-2 text-sm font-medium text-gray-900 dark:text-gray-300">我满足 <a href="#"
|
||||||
|
class="text-blue-600 hover:underline dark:text-blue-500">《凌中的锋雨-友链申请要求》</a></label>
|
||||||
|
</div>
|
||||||
|
<button onclick="buttonSubmit()"
|
||||||
|
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 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">
|
||||||
|
<i class="bi bi-send me-1"></i>发送申请
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mb-20"></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>
|
||||||
|
<!-- 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>
|
||||||
|
<div id="toast-interactive"
|
||||||
|
class="z-[9999] fixed top-5 left-5 hidden w-full max-w-xs p-4 text-gray-500 bg-white rounded-lg shadow dark:bg-gray-800 dark:text-gray-400" role="alert">
|
||||||
|
<div class="flex">
|
||||||
|
<div class="inline-flex items-center justify-center flex-shrink-0 w-8 h-8 text-blue-500 bg-blue-100 rounded-lg dark:text-blue-300 dark:bg-blue-900">
|
||||||
|
<svg aria-hidden="true" class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd"
|
||||||
|
d="M4 2a1 1 0 011 1v2.101a7.002 7.002 0 0111.601 2.566 1 1 0 11-1.885.666A5.002 5.002 0 005.999 7H9a1 1 0 010 2H4a1 1 0 01-1-1V3a1 1 0 011-1zm.008 9.057a1 1 0 011.276.61A5.002 5.002 0 0014.001 13H11a1 1 0 110-2h5a1 1 0 011 1v5a1 1 0 11-2 0v-2.101a7.002 7.002 0 01-11.601-2.566 1 1 0 01.61-1.276z"
|
||||||
|
clip-rule="evenodd"></path>
|
||||||
|
</svg>
|
||||||
|
<span class="sr-only">Refresh icon</span>
|
||||||
|
</div>
|
||||||
|
<div class="ml-3 text-sm font-normal">
|
||||||
|
<span class="mb-1 text-sm font-semibold text-gray-900 dark:text-white">友链已登记</span>
|
||||||
|
<div class="mb-2 text-sm font-normal">已经存有该博客(博客名字、博客地址、博主邮箱不得重复),请确认您没有输入错误吗?<span class="text-red-500">(如果想修改已登记博客,请使用在友链登记邮箱进行注册/登录进行修改)</span>
|
||||||
|
</div>
|
||||||
|
<div class="grid grid-cols-2 gap-2">
|
||||||
|
<div>
|
||||||
|
<a href="{{ route('login') }}"
|
||||||
|
class="inline-flex justify-center w-full px-2 py-1.5 text-xs font-medium text-center text-white bg-blue-600 rounded-lg hover:bg-blue-700 focus:ring-4 focus:outline-none focus:ring-blue-300 dark:bg-blue-500 dark:hover:bg-blue-600 dark:focus:ring-blue-800">登录</a>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<a id="edit-friend" href="{{ route('function.edit-search') }}" class="inline-flex justify-center w-full px-2 py-1.5 text-xs font-medium
|
||||||
|
text-center text-gray-900 bg-white border border-gray-300 rounded-lg hover:bg-gray-100 focus:ring-4 focus:outline-none focus:ring-gray-200 dark:bg-gray-600 dark:text-white dark:border-gray-600 dark:hover:bg-gray-700 dark:hover:border-gray-700 dark:focus:ring-gray-700">检索</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button type="button"
|
||||||
|
class="ml-auto -mx-1.5 -my-1.5 bg-white text-gray-400 hover:text-gray-900 rounded-lg focus:ring-2 focus:ring-gray-300 p-1.5 hover:bg-gray-100 inline-flex h-8 w-8 dark:text-gray-500 dark:hover:text-white dark:bg-gray-800 dark:hover:bg-gray-700"
|
||||||
|
data-dismiss-target="#toast-interactive" aria-label="Close">
|
||||||
|
<span class="sr-only">Close</span>
|
||||||
|
<svg aria-hidden="true" class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd"
|
||||||
|
d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
|
||||||
|
clip-rule="evenodd"></path>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
<script src="{{ asset('js/app.js') }}"></script>
|
||||||
|
<script src="{{ asset('js/jquery.js') }}"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(document).ready(function () {
|
||||||
|
let userIcon = $('#userIcon').val();
|
||||||
|
|
||||||
|
$('#checkRssJudge').change(function () {
|
||||||
|
if ($(this).is(':checked')) {
|
||||||
|
$('#userRss').prop('disabled', false);
|
||||||
|
} else {
|
||||||
|
$('#userRss').prop('disabled', true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$('#DemoCheck').mouseenter(function () {
|
||||||
|
if (userIcon === '') userIcon = 'https://api.x-lf.cn/avatar/?uid=1';
|
||||||
|
else userIcon = $('#userIcon').val();
|
||||||
|
$('#userDemo').prop('src', userIcon);
|
||||||
|
$('#userDemoName').text($('#userBlog').val());
|
||||||
|
$('#userDemoDescription').text($('#userDescription').val());
|
||||||
|
});
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
function buttonSubmit() {
|
||||||
|
if ($('#remember').prop('checked')) {
|
||||||
|
ajax();
|
||||||
|
} else {
|
||||||
|
Toast.toggle('请您确认知情友链申请要求', '<i class="bi bi-check-circle text-green-500"></i>');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Enum {
|
||||||
|
static userEmail = '用户邮箱';
|
||||||
|
static userServerHost = '服务商';
|
||||||
|
static userBlog = '博客名字';
|
||||||
|
static userUrl = '博客地址';
|
||||||
|
static userDescription = '博客描述';
|
||||||
|
static userIcon = '图片地址';
|
||||||
|
static checkRssJudge = 'RSS选项';
|
||||||
|
static userRss = 'RSS地址';
|
||||||
|
static userLocation = '所属位置';
|
||||||
|
static userSelColor = '选择颜色';
|
||||||
|
static userRemark = '留言备注';
|
||||||
|
}
|
||||||
|
|
||||||
|
function ajax() {
|
||||||
|
$.ajax({
|
||||||
|
async: true,
|
||||||
|
method: "POST",
|
||||||
|
data: $('#FormData').serialize(),
|
||||||
|
url: '{{ route('api.link.custom.add') }}',
|
||||||
|
dataType: "json",
|
||||||
|
success: function (returnData) {
|
||||||
|
if (returnData.output === "Success") {
|
||||||
|
Toast.toggle('友链申请成功,即将跳转', '<i class="bi bi-check-circle text-green-500"></i>');
|
||||||
|
setTimeout(function () {
|
||||||
|
location.href = '{{ route('function.link') }}';
|
||||||
|
}, 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 if (returnData.responseJSON.output === "AlreadyUser") {
|
||||||
|
$('#toast-interactive').fadeIn(300);
|
||||||
|
$('#edit-friend').attr('href', "{{ route('function.edit-search') }}?searchName=" + $('#userBlog').val() + "&searchUrl=" + $('#userUrl').val());
|
||||||
|
setTimeout(function () {
|
||||||
|
$('#toast-interactive').fadeOut(300);
|
||||||
|
}, 10000);
|
||||||
|
} else {
|
||||||
|
Toast.toggle('未知错误', '<i class="bi bi-x-circle text-red-500"></i>');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
{!! $webFooter !!}
|
||||||
|
</html>
|
@ -210,19 +210,28 @@ class="relative left-[calc(50%+3rem)] aspect-[1155/678] w-[36.125rem] -translate
|
|||||||
</div>
|
</div>
|
||||||
<div class="ml-3 text-sm font-normal">
|
<div class="ml-3 text-sm font-normal">
|
||||||
<span class="mb-1 text-sm font-semibold text-gray-900 dark:text-white">友链已登记</span>
|
<span class="mb-1 text-sm font-semibold text-gray-900 dark:text-white">友链已登记</span>
|
||||||
<div class="mb-2 text-sm font-normal">已经存有该博客(博客名字、博客地址、博主邮箱不得重复),请确认您没有输入错误吗?<span class="text-red-500">(如果想修改已登记博客,请使用在友链登记邮箱进行注册/登录进行修改)</span></div>
|
<div class="mb-2 text-sm font-normal">已经存有该博客(博客名字、博客地址、博主邮箱不得重复),请确认您没有输入错误吗?<span class="text-red-500">(如果想修改已登记博客,请使用在友链登记邮箱进行注册/登录进行修改)</span>
|
||||||
|
</div>
|
||||||
<div class="grid grid-cols-2 gap-2">
|
<div class="grid grid-cols-2 gap-2">
|
||||||
<div>
|
<div>
|
||||||
<a href="{{ route('login') }}" class="inline-flex justify-center w-full px-2 py-1.5 text-xs font-medium text-center text-white bg-blue-600 rounded-lg hover:bg-blue-700 focus:ring-4 focus:outline-none focus:ring-blue-300 dark:bg-blue-500 dark:hover:bg-blue-600 dark:focus:ring-blue-800">登录</a>
|
<a href="{{ route('login') }}"
|
||||||
|
class="inline-flex justify-center w-full px-2 py-1.5 text-xs font-medium text-center text-white bg-blue-600 rounded-lg hover:bg-blue-700 focus:ring-4 focus:outline-none focus:ring-blue-300 dark:bg-blue-500 dark:hover:bg-blue-600 dark:focus:ring-blue-800">登录</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a id="edit-friend" href="{{ route('function.edit-friend') }}" class="inline-flex justify-center w-full px-2 py-1.5 text-xs font-medium text-center text-gray-900 bg-white border border-gray-300 rounded-lg hover:bg-gray-100 focus:ring-4 focus:outline-none focus:ring-gray-200 dark:bg-gray-600 dark:text-white dark:border-gray-600 dark:hover:bg-gray-700 dark:hover:border-gray-700 dark:focus:ring-gray-700">检索</a>
|
<a id="edit-friend" href="{{ route('function.edit-search') }}" class="inline-flex justify-center w-full px-2 py-1.5 text-xs font-medium
|
||||||
|
text-center text-gray-900 bg-white border border-gray-300 rounded-lg hover:bg-gray-100 focus:ring-4 focus:outline-none focus:ring-gray-200 dark:bg-gray-600 dark:text-white dark:border-gray-600 dark:hover:bg-gray-700 dark:hover:border-gray-700 dark:focus:ring-gray-700">检索</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button type="button" class="ml-auto -mx-1.5 -my-1.5 bg-white text-gray-400 hover:text-gray-900 rounded-lg focus:ring-2 focus:ring-gray-300 p-1.5 hover:bg-gray-100 inline-flex h-8 w-8 dark:text-gray-500 dark:hover:text-white dark:bg-gray-800 dark:hover:bg-gray-700" data-dismiss-target="#toast-interactive" aria-label="Close">
|
<button type="button"
|
||||||
|
class="ml-auto -mx-1.5 -my-1.5 bg-white text-gray-400 hover:text-gray-900 rounded-lg focus:ring-2 focus:ring-gray-300 p-1.5 hover:bg-gray-100 inline-flex h-8 w-8 dark:text-gray-500 dark:hover:text-white dark:bg-gray-800 dark:hover:bg-gray-700"
|
||||||
|
data-dismiss-target="#toast-interactive" aria-label="Close">
|
||||||
<span class="sr-only">Close</span>
|
<span class="sr-only">Close</span>
|
||||||
<svg aria-hidden="true" class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"></path></svg>
|
<svg aria-hidden="true" class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd"
|
||||||
|
d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
|
||||||
|
clip-rule="evenodd"></path>
|
||||||
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -46,5 +46,6 @@
|
|||||||
Route::post('add',[Link::class,'apiCustomAdd'])->name('api.link.custom.add');
|
Route::post('add',[Link::class,'apiCustomAdd'])->name('api.link.custom.add');
|
||||||
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');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -31,12 +31,9 @@
|
|||||||
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');
|
||||||
Route::get('make-friend',[UserLink::class, 'viewMakeFriend'])->name('function.make-friend');
|
Route::get('make-friend',[UserLink::class, 'viewMakeFriend'])->name('function.make-friend');
|
||||||
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}',function ($friendId) {
|
Route::get('edit-friend/{friendId}',[UserLink::class,'viewEditFriend'])->name('function.edit-friend');
|
||||||
$userLink = new UserLink();
|
|
||||||
return $userLink->viewEditFriend($friendId);
|
|
||||||
})->name('function.edit-friend');
|
|
||||||
Route::get('sponsor',function () {
|
Route::get('sponsor',function () {
|
||||||
return view('function.sponsor');
|
return view('function.sponsor');
|
||||||
})->name('function.sponsor');
|
})->name('function.sponsor');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user