1
0
mirror of https://github.com/cjango/dcat-vue.git synced 2025-12-06 22:40:03 +08:00

一些优化

This commit is contained in:
weiwait
2023-03-02 17:57:02 +08:00
parent 169b467dd1
commit d080503e9b
22 changed files with 249 additions and 75 deletions

View File

@@ -1 +1 @@
.file-list-wrap[data-v-4317a8d6]{margin-top:6px!important}.cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;user-select:none}.cropper-container img{backface-visibility:hidden;display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-wrap-box,.cropper-canvas,.cropper-drag-box,.cropper-crop-box,.cropper-modal{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-wrap-box,.cropper-canvas{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:#3399ffbf;overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.3333333333%;left:0;top:33.3333333333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.3333333333%;top:0;width:33.3333333333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:before,.cropper-center:after{background-color:#eee;content:" ";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width: 768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width: 992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width: 1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:" ";display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(../images/bg.png)}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}.n-modal-container{z-index:99999999!important}.modal-container[data-v-14b01bbd]{border-radius:10px}.modal-container .cropper-container[data-v-14b01bbd]{width:480px;height:270px}.modal-container .cropper-container img[data-v-14b01bbd]{max-width:100%;display:block}.modal-container .large[data-v-14b01bbd]{width:960px!important;height:540px!important}.modal-container .cropper-controls[data-v-14b01bbd]{padding:11px 0 11px 11px;background-color:#c9c9c9;border-radius:0 0 6px 6px}.file-list-wrap[data-v-8ad40512]{margin-top:2px!important}.preview[data-v-8ad40512]{width:138px;height:138px;border:1px solid #dae1e7;border-radius:10px;background-color:#f1f1f1;display:flex;justify-content:center;align-items:center}.preview img[data-v-8ad40512]{max-width:100%;max-height:100%;border-radius:4px;padding:1px}.preview[data-v-8ad40512]:hover{border:1px dashed #2dd3c4}.custom-upload-dragger[data-v-8ad40512]{width:138px;height:138px;display:flex;justify-content:center;align-items:center;border-radius:10px}.custom-upload-dragger .btn-plus[data-v-8ad40512]{font-size:88px;color:#b0b0b0}.add[data-v-9ae53601]{font-size:20px}.map-container{margin-top:18px;height:var(--3ba32538)}.map-container canvas{border-radius:10px;box-shadow:1px 1px 6px #aaa}
.file-list-wrap[data-v-4317a8d6]{margin-top:6px!important}.cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;user-select:none}.cropper-container img{backface-visibility:hidden;display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-wrap-box,.cropper-canvas,.cropper-drag-box,.cropper-crop-box,.cropper-modal{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-wrap-box,.cropper-canvas{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:#3399ffbf;overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.3333333333%;left:0;top:33.3333333333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.3333333333%;top:0;width:33.3333333333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:before,.cropper-center:after{background-color:#eee;content:" ";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width: 768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width: 992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width: 1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:" ";display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(../images/bg.png)}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}.n-modal-container{z-index:99999999!important}.modal-container[data-v-14b01bbd]{border-radius:10px}.modal-container .cropper-container[data-v-14b01bbd]{width:480px;height:270px}.modal-container .cropper-container img[data-v-14b01bbd]{max-width:100%;display:block}.modal-container .large[data-v-14b01bbd]{width:960px!important;height:540px!important}.modal-container .cropper-controls[data-v-14b01bbd]{padding:11px 0 11px 11px;background-color:#c9c9c9;border-radius:0 0 6px 6px}.file-list-wrap[data-v-8ad40512]{margin-top:2px!important}.preview[data-v-8ad40512]{width:138px;height:138px;border:1px solid #dae1e7;border-radius:10px;background-color:#f1f1f1;display:flex;justify-content:center;align-items:center}.preview img[data-v-8ad40512]{max-width:100%;max-height:100%;border-radius:4px;padding:1px}.preview[data-v-8ad40512]:hover{border:1px dashed #2dd3c4}.custom-upload-dragger[data-v-8ad40512]{width:138px;height:138px;display:flex;justify-content:center;align-items:center;border-radius:10px}.custom-upload-dragger .btn-plus[data-v-8ad40512]{font-size:88px;color:#b0b0b0}.add[data-v-9ae53601]{font-size:20px}.map-container{margin-top:18px;height:var(--f14f1f20)}.map-container canvas{border-radius:10px;box-shadow:1px 1px 6px #aaa}

View File

@@ -0,0 +1 @@
(function(){const o=document.createElement("link").relList;if(o&&o.supports&&o.supports("modulepreload"))return;for(const t of document.querySelectorAll('link[rel="modulepreload"]'))l(t);new MutationObserver(t=>{for(const e of t)if(e.type==="childList")for(const r of e.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&l(r)}).observe(document,{childList:!0,subtree:!0});function i(t){const e={};return t.integrity&&(e.integrity=t.integrity),t.referrerpolicy&&(e.referrerPolicy=t.referrerpolicy),t.crossorigin==="use-credentials"?e.credentials="include":t.crossorigin==="anonymous"?e.credentials="omit":e.credentials="same-origin",e}function l(t){if(t.ep)return;t.ep=!0;const e=i(t);fetch(t.href,e)}})();const d="modulepreload",m=function(u){return"/"+u},f={},h=function(o,i,l){if(!i||i.length===0)return o();const t=document.getElementsByTagName("link");return Promise.all(i.map(e=>{if(e=m(e),e in f)return;f[e]=!0;const r=e.endsWith(".css"),a=r?'[rel="stylesheet"]':"";if(!!l)for(let s=t.length-1;s>=0;s--){const c=t[s];if(c.href===e&&(!r||c.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${e}"]${a}`))return;const n=document.createElement("link");if(n.rel=r?"stylesheet":d,r||(n.as="script",n.crossOrigin=""),n.href=e,document.head.appendChild(n),r)return new Promise((s,c)=>{n.addEventListener("load",s),n.addEventListener("error",()=>c(new Error(`Unable to preload CSS for ${e}`)))})})).then(()=>o())};h(()=>import("./index.js"),["vendor/dcat-admin-extensions/weiwait/dcat-vue/js/index.js","vendor/dcat-admin-extensions/weiwait/dcat-vue/css/index.css"])();

File diff suppressed because one or more lines are too long

View File

@@ -2,7 +2,7 @@
<label class="{{$viewClass['label']}} control-label pt-0">{!! $label !!}</label>
<div class="{{$viewClass['field']}}" id="{{ $mountId }}">
<div class="{{$viewClass['field']}}" id="{{ $vid }}">
</div>
</div>
@@ -11,11 +11,11 @@
const App = app()
App.provide('provides', @json($provides, true))
App.mount('#{{ $mountId }}')
App.mount('#{{ $vid }}')
if (!window.dv) {
window.dv = {instances: {}, maps: {wemap: false}}
}
window.dv.instances["{{ $mountId }}"] = App
window.dv.instances["{{ $vid }}"] = App
</script>

View File

@@ -5,10 +5,11 @@ namespace Weiwait\DcatVue\Field;
use Dcat\Admin\Form\Field;
use Dcat\Admin\Support\Helper;
use Illuminate\Support\Str;
use Weiwait\DcatVue\Field\Traits\FieldCommon;
class DateRange extends Field\DateRange
{
protected $view = 'weiwait.dcat-vue::common';
use FieldCommon;
public function render()
{
@@ -50,7 +51,6 @@ class DateRange extends Field\DateRange
{
$this->addVariables([
'component' => 'DateRange',
'mountId' => 'id' . md5(Str::uuid()),
]);
}

View File

@@ -5,10 +5,11 @@ namespace Weiwait\DcatVue\Field;
use Dcat\Admin\Form\Field;
use Exception;
use Illuminate\Support\Str;
use Weiwait\DcatVue\Field\Traits\FieldCommon;
class Distpicker extends Field
{
protected $view = 'weiwait.dcat-vue::common';
use FieldCommon;
// 地图高度
protected string $height = '380px';
// 模板id

View File

@@ -3,15 +3,13 @@
namespace Weiwait\DcatVue\Field;
use Dcat\Admin\Form\Field;
use Dcat\Admin\Support\Helper;
use Illuminate\Support\Str;
use Weiwait\DcatVue\Field\Traits\FieldCommon;
use Weiwait\DcatVue\Field\Traits\UploadTrait;
class Editor extends Field\Editor
{
use UploadTrait;
protected $view = 'weiwait.dcat-vue::common';
use UploadTrait, FieldCommon;
public function render()
{

View File

@@ -4,11 +4,13 @@ namespace Weiwait\DcatVue\Field;
use Dcat\Admin\Form\Field;
use Illuminate\Support\Str;
use Weiwait\DcatVue\Field\Traits\FieldCommon;
use Weiwait\DcatVue\Models\WeiwaitUpload;
class File extends Field\File
{
protected $view = 'weiwait.dcat-vue::common';
use FieldCommon;
protected string $disk;
protected function prepareInputValue($file)

View File

@@ -5,11 +5,13 @@ namespace Weiwait\DcatVue\Field;
use Dcat\Admin\Form\Field;
use Dcat\Admin\Support\Helper;
use Illuminate\Support\Str;
use Weiwait\DcatVue\Field\Traits\FieldCommon;
use Weiwait\DcatVue\Models\WeiwaitUpload;
class Image extends Field\Image
{
protected $view = 'weiwait.dcat-vue::common';
use FieldCommon;
protected string $disk;
protected bool $disableCropper = false;

View File

@@ -7,11 +7,13 @@ use Dcat\Admin\Support\Helper;
use Illuminate\Support\Arr;
use Illuminate\Support\MessageBag;
use Illuminate\Support\Str;
use Weiwait\DcatVue\Field\Traits\FieldCommon;
use function Swoole\Coroutine\map;
class KeyValue extends Field\KeyValue
{
protected $view = 'weiwait.dcat-vue::common';
use FieldCommon;
private bool $is_list = false;
private bool $is_serial = false;
private bool $is_sortable = false;

View File

@@ -5,10 +5,11 @@ namespace Weiwait\DcatVue\Field;
use Dcat\Admin\Form\Field;
use Dcat\Admin\Support\Helper;
use Illuminate\Support\Str;
use Weiwait\DcatVue\Field\Traits\FieldCommon;
class ListField extends Field\ListField
{
protected $view = 'weiwait.dcat-vue::common';
use FieldCommon;
public function render()
{

View File

@@ -4,11 +4,13 @@ namespace Weiwait\DcatVue\Field;
use Dcat\Admin\Form\Field;
use Illuminate\Support\Str;
use Weiwait\DcatVue\Field\Traits\FieldCommon;
use Weiwait\DcatVue\Models\WeiwaitUpload;
class MultipleFile extends Field\MultipleFile
{
protected $view = 'weiwait.dcat-vue::common';
use FieldCommon;
protected string $disk;
protected function prepareInputValue($file): array

View File

@@ -5,11 +5,13 @@ namespace Weiwait\DcatVue\Field;
use Dcat\Admin\Form\Field;
use Dcat\Admin\Support\Helper;
use Illuminate\Support\Str;
use Weiwait\DcatVue\Field\Traits\FieldCommon;
use Weiwait\DcatVue\Models\WeiwaitUpload;
class MultipleImage extends Field\MultipleImage
{
protected $view = 'weiwait.dcat-vue::common';
use FieldCommon;
protected string $disk;
protected function prepareInputValue($file)

View File

@@ -5,10 +5,12 @@ namespace Weiwait\DcatVue\Field;
use Dcat\Admin\Form\Field;
use Dcat\Admin\Support\Helper;
use Illuminate\Support\Str;
use Weiwait\DcatVue\Field\Traits\FieldCommon;
class MultipleSelect extends Field\MultipleSelect
{
protected $view = 'weiwait.dcat-vue::common';
use FieldCommon;
private string $optionsFromKeyValueField = '';
private string $concatSeparator = '';

View File

@@ -3,12 +3,12 @@
namespace Weiwait\DcatVue\Field;
use Dcat\Admin\Form\Field;
use Dcat\Admin\Support\Helper;
use Illuminate\Support\Str;
use Weiwait\DcatVue\Field\Traits\FieldCommon;
class Number extends Field\Number
{
protected $view = 'weiwait.dcat-vue::common';
use FieldCommon;
public function render()
{
@@ -44,7 +44,6 @@ class Number extends Field\Number
{
$this->addVariables([
'component' => 'Number',
'mountId' => 'id' . md5(Str::uuid()),
]);
}

View File

@@ -4,11 +4,13 @@ namespace Weiwait\DcatVue\Field;
use Dcat\Admin\Form\Field;
use Dcat\Admin\Support\Helper;
use Illuminate\Support\Str;
use Weiwait\DcatVue\Field\Traits\FieldCommon;
use Weiwait\DcatVue\Field\Traits\HasOptions;
class Select extends Field\Select
{
protected $view = 'weiwait.dcat-vue::common';
use HasOptions, FieldCommon;
private string $optionsFromKeyValueField = '';
private string $concatSeparator = '';
@@ -69,7 +71,6 @@ class Select extends Field\Select
{
$this->addVariables([
'component' => 'Select',
'mountId' => 'id' . md5(Str::uuid()),
'optionsFromKeyValueField' => $this->optionsFromKeyValueField,
'concatSeparator' => $this->concatSeparator,
]);

View File

@@ -5,10 +5,11 @@ namespace Weiwait\DcatVue\Field;
use Dcat\Admin\Form\Field;
use Dcat\Admin\Support\Helper;
use Illuminate\Support\Str;
use Weiwait\DcatVue\Field\Traits\FieldCommon;
class Tag extends Field\Tags
{
protected $view = 'weiwait.dcat-vue::common';
use FieldCommon;
public function render()
{

View File

@@ -0,0 +1,33 @@
<?php
namespace Weiwait\DcatVue\Field\Traits;
trait FieldCommon
{
protected string $vid;
public function __construct($column, $arguments = [])
{
parent::__construct($column, $arguments);
$this->view = 'weiwait.dcat-vue::common';
$this->makeVid();
}
public function makeVid(): static
{
$this->vid = 'vid' . md5(uuid_create());
$this->addVariables([
'vid' => $this->vid,
]);
return $this;
}
public function vid(): string
{
return $this->vid;
}
}

View File

@@ -0,0 +1,66 @@
<?php
namespace Weiwait\DcatVue\Field\Traits;
use Dcat\Admin\Exception\RuntimeException;
use Dcat\Admin\Form\Field;
use Illuminate\Database\Eloquent\Model;
trait HasOptions
{
/**
* @throws RuntimeException
*/
public function modelLoad(string $model, string $id, string $field, array $filters = [], int $perPage = 0): static
{
if (! class_exists($model) || ! in_array(Model::class, class_parents($model))) {
throw new RuntimeException("[$model] must be a valid model class");
}
self::composing(function (Field $field) use($filters) {
$refs = [];
foreach ($filters as $name => $condition) {
if (is_numeric($name)) {
$ref = explode('.', $condition);
$name = $condition;
$condition = $ref[0];
} else {
$ref = explode('.', $name);
}
$refField = $field->form
->fields()
->filter(fn(Field $field) => $field->column() === $ref[0])
->values()
->get($filter[1] ?? 0);
if (!$refField) {
throw new \Exception("找不到参考字段[$ref[0]");
}
$refs[] = ['vid' => $refField->vid(), 'name' => $name, 'condition' => $condition];
}
$field->addVariables([
'loadRefs' => $refs,
]);
});
$filters = array_map(fn($k, $v) => is_numeric($k) ? $v : $k, array_keys($filters), array_values($filters));
$this->addVariables([
'load' => [
'model' => $model,
'id' => $id,
'field' => $field,
'perPage' => $perPage,
'filters' => $filters,
'url' => route('dcat.admin.weiwait.options.model'),
]
]);
return $this;
}
}

View File

@@ -5,10 +5,11 @@ namespace Weiwait\DcatVue\Field;
use Dcat\Admin\Form\Field;
use Dcat\Admin\Support\Helper;
use Dcat\Admin\Widgets\Checkbox as WidgetCheckbox;
use Weiwait\DcatVue\Field\Traits\FieldCommon;
class Vue extends Field\Checkbox
{
protected $view = 'weiwait.dcat-vue::common';
use FieldCommon;
protected array $watch = [];

View File

@@ -0,0 +1,56 @@
<?php
namespace Weiwait\DcatVue\Http\Controllers;
use App\Http\Controllers\Controller;
use Dcat\Admin\Exception\RuntimeException;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
class OptionController extends Controller
{
/**
* @throws RuntimeException
*/
public function model(Request $request)
{
$request->validate([
'model' => 'required|string',
'id' => 'required|string',
'field' => 'required|string',
'filters' => 'nullable|array',
'page' => 'nullable|integer',
'perPage' => 'nullable|integer',
]);
$model = $request['model'];
if (! class_exists($model) || ! in_array(Model::class, class_parents($model))) {
throw new RuntimeException("[$model] must be a valid model class");
}
/** @var Model $model */
$query = $model::query()->where(
collect($request['filters'])
->filter()
->map(fn($v, $k) => [$k, '=', $v])
->values()
->toArray()
);
$page = null;
if ($request['perPage']) {
$page = $query->paginate(10, [$request['id'], $request['field']]);
$options = $page->items();
} else {
$options = $query->get([$request['id'], $request['field']]);
}
return response()->json([
'options' => collect($options)->map(fn($item) => ['id' => $item[$request['id']], 'field' => $item[$request['field']]]),
'nextPageUrl' => $page?->nextPageUrl(),
'total' => $page?->total(),
]);
}
}

View File

@@ -31,3 +31,7 @@ Route::post('auth/login', [Controllers\DcatAuthController::class, 'postLogin']);
// 同步存储
Route::post('weiwait/storage/sync', [Controllers\DcatVueController::class, 'syncStorage'])
->name('weiwait.storage.sync');
// 模型选项
Route::post('weiwait/options/model', [Controllers\OptionController::class, 'model'])
->name('weiwait.options.model');