generated from panliang/owl-admin-starter
api
parent
0c6ddaf1c5
commit
37dc686af0
|
|
@ -0,0 +1,29 @@
|
|||
<?php
|
||||
|
||||
namespace App\Admin\Controllers;
|
||||
|
||||
use App\Admin\Services\FeedbackService;
|
||||
use Slowlyo\OwlAdmin\Controllers\AdminController;
|
||||
use Slowlyo\OwlAdmin\Renderers\Page;
|
||||
|
||||
class FeedbackController extends AdminController
|
||||
{
|
||||
protected string $serviceName = FeedbackService::class;
|
||||
|
||||
public function list(): Page
|
||||
{
|
||||
$crud = $this->baseCRUD()
|
||||
->filterTogglable(false)
|
||||
->columnsTogglable(false)
|
||||
->headerToolbar([])
|
||||
->columns([
|
||||
amisMake()->TableColumn()->name('id')->label(__('banner.id')),
|
||||
amisMake()->TableColumn()->name('content')->label(__('feedback.content')),
|
||||
$this->rowActions([
|
||||
$this->rowDeleteButton()
|
||||
]),
|
||||
]);
|
||||
|
||||
return $this->baseList($crud);
|
||||
}
|
||||
}
|
||||
|
|
@ -69,6 +69,7 @@ class PartyCateController extends AdminController
|
|||
amisMake()->TableColumn()->name('name')->label(__('party_cate.name')),
|
||||
amisMake()->TableColumn()->name('master.name')->label(__('party_cate.master_id')),
|
||||
amisMake()->TableColumn()->name('plan.name')->label(__('party_cate.plan_id')),
|
||||
amisMake()->TableColumn()->name('current_score')->label(__('party_cate.current_score')),
|
||||
amisMake()->TableColumn()->name('score')->label(__('party_cate.score')),
|
||||
amisMake()->TableColumn()->name('remarks')->label(__('party_cate.remarks')),
|
||||
$this->rowActions([
|
||||
|
|
@ -116,6 +117,7 @@ class PartyCateController extends AdminController
|
|||
amisMake()->TextControl()->name('master.name')->label(__('party_cate.master_id'))->static(),
|
||||
amisMake()->TextControl()->name('plan.name')->label(__('party_cate.plan_id'))->static(),
|
||||
amisMake()->TextControl()->name('remarks')->label(__('party_cate.remarks'))->static(),
|
||||
amisMake()->TextControl()->name('current_score')->label(__('party_cate.current_score'))->static(),
|
||||
amisMake()->TextControl()->name('score')->label(__('party_cate.score'))->static(),
|
||||
amisMake()->TextControl()->name('scores')->label(__('party_cate.scores'))->static()->staticSchema(amisMake()->Json()),
|
||||
amisMake()->TextControl()->name('created_at')->label(__('party_cate.created_at'))->static(),
|
||||
|
|
@ -154,6 +156,7 @@ class PartyCateController extends AdminController
|
|||
amisMake()->TableColumn()->name('id')->label(__('party_user.id')),
|
||||
amisMake()->TableColumn()->name('name')->label(__('party_user.name')),
|
||||
amisMake()->TableColumn()->set('type', 'avatar')->set('src', '${avatar}')->name('avatar')->label(__('party_user.avatar')),
|
||||
amisMake()->TableColumn()->name('current_score')->label(__('party_user.current_score')),
|
||||
amisMake()->TableColumn()->name('score')->label(__('party_user.score')),
|
||||
$userController->rowActions([
|
||||
amisMake()->DialogAction()->label(__('admin.show'))->icon('fa-regular fa-eye')->level('link')->dialog(
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@ class PartyUserController extends AdminController
|
|||
amisMake()->TableColumn()->name('name')->label(__('party_user.name')),
|
||||
amisMake()->TableColumn()->type('avatar')->src('${avatar}')->name('avatar')->label(__('party_user.avatar')),
|
||||
amisMake()->TableColumn()->name('cate.name')->label(__('party_user.cate_id')),
|
||||
amisMake()->TableColumn()->name('current_score')->label(__('party_user.current_score')),
|
||||
amisMake()->TableColumn()->name('score')->label(__('party_user.score')),
|
||||
$this->rowActions([
|
||||
$this->rowShowButton(),
|
||||
|
|
@ -66,6 +67,7 @@ class PartyUserController extends AdminController
|
|||
amisMake()->TextControl()->name('username')->label(__('party_user.username'))->static(),
|
||||
amisMake()->TextControl()->name('name')->label(__('party_user.name'))->static(),
|
||||
amisMake()->TextControl()->name('avatar')->label(__('party_user.avatar'))->static()->staticSchema(amisMake()->Image()),
|
||||
amisMake()->TextControl()->name('current_score')->label(__('party_cate.current_score'))->static(),
|
||||
amisMake()->TextControl()->name('score')->label(__('party_cate.score'))->static(),
|
||||
amisMake()->TextControl()->name('scores')->label(__('party_cate.scores'))->static()->staticSchema(amisMake()->Json()),
|
||||
amisMake()->TextControl()->name('remarks')->label(__('party_cate.remarks'))->static(),
|
||||
|
|
|
|||
|
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
|
||||
namespace App\Admin\Services;
|
||||
|
||||
use App\Models\Feedback;
|
||||
|
||||
class FeedbackService extends BaseService
|
||||
{
|
||||
protected array $withRelationships = [];
|
||||
|
||||
protected string $modelName = Feedback::class;
|
||||
|
||||
protected string $modelFilterName = '';
|
||||
}
|
||||
|
|
@ -80,6 +80,7 @@ class PartyCateService extends BaseService
|
|||
}
|
||||
$info->update([
|
||||
'score' => $info->score + $score,
|
||||
'current_score' => $info->current_score + $score,
|
||||
'scores' => $scores,
|
||||
]);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -78,6 +78,7 @@ class PartyUserService extends BaseService
|
|||
}
|
||||
$user->update([
|
||||
'score' => $user->score + $score,
|
||||
'current_score' => $user->current_score + $score,
|
||||
'scores' => $scores,
|
||||
]);
|
||||
|
||||
|
|
|
|||
|
|
@ -56,4 +56,6 @@ Route::group([
|
|||
$router->resource('user-rank', \App\Admin\Controllers\UserRankController::class)->names('admin.user_rank');
|
||||
// 党支部排名
|
||||
$router->resource('cate-rank', \App\Admin\Controllers\CateRankController::class)->names('admin.cate_rank');
|
||||
|
||||
$router->resource('feedback', \App\Admin\Controllers\FeedbackController::class)->names('admin.feedback');
|
||||
});
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
namespace App\Console\Commands;
|
||||
|
||||
use App\Models\UserScore;
|
||||
use App\Models\PartyCate;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use App\Models\CateRank as CateRankModel;
|
||||
|
|
@ -50,5 +51,9 @@ class CateRank extends Command
|
|||
];
|
||||
}
|
||||
CateRankModel::insert($list);
|
||||
// 清空党支部当前得分
|
||||
PartyCate::update([
|
||||
'current_score' => 0
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Models\PartyUser;
|
||||
use App\Models\UserScore;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
|
@ -53,5 +54,9 @@ class UserRank extends Command
|
|||
];
|
||||
}
|
||||
UserRankModel::insert($list);
|
||||
// 清空党员当前得分
|
||||
PartyUser::update([
|
||||
'current_score' => 0
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Admin\Services\PartyUserService;
|
||||
|
||||
class AccountController extends Controller
|
||||
{
|
||||
public function profile()
|
||||
{
|
||||
$user = auth('api')->user();
|
||||
|
||||
return $this->response()->success($user);
|
||||
}
|
||||
|
||||
public function update(Request $request)
|
||||
{
|
||||
$user = auth('api')->user();
|
||||
$service = PartyUserService::make();
|
||||
if ($service->update($user->id, $request->all())) {
|
||||
return $this->response()->success('保存成功');
|
||||
}
|
||||
return $this->response()->fail($service->getError());
|
||||
}
|
||||
|
||||
public function logout()
|
||||
{
|
||||
$user = auth('api')->user();
|
||||
|
||||
$user->currentAccessToken()->delete();
|
||||
|
||||
return $this->response()->success();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\PartyUser;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
|
||||
class AuthController extends Controller
|
||||
{
|
||||
public function login(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'username' => 'required',
|
||||
'password' => 'required',
|
||||
]);
|
||||
|
||||
$user = PartyUser::where('username', $request->input('username'))->first();
|
||||
if (!Hash::check($request->input('password'), $user->password)) {
|
||||
throw new BaseException('用户名或密码错误');
|
||||
}
|
||||
// 更新第三方账户
|
||||
// $openid = $request->input('openid');
|
||||
// $open_type = $request->input('open_type');
|
||||
// if ($openid && $open_type) {
|
||||
// $this->updateUserSocialite($user, $openid, SocialiteType::from($open_type));
|
||||
// }
|
||||
$token = $user->createToken('client')->plainTextToken;
|
||||
return $this->response()->success(['token' => $token, 'user' => $user]);
|
||||
}
|
||||
|
||||
// protected function updateUserSocialite($user, $openid, $type)
|
||||
// {
|
||||
// // 清空以前绑定的
|
||||
// UserSocialite::where([
|
||||
// 'type' => $type,
|
||||
// 'user_type' => $user->getMorphClass(),
|
||||
// 'user_id' => $user->id,
|
||||
// ])->update(['user_id' => null]);
|
||||
// UserSocialite::updateOrCreate([
|
||||
// 'type' => $type,
|
||||
// 'user_type' => $user->getMorphClass(),
|
||||
// 'openid' => $openid,
|
||||
// ], [
|
||||
// 'user_id' => $user->id,
|
||||
// ]);
|
||||
// }
|
||||
}
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\Keyword;
|
||||
use App\Http\Resources\KeywordResource;
|
||||
|
||||
class KeywordController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$list = Keyword::filter($request->all())->get();
|
||||
|
||||
return $this->response()->success(KeywordResource::collection($list));
|
||||
}
|
||||
}
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Web;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\PartyUser;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
|
||||
class AuthController extends Controller
|
||||
{
|
||||
public function login(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'username' => 'required',
|
||||
'password' => 'required'
|
||||
]);
|
||||
|
||||
$auth = $this->guard();
|
||||
$user = PartyUser::where('username', $request->input('username'))->first();
|
||||
if ($user && Hash::check($request->input('password'), $user->getRawOriginal('password'))) {
|
||||
$auth->login($user);
|
||||
return back()->with('flash_message', '登录成功');
|
||||
}
|
||||
|
||||
return back()->withErrors('用户名或密码错误')->withInput(['username' => $request->input('username')]);
|
||||
}
|
||||
|
||||
public function logout()
|
||||
{
|
||||
$this->guard()->logout();
|
||||
return back()->with('flash_message', '已退出');
|
||||
}
|
||||
|
||||
protected function guard()
|
||||
{
|
||||
return Auth::guard('web');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Resources;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class KeywordResource extends JsonResource
|
||||
{
|
||||
/**
|
||||
* Transform the resource into an array.
|
||||
*
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
public function toArray(Request $request): array
|
||||
{
|
||||
return [
|
||||
'id' => $this->id,
|
||||
'name' => $this->id,
|
||||
'key' => $this->key,
|
||||
'value' => $this->value,
|
||||
'parent_id' => $this->parent_id,
|
||||
'sort' => $this->sort,
|
||||
'level' => $this->level,
|
||||
'options' => $this->options,
|
||||
'image' => $this->image,
|
||||
'images' => $this->images,
|
||||
'description' => $this->description,
|
||||
'content' => $this->content,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
/**
|
||||
* 书记信箱
|
||||
*/
|
||||
class Feedback extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $fillable = ['content'];
|
||||
}
|
||||
|
|
@ -13,7 +13,7 @@ class PartyCate extends Model
|
|||
{
|
||||
use HasDateTimeFormatter, Filterable;
|
||||
|
||||
protected $fillable = ['name', 'master_id', 'plan_id', 'remarks', 'score', 'scores'];
|
||||
protected $fillable = ['name', 'master_id', 'plan_id', 'remarks', 'current_score', 'score', 'scores'];
|
||||
|
||||
protected $casts = [
|
||||
'scores' => 'array'
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ class PartyUser extends Authenticatable
|
|||
{
|
||||
use HasDateTimeFormatter, Filterable, HasApiTokens;
|
||||
|
||||
protected $fillable = ['username', 'password', 'name', 'avatar', 'cate_id', 'remarks', 'score', 'scores'];
|
||||
protected $fillable = ['username', 'password', 'name', 'avatar', 'cate_id', 'remarks', 'current_score', 'score', 'scores'];
|
||||
|
||||
protected $hidden = ['password'];
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ use Illuminate\Support\Str;
|
|||
|
||||
return [
|
||||
// 应用名称
|
||||
'name' => 'Owl Admin',
|
||||
'name' => '五星党建',
|
||||
|
||||
// 应用 logo
|
||||
'logo' => '/admin/logo.png',
|
||||
|
|
@ -66,7 +66,7 @@ return [
|
|||
|
||||
'layout' => [
|
||||
// 浏览器标题, 功能名称使用 %title% 代替
|
||||
'title' => '%title% | OwlAdmin',
|
||||
'title' => '%title% | 五星党建',
|
||||
'header' => [
|
||||
// 是否显示 [刷新] 按钮
|
||||
'refresh' => true,
|
||||
|
|
|
|||
|
|
@ -30,11 +30,13 @@ return new class extends Migration
|
|||
});
|
||||
|
||||
Schema::table('party_users', function (Blueprint $table) {
|
||||
$table->unsignedInteger('current_score')->default(0)->comment('当前得分');
|
||||
$table->unsignedInteger('score')->default(0)->comment('累计得分');
|
||||
$table->json('scores')->nullable()->comment('每项得分{score_cate_1: 10}');
|
||||
});
|
||||
|
||||
Schema::table('party_cates', function (Blueprint $table) {
|
||||
$table->unsignedInteger('current_score')->default(0)->comment('累计得分');
|
||||
$table->unsignedInteger('score')->default(0)->comment('累计得分');
|
||||
$table->json('scores')->nullable()->comment('每项得分{score_cate_1: 10}');
|
||||
});
|
||||
|
|
|
|||
|
|
@ -0,0 +1,30 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('feedback', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->text('content');
|
||||
$table->timestamps();
|
||||
|
||||
$table->comment('意见反馈');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('feedback');
|
||||
}
|
||||
};
|
||||
|
|
@ -28,6 +28,7 @@ class AdminMenuSeeder extends Seeder
|
|||
['title' => '广告管理', 'icon' => 'icon-park:picture-one', 'url' => '/banner', 'permission' => ['banner']],
|
||||
['title' => '支部排名', 'icon' => 'icon-park:sort-one', 'url' => '/cate-rank', 'permission' => ['cate-rank']],
|
||||
['title' => '个人排名', 'icon' => 'icon-park:sort-one', 'url' => '/user-rank', 'permission' => ['user-rank']],
|
||||
['title' => '书记信箱', 'icon' => 'icon-park:comment', 'url' => '/feedback', 'permission' => ['feedback']],
|
||||
['title' => '系统管理', 'icon' => 'icon-park:setting', 'url' => '/system', 'permission' => ['system'], 'children' => [
|
||||
['title' => '用户管理', 'icon' => 'icon-park:people-plus', 'url' => '/system/admin_users', 'permission' => ['admin_user']],
|
||||
['title' => '角色管理', 'icon' => 'icon-park:people-plus-one', 'url' => '/system/admin_roles', 'permission' => ['admin_rule']],
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ class PartyUserSeeder extends Seeder
|
|||
(new PartyCateFactory())->count(20)->create();
|
||||
(new PartyUserFactory())->count(100)->create();
|
||||
|
||||
UserScore::truncate();
|
||||
UserScore::factory()->count(100)->create();
|
||||
// UserScore::truncate();
|
||||
// UserScore::factory()->count(100)->create();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ class PermissionSeeder extends Seeder
|
|||
['name' => '广告管理', 'slug' => 'banner'],
|
||||
['name' => '党员排名', 'slug' => 'user_rank'],
|
||||
['name' => '支部排名', 'slug' => 'cate_rank'],
|
||||
['name' => '书记信箱', 'slug' => 'feedback'],
|
||||
['name' => '系统管理', 'slug' => 'system', 'children' => [
|
||||
['name' => '用户管理', 'slug' => 'admin_user'],
|
||||
['name' => '角色管理', 'slug' => 'admin_role'],
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'content' => '内容',
|
||||
];
|
||||
|
|
@ -11,4 +11,5 @@ return [
|
|||
'remarks' => '备注',
|
||||
'score' => '累计得分',
|
||||
'scores' => '五星维度',
|
||||
'current_score' => '当前得分',
|
||||
];
|
||||
|
|
|
|||
|
|
@ -12,5 +12,6 @@ return [
|
|||
'cate_id' => '党支部',
|
||||
'remarks' => '备注',
|
||||
'score' => '累计得分',
|
||||
'current_score' => '当前得分',
|
||||
'scores' => '五星维度',
|
||||
];
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
const toastElement = document.getElementById('toast')
|
||||
if (toastElement) {
|
||||
const toast = bootstrap.Toast.getOrCreateInstance(toastElement)
|
||||
toast.show()
|
||||
}
|
||||
|
|
@ -1,111 +0,0 @@
|
|||
@extends('layout')
|
||||
@section('title')
|
||||
{{ config('admin.name') }}
|
||||
@endsection
|
||||
@section('content')
|
||||
<div id="carousel" class="carousel slide">
|
||||
<div class="carousel-inner">
|
||||
<div class="carousel-item active">
|
||||
<img src="https://via.placeholder.com/800x300.png?text=1" class="d-block w-100" alt="..." width="100%" height="300">
|
||||
</div>
|
||||
<div class="carousel-item">
|
||||
<img src="https://via.placeholder.com/800x300.png?text=2" class="d-block w-100" alt="..." width="100%" height="300">
|
||||
</div>
|
||||
<div class="carousel-item">
|
||||
<img src="https://via.placeholder.com/800x300.png?text=3" class="d-block w-100" alt="..." width="100%" height="300">
|
||||
</div>
|
||||
</div>
|
||||
<button class="carousel-control-prev" type="button" data-bs-target="#carousel" data-bs-slide="prev" width="100%" height="300">
|
||||
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
|
||||
<span class="visually-hidden">Previous</span>
|
||||
</button>
|
||||
<button class="carousel-control-next" type="button" data-bs-target="#carousel" data-bs-slide="next">
|
||||
<span class="carousel-control-next-icon" aria-hidden="true"></span>
|
||||
<span class="visually-hidden">Next</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="container px-3 py-3">
|
||||
<div class="row g-2">
|
||||
<div class="feature col">
|
||||
<a href="#" class="feature-icon d-block">
|
||||
<img src="https://via.placeholder.com/600x300.png?text=4" alt="" width="100%" />
|
||||
</a>
|
||||
<h3 class="fs-2 mt-2 text-center">
|
||||
<a href="#">共性指标</a>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="feature col">
|
||||
<a href="#" class="feature-icon d-block">
|
||||
<img src="https://via.placeholder.com/600x300.png?text=5" alt="" width="100%" />
|
||||
</a>
|
||||
<h3 class="fs-2 mt-2 text-center">
|
||||
<a href="#">进阶指标</a>
|
||||
</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container px-3 py-3">
|
||||
<div class="card bg-danger">
|
||||
<div class="card-header text-white">
|
||||
五星党员
|
||||
</div>
|
||||
<ol class="list-group list-group-flush list-group-numbered">
|
||||
<li class="list-group-item d-flex gap-3 py-3">
|
||||
<img src="https://via.placeholder.com/32x32.png?text=A" alt="" width="32" height="32" class="rounded-circle flex-shrink-0">
|
||||
<div class="d-flex w-100 justify-content-between align-items-center">
|
||||
<b>姓名1</b>
|
||||
<small class="opacity-50 text-nowrap">党支部</small>
|
||||
</div>
|
||||
</li>
|
||||
<li class="list-group-item d-flex gap-3 py-3">
|
||||
<img src="https://via.placeholder.com/32x32.png?text=A" alt="" width="32" height="32" class="rounded-circle flex-shrink-0">
|
||||
<div class="d-flex w-100 justify-content-between align-items-center">
|
||||
<b>姓名2</b>
|
||||
<small class="opacity-50 text-nowrap">党支部</small>
|
||||
</div>
|
||||
</li>
|
||||
<li class="list-group-item d-flex gap-3 py-3">
|
||||
<img src="https://via.placeholder.com/32x32.png?text=A" alt="" width="32" height="32" class="rounded-circle flex-shrink-0">
|
||||
<div class="d-flex w-100 justify-content-between align-items-center">
|
||||
<b>姓名3</b>
|
||||
<small class="opacity-50 text-nowrap">党支部</small>
|
||||
</div>
|
||||
</li>
|
||||
<li class="list-group-item d-flex gap-3 py-3">
|
||||
<img src="https://via.placeholder.com/32x32.png?text=A" alt="" width="32" height="32" class="rounded-circle flex-shrink-0">
|
||||
<div class="d-flex w-100 justify-content-between align-items-center">
|
||||
<b>姓名4</b>
|
||||
<small class="opacity-50 text-nowrap">党支部</small>
|
||||
</div>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container px-3 py-3">
|
||||
<div class="card bg-warning">
|
||||
<div class="card-header text-white">五星支部</div>
|
||||
<ol class="list-group list-group-flush list-group-numbered">
|
||||
<li class="list-group-item d-flex gap-3 py-3">
|
||||
<div class="d-flex w-100 justify-content-between align-items-center">
|
||||
<b>党支部1</b>
|
||||
</div>
|
||||
</li>
|
||||
<li class="list-group-item d-flex gap-3 py-3">
|
||||
<div class="d-flex w-100 justify-content-between align-items-center">
|
||||
<b>党支部2</b>
|
||||
</div>
|
||||
</li>
|
||||
<li class="list-group-item d-flex gap-3 py-3">
|
||||
<div class="d-flex w-100 justify-content-between align-items-center">
|
||||
<b>党支部2</b>
|
||||
</div>
|
||||
</li>
|
||||
<li class="list-group-item d-flex gap-3 py-3">
|
||||
<div class="d-flex w-100 justify-content-between align-items-center">
|
||||
<b>党支部2</b>
|
||||
</div>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
<!doctype html>
|
||||
<html lang="{{ str_replace('_', '-', config('app.locale')) }}">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>@yield('title')</title>
|
||||
<link href="{{ url('bootstrap/bootstrap.min.css') }}" rel="stylesheet">
|
||||
@yield('style')
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar bg-dark border-bottom border-body" data-bs-theme="dark">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="#">{{ config('admin.name') }}</a>
|
||||
{{-- <ul class="nav nav-pills py-2">--}}
|
||||
{{-- <li class="nav-item"><a href="#" class="nav-link active" aria-current="page">Home</a></li>--}}
|
||||
{{-- <li class="nav-item"><a href="#" class="nav-link">Features</a></li>--}}
|
||||
{{-- <li class="nav-item"><a href="#" class="nav-link">Pricing</a></li>--}}
|
||||
{{-- <li class="nav-item"><a href="#" class="nav-link">FAQs</a></li>--}}
|
||||
{{-- </ul>--}}
|
||||
@if(auth('web')->check())
|
||||
<div class="flex-shrink-0 dropdown">
|
||||
<a href="#" class="d-block link-body-emphasis text-decoration-none dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
|
||||
@if(auth('web')->user()->avatar)
|
||||
<img src="{{ auth('web')->user()->avatar }}" alt="{{ auth('web')->user()->name }}" width="32" height="32" class="rounded-circle">
|
||||
@endif
|
||||
{{ auth('web')->user()->name }}
|
||||
</a>
|
||||
<ul class="dropdown-menu dropdown-menu-dark dropdown-menu-end">
|
||||
<li><a class="dropdown-item" href="{{ url('/profile') }}">个人中心</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" href="{{ url('/logout') }}">退出</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
@else
|
||||
<a href="{{ url('/login') }}" class="btn btn btn-outline-primary">登录</a>
|
||||
@endif
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="container py-1">
|
||||
@foreach($errors->all() as $error)
|
||||
<div class="alert alert-warning alert-dismissible" role="alert">
|
||||
{{ $error }}
|
||||
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@yield('content')
|
||||
<div class="container-fluid">
|
||||
<footer class="d-flex flex-wrap justify-content-between align-items-center py-3 my-4 border-top">
|
||||
<p class="col-md-4 mb-0 text-body-secondary">© 2023 Company, Inc</p>
|
||||
</footer>
|
||||
</div>
|
||||
<script src="{{ url('bootstrap/bootstrap.bundle.min.js') }}"></script>
|
||||
@yield('script')
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
@extends('layout')
|
||||
@section('title')
|
||||
登录
|
||||
@endsection
|
||||
@section('style')
|
||||
<style>
|
||||
.form-login {
|
||||
max-width: 330px;
|
||||
padding: 1rem;
|
||||
}
|
||||
.form-login input[name="username"] {
|
||||
margin-bottom: -1px;
|
||||
border-bottom-right-radius: 0;
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
|
||||
.form-login input[name="password"] {
|
||||
margin-bottom: 10px;
|
||||
border-top-left-radius: 0;
|
||||
border-top-right-radius: 0;
|
||||
}
|
||||
|
||||
</style>
|
||||
@endsection
|
||||
@section('content')
|
||||
<div class="d-flex align-items-center py-4 bg-body-tertiary">
|
||||
<div class="form-login w-100 m-auto">
|
||||
<form action="{{ url('/login') }}" method="post">
|
||||
{{ csrf_field() }}
|
||||
<div class="form-floating">
|
||||
<input type="text" class="form-control" id="username" name="username" placeholder="请输入用户名" value="{{ old('username') }}" required>
|
||||
<label for="username">用户名</label>
|
||||
</div>
|
||||
<div class="form-floating">
|
||||
<input type="password" class="form-control" id="password" name="password" placeholder="请输入密码" required>
|
||||
<label for="password">密码</label>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary w-100 py-2">登录</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
@extends('layout')
|
||||
@section('title')
|
||||
考核填报
|
||||
@endsection
|
||||
@section('content')
|
||||
<div class="container">
|
||||
<form class="py-3" action="" method="post" enctype="multipart/form-data">
|
||||
<div class="mb-3 row">
|
||||
<label for="input-title" class="col-2 col-form-label">{{ __('user_score.title') }}</label>
|
||||
<div class="col-10">
|
||||
<input type="text" class="form-control" id="input-title" placeholder="请填写{{ __('user_score.title') }}" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3 row">
|
||||
<label for="input-content" class="col-2 col-form-label">{{ __('user_score.content') }}</label>
|
||||
<div class="col-10">
|
||||
<textarea class="form-control" name="content" id="input-content" placeholder="请填写{{ __('user_score.content') }}"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3 row">
|
||||
<label for="input-images" class="col-2 col-form-label">{{ __('user_score.images') }}</label>
|
||||
<div class="col-10">
|
||||
<input type="file" class="form-control" id="input-images" name="images[]" multiple />
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3 row">
|
||||
<label for="input-file" class="col-2 col-form-label">{{ __('user_score.file') }}</label>
|
||||
<div class="col-10">
|
||||
<input type="file" class="form-control" id="input-file" name="file" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-10 offset-2">
|
||||
<button type="submit" class="btn btn-primary">提交</button>
|
||||
<button type="button" class="btn btn-secondary" onclick="window.history.back();">返回</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@endsection
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
@extends('layout')
|
||||
@section('title')
|
||||
考核填报
|
||||
@endsection
|
||||
@section('content')
|
||||
<div class="container">
|
||||
<div class="list-group py-3">
|
||||
<a href="{{ url('score/add') }}" class="list-group-item">政治忠诚</a>
|
||||
<a href="{{ url('score/add') }}" class="list-group-item">政治忠诚</a>
|
||||
<a href="{{ url('score/add') }}" class="list-group-item">政治忠诚</a>
|
||||
<a href="{{ url('score/add') }}" class="list-group-item">政治忠诚</a>
|
||||
<a href="{{ url('score/add') }}" class="list-group-item">政治忠诚</a>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
|
@ -1,65 +0,0 @@
|
|||
@extends('layout')
|
||||
@section('title')
|
||||
个人中心
|
||||
@endsection
|
||||
@section('content')
|
||||
<div class="container">
|
||||
<div class="card my-3">
|
||||
<div class="card-header d-flex justify-content-between align-items-center">
|
||||
<div>
|
||||
<img src="https://via.placeholder.com/64x64.png?A" alt="a" class="rounded-circle" width="48" height="48" />
|
||||
<b>姓名</b>
|
||||
</div>
|
||||
<span class="badge bg-danger rounded-pill">党支部</span>
|
||||
</div>
|
||||
<div class="list-group list-group-flush">
|
||||
<div class="list-group-item d-flex justify-content-center">
|
||||
<div id="echart" style="height: 250px;width: 330px;"></div>
|
||||
</div>
|
||||
<div class="list-group-item d-flex justify-content-between align-items-center">
|
||||
<b>当前得星: 10</b>
|
||||
<span class="badge bg-danger rounded-pill">排名: 12</span>
|
||||
</div>
|
||||
<div class="list-group-item">
|
||||
<b>历史得星: 20</b>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer d-flex justify-content-between">
|
||||
<a href="{{ url('score/select') }}" class="btn btn-primary">考核填报</a>
|
||||
<a href="" class="btn btn-secondary">意见反馈</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
@section('script')
|
||||
<script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.4.3/echarts.js"></script>
|
||||
<script>
|
||||
var element = document.getElementById('echart');
|
||||
var chart = echarts.init(element);
|
||||
var option = {
|
||||
radar: {
|
||||
indicator: [
|
||||
{ name: '政治忠诚', max: 50 },
|
||||
{ name: '政治定力', max: 50 },
|
||||
{ name: '政治担当', max: 50 },
|
||||
{ name: '政治能力', max: 50 },
|
||||
{ name: '政治自律', max: 50 },
|
||||
]
|
||||
},
|
||||
series: [
|
||||
{
|
||||
type: 'radar',
|
||||
areaStyle: {
|
||||
opacity: 0.9
|
||||
},
|
||||
data: [
|
||||
{
|
||||
value: [33, 14, 28, 26, 42],
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
};
|
||||
chart.setOption(option)
|
||||
</script>
|
||||
@endsection
|
||||
|
|
@ -15,3 +15,11 @@ use Illuminate\Support\Facades\Route;
|
|||
*/
|
||||
|
||||
Route::post('web/upload', [\App\Http\Controllers\WebController::class, 'upload']);
|
||||
|
||||
Route::post('login', [\App\Http\Controllers\Api\AuthController::class, 'login']);
|
||||
|
||||
Route::group(['middleware' => 'auth:api'], function () {
|
||||
Route::get('logout', [\App\Http\Controllers\Api\AccountController::class, 'logout']);
|
||||
Route::get('user/profile', [\App\Http\Controllers\Api\AccountController::class, 'profile']);
|
||||
Route::post('user/profile', [\App\Http\Controllers\Api\AccountController::class, 'update']);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -13,14 +13,4 @@ use Illuminate\Support\Facades\Route;
|
|||
|
|
||||
*/
|
||||
|
||||
Route::view('/', 'index');
|
||||
|
||||
Route::view('/login', 'login')->middleware('guest:web');
|
||||
Route::post('/login', [\App\Http\Controllers\Web\AuthController::class, 'login']);
|
||||
Route::group(['middleware' => 'auth:web'], function () {
|
||||
Route::any('/logout', [\App\Http\Controllers\Web\AuthController::class, 'logout'])->middleware('auth:web');
|
||||
|
||||
Route::view('profile', 'user.profile');
|
||||
Route::view('score/select', 'score.select-category');
|
||||
Route::view('score/add', 'score.add');
|
||||
});
|
||||
Route::view('/', 'admin');
|
||||
|
|
|
|||
Loading…
Reference in New Issue