1
0
Fork 0
master
panliang 2023-12-08 13:14:22 +08:00
parent 0c6ddaf1c5
commit 37dc686af0
35 changed files with 274 additions and 387 deletions

View File

@ -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);
}
}

View File

@ -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(

View File

@ -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(),

View File

@ -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 = '';
}

View File

@ -80,6 +80,7 @@ class PartyCateService extends BaseService
}
$info->update([
'score' => $info->score + $score,
'current_score' => $info->current_score + $score,
'scores' => $scores,
]);
}

View File

@ -78,6 +78,7 @@ class PartyUserService extends BaseService
}
$user->update([
'score' => $user->score + $score,
'current_score' => $user->current_score + $score,
'scores' => $scores,
]);

View File

@ -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');
});

View File

@ -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
]);
}
}

View File

@ -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
]);
}
}

View File

@ -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();
}
}

View File

@ -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,
// ]);
// }
}

View File

@ -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));
}
}

View File

@ -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');
}
}

View File

@ -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,
];
}
}

View File

@ -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'];
}

View File

@ -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'

View File

@ -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'];

View File

@ -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,

View File

@ -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}');
});

View File

@ -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');
}
};

View File

@ -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']],

View File

@ -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();
}
}

View File

@ -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'],

View File

@ -0,0 +1,5 @@
<?php
return [
'content' => '内容',
];

View File

@ -11,4 +11,5 @@ return [
'remarks' => '备注',
'score' => '累计得分',
'scores' => '五星维度',
'current_score' => '当前得分',
];

View File

@ -12,5 +12,6 @@ return [
'cate_id' => '党支部',
'remarks' => '备注',
'score' => '累计得分',
'current_score' => '当前得分',
'scores' => '五星维度',
];

View File

@ -0,0 +1,5 @@
const toastElement = document.getElementById('toast')
if (toastElement) {
const toast = bootstrap.Toast.getOrCreateInstance(toastElement)
toast.show()
}

View File

@ -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

View File

@ -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">&copy; 2023 Company, Inc</p>
</footer>
</div>
<script src="{{ url('bootstrap/bootstrap.bundle.min.js') }}"></script>
@yield('script')
</body>
</html>

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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']);
});

View File

@ -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');