Skip to content

Commit

Permalink
更新:编辑器优化,支持上传图片
Browse files Browse the repository at this point in the history
  • Loading branch information
zhuchunshu committed Dec 19, 2022
1 parent 74d27ee commit 334894e
Show file tree
Hide file tree
Showing 6 changed files with 98 additions and 45 deletions.
51 changes: 27 additions & 24 deletions app/Plugins/Core/src/Handler/UploadHandler.php
@@ -1,38 +1,44 @@
<?php


declare(strict_types=1);
/**
* This file is part of zhuchunshu.
* @link https://github.com/zhuchunshu
* @document https://github.com/zhuchunshu/super-forum
* @contact laravel@88.com
* @license https://github.com/zhuchunshu/super-forum/blob/master/LICENSE
*/
namespace App\Plugins\Core\src\Handler;


use App\Plugins\User\src\Models\UserUpload;
use Illuminate\Support\Str;
use Intervention\Image\ImageManagerStatic as Image;

class UploadHandler
{
public function save($file, $folder, $file_prefix=null, $max_width = 1500): array
public function save($file, $folder, $file_prefix = null, $max_width = 1500): array
{
if(!auth()->check()){
if(!admin_auth()->Check()){
if (! auth()->check()) {
if (! admin_auth()->Check()) {
return [
'path' => "/404.jpg",
"success" => false,
"status" => "上传失败,未登录"
'path' => '/404.jpg',
'success' => false,
'status' => '上传失败,未登录',
];
}

$user_id = 1;
}else{
} else {
$user_id = auth()->id();
}
if(!$file_prefix){
if (! $file_prefix) {
$file_prefix = Str::random();
}
// 构建存储的文件夹规则,值如:uploads/images/avatars/201709/21/
// 文件夹切割能让查找效率更高。
$folder_name = "upload/$folder/" . date("Ym/d", time());
if(!is_dir(public_path($folder_name))){
mkdir(public_path($folder_name),0777,true);
$folder_name = "upload/{$folder}/" . date('Ym/d', time());
if (! is_dir(public_path($folder_name))) {
mkdir(public_path($folder_name), 0777, true);
}
// 文件具体存储的物理路径,`public_path()` 获取的是 `public` 文件夹的物理路径。
// 值如:/home/vagrant/Code/larabbs/public/uploads/images/avatars/201709/21/
Expand All @@ -45,25 +51,23 @@ public function save($file, $folder, $file_prefix=null, $max_width = 1500): arra
// 值如:1_1493521050_7BVc9v9ujP.png
$filename = $file_prefix . '_' . time() . '_' . Str::random(10) . '.' . $extension;


// 将图片移动到我们的目标存储路径中
$file->moveTo(public_path($folder_name."/".$filename));
$file->moveTo(public_path($folder_name . '/' . $filename));

// 如果限制了图片宽度,就进行裁剪
if ($max_width && $extension !== 'gif') {

// 此类中封装的函数,用于裁剪图片
$this->reduceSize($upload_path . '/' . $filename, $max_width);
}
UserUpload::query()->create([
"user_id" => $user_id,
"path" => public_path("$folder_name/$filename"),
"url" => "/$folder_name/$filename"
'user_id' => $user_id,
'path' => public_path("{$folder_name}/{$filename}"),
'url' => "/{$folder_name}/{$filename}",
]);
return [
'path' => "/$folder_name/$filename",
"success" => true,
"status" => "上传成功!"
'path' => "/{$folder_name}/{$filename}",
'success' => true,
'status' => '上传成功!',
];
}

Expand All @@ -74,7 +78,6 @@ public function reduceSize($file_path, $max_width)

// 进行大小调整的操作
$image->resize($max_width, null, function ($constraint) {

// 设定宽度是 $max_width,高度等比例缩放
$constraint->aspectRatio();

Expand All @@ -85,4 +88,4 @@ public function reduceSize($file_path, $max_width)
// 对图片修改后进行保存
$image->save();
}
}
}
31 changes: 31 additions & 0 deletions app/Plugins/Topic/resources/views/create/basis.blade.php
Expand Up @@ -25,6 +25,7 @@
<textarea name="basis[content]" id="basis-content" cols="30" rows="10"></textarea>
</div>

<script src="{{file_hash("js/axios.min.js")}}"></script>
<script defer>
const target = document.getElementsByTagName("html")[0]
const body_className = document.getElementsByTagName("html")[0].getAttribute("data-theme");
Expand All @@ -38,6 +39,25 @@

observer.observe(target, {attributes: true});

const image_upload_handler = (blobInfo, progress) => new Promise((resolve, reject) => {
const formData = new FormData();
formData.append('file', blobInfo.blob(), blobInfo.filename());
formData.append('_token', csrf_token);
axios.post("/user/upload/image",formData,{
'Content-type' : 'multipart/form-data'
}).then(function(r){
console.log(r)
const data = r.data;
if(data.success){
resolve(data.result.url);
return ;
}
reject({message:'HTTP Error: ' + data.result.msg + ', Error Code: '+data.code,remove: true});
}).catch(function(e){
console.log(e)
})

});

document.addEventListener("DOMContentLoaded", function () {
let options = {
Expand All @@ -54,6 +74,17 @@
link_default_target: '_blank',
toolbar_mode: 'sliding',
image_advtab: true,
automatic_uploads: true,
images_reuse_filename: true,
setup : function(ed) {
//console.log(ed)
},
images_upload_handler: image_upload_handler,
init_instance_callback: (editor) => {
@if(request()->has('restoredraft'))
editor.plugins.autosave.restoreDraft()
@endif
},
mobile:{
menu:{!! \App\Plugins\Topic\src\Lib\Editor::menu() !!},
menubar:"{!! \App\Plugins\Topic\src\Lib\Editor::menubar() !!}",
Expand Down
10 changes: 10 additions & 0 deletions app/Plugins/Topic/src/Controllers/TopicController.php
Expand Up @@ -50,6 +50,16 @@ public function create_post()
return (new CreateTopic())->handler(request());
}

#[PostMapping(path: 'create/upload')]
#[Middleware(LoginMiddleware::class)]
public function create_upload()
{
if (! Authority()->check('topic_create')) {
return Json_Api(419, false, ['无发帖权限']);
}
return (new CreateTopic())->handler(request());
}

#[PostMapping(path: 'create/draft')]
#[Middleware(LoginMiddleware::class)]

Expand Down
Expand Up @@ -45,13 +45,18 @@ public function handler($data, \Closure $next)

if ($validator->fails()) {
// Handle exception
return redirect()->with('danger', $validator->errors()->first())->url('topic/create')->go();
$data = $data['basis'];
unset($data['content']);
$result = [];
$result['basis']=$data;
$result['restoredraft'] = true;
return redirect()->with('danger', $validator->errors()->first())->url('topic/create?'.http_build_query($result))->go();
}
$this->create($data);
$data = $this->create($data);
return $next($data);
}

public function create($data): void
public function create($data)
{
// 帖子标题
$title = $data['basis']['title'];
Expand All @@ -74,7 +79,7 @@ public function create($data): void
'user_ip' => get_client_ip(),
'user_agent' => get_user_agent(),
]);
$data = Topic::query()->create([
$topic = Topic::query()->create([
'post_id' => $post->id,
'title' => $title,
'user_id' => auth()->id(),
Expand All @@ -83,9 +88,12 @@ public function create($data): void
'tag_id' => $tag,
]);
// 给Posts表设置topic_id字段的值
Post::query()->where('id', $post->id)->update(['topic_id' => $data->id]);
$this->topic_keywords($data, $_content);
$this->at_user($data, $_content);
Post::query()->where('id', $post->id)->update(['topic_id' => $topic->id]);
$this->topic_keywords($topic, $_content);
$this->at_user($topic, $_content);
$data['topic_id']= $topic->id;
$data['post_id']= $post->id;
return $data;
}

private function tag(string $html)
Expand Down
27 changes: 13 additions & 14 deletions app/Plugins/User/src/Controller/ApiController.php
Expand Up @@ -12,6 +12,7 @@

use App\Plugins\Core\src\Handler\FileUpload;
use App\Plugins\Core\src\Handler\UploadHandler;
use App\Plugins\User\src\Middleware\LoginMiddleware;
use App\Plugins\User\src\Models\User;
use App\Plugins\User\src\Models\UserFans;
use App\Plugins\User\src\Models\UsersAuth;
Expand All @@ -20,36 +21,34 @@
use App\Plugins\User\src\Models\UsersSetting;
use App\Plugins\User\src\Models\UserUpload;
use Hyperf\HttpServer\Annotation\Controller;
use Hyperf\HttpServer\Annotation\Middleware;
use Hyperf\HttpServer\Annotation\PostMapping;
use Hyperf\RateLimit\Annotation\RateLimit;
use Hyperf\Utils\Arr;

#[Controller]
#[RateLimit(create: 1, capacity: 3)]
class ApiController
{
#[PostMapping(path: '/user/upload/image')]
#[Middleware(LoginMiddleware::class)]
public function up_image(UploadHandler $uploader)
{
$data = [];
if (! Authority()->check('upload_file')) {
return Json_Api(419, false, ['msg' => '你所在的用户组无权上传图片']);
}
foreach (request()->file('file') as $key => $file) {
if ($file->getSize() > get_options('core_user_up_img_size', 2048)) {
$result = $uploader->save($file, 'topic', auth()->id());
if ($result) {
$url = $result['path'];
$data['data']['succMap'][$url] = $url;
} else {
(array) $data['data']['errFiles'][] = $key;
}
$file = request()->file('file');
if ($file->getSize() > get_options('core_user_up_img_size', 2048)) {
$result = $uploader->save($file, 'topic', auth()->id());
if ($result['success'] === true) {
return Json_Api(200, true, ['msg' => '上传成功!', 'url' => $result['path']]);
}
return Json_Api(403, false, ['msg' => '上传失败!']);
}
return $data;
return Json_Api(403, false, ['msg' => '上传失败!']);
}

#[PostMapping(path: '/user/upload/file')]
#[Middleware(LoginMiddleware::class)]
public function up_file(FileUpload $uploader)
{
$data = [];
Expand All @@ -76,7 +75,7 @@ public function user_list(): array
$data = User::query()->select('username', 'id')->get();
$arr = [];
foreach ($data as $key => $value) {
$arr[$key]=['value' => '@' . $value->username, 'html' => '<img src="' . avatar_url($value->id) . '" alt="' . $value->username . '"/> ' . $value->username];
$arr[$key] = ['value' => '@' . $value->username, 'html' => '<img src="' . avatar_url($value->id) . '" alt="' . $value->username . '"/> ' . $value->username];
}
return $arr;
}
Expand Down Expand Up @@ -135,7 +134,7 @@ public function UserConfig(): array
// 通知小红点
$notice_red = 0;
foreach (Itf()->get('users_notices') as $value) {
$count = \Opis\Closure\unserialize((string)$value['count']);
$count = \Opis\Closure\unserialize((string) $value['count']);
if (@$count && is_callable($count) && call_user_func($count, auth()->id()) > 0) {
$notice_red += call_user_func($count, auth()->id());
}
Expand Down
2 changes: 2 additions & 0 deletions public/js/axios.min.js

Large diffs are not rendered by default.

0 comments on commit 334894e

Please sign in to comment.