diff --git a/.gitignore b/.gitignore index 7fe978f..ea48c4c 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ yarn-error.log /.fleet /.idea /.vscode +.user.ini diff --git a/app/Admin/Controllers/ActivityController.php b/app/Admin/Controllers/ActivityController.php new file mode 100644 index 0000000..698c252 --- /dev/null +++ b/app/Admin/Controllers/ActivityController.php @@ -0,0 +1,68 @@ +baseCRUD()->tableLayout('fixed') + ->headerToolbar([ + $this->createTypeButton('drawer', 'lg'), + ...$this->baseHeaderToolBar(), + ]) + ->filter($this->baseFilter()->labelWidth('80px')->body([ + amis()->GroupControl()->mode('horizontal')->body([ + amis()->TextControl('id', __('admin.id'))->columnRatio(3) + ->placeholder(__('admin.id')), + amis()->TextControl('name', __('admin.activities.name'))->columnRatio(3) + ->placeholder(__('admin.activities.name')), + ]), + ])) + ->columns([ + amis()->TableColumn('id', __('admin.id'))->width('50px')->sortable(), + amis()->TableColumn('name', __('admin.activities.name')), + amis()->TableColumn('state', __('admin.activities.state')), + amis()->TableColumn('start_at', __('admin.activities.start_at')), + amis()->TableColumn('end_at', __('admin.activities.end_at')), + + amis()->TableColumn('created_at', __('admin.created_at'))->type('datetime')->sortable(true), + Operation::make()->label(__('admin.actions'))->buttons([ + //发布活动-todo + //结算活动(参与时间结束后,且最后一场竞猜结束,点击结算则发送奖品)-todo + $this->rowShowTypeButton('drawer', 'xl'),//活动详情-todo-//竞猜赛程//活动奖品 + ]) + ]); + + return $this->baseList($crud); + } + + public function form($isEdit = false): Form + { + return $this->baseForm()->body([ + amis()->TextControl('name', __('admin.activities.name'))->required(true), + Components::make()->cropImageControl('cover', __('admin.activities.cover'))->required(true), + amis()->DateRangeControl('activity_at', __('admin.activities.activity_at'))->clearable(false)->format('YYYY-MM-DD HH:mm:ss')->required(true), + amis()->TextareaControl('rules', __('admin.activities.rules')) + ]); + } + + public function detail(): Form + { + return $this->baseDetail()->body([ + + ]); + } +} \ No newline at end of file diff --git a/app/Admin/Controllers/ArticleController.php b/app/Admin/Controllers/ArticleController.php index 2c646cc..2983bcb 100644 --- a/app/Admin/Controllers/ArticleController.php +++ b/app/Admin/Controllers/ArticleController.php @@ -31,7 +31,7 @@ class ArticleController extends AdminController amis()->TextControl('title', __('admin.articles.title')) ->placeholder(__('admin.articles.title')), Components::make()->parentControl(admin_url('api/keywords/tree-list?parent_name=article_category&has_owner=0'), 'category', __('admin.articles.category'), 'name', 'key'), - Components::make()->keywordsTagControl('t_ids', __('admin.articles.tags'), 'article_tag'), + // Components::make()->keywordsTagControl('t_ids', __('admin.articles.tags'), 'article_tag'), ]), amis()->GroupControl()->mode('horizontal')->body([ amis()->SelectControl('enable', __('admin.articles.is_enable')) @@ -64,8 +64,8 @@ class ArticleController extends AdminController amis()->TableColumn('category', __('admin.articles.category'))->type('mapping') ->map(Keyword::allChildrenOfKey('article_category')->pluck('name', 'key')->toArray()) ->itemSchema(amis()->Tag()->label('${item}')->color(Admin::setting()->get('system_theme_setting')['theme_color'] ?? '#1677ff')), - amis()->TableColumn('tags', __('admin.articles.tags'))->type('mapping')->map(Keyword::tagsMap('article_tag')), - amis()->TableColumn('cover', __('admin.articles.cover'))->type('image')->height('50px')->width('50px')->enlargeAble(true), + // amis()->TableColumn('tags', __('admin.articles.tags'))->type('mapping')->map(Keyword::tagsMap('article_tag')), + // amis()->TableColumn('cover', __('admin.articles.cover'))->type('image')->height('50px')->width('50px')->enlargeAble(true), amis()->TableColumn('published_at', __('admin.articles.published_at'))->remark(__('admin.articles.published_at_remark')), amis()->TableColumn('is_enable', __('admin.articles.is_enable'))->type('switch'), amis()->TableColumn('is_recommend', __('admin.articles.is_recommend'))->type('switch'), @@ -88,11 +88,12 @@ class ArticleController extends AdminController Components::make()->parentControl(admin_url('api/keywords/tree-list?parent_name=article_category&has_owner=0'), 'category', __('admin.articles.category'), 'name', 'key'), Components::make()->keywordsTagControl('t_ids', __('admin.articles.tags'), 'article_tag'), Components::make()->cropImageControl('cover', __('admin.articles.cover')), + amis()->TextControl('source', __('admin.articles.source')), Components::make()->sortControl('sort', __('admin.articles.sort')), amis()->DateTimeControl('published_at', __('admin.articles.published_at'))->format('YYYY-MM-DD HH:mm:ss')->description(__('admin.articles.published_at_remark')), amis()->SwitchControl('is_enable', __('admin.articles.is_enable'))->value(false), amis()->SwitchControl('is_recommend', __('admin.articles.is_recommend'))->value(false), - Components::make()->fileControl('appendixes', __('admin.articles.appendixes'), '.xsl,.xlsx,.txt,.doc,.docx,.pdf,.pptx'), + // Components::make()->fileControl('appendixes', __('admin.articles.appendixes'), '.xsl,.xlsx,.txt,.doc,.docx,.pdf,.pptx'), ])->md(4), amis()->Wrapper()->body([ Components::make()->fuEditorControl('content', __('admin.articles.content')), diff --git a/app/Admin/Controllers/UserController.php b/app/Admin/Controllers/UserController.php new file mode 100644 index 0000000..24b5c41 --- /dev/null +++ b/app/Admin/Controllers/UserController.php @@ -0,0 +1,65 @@ +baseCRUD()->tableLayout('fixed') + ->headerToolbar([ + amis('reload')->align('right'), + amis('filter-toggler')->align('right'), + ]) + ->filter($this->baseFilter()->labelWidth('80px')->body([ + amis()->GroupControl()->mode('horizontal')->body([ + amis()->TextControl('id', __('admin.id'))->columnRatio(3) + ->placeholder(__('admin.id')), + amis()->TextControl('nick_name', __('admin.users.nick_name'))->columnRatio(3) + ->placeholder(__('admin.users.nick_name')), + amis()->TextControl('phone', __('admin.users.phone'))->columnRatio(3) + ->placeholder(__('admin.users.phone')), + ]), + ])) + ->columns([ + amis()->TableColumn('id', __('admin.id'))->width('50px')->sortable(), + amis()->TableColumn('nick_name', __('admin.users.nick_name')), + amis()->TableColumn('avatar', __('admin.users.avatar'))->type('image')->height('50px')->width('50px')->enlargeAble(true), + amis()->TableColumn('phone', __('admin.users.phone')), + amis()->TableColumn('mini_openid', __('admin.users.mini_openid')), + amis()->TableColumn('last_login_at', __('admin.users.last_login_at')), + amis()->TableColumn('last_login_ip', __('admin.users.last_login_ip')), + + amis()->TableColumn('created_at', __('admin.users.created_at'))->type('datetime')->sortable(true), + Operation::make()->label(__('admin.actions'))->buttons([ + $this->rowShowTypeButton('drawer', 'xl'), + ]) + ]); + + return $this->baseList($crud); + } + + public function form($isEdit = false): Form + { + return $this->baseForm()->body([ + ]); + } + + public function detail(): Form + { + return $this->baseDetail()->body([ + + ]); + } +} \ No newline at end of file diff --git a/app/Admin/routes.php b/app/Admin/routes.php index b080bf1..a8d7bee 100644 --- a/app/Admin/routes.php +++ b/app/Admin/routes.php @@ -32,6 +32,10 @@ Route::group([ $router->resource('ads', \App\Admin\Controllers\AdController::class); + $router->resource('users', \App\Admin\Controllers\UserController::class)->only(['index', 'show']); + + $router->resource('activities', \App\Admin\Controllers\ActivityController::class); + //修改上传 $router->post('upload_file', [\App\Admin\Controllers\IndexController::class, 'uploadFile']); $router->post('upload_image', [\App\Admin\Controllers\IndexController::class, 'uploadImage']); diff --git a/app/Enums/Score.php b/app/Enums/Score.php new file mode 100644 index 0000000..ddfd66c --- /dev/null +++ b/app/Enums/Score.php @@ -0,0 +1,47 @@ +name] = $score->value; + } + return $options; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Api/AuthController.php b/app/Http/Controllers/Api/AuthController.php new file mode 100644 index 0000000..1730717 --- /dev/null +++ b/app/Http/Controllers/Api/AuthController.php @@ -0,0 +1,7 @@ +where('id', $id); + } + /** + * 昵称 + */ + public function name($name) + { + return $this->where('name','like', $name.'%'); + } +} diff --git a/app/Models/Filters/UserFilter.php b/app/Models/Filters/UserFilter.php new file mode 100644 index 0000000..5c10c97 --- /dev/null +++ b/app/Models/Filters/UserFilter.php @@ -0,0 +1,33 @@ +where('id', $id); + } + /** + * 昵称 + */ + public function nickName($nickName) + { + return $this->where('nick_name','like', $nickName.'%'); + } + + /** + * 手机号 + */ + public function phone($phone) + { + return $this->where('phone','like', $phone.'%'); + } + +} diff --git a/app/Models/User.php b/app/Models/User.php index 4d7f70f..aaf4b80 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -7,10 +7,11 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; +use EloquentFilter\Filterable; class User extends Authenticatable { - use HasApiTokens, HasFactory, Notifiable; + use HasApiTokens, HasFactory, Notifiable, Filterable; /** * The attributes that are mass assignable. @@ -18,28 +19,12 @@ class User extends Authenticatable * @var array */ protected $fillable = [ - 'name', - 'email', - 'password', - ]; - - /** - * The attributes that should be hidden for serialization. - * - * @var array - */ - protected $hidden = [ - 'password', - 'remember_token', - ]; - - /** - * The attributes that should be cast. - * - * @var array - */ - protected $casts = [ - 'email_verified_at' => 'datetime', - 'password' => 'hashed', + 'nick_name', + 'avatar', + 'phone', + 'mini_openid', + 'union_id', + 'last_login_at', + 'last_login_ip' ]; } diff --git a/app/Models/UserActivity.php b/app/Models/UserActivity.php new file mode 100644 index 0000000..dd162d7 --- /dev/null +++ b/app/Models/UserActivity.php @@ -0,0 +1,11 @@ +id(); - $table->string('name'); - $table->string('email')->unique(); - $table->timestamp('email_verified_at')->nullable(); - $table->string('password'); + $table->string('mini_openid')->comment('小程序openid'); + $table->string('union_id')->nullable()->default('')->comment('微信唯一标识'); + $table->string('nick_name')->nullable()->default('')->comment('微信昵称'); + $table->string('avatar')->nullable()->default('')->comment('微信头像'); + $table->string('phone')->nullable()->default('')->comment('手机号'); + $table->timestamp('last_login_at')->nullable()->comment('上次登录时间'); + $table->timestamp('last_login_ip')->nullable()->comment('上次登录ip'); + $table->rememberToken(); $table->timestamps(); }); diff --git a/database/migrations/2024_05_16_112901_create_activities_table.php b/database/migrations/2024_05_16_112901_create_activities_table.php new file mode 100644 index 0000000..3cbefe4 --- /dev/null +++ b/database/migrations/2024_05_16_112901_create_activities_table.php @@ -0,0 +1,33 @@ +id(); + $table->string('name')->comment('名称'); + $table->string('cover')->nullable()->comment('封面图'); + $table->timestamp('start_at')->comment('开始时间'); + $table->timestamp('end_at')->comment('结束时间'); + $table->text('rules')->nullable()->comment('规则内容'); + $table->unsignedTinyInteger('state')->comment('状态:0未发布,1进行中,2已开奖'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('activities'); + } +}; diff --git a/database/migrations/2024_05_16_114837_create_activity_games_table.php b/database/migrations/2024_05_16_114837_create_activity_games_table.php new file mode 100644 index 0000000..bbf729a --- /dev/null +++ b/database/migrations/2024_05_16_114837_create_activity_games_table.php @@ -0,0 +1,38 @@ +id(); + $table->unsignedBigInteger('activity_id'); + $table->string('name')->comment('名称'); + $table->string('home_field')->comment('主场'); + $table->string('home_logo')->comment('主场logo'); + $table->string('away')->comment('客场'); + $table->string('away_logo')->comment('客场logo'); + $table->timestamp('game_at')->comment('比赛时间'); + $table->unsignedTinyInteger('state')->comment('状态:0未发布,1已发布,2已公布'); + $table->unsignedInteger('mark')->comment('分数'); + $table->enum('score', Score::options())->nullable()->comment('比赛结果'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('activity_games'); + } +}; diff --git a/database/migrations/2024_05_16_114849_create_activity_gifts_table.php b/database/migrations/2024_05_16_114849_create_activity_gifts_table.php new file mode 100644 index 0000000..0228e3e --- /dev/null +++ b/database/migrations/2024_05_16_114849_create_activity_gifts_table.php @@ -0,0 +1,31 @@ +id(); + $table->unsignedBigInteger('activity_id'); + $table->string('name')->comment('名称'); + $table->string('logo')->nullable()->comment('图片'); + $table->unsignedInteger('rank')->comment('第几名获得'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('activity_gifts'); + } +}; diff --git a/database/migrations/2024_05_16_153926_create_user_activities_table.php b/database/migrations/2024_05_16_153926_create_user_activities_table.php new file mode 100644 index 0000000..94b0821 --- /dev/null +++ b/database/migrations/2024_05_16_153926_create_user_activities_table.php @@ -0,0 +1,34 @@ +id(); + $table->unsignedBigInteger('user_id'); + $table->unsignedBigInteger('activity_id'); + $table->unsignedInteger('mark')->default(0)->comment('分数'); + $table->unsignedInteger('join_time')->default(0)->comment('竞猜次数'); + $table->unsignedInteger('right_time')->default(0)->comment('猜对次数'); + $table->timestamp('last_join_at')->comment('最后一次竞猜时间'); + $table->unsignedTinyInteger('has_gift')->default(0)->comment('是否获奖'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('user_activities'); + } +}; diff --git a/database/migrations/2024_05_16_154821_create_user_games_table.php b/database/migrations/2024_05_16_154821_create_user_games_table.php new file mode 100644 index 0000000..b2a0c50 --- /dev/null +++ b/database/migrations/2024_05_16_154821_create_user_games_table.php @@ -0,0 +1,33 @@ +id(); + $table->unsignedBigInteger('user_id'); + $table->unsignedBigInteger('activity_id'); + $table->unsignedBigInteger('game_id'); + $table->enum('score', Score::options())->nullable()->comment('竞猜结果'); + $table->unsignedTinyInteger('is_right')->default(0)->comment('是否答对'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('user_games'); + } +}; diff --git a/database/migrations/2024_05_16_155008_create_user_gifts_table.php b/database/migrations/2024_05_16_155008_create_user_gifts_table.php new file mode 100644 index 0000000..72ca456 --- /dev/null +++ b/database/migrations/2024_05_16_155008_create_user_gifts_table.php @@ -0,0 +1,36 @@ +id(); + $table->unsignedBigInteger('user_id'); + $table->unsignedBigInteger('activity_id'); + $table->unsignedBigInteger('gift_id'); + $table->string('consignee')->nullable()->comment('收货人'); + $table->string('address')->nullable()->comment('收货地址'); + $table->string('phone')->nullable()->comment('联系电话'); + $table->string('shipping_company')->nullable()->comment('快递公司'); + $table->string('shipping_number')->nullable()->comment('快递号码'); + $table->unsignedTinyInteger('state')->default(0)->comment('状态:0未领取,1未发货,2已发货'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('user_gifts'); + } +}; diff --git a/database/migrations/2024_05_16_163922_add_source_to_articles_table.php b/database/migrations/2024_05_16_163922_add_source_to_articles_table.php new file mode 100644 index 0000000..5a7e13e --- /dev/null +++ b/database/migrations/2024_05_16_163922_add_source_to_articles_table.php @@ -0,0 +1,30 @@ +string('source')->nullable()->comment('来源'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('articles', function (Blueprint $table) { + // + $table->dropColumn(['source']); + }); + } +}; diff --git a/database/seeders/AdminMenuSeeder.php b/database/seeders/AdminMenuSeeder.php index 64d4d73..fbed7d5 100644 --- a/database/seeders/AdminMenuSeeder.php +++ b/database/seeders/AdminMenuSeeder.php @@ -20,7 +20,21 @@ class AdminMenuSeeder extends Seeder // $menus = [ ['title' => 'index', 'icon' => 'line-md:home-twotone-alt', 'url' => '/index', 'is_home'=>1, 'order'=>1], - ['title' => 'admin_system', 'icon' => 'material-symbols:settings-outline', 'url' => '/system', 'order'=>2, + + ['title' => 'users', 'icon' => 'bx:user-circle', 'url' => '/users', 'order'=>2], + ['title' => 'activity', 'icon' => 'akar-icons:star', 'url' => '/activity', 'order' => 3, + 'children' => [ + ['title'=> 'activites', 'icon'=> 'bx:football', 'url' => '/activities', 'order'=>1], + ['title'=> 'activity_gifts', 'icon'=> 'akar-icons:gift', 'url' => '/activity_gifts', 'order'=>1], + ] + ], + ['title' => 'web_content', 'icon' => 'ic:outline-collections-bookmark', 'url' => '', 'order'=>4, + 'children' =>[ + ['title'=>'articles', 'icon'=>'ic:outline-article','url'=>'/articles', 'order'=>1], + ['title'=>'ads', 'icon'=>'lets-icons:img-box','url'=>'/ads', 'order'=>2], + ] + ], + ['title' => 'admin_system', 'icon' => 'material-symbols:settings-outline', 'url' => '/system', 'order'=>5, 'children' => [ ['title' => 'admin_users', 'icon' => 'ph:user-gear', 'url' => '/system/admin_users', 'order'=>1], ['title' => 'admin_roles', 'icon' => 'carbon:user-role', 'url' => '/system/admin_roles', 'order'=>2], @@ -29,12 +43,6 @@ class AdminMenuSeeder extends Seeder ['title' => 'admin_setting', 'icon' => 'akar-icons:settings-horizontal', 'url' => '/system/settings', 'order'=>5], ['title' => 'keywords', 'icon' => 'ph:codesandbox-logo-light', 'url' => '/system/keywords', 'order'=>6] ], - ], - ['title' => 'web_content', 'icon' => 'ic:outline-collections-bookmark', 'url' => '', 'order'=>3, - 'children' =>[ - ['title'=>'articles', 'icon'=>'ic:outline-article','url'=>'/articles', 'order'=>1], - ['title'=>'ads', 'icon'=>'lets-icons:img-box','url'=>'/ads', 'order'=>2], - ] ] ]; DB::table('admin_menus')->truncate(); diff --git a/lang/zh_CN/admin.php b/lang/zh_CN/admin.php index a888d66..209a881 100644 --- a/lang/zh_CN/admin.php +++ b/lang/zh_CN/admin.php @@ -1,6 +1,7 @@ '编号', 'remember_me' => '记住我', 'login' => '登 录', 'logout' => '退出登录', @@ -283,6 +284,7 @@ return [ 'sort' => '排序', 'appendixes' => '附件', 'published_at_remark' => '*若未设置发布时间且操作设置为显示,则默认生成发布时间', + 'source'=>'来源' ], 'ads' => [ 'id' => 'ID', @@ -302,5 +304,23 @@ return [ 'mini_id' => '小程序ID', 'mini_link'=> '小程序路径' ], + ], + 'users'=> [ + 'nick_name' => '昵称', + 'avatar' => '头像', + 'phone' => '手机号', + 'mini_openid' => '小程序唯一标识', + 'last_login_at' => '上次登录时间', + 'last_login_ip' => '上次登录IP', + 'created_at' => '首次进入时间', + ], + 'activities' => [ + 'name' => '活动名称', + 'state' => '状态', + 'activity_at' => '活动期限', + 'start_at' => '开始时间', + 'end_at' => '结束时间', + 'rules' => '规则内容', + 'cover' => '活动封面' ] ]; diff --git a/lang/zh_CN/menu.php b/lang/zh_CN/menu.php index dbedcd6..be478f9 100644 --- a/lang/zh_CN/menu.php +++ b/lang/zh_CN/menu.php @@ -13,4 +13,8 @@ return [ 'web_content' => '内容管理', 'articles' => '文章管理', 'ads' => '广告管理', + 'activity' => '活动中心', + 'activites'=> '足彩竞猜', + 'activity_gifts' => '获奖列表', + 'users' => '会员管理' ]; diff --git a/storage/app/.gitignore b/storage/app/.gitignore old mode 100644 new mode 100755 diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/.gitignore b/storage/framework/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/cache/.gitignore b/storage/framework/cache/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/cache/data/.gitignore b/storage/framework/cache/data/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/sessions/.gitignore b/storage/framework/sessions/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/testing/.gitignore b/storage/framework/testing/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/views/.gitignore b/storage/framework/views/.gitignore old mode 100644 new mode 100755 diff --git a/storage/logs/.gitignore b/storage/logs/.gitignore old mode 100644 new mode 100755