添加提示
parent
7955aa8cc3
commit
8050f03add
|
|
@ -5,7 +5,9 @@ namespace App\Admin\Controllers;
|
|||
use Slowlyo\OwlAdmin\Renderers\Page;
|
||||
use Slowlyo\OwlAdmin\Renderers\Form;
|
||||
use Slowlyo\OwlAdmin\Renderers\Operation;
|
||||
use Slowlyo\OwlAdmin\Services\AdminUserService;
|
||||
use Slowlyo\OwlAdmin\Renderers\SwitchControl;
|
||||
use Slowlyo\OwlAdmin\Renderers\TableColumn;
|
||||
use App\Services\Admin\AdminUserService;
|
||||
use Slowlyo\OwlAdmin\Services\AdminRoleService;
|
||||
use Slowlyo\OwlAdmin\Controllers\AdminController;
|
||||
|
||||
|
|
@ -28,6 +30,7 @@ class AdminUserController extends AdminController
|
|||
->size('md')
|
||||
->placeholder(__('admin.admin_user.search_username'))
|
||||
))
|
||||
->quickSaveItemApi(admin_url('quick-edit/admin_users/$id'))
|
||||
->columns([
|
||||
amisMake()->TableColumn('id', 'ID')->sortable(),
|
||||
amisMake()->TableColumn('avatar', __('admin.admin_user.avatar'))->type('avatar')->src('${avatar}'),
|
||||
|
|
@ -36,6 +39,7 @@ class AdminUserController extends AdminController
|
|||
amisMake()->TableColumn('roles', __('admin.admin_user.roles'))->type('each')->items(
|
||||
amisMake()->Tag()->label('${name}')->className('my-1')
|
||||
),
|
||||
amisMake()->TableColumn('lock', '锁定')->type('switch')->quickEdit(SwitchControl::make()->saveImmediately(true)->mode('inline')),
|
||||
amisMake()->TableColumn('created_at', __('admin.created_at'))->type('datetime')->sortable(true),
|
||||
Operation::make()->label(__('admin.actions'))->buttons([
|
||||
$this->rowEditButton(true),
|
||||
|
|
@ -62,6 +66,7 @@ class AdminUserController extends AdminController
|
|||
->joinValues(false)
|
||||
->extractValue()
|
||||
->options(AdminRoleService::make()->query()->get(['id', 'name'])),
|
||||
SwitchControl::make()->name('lock')->label('锁定')->value(false),
|
||||
]);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,14 +2,214 @@
|
|||
|
||||
namespace App\Admin\Controllers;
|
||||
|
||||
use Slowlyo\OwlAdmin\Admin;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Slowlyo\OwlAdmin\Renderers\Page;
|
||||
use Slowlyo\OwlAdmin\Renderers\Form;
|
||||
use Slowlyo\OwlAdmin\Renderers\TextControl;
|
||||
use Slowlyo\OwlAdmin\Renderers\ImageControl;
|
||||
use Slowlyo\OwlAdmin\Support\Captcha;
|
||||
use Slowlyo\OwlAdmin\Models\AdminUser;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Slowlyo\OwlAdmin\Controllers\AuthController as AdminAuthController;
|
||||
use Slowlyo\OwlAdmin\Renderers\{Page, Form, TextControl, ImageControl};
|
||||
|
||||
class AuthController extends AdminAuthController
|
||||
{
|
||||
public function login(Request $request)
|
||||
{
|
||||
if (Admin::config('admin.auth.login_captcha')) {
|
||||
if (!$request->has('captcha')) {
|
||||
return $this->response()->fail(__('admin.required', ['attribute' => __('admin.captcha')]));
|
||||
}
|
||||
|
||||
if (strtolower(admin_decode($request->sys_captcha)) != strtolower($request->captcha)) {
|
||||
return $this->response()->fail(__('admin.captcha_error'));
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
$validator = Validator::make($request->all(), [
|
||||
'username' => 'required',
|
||||
'password' => 'required',
|
||||
], [
|
||||
'username' . '.required' => __('admin.required', ['attribute' => __('admin.username')]),
|
||||
'password.required' => __('admin.required', ['attribute' => __('admin.password')]),
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
abort(Response::HTTP_BAD_REQUEST, $validator->errors()->first());
|
||||
}
|
||||
$adminModel = Admin::config("admin.auth.model", AdminUser::class);
|
||||
$user = $adminModel::query()->where('username', $request->username)->first();
|
||||
if($user && $user->lock){
|
||||
abort(Response::HTTP_BAD_REQUEST, '您的账号已被锁定,需要联系超级管理员解锁。');
|
||||
}else{
|
||||
if ($user && Hash::check($request->password, $user->password)) {
|
||||
$module = Admin::currentModule(true);
|
||||
$prefix = $module ? $module . '.' : '';
|
||||
$token = $user->createToken($prefix . 'admin')->plainTextToken;
|
||||
$user->update([
|
||||
'error_num'=>0,
|
||||
'last_error_at' => null
|
||||
]);
|
||||
|
||||
return $this->response()->success(compact('token'), __('admin.login_successful'));
|
||||
}else{
|
||||
//24小时内连续错3次
|
||||
if($user->last_error_at && $user->last_error_at> now()->subHours(24)){
|
||||
$user->increment('error_num');
|
||||
}else{
|
||||
$user->update([
|
||||
'error_num'=>1,
|
||||
]);
|
||||
}
|
||||
$user->update([
|
||||
'last_error_at' => now()
|
||||
]);
|
||||
}
|
||||
if($user->error_num >= 3){
|
||||
$user->update([
|
||||
'lock' => 1
|
||||
]);
|
||||
abort(Response::HTTP_BAD_REQUEST, '您24小时连续输错密码3次,账号已锁定,需要联系超级管理员解锁。');
|
||||
}else{
|
||||
abort(Response::HTTP_BAD_REQUEST, __('admin.login_failed'));
|
||||
}
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
return $this->response()->fail($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public function loginPage()
|
||||
{
|
||||
$captcha = null;
|
||||
$enableCaptcha = Admin::config('admin.auth.login_captcha');
|
||||
|
||||
// 验证码
|
||||
if ($enableCaptcha) {
|
||||
$captcha = amisMake()->InputGroupControl()->body([
|
||||
amisMake()->TextControl()->name('captcha')->placeholder(__('admin.captcha'))->required(),
|
||||
amisMake()->HiddenControl()->name('sys_captcha'),
|
||||
amisMake()->Service()->id('captcha-service')->api('get:' . admin_url('/captcha'))->body(
|
||||
amisMake()
|
||||
->Image()
|
||||
->src('${captcha_img}')
|
||||
->height('1.917rem')
|
||||
->className('p-0 border captcha-box')
|
||||
->set(
|
||||
'clickAction',
|
||||
['actionType' => 'reload', 'target' => 'captcha-service']
|
||||
)
|
||||
),
|
||||
]);
|
||||
}
|
||||
|
||||
$form = amisMake()->Form()->id('login-form')->title()->api(admin_url('/login'))->body([
|
||||
amisMake()->TextControl()->name('username')->placeholder(__('admin.username'))->required(),
|
||||
amisMake()
|
||||
->TextControl()
|
||||
->type('input-password')
|
||||
->name('password')
|
||||
->placeholder(__('admin.password'))
|
||||
->required(),
|
||||
$captcha,
|
||||
amisMake()->CheckboxControl()->name('remember_me')->option(__('admin.remember_me'))->value(true),
|
||||
|
||||
// 登录按钮
|
||||
amisMake()
|
||||
->VanillaAction()
|
||||
->actionType('submit')
|
||||
->label(__('admin.login'))
|
||||
->level('primary')
|
||||
->className('w-full'),
|
||||
])->actions([]); // 清空默认的提交按钮
|
||||
|
||||
$failAction = [];
|
||||
if ($enableCaptcha) {
|
||||
// 登录失败后刷新验证码
|
||||
$failAction = [
|
||||
// 登录失败事件
|
||||
'submitFail' => [
|
||||
'actions' => [
|
||||
// 刷新验证码外层Service
|
||||
['actionType' => 'reload', 'componentId' => 'captcha-service'],
|
||||
],
|
||||
],
|
||||
];
|
||||
}
|
||||
$form->onEvent(array_merge([
|
||||
// 页面初始化事件
|
||||
'inited' => [
|
||||
'actions' => [
|
||||
// 读取本地存储的登录参数
|
||||
[
|
||||
'actionType' => 'custom',
|
||||
'script' => <<<JS
|
||||
let loginParams = localStorage.getItem('loginParams')
|
||||
if(loginParams){
|
||||
loginParams = JSON.parse(loginParams)
|
||||
doAction({
|
||||
actionType: 'setValue',
|
||||
componentId: 'login-form',
|
||||
args: { value: loginParams }
|
||||
})
|
||||
}
|
||||
JS
|
||||
,
|
||||
|
||||
],
|
||||
],
|
||||
],
|
||||
// 登录成功事件
|
||||
'submitSucc' => [
|
||||
'actions' => [
|
||||
// 保存登录参数到本地, 并跳转到首页
|
||||
[
|
||||
'actionType' => 'custom',
|
||||
'script' => <<<JS
|
||||
let _data = {}
|
||||
if(event.data.remember_me){
|
||||
_data = { username: event.data.username, password: event.data.password }
|
||||
}
|
||||
window.\$owl.afterLoginSuccess(_data, event.data.result.data.token)
|
||||
JS,
|
||||
|
||||
],
|
||||
],
|
||||
],
|
||||
], $failAction));
|
||||
|
||||
$card = amisMake()->Card()->className('w-96 m:w-full')->body([
|
||||
amisMake()->Flex()->justify('space-between')->className('px-2.5 pb-2.5')->items([
|
||||
amisMake()->Image()->src(url(Admin::config('admin.logo')))->width(40)->height(40),
|
||||
amisMake()
|
||||
->Tpl()
|
||||
->className('font-medium')
|
||||
->tpl('<div style="font-size: 24px">' . Admin::config('admin.name') . '</div>'),
|
||||
]),
|
||||
$form,
|
||||
]);
|
||||
|
||||
return amisMake()->Page()->css([
|
||||
'.captcha-box .cxd-Image--thumb' => [
|
||||
'padding' => '0',
|
||||
'cursor' => 'pointer',
|
||||
'border' => 'var(--Form-input-borderWidth) solid var(--Form-input-borderColor)',
|
||||
|
||||
'border-top-right-radius' => '4px',
|
||||
'border-bottom-right-radius' => '4px',
|
||||
],
|
||||
'.cxd-Image-thumb' => ['width' => 'auto'],
|
||||
])->body(
|
||||
amisMake()->Wrapper()->className("h-screen w-full flex items-center justify-center")->body($card)
|
||||
);
|
||||
}
|
||||
|
||||
public function userSetting(): \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource
|
||||
{
|
||||
$user = $this->user();
|
||||
|
|
@ -31,10 +231,10 @@ class AuthController extends AdminAuthController
|
|||
->label(__('admin.admin_user.name'))
|
||||
->name('name')
|
||||
->required(),
|
||||
TextControl::make()
|
||||
->type('input-password')
|
||||
->label(__('admin.old_password'))
|
||||
->name('old_password'),
|
||||
// TextControl::make()
|
||||
// ->type('input-password')
|
||||
// ->label(__('admin.old_password'))
|
||||
// ->name('old_password'),
|
||||
TextControl::make()
|
||||
->type('input-password')
|
||||
->label('新密码')
|
||||
|
|
@ -56,22 +256,20 @@ class AuthController extends AdminAuthController
|
|||
{
|
||||
$request = request();
|
||||
$request->validate([
|
||||
'old_password' => ['nullable', 'current_password:sanctum', Rule::requiredIf($request->filled(['password', 'confirm_password']))],
|
||||
'password' => Rule::requiredIf($request->filled('old_password')),
|
||||
'confirm_password' => [Rule::requiredIf($request->filled('old_password')), 'same:password'],
|
||||
// 'old_password' => ['nullable', Rule::requiredIf($request->filled(['password', 'confirm_password']))],
|
||||
'password' => "required",
|
||||
'confirm_password' => ["required", 'same:password'],
|
||||
], [
|
||||
'old_password.required' => '原密码必填',
|
||||
'password.required' => '新密码必填',
|
||||
'confirm_password.required' => '确认密码必填',
|
||||
'old_password.current_password' => __('admin.admin_user.old_password_error'),
|
||||
'confirm_password.same' => __('admin.admin_user.password_confirmation'),
|
||||
]);
|
||||
$user = $this->user();
|
||||
$attributes = $request->only(['avatar', 'name']);
|
||||
if ($request->filled('old_password')) {
|
||||
// if ($request->filled('old_password')) {
|
||||
$attributes['password']
|
||||
= Hash::make($request->input('password'));
|
||||
}
|
||||
= Hash::make(md5($request->input('password')));
|
||||
// }
|
||||
$user->update($attributes);
|
||||
return $this->response()->successMessage(__('admin.action_success'));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,6 +11,10 @@ Route::group([
|
|||
$router->get('/_settings', '\App\Admin\Controllers\IndexController@settings');
|
||||
$router->resource('system/admin_users', App\Admin\Controllers\AdminUserController::class);
|
||||
|
||||
$router->get('login', [App\Admin\Controllers\AuthController::class, 'loginPage']);
|
||||
$router->post('login', [App\Admin\Controllers\AuthController::class, 'login']);
|
||||
$router->post('quick-edit/admin_users/{admin_user}',[\App\Admin\Controllers\AdminUserController::class, 'update']);
|
||||
|
||||
// 用户设置
|
||||
$router->get('user_setting', [App\Admin\Controllers\AuthController::class, 'userSetting']);
|
||||
$router->put('user_setting', [App\Admin\Controllers\AuthController::class, 'saveUserSetting']);
|
||||
|
|
|
|||
|
|
@ -20,14 +20,40 @@ class AuthController extends Controller
|
|||
if (! $user) {
|
||||
return $this->error('用户名或密码错误');
|
||||
}
|
||||
if($user->lock){
|
||||
return $this->error('您的账号已被锁定,需要联系超级管理员解锁。');
|
||||
}
|
||||
if (! Hash::check($request->input('password'), $user->password)) {
|
||||
return $this->error('用户名或密码错误');
|
||||
if($user->last_error_at && $user->last_error_at> now()->subHours(24)){
|
||||
$user->increment('error_num');
|
||||
}else{
|
||||
$user->update([
|
||||
'error_num'=>1,
|
||||
]);
|
||||
}
|
||||
|
||||
$user->update([
|
||||
'last_error_at' => now()
|
||||
]);
|
||||
if($user->error_num >= 3){
|
||||
$user->update([
|
||||
'lock' => 1
|
||||
]);
|
||||
return $this->error('您24小时连续输错密码3次,账号已锁定,需要联系超级管理员解锁。');
|
||||
}else{
|
||||
return $this->error('用户名或密码错误');
|
||||
}
|
||||
}
|
||||
|
||||
// if ($user->is_enable !== 1) {
|
||||
// return $this->error('用户状态异常请联系管理员');
|
||||
// }
|
||||
|
||||
$user->update([
|
||||
'error_num'=>0,
|
||||
'last_error_at' => null
|
||||
]);
|
||||
|
||||
return $this->attemptUser($user);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -21,6 +21,9 @@ class User extends Authenticatable
|
|||
'name',
|
||||
'email',
|
||||
'password',
|
||||
'lock',
|
||||
'error_num',
|
||||
'last_error_at',
|
||||
];
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -0,0 +1,164 @@
|
|||
<?php
|
||||
|
||||
namespace App\Services\Admin;
|
||||
|
||||
use Illuminate\Support\Arr;
|
||||
use Slowlyo\OwlAdmin\Admin;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Slowlyo\OwlAdmin\Models\AdminUser;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
/**
|
||||
* @method AdminUser getModel()
|
||||
* @method AdminUser|Builder query()
|
||||
*/
|
||||
class AdminUserService extends BaseService
|
||||
{
|
||||
protected string $modelName;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->modelName = Admin::adminUserModel();
|
||||
}
|
||||
|
||||
public function getEditData($id): Model|\Illuminate\Database\Eloquent\Collection|Builder|array|null
|
||||
{
|
||||
$adminUser = parent::getEditData($id)->makeHidden('password');
|
||||
|
||||
$adminUser->load('roles');
|
||||
|
||||
return $adminUser;
|
||||
}
|
||||
|
||||
public function store($data): bool
|
||||
{
|
||||
if ($this->checkUsernameUnique($data['username'])) {
|
||||
return $this->setError(__('admin.admin_user.username_already_exists'));
|
||||
}
|
||||
|
||||
if (!data_get($data, 'password')) {
|
||||
return $this->setError(__('admin.required', ['attribute' => __('admin.password')]));
|
||||
}
|
||||
|
||||
if (!$this->passwordHandler($data)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$columns = $this->getTableColumns();
|
||||
|
||||
$model = $this->getModel();
|
||||
|
||||
return $this->saveData($data, $columns, $model);
|
||||
}
|
||||
|
||||
public function update($primaryKey, $data): bool
|
||||
{
|
||||
if ($this->checkUsernameUnique($data['username'], $primaryKey)) {
|
||||
return $this->setError(__('admin.admin_user.username_already_exists'));
|
||||
}
|
||||
|
||||
if (!$this->passwordHandler($data)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$columns = $this->getTableColumns();
|
||||
|
||||
$model = $this->query()->whereKey($primaryKey)->first();
|
||||
|
||||
return $this->saveData($data, $columns, $model);
|
||||
}
|
||||
|
||||
public function checkUsernameUnique($username, $id = 0): bool
|
||||
{
|
||||
return $this->query()
|
||||
->where('username', $username)
|
||||
->when($id, fn($query) => $query->where('id', '<>', $id))
|
||||
->exists();
|
||||
}
|
||||
|
||||
public function updateUserSetting($primaryKey, $data): bool
|
||||
{
|
||||
if (!$this->passwordHandler($data, $primaryKey)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return parent::update($primaryKey, $data);
|
||||
}
|
||||
|
||||
public function passwordHandler(&$data, $id = null): bool
|
||||
{
|
||||
$password = Arr::get($data, 'password');
|
||||
|
||||
if ($password) {
|
||||
if ($password !== Arr::get($data, 'confirm_password')) {
|
||||
return $this->setError(__('admin.admin_user.password_confirmation'));
|
||||
}
|
||||
|
||||
if ($id) {
|
||||
if (!Arr::get($data, 'old_password')) {
|
||||
return $this->setError(__('admin.admin_user.old_password_required'));
|
||||
}
|
||||
|
||||
$oldPassword = $this->query()->where('id', $id)->value('password');
|
||||
|
||||
if (!Hash::check($data['old_password'], $oldPassword)) {
|
||||
return $this->setError(__('admin.admin_user.old_password_error'));
|
||||
}
|
||||
}
|
||||
|
||||
$data['password'] = bcrypt(md5($password));
|
||||
|
||||
unset($data['confirm_password']);
|
||||
unset($data['old_password']);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function list()
|
||||
{
|
||||
$keyword = request()->keyword;
|
||||
|
||||
$query = $this
|
||||
->query()
|
||||
->with('roles')
|
||||
->select(['id', 'name', 'username', 'avatar', 'created_at','lock'])
|
||||
->when($keyword, function ($query) use ($keyword) {
|
||||
$query->where('username', 'like', "%{$keyword}%")->orWhere('name', 'like', "%{$keyword}%");
|
||||
});
|
||||
|
||||
$items = (clone $query)->paginate(request()->input('perPage', 20))->items();
|
||||
$total = (clone $query)->count();
|
||||
|
||||
return compact('items', 'total');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $data
|
||||
* @param array $columns
|
||||
* @param AdminUser $model
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function saveData($data, array $columns, AdminUser $model): bool
|
||||
{
|
||||
$roles = Arr::pull($data, 'roles');
|
||||
|
||||
foreach ($data as $k => $v) {
|
||||
if (!in_array($k, $columns)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$model->setAttribute($k, $v);
|
||||
}
|
||||
|
||||
if ($model->save()) {
|
||||
$model->roles()->sync(Arr::has($roles, '0.id') ? Arr::pluck($roles, 'id') : $roles);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('admin_users', function (Blueprint $table) {
|
||||
//
|
||||
$table->unsignedInteger('lock')->default(0)->comment('锁定');
|
||||
$table->unsignedInteger('error_num')->default(0)->comment('错误次数');
|
||||
$table->timestamp('last_error_at')->nullable()->comment('上次错误时间');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('admin_users', function (Blueprint $table) {
|
||||
//
|
||||
$table->dropColumn(['lock', 'error_num', 'last_error_at']);
|
||||
});
|
||||
}
|
||||
};
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
import{g as a}from"./index-4f31eaf5.js";import{r as f}from"./codemirror-9bcc750d.js";function s(o,c){for(var t=0;t<c.length;t++){const r=c[t];if(typeof r!="string"&&!Array.isArray(r)){for(const e in r)if(e!=="default"&&!(e in o)){const i=Object.getOwnPropertyDescriptor(r,e);i&&Object.defineProperty(o,e,i.get?i:{enumerable:!0,get:()=>r[e]})}}}return Object.freeze(Object.defineProperty(o,Symbol.toStringTag,{value:"Module"}))}var n=f();const m=a(n),d=s({__proto__:null,default:m},[n]);export{d as c};
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
import{g as a}from"./index-5e1f3e71.js";import{r as f}from"./codemirror-80c2c35d.js";function s(o,c){for(var t=0;t<c.length;t++){const r=c[t];if(typeof r!="string"&&!Array.isArray(r)){for(const e in r)if(e!=="default"&&!(e in o)){const i=Object.getOwnPropertyDescriptor(r,e);i&&Object.defineProperty(o,e,i.get?i:{enumerable:!0,get:()=>r[e]})}}}return Object.freeze(Object.defineProperty(o,Symbol.toStringTag,{value:"Module"}))}var n=f();const m=a(n),d=s({__proto__:null,default:m},[n]);export{d as c};
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
import{g as a}from"./index-b99e116c.js";import{r as f}from"./codemirror-13d03d6c.js";function s(o,c){for(var t=0;t<c.length;t++){const r=c[t];if(typeof r!="string"&&!Array.isArray(r)){for(const e in r)if(e!=="default"&&!(e in o)){const i=Object.getOwnPropertyDescriptor(r,e);i&&Object.defineProperty(o,e,i.get?i:{enumerable:!0,get:()=>r[e]})}}}return Object.freeze(Object.defineProperty(o,Symbol.toStringTag,{value:"Module"}))}var n=f();const m=a(n),d=s({__proto__:null,default:m},[n]);export{d as c};
|
||||
|
|
@ -0,0 +1 @@
|
|||
import{g as a}from"./index-ed285efe.js";import{r as f}from"./codemirror-d12b9c61.js";function s(o,c){for(var t=0;t<c.length;t++){const r=c[t];if(typeof r!="string"&&!Array.isArray(r)){for(const e in r)if(e!=="default"&&!(e in o)){const i=Object.getOwnPropertyDescriptor(r,e);i&&Object.defineProperty(o,e,i.get?i:{enumerable:!0,get:()=>r[e]})}}}return Object.freeze(Object.defineProperty(o,Symbol.toStringTag,{value:"Module"}))}var n=f();const m=a(n),d=s({__proto__:null,default:m},[n]);export{d as c};
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue