first commit

This commit is contained in:
Eric Li
2025-06-13 12:09:50 +08:00
commit b12cd07419
545 changed files with 39389 additions and 0 deletions

18
.editorconfig Normal file
View File

@ -0,0 +1,18 @@
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
[*.{yml,yaml}]
indent_size = 2
[docker-compose.yml]
indent_size = 4

61
.env.example Normal file
View File

@ -0,0 +1,61 @@
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:+yprEO2olPYKOgE6LbqOzBEHDaqvP7c6p5Uh4R0i978=
APP_DEBUG=true
APP_URL=http://dph-tycg-event.styledesign.com.tw
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=mysql8.0
DB_PORT=3306
DB_DATABASE=laravel_dph-tycg-event_styledesign_com_tw
DB_USERNAME=root
DB_PASSWORD=secret
BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
REDIS_HOST=redis6
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1
VITE_APP_NAME="${APP_NAME}"
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
# SYSTEM PHP VERSION
SYS_PHP_VER=8.1

11
.gitattributes vendored Normal file
View File

@ -0,0 +1,11 @@
* text=auto eol=lf
*.blade.php diff=html
*.css diff=css
*.html diff=html
*.md diff=markdown
*.php diff=php
/.github export-ignore
CHANGELOG.md export-ignore
.styleci.yml export-ignore

19
.gitignore vendored Normal file
View File

@ -0,0 +1,19 @@
/.phpunit.cache
/node_modules
/public/build
/public/hot
/public/storage
/storage/*.key
/vendor
.env
.env.backup
.env.production
.phpunit.result.cache
Homestead.json
Homestead.yaml
auth.json
npm-debug.log
yarn-error.log
/.fleet
/.idea
/.vscode

66
README.md Normal file
View File

@ -0,0 +1,66 @@
<p align="center"><a href="https://laravel.com" target="_blank"><img src="https://raw.githubusercontent.com/laravel/art/master/logo-lockup/5%20SVG/2%20CMYK/1%20Full%20Color/laravel-logolockup-cmyk-red.svg" width="400" alt="Laravel Logo"></a></p>
<p align="center">
<a href="https://github.com/laravel/framework/actions"><img src="https://github.com/laravel/framework/workflows/tests/badge.svg" alt="Build Status"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/dt/laravel/framework" alt="Total Downloads"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/v/laravel/framework" alt="Latest Stable Version"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/l/laravel/framework" alt="License"></a>
</p>
## About Laravel
Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:
- [Simple, fast routing engine](https://laravel.com/docs/routing).
- [Powerful dependency injection container](https://laravel.com/docs/container).
- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage.
- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent).
- Database agnostic [schema migrations](https://laravel.com/docs/migrations).
- [Robust background job processing](https://laravel.com/docs/queues).
- [Real-time event broadcasting](https://laravel.com/docs/broadcasting).
Laravel is accessible, powerful, and provides tools required for large, robust applications.
## Learning Laravel
Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework.
You may also try the [Laravel Bootcamp](https://bootcamp.laravel.com), where you will be guided through building a modern Laravel application from scratch.
If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library.
## Laravel Sponsors
We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com).
### Premium Partners
- **[Vehikl](https://vehikl.com/)**
- **[Tighten Co.](https://tighten.co)**
- **[WebReinvent](https://webreinvent.com/)**
- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)**
- **[64 Robots](https://64robots.com)**
- **[Curotec](https://www.curotec.com/services/technologies/laravel/)**
- **[Cyber-Duck](https://cyber-duck.co.uk)**
- **[DevSquad](https://devsquad.com/hire-laravel-developers)**
- **[Jump24](https://jump24.co.uk)**
- **[Redberry](https://redberry.international/laravel/)**
- **[Active Logic](https://activelogic.com)**
- **[byte5](https://byte5.de)**
- **[OP.GG](https://op.gg)**
## Contributing
Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).
## Code of Conduct
In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).
## Security Vulnerabilities
If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed.
## License
The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).

27
app/Console/Kernel.php Normal file
View File

@ -0,0 +1,27 @@
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* Define the application's command schedule.
*/
protected function schedule(Schedule $schedule): void
{
// $schedule->command('inspire')->hourly();
}
/**
* Register the commands for the application.
*/
protected function commands(): void
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
class Handler extends ExceptionHandler
{
/**
* The list of the inputs that are never flashed to the session on validation exceptions.
*
* @var array<int, string>
*/
protected $dontFlash = [
'current_password',
'password',
'password_confirmation',
];
/**
* Register the exception handling callbacks for the application.
*/
public function register(): void
{
$this->reportable(function (Throwable $e) {
//
});
}
}

View File

@ -0,0 +1,37 @@
<?php
namespace App\Fields;
use Backpack\CRUD\app\Library\CrudPanel\CrudField;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade;
class IframeField
{
/**
* Create an iframe custom field.
*
* @param string $name Field name (not used for display, only for form data)
* @param string $label Field label
* @param array $options Additional options (url, width, height, extra_attributes, hint)
* @return CrudField
*/
public static function make(string $name, string $label, array $options = [])
{
$url = isset($options['url']) && is_callable($options['url'])
? $options['url'](CrudPanelFacade::getFacadeRoot())
: ($options['url'] ?? null);
$field = [
'name' => $name,
'label' => $label,
'type' => 'iframe',
'url' => $url, // URL to display in iframe
'width' => $options['width'] ?? '', // Iframe width
'height' => $options['height'] ?? '', // Iframe height
'extra_attributes' => $options['extra_attributes'] ?? [], // Additional iframe attributes
'hint' => $options['hint'] ?? null, // Help text
];
return \Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade::field($field);
}
}

View File

@ -0,0 +1,269 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Requests\EventHealthAllowanceRequest;
use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;
use App\Mail\EventNotifyMail;
use Illuminate\Support\Facades\Mail;
use Exception;
/**
* Class EventHealthAllowanceCrudController
* @package App\Http\Controllers\Admin
* @property-read \Backpack\CRUD\app\Library\CrudPanel\CrudPanel $crud
*/
class EventHealthAllowanceCrudController extends CrudController
{
use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation { update as traitUpdate; }
/**
* Configure the CrudPanel object. Apply settings to all operations.
*
* @return void
*/
public function setup()
{
CRUD::setModel(\App\Models\EventHealthAllowance::class);
CRUD::setRoute(config('backpack.base.route_prefix') . '/event-health-allowance');
CRUD::setEntityNameStrings('活動:反轉代謝新人生', '活動:反轉代謝新人生');
}
/**
* Define what happens when the List operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-list-entries
* @return void
*/
protected function setupListOperation()
{
$this->crud->addColumns([
[
'name' => 'created_at',
'label' => '登記時間',
'type' => 'datetime',
'format' => 'YYYY/MM/DD HH:mm:SS'
],
[
'name' => 'check_state',
'label' => '審核狀態',
'type' => 'select_from_array',
'options' => ['1' => '未審核  ', '2' => '通過  ', '3' => '未通過 ✖'],
],
[
'name' => 'twid',
'label' => '身份證',
'type' => 'text'
],
[
'name' => 'name',
'label' => '姓名',
'type' => 'text'
],
]);
}
/**
* Define what happens when the Create operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-create
* @return void
*/
protected function setupCreateOperation()
{
CRUD::setValidation(EventHealthAllowanceRequest::class);
$this->crud->addFields([
[
'name' => 'hospital_name',
'label' => '就醫院所',
'type' => 'text',
],
[
'name' => 'name',
'label' => '姓名',
'type' => 'text',
],
[
'name' => 'twid',
'label' => '身份證',
'type' => 'text',
],
[
'name' => 'phone',
'label' => '手機號碼',
'type' => 'text',
],
[
'name' => 'email',
'label' => 'Email',
'type' => 'text',
],
[
'name' => 'address',
'label' => '地址',
'type' => 'text',
],
[
'name' => 'check_state',
'label' => "審核狀態",
'type' => 'select_from_array',
'options' => ['1' => '未審核  ', '2' => '通過  ', '3' => '未通過 ✖'],
'allows_null' => false,
'default' => '1',
],
[
'name' => 'check_reson',
'label' => "審核回應(未通過原因)",
'type' => 'text',
],
]);
}
/**
* Define what happens when the Update operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-update
* @return void
*/
protected function setupUpdateOperation()
{
$this->setupCreateOperation();
CRUD::iframe('record_card_img_src', '記錄小卡', [
'url' => function ($crud) {
$entry = $crud->getCurrentEntry();
$path = str_replace("uploads/", "", $entry->record_card_img_src);
return $path ? route('storage.serve', $path) : "about:blank";
},
'width' => '400px',
'height' => '300px',
'extra_attributes' => [
'sandbox' => 'allow-same-origin allow-scripts allow-popups', // Security: Restrict iframe
'allow' => 'fullscreen',
],
'hint' => '',
]);
CRUD::iframe('twid_front_img_src', '身份證正面', [
'url' => function ($crud) {
$entry = $crud->getCurrentEntry();
$path = str_replace("uploads/", "", $entry->twid_front_img_src);
return $path ? route('storage.serve', $path) : "about:blank";
},
'width' => '400px',
'height' => '300px',
'extra_attributes' => [
'sandbox' => 'allow-same-origin allow-scripts allow-popups', // Security: Restrict iframe
'allow' => 'fullscreen',
],
'hint' => '',
]);
CRUD::iframe('twid_back_img_src', '身份證反面', [
'url' => function ($crud) {
$entry = $crud->getCurrentEntry();
$path = str_replace("uploads/", "", $entry->twid_back_img_src);
return $path ? route('storage.serve', $path) : "about:blank";
},
'width' => '400px',
'height' => '300px',
'extra_attributes' => [
'sandbox' => 'allow-same-origin allow-scripts allow-popups', // Security: Restrict iframe
'allow' => 'fullscreen',
],
'hint' => '',
]);
CRUD::iframe('exam_1st_img_src', '檢驗檢查報告1', [
'url' => function ($crud) {
$entry = $crud->getCurrentEntry();
$path = str_replace("uploads/", "", $entry->exam_1st_img_src);
return $path ? route('storage.serve', $path) : "about:blank";
},
'width' => '400px',
'height' => '300px',
'extra_attributes' => [
'sandbox' => 'allow-same-origin allow-scripts allow-popups', // Security: Restrict iframe
'allow' => 'fullscreen',
],
'hint' => '',
]);
CRUD::iframe('exam_2nd_img_src', '檢驗檢查報告2', [
'url' => function ($crud) {
$entry = $crud->getCurrentEntry();
$path = str_replace("uploads/", "", $entry->exam_2nd_img_src);
return $path ? route('storage.serve', $path) : "about:blank";
},
'width' => '400px',
'height' => '300px',
'extra_attributes' => [
'sandbox' => 'allow-same-origin allow-scripts allow-popups', // Security: Restrict iframe
'allow' => 'fullscreen',
],
'hint' => '',
]);
}
public function update()
{
$entry = $this->crud->getCurrentEntry();
$org_check_state = $entry->check_state;
// do something before validation, before save, before everything
$response = $this->traitUpdate();
// do something after save
$entry = $this->crud->getCurrentEntry();
if ($entry->check_state != $org_check_state) {
switch($entry->check_state) {
case '2': //過通
try {
Mail::to($entry->email)->send(new EventNotifyMail([
"title" => "反轉代謝新人生 皮蛇疫苗加碼補 審核通過!",
"body" => "恭喜您審核通過!"
."\n\n登記資料:"
."\n就醫院所:".$entry->hospital_name
."\n姓名:".$entry->name
."\n身份證字號:".substr($entry->twid,0,2)."xxxx".substr($entry->twid,-4)
."\n行動電話:".$entry->phone
."\n電子信箱:".$entry->email
."\n收件地址:".$entry->address
,
]));
} catch (Exception $ex) {
}
break;
case '3': //未通過
try {
Mail::to($entry->email)->send(new EventNotifyMail([
"title" => "反轉代謝新人生 皮蛇疫苗加碼補 未通過審核!",
"body" => "抱歉,您的審核未通過!"
."\n請依以下理由重新上活動網站登記"
."\n理由:".$entry->check_reson
."\n\n登記資料:"
."\n就醫院所:".$entry->hospital_name
."\n姓名:".$entry->name
."\n身份證字號:".substr($entry->twid,0,2)."xxxx".substr($entry->twid,-4)
."\n行動電話:".$entry->phone
."\n電子信箱:".$entry->email
."\n收件地址:".$entry->address
,
]));
} catch (Exception $ex) {
}
break;
}
}
return $response;
}
}

View File

@ -0,0 +1,252 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Requests\EventImprovedHealthRequest;
use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;
use App\Mail\EventNotifyMail;
use Illuminate\Support\Facades\Mail;
use Exception;
/**
* Class EventImprovedHealthCrudController
* @package App\Http\Controllers\Admin
* @property-read \Backpack\CRUD\app\Library\CrudPanel\CrudPanel $crud
*/
class EventImprovedHealthCrudController extends CrudController
{
use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation { update as traitUpdate; }
/**
* Configure the CrudPanel object. Apply settings to all operations.
*
* @return void
*/
public function setup()
{
CRUD::setModel(\App\Models\EventImprovedHealth::class);
CRUD::setRoute(config('backpack.base.route_prefix') . '/event-improved-health');
CRUD::setEntityNameStrings('活動健康達標GO', '活動健康達標GO');
}
/**
* Define what happens when the List operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-list-entries
* @return void
*/
protected function setupListOperation()
{
$this->crud->addColumns([
[
'name' => 'created_at',
'label' => '登記時間',
'type' => 'datetime',
'format' => 'YYYY/MM/DD HH:mm:SS'
],
[
'name' => 'check_state',
'label' => '審核狀態',
'type' => 'select_from_array',
'options' => ['1' => '未審核  ', '2' => '通過  ', '3' => '未通過 ✖'],
],
[
'name' => 'twid',
'label' => '身份證',
'type' => 'text'
],
[
'name' => 'name',
'label' => '姓名',
'type' => 'text'
],
]);
}
/**
* Define what happens when the Create operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-create
* @return void
*/
protected function setupCreateOperation()
{
CRUD::setValidation(EventImprovedHealthRequest::class);
$this->crud->addFields([
[
'name' => 'hospital_name',
'label' => '就醫院所',
'type' => 'text',
],
[
'name' => 'name',
'label' => '姓名',
'type' => 'text',
],
[
'name' => 'twid',
'label' => '身份證',
'type' => 'text',
],
[
'name' => 'phone',
'label' => '手機號碼',
'type' => 'text',
],
[
'name' => 'email',
'label' => 'Email',
'type' => 'text',
],
[
'name' => 'address',
'label' => '地址',
'type' => 'text',
],
[
'name' => 'check_state',
'label' => "審核狀態",
'type' => 'select_from_array',
'options' => ['1' => '未審核  ', '2' => '通過  ', '3' => '未通過 ✖'],
'allows_null' => false,
'default' => '1',
],
[
'name' => 'check_reson',
'label' => "審核回應(未通過原因)",
'type' => 'text',
],
]);
}
/**
* Define what happens when the Update operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-update
* @return void
*/
protected function setupUpdateOperation()
{
$this->setupCreateOperation();
CRUD::iframe('record_card_img_src', '記錄小卡', [
'url' => function ($crud) {
$entry = $crud->getCurrentEntry();
$path = str_replace("uploads/", "", $entry->record_card_img_src);
return $path ? route('storage.serve', $path) : "about:blank";
},
'width' => '400px',
'height' => '300px',
'extra_attributes' => [
'sandbox' => 'allow-same-origin allow-scripts allow-popups', // Security: Restrict iframe
'allow' => 'fullscreen',
],
'hint' => '',
]);
CRUD::iframe('twid_front_img_src', '身份證正面', [
'url' => function ($crud) {
$entry = $crud->getCurrentEntry();
$path = str_replace("uploads/", "", $entry->twid_front_img_src);
return $path ? route('storage.serve', $path) : "about:blank";
},
'width' => '400px',
'height' => '300px',
'extra_attributes' => [
'sandbox' => 'allow-same-origin allow-scripts allow-popups', // Security: Restrict iframe
'allow' => 'fullscreen',
],
'hint' => '',
]);
CRUD::iframe('twid_back_img_src', '身份證反面', [
'url' => function ($crud) {
$entry = $crud->getCurrentEntry();
$path = str_replace("uploads/", "", $entry->twid_back_img_src);
return $path ? route('storage.serve', $path) : "about:blank";
},
'width' => '400px',
'height' => '300px',
'extra_attributes' => [
'sandbox' => 'allow-same-origin allow-scripts allow-popups', // Security: Restrict iframe
'allow' => 'fullscreen',
],
'hint' => '',
]);
CRUD::iframe('exam_img_src', '檢查報告', [
'url' => function ($crud) {
$entry = $crud->getCurrentEntry();
$path = str_replace("uploads/", "", $entry->exam_img_src);
return $path ? route('storage.serve', $path) : "about:blank";
},
'width' => '400px',
'height' => '300px',
'extra_attributes' => [
'sandbox' => 'allow-same-origin allow-scripts allow-popups', // Security: Restrict iframe
'allow' => 'fullscreen',
],
'hint' => '',
]);
}
public function update()
{
$entry = $this->crud->getCurrentEntry();
$org_check_state = $entry->check_state;
// do something before validation, before save, before everything
$response = $this->traitUpdate();
// do something after save
$entry = $this->crud->getCurrentEntry();
if ($entry->check_state != $org_check_state) {
switch($entry->check_state) {
case '2': //過通
try {
Mail::to($entry->email)->send(new EventNotifyMail([
"title" => "健康達標GO 大獎汽車不是夢 審核通過!",
"body" => "恭喜您審核通過!"
."\n\n登記資料:"
."\n就醫院所:".$entry->hospital_name
."\n姓名:".$entry->name
."\n身份證字號:".substr($entry->twid,0,2)."xxxx".substr($entry->twid,-4)
."\n行動電話:".$entry->phone
."\n電子信箱:".$entry->email
."\n收件地址:".$entry->address
,
]));
} catch (Exception $ex) {
}
break;
case '3': //未通過
try {
Mail::to($entry->email)->send(new EventNotifyMail([
"title" => "健康達標GO 大獎汽車不是夢 未通過審核!",
"body" => "抱歉,您的審核未通過!"
."\n請依以下理由重新上活動網站登記"
."\n理由:".$entry->check_reson
."\n\n登記資料:"
."\n就醫院所:".$entry->hospital_name
."\n姓名:".$entry->name
."\n身份證字號:".substr($entry->twid,0,2)."xxxx".substr($entry->twid,-4)
."\n行動電話:".$entry->phone
."\n電子信箱:".$entry->email
."\n收件地址:".$entry->address
,
]));
} catch (Exception $ex) {
}
break;
}
}
return $response;
}
}

View File

@ -0,0 +1,240 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Requests\EventMetabolismRequest;
use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;
use App\Mail\EventNotifyMail;
use Illuminate\Support\Facades\Mail;
use Exception;
/**
* Class EventMetabolismCrudController
* @package App\Http\Controllers\Admin
* @property-read \Backpack\CRUD\app\Library\CrudPanel\CrudPanel $crud
*/
class EventMetabolismCrudController extends CrudController
{
use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation { update as traitUpdate; }
/**
* Configure the CrudPanel object. Apply settings to all operations.
*
* @return void
*/
public function setup()
{
CRUD::setModel(\App\Models\EventMetabolism::class);
CRUD::setRoute(config('backpack.base.route_prefix') . '/event-metabolism');
CRUD::setEntityNameStrings('活動:符合代謝新收案', '活動:符合代謝新收案');
}
/**
* Define what happens when the List operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-list-entries
* @return void
*/
protected function setupListOperation()
{
$this->crud->addColumns([
[
'name' => 'created_at',
'label' => '登記時間',
'type' => 'datetime',
'format' => 'YYYY/MM/DD HH:mm:SS'
],
[
'name' => 'check_state',
'label' => '審核狀態',
'type' => 'select_from_array',
'options' => ['1' => '未審核  ', '2' => '通過  ', '3' => '未通過 ✖'],
],
[
'name' => 'twid',
'label' => '身份證',
'type' => 'text'
],
[
'name' => 'name',
'label' => '姓名',
'type' => 'text'
],
]);
}
/**
* Define what happens when the Create operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-create
* @return void
*/
protected function setupCreateOperation()
{
CRUD::setValidation(EventMetabolismRequest::class);
$this->crud->addFields([
[
'name' => 'hospital_name',
'label' => '就醫院所',
'type' => 'text',
],
[
'name' => 'name',
'label' => '姓名',
'type' => 'text',
],
[
'name' => 'twid',
'label' => '身份證',
'type' => 'text',
],
[
'name' => 'phone',
'label' => '手機號碼',
'type' => 'text',
],
[
'name' => 'email',
'label' => 'Email',
'type' => 'text',
],
[
'name' => 'address',
'label' => '地址',
'type' => 'text',
],
[
'name' => 'check_state',
'label' => "審核狀態",
'type' => 'select_from_array',
'options' => ['1' => '未審核  ', '2' => '通過  ', '3' => '未通過 ✖'],
'allows_null' => false,
'default' => '1',
],
[
'name' => 'check_reson',
'label' => "審核回應(未通過原因)",
'type' => 'text',
],
]);
}
/**
* Define what happens when the Update operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-update
* @return void
*/
protected function setupUpdateOperation()
{
$this->setupCreateOperation();
CRUD::iframe('record_card_img_src', '記錄小卡', [
'url' => function ($crud) {
$entry = $crud->getCurrentEntry();
$path = str_replace("uploads/", "", $entry->record_card_img_src);
return $path ? route('storage.serve', $path) : "about:blank";
},
'width' => '400px',
'height' => '300px',
'extra_attributes' => [
'sandbox' => 'allow-same-origin allow-scripts allow-popups', // Security: Restrict iframe
'allow' => 'fullscreen',
],
'hint' => '',
]);
CRUD::iframe('twid_front_img_src', '身份證正面', [
'url' => function ($crud) {
$entry = $crud->getCurrentEntry();
$path = str_replace("uploads/", "", $entry->twid_front_img_src);
return $path ? route('storage.serve', $path) : "about:blank";
},
'width' => '400px',
'height' => '300px',
'extra_attributes' => [
'sandbox' => 'allow-same-origin allow-scripts allow-popups', // Security: Restrict iframe
'allow' => 'fullscreen',
],
'hint' => '',
]);
CRUD::iframe('twid_back_img_src', '身份證反面', [
'url' => function ($crud) {
$entry = $crud->getCurrentEntry();
$path = str_replace("uploads/", "", $entry->twid_back_img_src);
return $path ? route('storage.serve', $path) : "about:blank";
},
'width' => '400px',
'height' => '300px',
'extra_attributes' => [
'sandbox' => 'allow-same-origin allow-scripts allow-popups', // Security: Restrict iframe
'allow' => 'fullscreen',
],
'hint' => '',
]);
}
public function update()
{
$entry = $this->crud->getCurrentEntry();
$org_check_state = $entry->check_state;
// do something before validation, before save, before everything
$response = $this->traitUpdate();
// do something after save
$entry = $this->crud->getCurrentEntry();
if ($entry->check_state != $org_check_state) {
switch($entry->check_state) {
case '2': //過通
try {
Mail::to($entry->email)->send(new EventNotifyMail([
"title" => "符合代謝新收案 早鳥報名最划算 審核通過!",
"body" => "恭喜您審核通過!"
."\n\n登記資料:"
."\n就醫院所:".$entry->hospital_name
."\n姓名:".$entry->name
."\n身份證字號:".substr($entry->twid,0,2)."xxxx".substr($entry->twid,-4)
."\n行動電話:".$entry->phone
."\n電子信箱:".$entry->email
."\n收件地址:".$entry->address
,
]));
} catch (Exception $ex) {
}
break;
case '3': //未通過
try {
Mail::to($entry->email)->send(new EventNotifyMail([
"title" => "符合代謝新收案 早鳥報名最划算 未通過審核!",
"body" => "抱歉,您的審核未通過!"
."\n請依以下理由重新上活動網站登記"
."\n理由:".$entry->check_reson
."\n\n登記資料:"
."\n就醫院所:".$entry->hospital_name
."\n姓名:".$entry->name
."\n身份證字號:".substr($entry->twid,0,2)."xxxx".substr($entry->twid,-4)
."\n行動電話:".$entry->phone
."\n電子信箱:".$entry->email
."\n收件地址:".$entry->address
,
]));
} catch (Exception $ex) {
}
break;
}
}
return $response;
}
}

View File

@ -0,0 +1,96 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Requests\EventRegistrationInfoRequest;
use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;
use Illuminate\Support\Facades\Cache;
/**
* Class EventRegistrationInfoCrudController
* @package App\Http\Controllers\Admin
* @property-read \Backpack\CRUD\app\Library\CrudPanel\CrudPanel $crud
*/
class EventRegistrationInfoCrudController extends CrudController
{
use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation { update as traitUpdate; }
/**
* Configure the CrudPanel object. Apply settings to all operations.
*
* @return void
*/
public function setup()
{
CRUD::setModel(\App\Models\EventRegistrationInfo::class);
CRUD::setRoute(config('backpack.base.route_prefix') . '/event-registration-info');
CRUD::setEntityNameStrings('活動設定', '活動設定');
}
/**
* Define what happens when the List operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-list-entries
* @return void
*/
protected function setupListOperation()
{
CRUD::setFromDb(); // set columns from db columns.
/**
* Columns can be defined using the fluent syntax:
* - CRUD::column('price')->type('number');
*/
}
/**
* Define what happens when the Create operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-create
* @return void
*/
protected function setupCreateOperation()
{
CRUD::setValidation(EventRegistrationInfoRequest::class);
CRUD::setFromDb(); // set fields from db columns.
/**
* Fields can be defined using the fluent syntax:
* - CRUD::field('price')->type('number');
*/
}
/**
* Define what happens when the Update operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-update
* @return void
*/
protected function setupUpdateOperation()
{
$this->setupCreateOperation();
}
public function update()
{
// do something before validation, before save, before everything
$response = $this->traitUpdate();
$entry = $this->crud->getCurrentEntry();
// do something after save
Cache::forget('event-info-cache-'.$entry->id);
//Cache::put('event-info-cache-'.$entry->id, null, 0);
//Cache::flush();
$eventInfo = Cache::get('event-info-cache-'.$entry->id, function () use ($entry) {
return ['enable'=>$entry->enable,'limit' => $entry->limit, 'start_at' => $entry->event_start_date, 'end_at' => $entry->event_end_date ];
});
return $response;
}
}

View File

@ -0,0 +1,93 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Requests\FaqCatalogRequest;
use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;
/**
* Class FaqCatalogCrudController
* @package App\Http\Controllers\Admin
* @property-read \Backpack\CRUD\app\Library\CrudPanel\CrudPanel $crud
*/
class FaqCatalogCrudController extends CrudController
{
use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\ReorderOperation;
/**
* Configure the CrudPanel object. Apply settings to all operations.
*
* @return void
*/
public function setup()
{
CRUD::setModel(\App\Models\FaqCatalog::class);
CRUD::setRoute(config('backpack.base.route_prefix') . '/faq-catalog');
CRUD::setEntityNameStrings('faq catalog', 'faq catalogs');
}
protected function setupReorderOperation()
{
CRUD::set('reorder.label', 'name');
CRUD::set('reorder.max_level', 1);
}
/**
* Define what happens when the List operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-list-entries
* @return void
*/
protected function setupListOperation()
{
if (! $this->crud->getRequest()->has('order')){
$this->crud->orderBy('lft', 'asc')->orderBy('id', 'desc');
}
CRUD::addColumn('#');
CRUD::column('is_front_show')->label(trans('backend.columnName.is_front_show'))->type('checkbox');
CRUD::column('name')->label(trans('backend.columnName.name'))->type('textarea_nl2br')->escaped(false)->searchLogic('text');
}
/**
* Define what happens when the Create operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-create
* @return void
*/
protected function setupCreateOperation()
{
CRUD::setValidation(FaqCatalogRequest::class);
CRUD::addFields([
[
'name' => 'is_front_show',
'label' => trans('backend.columnName.is_front_show'),
'type' => 'boolean',
'default' => true,
],
[
'name' => 'name',
'lable' => 'Name',
'type' => 'text',
],
]);
}
/**
* Define what happens when the Update operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-update
* @return void
*/
protected function setupUpdateOperation()
{
$this->setupCreateOperation();
}
}

View File

@ -0,0 +1,159 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Requests\FaqRequest;
use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;
/**
* Class FaqCrudController
* @package App\Http\Controllers\Admin
* @property-read \Backpack\CRUD\app\Library\CrudPanel\CrudPanel $crud
*/
class FaqCrudController extends CrudController
{
use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation;
/**
* Configure the CrudPanel object. Apply settings to all operations.
*
* @return void
*/
public function setup()
{
CRUD::setModel(\App\Models\Faq::class);
CRUD::setRoute(config('backpack.base.route_prefix') . '/faq');
CRUD::setEntityNameStrings('常見問題', '常見問題');
}
/**
* Define what happens when the List operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-list-entries
* @return void
*/
protected function setupListOperation()
{
$this->crud->addColumns([
[
'name' => 'post_at',
'label' => trans('backend.columnName.post_at'),
'type' => 'datetime',
//'format' => 'YYYY/MM/DD HH:mm:SS',
],
[
'name' => 'is_front_show',
'label' => trans('backend.columnName.is_front_show'),
'type' => 'checkbox'
],
[
'name' => 'title',
'label' => trans('backend.columnName.title'),
'type' => 'text'
]
]);
}
/**
* Define what happens when the Create operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-create
* @return void
*/
protected function setupCreateOperation()
{
CRUD::setValidation(FaqRequest::class);
$this->crud->addFields([
[
'name' => 'news_catalog_id',
'label' => trans('backend.columnName.catalog'),
'type' => 'select2_nested',
'entity' => 'faqCatalog',
'attribute' => 'name',
'model' => 'App\Models\FaqCatalog',
],
[
'name' => 'post_at',
'label' => trans('backend.columnName.post_at'),
'type' => 'datetime_picker',
'format' => 'YYYY/MM/DD HH:mm:SS',
'default' => \Carbon\Carbon::now(),
],
[
'name' => 'is_front_show',
'label' => trans('backend.columnName.is_front_show'),
'type' => 'boolean',
'default' => true,
],
[
'name' => 'title',
'label' => trans('backend.columnName.title'),
'type' => 'text',
],
[
'name' => 'photos',
'label' => trans('backend.columnName.cover'),
'type' => 'upload_img_multiple',
'upload' => true,
'disk' => 'public',
'hint' => '',
'qty' => 1, // 0=no limit, >0=limit
'showSingleChoise' => '0', // 0=hidden, 1=show(default)
'showComment' => '0', // 0=hidden, 1=show(default)
],
// [
// 'name' => 'description',
// 'label' => trans('backend.columnName.description'),
// 'type' => 'textarea'
// ],
[
'name' => 'body',
'lable' => trans('backend.columnName.body'),
'type' => 'tinymce',
// optional overwrite of the configuration array
'options' => [
//'selector' => 'textarea.tinymce',
//'skin' => 'dick-light',
'plugins' => 'code lists advlist image link media anchor table hr imagetools importcss insertdatetime paste searchreplace textcolor textpattern help',
'menubar' => 'edit insert view format help',
'toolbar' => 'code undo redo bold italic alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | table image media link',
'language' => str_replace('-', '_', app()->getLocale()),
'height' => '500px',
],
],
// [
// 'name' => 'source_links',
// 'lable' => 'Source Links',
// 'type' => 'key_val_multiple',
// ],
// [
// 'name' => 'seo_keyword',
// 'label' => trans('backend.columnName.seo_keyword'),
// 'type' => 'text'
// ],
// [
// 'name' => 'seo_description',
// 'label' => trans('backend.columnName.seo_description'),
// 'type' => 'textarea'
// ],
]);
}
/**
* Define what happens when the Update operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-update
* @return void
*/
protected function setupUpdateOperation()
{
$this->setupCreateOperation();
}
}

View File

@ -0,0 +1,93 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Requests\HealthInfoCatalogRequest;
use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;
/**
* Class HealthInfoCatalogCrudController
* @package App\Http\Controllers\Admin
* @property-read \Backpack\CRUD\app\Library\CrudPanel\CrudPanel $crud
*/
class HealthInfoCatalogCrudController extends CrudController
{
use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\ReorderOperation;
/**
* Configure the CrudPanel object. Apply settings to all operations.
*
* @return void
*/
public function setup()
{
CRUD::setModel(\App\Models\HealthInfoCatalog::class);
CRUD::setRoute(config('backpack.base.route_prefix') . '/health-info-catalog');
CRUD::setEntityNameStrings('health info catalog', 'health info catalogs');
}
protected function setupReorderOperation()
{
CRUD::set('reorder.label', 'name');
CRUD::set('reorder.max_level', 1);
}
/**
* Define what happens when the List operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-list-entries
* @return void
*/
protected function setupListOperation()
{
if (! $this->crud->getRequest()->has('order')){
$this->crud->orderBy('lft', 'asc')->orderBy('id', 'desc');
}
CRUD::addColumn('#');
CRUD::column('is_front_show')->label(trans('backend.columnName.is_front_show'))->type('checkbox');
CRUD::column('name')->label(trans('backend.columnName.name'))->type('textarea_nl2br')->escaped(false)->searchLogic('text');
}
/**
* Define what happens when the Create operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-create
* @return void
*/
protected function setupCreateOperation()
{
CRUD::setValidation(HealthInfoCatalogRequest::class);
CRUD::addFields([
[
'name' => 'is_front_show',
'label' => trans('backend.columnName.is_front_show'),
'type' => 'boolean',
'default' => true,
],
[
'name' => 'name',
'lable' => 'Name',
'type' => 'text',
],
]);
}
/**
* Define what happens when the Update operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-update
* @return void
*/
protected function setupUpdateOperation()
{
$this->setupCreateOperation();
}
}

View File

@ -0,0 +1,160 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Requests\HealthInfoRequest;
use App\Models\HealthInfo;
use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;
/**
* Class HealthInfoCrudController
* @package App\Http\Controllers\Admin
* @property-read \Backpack\CRUD\app\Library\CrudPanel\CrudPanel $crud
*/
class HealthInfoCrudController extends CrudController
{
use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation;
/**
* Configure the CrudPanel object. Apply settings to all operations.
*
* @return void
*/
public function setup()
{
CRUD::setModel(\App\Models\HealthInfo::class);
CRUD::setRoute(config('backpack.base.route_prefix') . '/health-info');
CRUD::setEntityNameStrings('健康資訊', '健康資訊');
}
/**
* Define what happens when the List operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-list-entries
* @return void
*/
protected function setupListOperation()
{
$this->crud->addColumns([
[
'name' => 'post_at',
'label' => trans('backend.columnName.post_at'),
'type' => 'datetime',
//'format' => 'YYYY/MM/DD HH:mm:SS',
],
[
'name' => 'is_front_show',
'label' => trans('backend.columnName.is_front_show'),
'type' => 'checkbox'
],
[
'name' => 'title',
'label' => trans('backend.columnName.title'),
'type' => 'text'
]
]);
}
/**
* Define what happens when the Create operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-create
* @return void
*/
protected function setupCreateOperation()
{
CRUD::setValidation(HealthInfoRequest::class);
$this->crud->addFields([
[
'name' => 'news_catalog_id',
'label' => trans('backend.columnName.catalog'),
'type' => 'select2_nested',
'entity' => 'healthInfoCatalog',
'attribute' => 'name',
'model' => 'App\Models\HealthInfoCatalog',
],
[
'name' => 'post_at',
'label' => trans('backend.columnName.post_at'),
'type' => 'datetime_picker',
'format' => 'YYYY/MM/DD HH:mm:SS',
'default' => \Carbon\Carbon::now(),
],
[
'name' => 'is_front_show',
'label' => trans('backend.columnName.is_front_show'),
'type' => 'boolean',
'default' => true,
],
[
'name' => 'title',
'label' => trans('backend.columnName.title'),
'type' => 'text',
],
[
'name' => 'photos',
'label' => trans('backend.columnName.cover'),
'type' => 'upload_img_multiple',
'upload' => true,
'disk' => 'public',
'hint' => '',
'qty' => 1, // 0=no limit, >0=limit
'showSingleChoise' => '0', // 0=hidden, 1=show(default)
'showComment' => '0', // 0=hidden, 1=show(default)
],
// [
// 'name' => 'description',
// 'label' => trans('backend.columnName.description'),
// 'type' => 'textarea'
// ],
[
'name' => 'body',
'lable' => trans('backend.columnName.body'),
'type' => 'tinymce',
// optional overwrite of the configuration array
'options' => [
//'selector' => 'textarea.tinymce',
//'skin' => 'dick-light',
'plugins' => 'code lists advlist image link media anchor table hr imagetools importcss insertdatetime paste searchreplace textcolor textpattern help',
'menubar' => 'edit insert view format help',
'toolbar' => 'code undo redo bold italic alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | table image media link',
'language' => str_replace('-', '_', app()->getLocale()),
'height' => '500px',
],
],
// [
// 'name' => 'source_links',
// 'lable' => 'Source Links',
// 'type' => 'key_val_multiple',
// ],
// [
// 'name' => 'seo_keyword',
// 'label' => trans('backend.columnName.seo_keyword'),
// 'type' => 'text'
// ],
// [
// 'name' => 'seo_description',
// 'label' => trans('backend.columnName.seo_description'),
// 'type' => 'textarea'
// ],
]);
}
/**
* Define what happens when the Update operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-update
* @return void
*/
protected function setupUpdateOperation()
{
$this->setupCreateOperation();
}
}

View File

@ -0,0 +1,93 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Requests\NewsCatalogRequest;
use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;
/**
* Class NewsCatalogCrudController
* @package App\Http\Controllers\Admin
* @property-read \Backpack\CRUD\app\Library\CrudPanel\CrudPanel $crud
*/
class NewsCatalogCrudController extends CrudController
{
use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\ReorderOperation;
/**
* Configure the CrudPanel object. Apply settings to all operations.
*
* @return void
*/
public function setup()
{
CRUD::setModel(\App\Models\NewsCatalog::class);
CRUD::setRoute(config('backpack.base.route_prefix') . '/news-catalog');
CRUD::setEntityNameStrings('news catalog', 'news catalogs');
}
protected function setupReorderOperation()
{
CRUD::set('reorder.label', 'name');
CRUD::set('reorder.max_level', 1);
}
/**
* Define what happens when the List operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-list-entries
* @return void
*/
protected function setupListOperation()
{
if (! $this->crud->getRequest()->has('order')){
$this->crud->orderBy('lft', 'asc')->orderBy('id', 'desc');
}
CRUD::addColumn('#');
CRUD::column('is_front_show')->label(trans('backend.columnName.is_front_show'))->type('checkbox');
CRUD::column('name')->label(trans('backend.columnName.name'))->type('textarea_nl2br')->escaped(false)->searchLogic('text');
}
/**
* Define what happens when the Create operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-create
* @return void
*/
protected function setupCreateOperation()
{
CRUD::setValidation(NewsCatalogRequest::class);
CRUD::addFields([
[
'name' => 'is_front_show',
'label' => trans('backend.columnName.is_front_show'),
'type' => 'boolean',
'default' => true,
],
[
'name' => 'name',
'lable' => 'Name',
'type' => 'text',
],
]);
}
/**
* Define what happens when the Update operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-update
* @return void
*/
protected function setupUpdateOperation()
{
$this->setupCreateOperation();
}
}

View File

@ -0,0 +1,161 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Requests\NewsRequest;
use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;
/**
* Class NewsCrudController
* @package App\Http\Controllers\Admin
* @property-read \Backpack\CRUD\app\Library\CrudPanel\CrudPanel $crud
*/
class NewsCrudController extends CrudController
{
use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation;
//use \Backpack\ActivityLog\Http\Controllers\Operations\ModelActivityOperation;
//use \Backpack\ActivityLog\Http\Controllers\Operations\EntryActivityOperation;
/**
* Configure the CrudPanel object. Apply settings to all operations.
*
* @return void
*/
public function setup()
{
CRUD::setModel(\App\Models\News::class);
CRUD::setRoute(config('backpack.base.route_prefix') . '/news');
CRUD::setEntityNameStrings('最新消息', '最新消息');
}
/**
* Define what happens when the List operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-list-entries
* @return void
*/
protected function setupListOperation()
{
$this->crud->addColumns([
[
'name' => 'post_at',
'label' => trans('backend.columnName.post_at'),
'type' => 'datetime',
//'format' => 'YYYY/MM/DD HH:mm:SS',
],
[
'name' => 'is_front_show',
'label' => trans('backend.columnName.is_front_show'),
'type' => 'checkbox'
],
[
'name' => 'title',
'label' => trans('backend.columnName.title'),
'type' => 'text'
]
]);
}
/**
* Define what happens when the Create operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-create
* @return void
*/
protected function setupCreateOperation()
{
CRUD::setValidation(NewsRequest::class);
$this->crud->addFields([
[
'name' => 'news_catalog_id',
'label' => trans('backend.columnName.catalog'),
'type' => 'select2_nested',
'entity' => 'newsCatalog',
'attribute' => 'name',
'model' => 'App\Models\NewsCatalog',
],
[
'name' => 'post_at',
'label' => trans('backend.columnName.post_at'),
'type' => 'datetime_picker',
'format' => 'YYYY/MM/DD HH:mm:SS',
'default' => \Carbon\Carbon::now(),
],
[
'name' => 'is_front_show',
'label' => trans('backend.columnName.is_front_show'),
'type' => 'boolean',
'default' => true,
],
[
'name' => 'title',
'label' => trans('backend.columnName.title'),
'type' => 'text',
],
[
'name' => 'photos',
'label' => trans('backend.columnName.cover'),
'type' => 'upload_img_multiple',
'upload' => true,
'disk' => 'public',
'hint' => '',
'qty' => 1, // 0=no limit, >0=limit
'showSingleChoise' => '0', // 0=hidden, 1=show(default)
'showComment' => '0', // 0=hidden, 1=show(default)
],
//[
// 'name' => 'description',
// 'label' => trans('backend.columnName.description'),
// 'type' => 'textarea'
//],
[
'name' => 'body',
'lable' => trans('backend.columnName.body'),
'type' => 'tinymce',
// optional overwrite of the configuration array
'options' => [
//'selector' => 'textarea.tinymce',
//'skin' => 'dick-light',
'plugins' => 'code lists advlist image link media anchor table hr imagetools importcss insertdatetime paste searchreplace textcolor textpattern help',
'menubar' => 'edit insert view format help',
'toolbar' => 'code undo redo bold italic alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | table image media link',
'language' => str_replace('-', '_', app()->getLocale()),
'height' => '500px',
],
],
// [
// 'name' => 'source_links',
// 'lable' => 'Source Links',
// 'type' => 'key_val_multiple',
// ],
// [
// 'name' => 'seo_keyword',
// 'label' => trans('backend.columnName.seo_keyword'),
// 'type' => 'text'
// ],
// [
// 'name' => 'seo_description',
// 'label' => trans('backend.columnName.seo_description'),
// 'type' => 'textarea'
// ],
]);
}
/**
* Define what happens when the Update operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-update
* @return void
*/
protected function setupUpdateOperation()
{
$this->setupCreateOperation();
}
}

View File

@ -0,0 +1,93 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Requests\NoticeCatalogRequest;
use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;
/**
* Class NoticeCatalogCrudController
* @package App\Http\Controllers\Admin
* @property-read \Backpack\CRUD\app\Library\CrudPanel\CrudPanel $crud
*/
class NoticeCatalogCrudController extends CrudController
{
use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\ReorderOperation;
/**
* Configure the CrudPanel object. Apply settings to all operations.
*
* @return void
*/
public function setup()
{
CRUD::setModel(\App\Models\NoticeCatalog::class);
CRUD::setRoute(config('backpack.base.route_prefix') . '/notice-catalog');
CRUD::setEntityNameStrings('notice catalog', 'notice catalogs');
}
protected function setupReorderOperation()
{
CRUD::set('reorder.label', 'name');
CRUD::set('reorder.max_level', 1);
}
/**
* Define what happens when the List operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-list-entries
* @return void
*/
protected function setupListOperation()
{
if (! $this->crud->getRequest()->has('order')){
$this->crud->orderBy('lft', 'asc')->orderBy('id', 'desc');
}
CRUD::addColumn('#');
CRUD::column('is_front_show')->label(trans('backend.columnName.is_front_show'))->type('checkbox');
CRUD::column('name')->label(trans('backend.columnName.name'))->type('textarea_nl2br')->escaped(false)->searchLogic('text');
}
/**
* Define what happens when the Create operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-create
* @return void
*/
protected function setupCreateOperation()
{
CRUD::setValidation(NoticeCatalogRequest::class);
CRUD::addFields([
[
'name' => 'is_front_show',
'label' => trans('backend.columnName.is_front_show'),
'type' => 'boolean',
'default' => true,
],
[
'name' => 'name',
'lable' => 'Name',
'type' => 'text',
],
]);
}
/**
* Define what happens when the Update operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-update
* @return void
*/
protected function setupUpdateOperation()
{
$this->setupCreateOperation();
}
}

View File

@ -0,0 +1,159 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Requests\NoticeRequest;
use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;
/**
* Class NoticeCrudController
* @package App\Http\Controllers\Admin
* @property-read \Backpack\CRUD\app\Library\CrudPanel\CrudPanel $crud
*/
class NoticeCrudController extends CrudController
{
use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation;
/**
* Configure the CrudPanel object. Apply settings to all operations.
*
* @return void
*/
public function setup()
{
CRUD::setModel(\App\Models\Notice::class);
CRUD::setRoute(config('backpack.base.route_prefix') . '/notice');
CRUD::setEntityNameStrings('注意事項', '注意事項');
}
/**
* Define what happens when the List operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-list-entries
* @return void
*/
protected function setupListOperation()
{
$this->crud->addColumns([
[
'name' => 'post_at',
'label' => trans('backend.columnName.post_at'),
'type' => 'datetime',
//'format' => 'YYYY/MM/DD HH:mm:SS',
],
[
'name' => 'is_front_show',
'label' => trans('backend.columnName.is_front_show'),
'type' => 'checkbox'
],
[
'name' => 'title',
'label' => trans('backend.columnName.title'),
'type' => 'text'
]
]);
}
/**
* Define what happens when the Create operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-create
* @return void
*/
protected function setupCreateOperation()
{
CRUD::setValidation(NoticeRequest::class);
$this->crud->addFields([
[
'name' => 'news_catalog_id',
'label' => trans('backend.columnName.catalog'),
'type' => 'select2_nested',
'entity' => 'noticeCatalog',
'attribute' => 'name',
'model' => 'App\Models\NoticeCatalog',
],
[
'name' => 'post_at',
'label' => trans('backend.columnName.post_at'),
'type' => 'datetime_picker',
'format' => 'YYYY/MM/DD HH:mm:SS',
'default' => \Carbon\Carbon::now(),
],
[
'name' => 'is_front_show',
'label' => trans('backend.columnName.is_front_show'),
'type' => 'boolean',
'default' => true,
],
[
'name' => 'title',
'label' => trans('backend.columnName.title'),
'type' => 'text',
],
[
'name' => 'photos',
'label' => trans('backend.columnName.cover'),
'type' => 'upload_img_multiple',
'upload' => true,
'disk' => 'public',
'hint' => '',
'qty' => 1, // 0=no limit, >0=limit
'showSingleChoise' => '0', // 0=hidden, 1=show(default)
'showComment' => '0', // 0=hidden, 1=show(default)
],
// [
// 'name' => 'description',
// 'label' => trans('backend.columnName.description'),
// 'type' => 'textarea'
// ],
[
'name' => 'body',
'lable' => trans('backend.columnName.body'),
'type' => 'tinymce',
// optional overwrite of the configuration array
'options' => [
//'selector' => 'textarea.tinymce',
//'skin' => 'dick-light',
'plugins' => 'code lists advlist image link media anchor table hr imagetools importcss insertdatetime paste searchreplace textcolor textpattern help',
'menubar' => 'edit insert view format help',
'toolbar' => 'code undo redo bold italic alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | table image media link',
'language' => str_replace('-', '_', app()->getLocale()),
'height' => '500px',
],
],
// [
// 'name' => 'source_links',
// 'lable' => 'Source Links',
// 'type' => 'key_val_multiple',
// ],
// [
// 'name' => 'seo_keyword',
// 'label' => trans('backend.columnName.seo_keyword'),
// 'type' => 'text'
// ],
// [
// 'name' => 'seo_description',
// 'label' => trans('backend.columnName.seo_description'),
// 'type' => 'textarea'
// ],
]);
}
/**
* Define what happens when the Update operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-update
* @return void
*/
protected function setupUpdateOperation()
{
$this->setupCreateOperation();
}
}

View File

@ -0,0 +1,41 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
class StorageController extends Controller
{
public function serve(Request $request, $file_path)
{
$allowed_directory = 'uploads';
$file_path = str_replace(['../', '..\\'], '', $file_path);
$full_path = storage_path("app/{$allowed_directory}/{$file_path}");
if (is_dir($full_path)) {
throw new NotFoundHttpException('檔案不存在');
}
if (!Storage::disk('local')->exists("{$allowed_directory}/{$file_path}")) {
throw new NotFoundHttpException('檔案不存在');
}
$real_path = realpath($full_path);
$allowed_base_path = realpath(storage_path("app/{$allowed_directory}"));
if (!$real_path || strpos($real_path, $allowed_base_path) !== 0) {
throw new AccessDeniedHttpException('無權訪問該檔案');
}
$mime_type = mime_content_type($full_path) ?: 'application/octet-stream';
return Response::file($full_path, [
'Content-Type' => $mime_type,
'Content-Disposition' => 'inline; filename="' . basename($file_path) . '"',
'X-Frame-Options' => 'SAMEORIGIN', // Allow same-origin framing
'Content-Security-Policy' => "frame-ancestors 'self'", // Allow iframe on same domain
]);
}
}

View File

@ -0,0 +1,77 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Requests\UserRequest;
use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;
/**
* Class UserCrudController
* @package App\Http\Controllers\Admin
* @property-read \Backpack\CRUD\app\Library\CrudPanel\CrudPanel $crud
*/
class UserCrudController extends CrudController
{
use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation;
//use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation;
/**
* Configure the CrudPanel object. Apply settings to all operations.
*
* @return void
*/
public function setup()
{
CRUD::setModel(\App\Models\User::class);
CRUD::setRoute(config('backpack.base.route_prefix') . '/user');
CRUD::setEntityNameStrings('使用者', '使用者');
}
/**
* Define what happens when the List operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-list-entries
* @return void
*/
protected function setupListOperation()
{
CRUD::setFromDb(); // set columns from db columns.
/**
* Columns can be defined using the fluent syntax:
* - CRUD::column('price')->type('number');
*/
}
/**
* Define what happens when the Create operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-create
* @return void
*/
protected function setupCreateOperation()
{
CRUD::setValidation(UserRequest::class);
CRUD::setFromDb(); // set fields from db columns.
/**
* Fields can be defined using the fluent syntax:
* - CRUD::field('price')->type('number');
*/
}
/**
* Define what happens when the Update operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-update
* @return void
*/
protected function setupUpdateOperation()
{
$this->setupCreateOperation();
}
}

View File

@ -0,0 +1,12 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController
{
use AuthorizesRequests, ValidatesRequests;
}

View File

@ -0,0 +1,28 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class FaqController extends Controller
{
public function index(Request $request)
{
$perPageItems = 999;
$page = $request->get("p");
$page = (!$page || $page < 1) ? 1 : $page;
$pageOffset = $perPageItems * ($page - 1);
$dataRows = \App\Models\Faq::where('is_front_show', '=', true)
->orderBy('post_at', 'desc');
//->select('id', 'title', 'description', 'body', 'photos', 'post_at');
return view('faqs', [
'dataRows' => $dataRows->skip($pageOffset)->take($perPageItems)->get(),
'dataCurrentPage' => $page,
'dataPerPageItems' => $perPageItems,
'dataTotalCount' => $dataRows->count(),
]);
}
}

View File

@ -0,0 +1,405 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\EventHealthAllowanceCheckRequest;
use App\Http\Requests\EventHealthAllowanceRequest;
use App\Models\EventHealthAllowance;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Carbon\Carbon;
use App\Models\EventMetabolism;
use App\Mail\EventNotifyMail;
use App\Models\EventRegistrationInfo;
use Illuminate\Support\Facades\Mail;
use Exception;
use Illuminate\Support\Facades\Cache;
use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Gd\Driver;
class HealthAllowanceFillFormController extends Controller
{
/**
* Handle the incoming request.
*/
public function __invoke(Request $request)
{
//
}
public function index(Request $request)
{
$enable = true;
$eventInfo = Cache::get('event-info-cache-3', function () {
$entry = EventRegistrationInfo::where('id', 3)->first();
if ($entry) {
return ['enable' => $entry->enable,'limit' => $entry->limit, 'start_at' => $entry->event_start_date, 'end_at' => $entry->event_end_date ];
}
return null;
});
if ($eventInfo) {
if ($eventInfo['enable'] != "1") {
$enable = false;
}
$date_now = new \DateTime("now");
$date_start = new \DateTime($eventInfo['start_at']);
$date_end = new \DateTime($eventInfo['end_at']);
if ($date_now > $date_start && $date_end > $date_now ) {
//
} else {
$enable = false;
}
}
return view('health_allowance', [
'enable' => $enable
]);
}
public function doGet(Request $request)
{
return view('health_allowance_fill_form');
}
public function doPostOk(Request $request)
{
return view('health_allowance_fill_form_ok');
}
public function doPost(EventHealthAllowanceRequest $request)
{
try
{
$eventInfo = Cache::get('event-info-cache-3', function () {
$entry = EventRegistrationInfo::where('id', 3)->first();
if ($entry) {
return ['enable' => $entry->enable,'limit' => $entry->limit, 'start_at' => $entry->event_start_date, 'end_at' => $entry->event_end_date ];
}
return null;
});
if ($eventInfo) {
if ($eventInfo['enable'] != "1") {
throw new \Exception('活動已截止。');
}
$date_now = new \DateTime("now");
$date_start = new \DateTime($eventInfo['start_at']);
$date_end = new \DateTime($eventInfo['end_at']);
if ($date_now > $date_start && $date_end > $date_now ) {
//
} else {
throw new \Exception('活動已截止。');
}
}
DB::beginTransaction();
//$checkPhone = EventMetabolism::where('phone', '=', $request->input('phone'))->first();
//if ($checkPhone) {
// throw new \Exception('本電話號碼已經登記。');
//}
$twid = Str::upper($request->input('twid'));
$eventItem = EventHealthAllowance::where('twid', '=', $twid)->first();
if (!$eventItem) {
$eventItem = new EventHealthAllowance();
$eventItem->twid = $twid;
}
if ($eventItem->check_state == 1) {
throw new \Exception('您已經登記審查,請等待審查完成。');
}
if ($eventItem->check_state == 2) {
throw new \Exception('您已經登記審查通過。');
}
$eventItem->hospital_name = $request->input('hospital_name');
$eventItem->name = $request->input('name');
$eventItem->phone = $request->input('phone');
$eventItem->email = $request->input('email');
$eventItem->address = $request->input('address');
$uploadPath = 'uploads/health_allowance';
$acceptExt = ['jpg', 'jpeg', 'png', 'pdf'];
$finfo = new \finfo(FILEINFO_MIME_TYPE);
$allowedMimeTypes = [
'image/png', // PNG
'image/jpeg', // JPG/JPEG
'application/pdf' // PDF
];
$manager = new ImageManager(Driver::class);
$uploadTime = time();
$fileName = $request->input('fileRecordCardFileName');
if ($fileName && $request->filled('fileRecordCardBase64')) {
$fileBase64 = $request->input('fileRecordCardBase64');
$fileData = base64_decode($fileBase64);
$fileExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
if (!in_array($fileExt, $acceptExt)) {
throw new \Exception('記錄小卡檔案 副檔名錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
$mimeType = $finfo->buffer($fileData);
if (!in_array($mimeType, $allowedMimeTypes)) {
throw new \Exception('記錄小卡檔案 檔案類型錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
if ($mimeType != 'application/pdf') {
$image = $manager->read($fileData);
$image->scaleDown(2048, 2048);
$fileData = $image->toJpeg(50);
$fileExt = 'jpg';
}
if ($eventItem->record_card_img_src) {
try {
Storage::disk('local')->delete($eventItem->record_card_img_src);
} catch (\Exception $ex2) {
}
}
$fileName = $eventItem->twid . "_RecordCard_" . $uploadTime . "." . $fileExt;
Storage::disk('local')->put($uploadPath. '/' . $fileName, $fileData);
$eventItem->record_card_img_src = $uploadPath.'/'.$fileName;
} else {
throw new \Exception('請上傳記錄小卡。');
}
$fileName = $request->input('fileTwidFrontFileName');
if ($fileName && $request->filled('fileTwidFrontBase64')) {
$fileBase64 = $request->input('fileTwidFrontBase64');
$fileData = base64_decode($fileBase64);
$fileExt = pathinfo($fileName, PATHINFO_EXTENSION);
if (!in_array($fileExt, $acceptExt)) {
throw new \Exception('身份證正面檔案 副檔名錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
$mimeType = $finfo->buffer($fileData);
if (!in_array($mimeType, $allowedMimeTypes)) {
throw new \Exception('身份證正面檔案 檔案類型錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
if ($mimeType != 'application/pdf') {
$image = $manager->read($fileData);
$image->scaleDown(2048, 2048);
$fileData = $image->toJpeg(50);
$fileExt = 'jpg';
}
if ($eventItem->twid_front_img_src) {
try {
Storage::disk('local')->delete($eventItem->twid_front_img_src);
} catch (\Exception $ex2) {
}
}
$fileName = $eventItem->twid . "_TwidFront_" . $uploadTime . "." . $fileExt;
Storage::disk('local')->put($uploadPath. '/' . $fileName, $fileData);
$eventItem->twid_front_img_src = $uploadPath.'/'.$fileName;
} else {
throw new \Exception('請上傳身份證正面。');
}
$fileName = $request->input('fileTwidBackFileName');
if ($fileName && $request->filled('fileTwidBackBase64')) {
$fileBase64 = $request->input('fileTwidBackBase64');
$fileData = base64_decode($fileBase64);
$fileExt = pathinfo($fileName, PATHINFO_EXTENSION);
if (!in_array($fileExt, $acceptExt)) {
throw new \Exception('身份證背面檔案 副檔名錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
$mimeType = $finfo->buffer($fileData);
if (!in_array($mimeType, $allowedMimeTypes)) {
throw new \Exception('身份證背面檔案 檔案類型錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
if ($mimeType != 'application/pdf') {
$image = $manager->read($fileData);
$image->scaleDown(2048, 2048);
$fileData = $image->toJpeg(50);
$fileExt = 'jpg';
}
if ($eventItem->twid_back_img_src) {
try {
Storage::disk('local')->delete($eventItem->twid_back_img_src);
} catch (\Exception $ex2) {
}
}
$fileName = $eventItem->twid . "_TwidBack_" . $uploadTime . "." . $fileExt;
Storage::disk('local')->put($uploadPath. '/' . $fileName, $fileData);
$eventItem->twid_back_img_src = $uploadPath.'/'.$fileName;
} else {
throw new \Exception('請上傳身份證背面。');
}
$fileName = $request->input('fileExam1stFileName');
if ($fileName && $request->filled('fileExam1stBase64')) {
$fileBase64 = $request->input('fileExam1stBase64');
$fileData = base64_decode($fileBase64);
$fileExt = pathinfo($fileName, PATHINFO_EXTENSION);
if (!in_array($fileExt, $acceptExt)) {
throw new \Exception('檢驗檢查報告1檔案 副檔名錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
$mimeType = $finfo->buffer($fileData);
if (!in_array($mimeType, $allowedMimeTypes)) {
throw new \Exception('檢驗檢查報告1檔案 檔案類型錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
if ($mimeType != 'application/pdf') {
$image = $manager->read($fileData);
$image->scaleDown(2048, 2048);
$fileData = $image->toJpeg(50);
$fileExt = 'jpg';
}
if ($eventItem->exam_1st_img_src) {
try {
Storage::disk('local')->delete($eventItem->exam_1st_img_src);
} catch (\Exception $ex2) {
}
}
$fileName = $eventItem->twid . "_Exam1st_" . $uploadTime . "." . $fileExt;
Storage::disk('local')->put($uploadPath. '/' . $fileName, $fileData);
$eventItem->exam_1st_img_src = $uploadPath.'/'.$fileName;
} else {
throw new \Exception('請上傳檢驗檢查報告1。');
}
$fileName = $request->input('fileExam2ndFileName');
if ($fileName && $request->filled('fileExam2ndBase64')) {
$fileBase64 = $request->input('fileExam2ndBase64');
$fileData = base64_decode($fileBase64);
$fileExt = pathinfo($fileName, PATHINFO_EXTENSION);
if (!in_array($fileExt, $acceptExt)) {
throw new \Exception('檢驗檢查報告2檔案 副檔名錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
$mimeType = $finfo->buffer($fileData);
if (!in_array($mimeType, $allowedMimeTypes)) {
throw new \Exception('檢驗檢查報告2檔案 檔案類型錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
if ($mimeType != 'application/pdf') {
$image = $manager->read($fileData);
$image->scaleDown(2048, 2048);
$fileData = $image->toJpeg(50);
$fileExt = 'jpg';
}
if ($eventItem->exam_2nd_img_src) {
try {
Storage::disk('local')->delete($eventItem->exam_2nd_img_src);
} catch (\Exception $ex2) {
}
}
$fileName = $eventItem->twid . "_Exam2nd_" . $uploadTime . "." . $fileExt;
Storage::disk('local')->put($uploadPath. '/' . $fileName, $fileData);
$eventItem->exam_2nd_img_src = $uploadPath.'/'.$fileName;
} else {
throw new \Exception('請上傳檢驗檢查報告2。');
}
// $file = $request->file('fileRecordCard');
// if ($file) {
// $fileExt = $file->getClientOriginalExtension();
// $fileName = $eventItem->twid . "_RecordCard." . $fileExt;
// $path = $file->storeAs($uploadPath, $fileName);
// $eventItem->record_card_img_src = $uploadPath.'/'.$fileName;
// } else {
// throw new \Exception('請上傳記錄小卡。');
// }
// $file = $request->file('fileTwidFront');
// if ($file) {
// $fileExt = $file->getClientOriginalExtension();
// $fileName = $eventItem->twid . "_TwidFront." . $fileExt;
// $path = $file->storeAs($uploadPath, $fileName);
// $eventItem->twid_front_img_src = $uploadPath.'/'.$fileName;
// } else {
// throw new \Exception('請上傳身份證正面。');
// }
// $file = $request->file('fileTwidBack');
// if ($file) {
// $fileExt = $file->getClientOriginalExtension();
// $fileName = $eventItem->twid . "_TwidBack." . $fileExt;
// $path = $file->storeAs($uploadPath, $fileName);
// $eventItem->twid_back_img_src = $uploadPath.'/'.$fileName;
// } else {
// throw new \Exception('請上傳身份證背面。');
// }
// $file = $request->file('fileExam1st');
// if ($file) {
// $fileExt = $file->getClientOriginalExtension();
// $fileName = $eventItem->twid . "_Exam1st." . $fileExt;
// $path = $file->storeAs($uploadPath, $fileName);
// $eventItem->exam_1st_img_src = $uploadPath.'/'.$fileName;
// } else {
// throw new \Exception('請上傳檢驗檢查報告1。');
// }
// $file = $request->file('fileExam2nd');
// if ($file) {
// $fileExt = $file->getClientOriginalExtension();
// $fileName = $eventItem->twid . "_Exam2nd." . $fileExt;
// $path = $file->storeAs($uploadPath, $fileName);
// $eventItem->exam_2nd_img_src = $uploadPath.'/'.$fileName;
// } else {
// throw new \Exception('請上傳檢驗檢查報告2。');
// }
$eventItem->check_state = 1;
$eventItem->save();
DB::commit();
try {
Mail::to($request->input('email'))->send(new EventNotifyMail([
"title" => "反轉代謝新人生 皮蛇疫苗加碼補 登記成功!",
"body" => "登記資料:"
."\n就醫院所:".$request->input('hospital_name')
."\n姓名:".$request->input('name')
."\n身份證字號:".substr($request->input('twid'),0,2)."xxxx".substr($request->input('twid'),-4)
."\n行動電話:".$request->input('phone')
."\n電子信箱:".$request->input('email')
."\n收件地址:".$request->input('address')
,
]));
} catch (Exception $ex) {
}
}
catch (\Exception $ex) {
DB::rollBack();
return redirect()->back()->withErrors([$ex->getMessage()])->withInput(Request()->all());
}
//return redirect()->back()->with('success', '登記成功!');
return view('health_allowance_fill_form_ok');
}
public function doCheckGet(Request $request)
{
return view('health_allowance_check');
}
public function doCheckPost(EventHealthAllowanceCheckRequest $request)
{
$rejectReason = '';
try
{
$twid = Str::upper($request->input('twid'));
$phone = $request->input('phone');
$eventItem = EventHealthAllowance::where('twid', 'like', '%'.$twid)->where('phone', 'like', '%'.$phone)->first();
if (!$eventItem) {
throw new \Exception('找不到您登記的資料,請確認是否資訊正確。');
}
if ($eventItem->check_state == 1) {
throw new \Exception('您已經登記審查,請等待審查完成。');
}
if ($eventItem->check_state == 2) {
$rejectReason = $eventItem->check_reson;
throw new \Exception('您的審查未通過,請依以下原因說明重新登記。');
}
}
catch (\Exception $ex) {
return redirect()->back()->withErrors([$ex->getMessage(), $rejectReason])->withInput(Request()->all());
}
return redirect()->back()->with('success', '您已審格通過!');
}
}

View File

@ -0,0 +1,28 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HealthInfoController extends Controller
{
public function index(Request $request)
{
$perPageItems = 999;
$page = $request->get("p");
$page = (!$page || $page < 1) ? 1 : $page;
$pageOffset = $perPageItems * ($page - 1);
$dataRows = \App\Models\HealthInfo::where('is_front_show', '=', true)
->orderBy('post_at', 'desc');
//->select('id', 'title', 'description', 'body', 'photos', 'post_at');
return view('health_infos', [
'dataRows' => $dataRows->skip($pageOffset)->take($perPageItems)->get(),
'dataCurrentPage' => $page,
'dataPerPageItems' => $perPageItems,
'dataTotalCount' => $dataRows->count(),
]);
}
}

View File

@ -0,0 +1,364 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\EventImprovedHealthCheckRequest;
use App\Http\Requests\EventImprovedHealthRequest;
use App\Models\EventImprovedHealth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Carbon\Carbon;
use App\Mail\EventNotifyMail;
use Illuminate\Support\Facades\Mail;
use App\Models\EventMetabolism;
use App\Models\EventRegistrationInfo;
use Exception;
use Illuminate\Support\Facades\Cache;
use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Gd\Driver;
class ImprovedHealthFillFormController extends Controller
{
/**
* Handle the incoming request.
*/
public function __invoke(Request $request)
{
//
}
public function index(Request $request)
{
$enable = true;
$eventInfo = Cache::get('event-info-cache-2', function () {
$entry = EventRegistrationInfo::where('id', 2)->first();
if ($entry) {
return ['enable' => $entry->enable,'limit' => $entry->limit, 'start_at' => $entry->event_start_date, 'end_at' => $entry->event_end_date ];
}
return null;
});
if ($eventInfo) {
if ($eventInfo['enable'] != "1") {
$enable = false;
}
$date_now = new \DateTime("now");
$date_start = new \DateTime($eventInfo['start_at']);
$date_end = new \DateTime($eventInfo['end_at']);
if ($date_now > $date_start && $date_end > $date_now ) {
//
} else {
$enable = false;
}
}
return view('improved_health', [
'enable' => $enable
]);
}
public function doGet(Request $request)
{
return view('improved_health_fill_form');
}
public function doPostOk(Request $request)
{
return view('improved_health_fill_form_ok');
}
public function doPost(EventImprovedHealthRequest $request)
{
try
{
$eventInfo = Cache::get('event-info-cache-2', function () {
$entry = EventRegistrationInfo::where('id', 2)->first();
if ($entry) {
return ['enable' => $entry->enable,'limit' => $entry->limit, 'start_at' => $entry->event_start_date, 'end_at' => $entry->event_end_date ];
}
return null;
});
if ($eventInfo) {
if ($eventInfo['enable'] != "1") {
throw new \Exception('活動已截止。');
}
$date_now = new \DateTime("now");
$date_start = new \DateTime($eventInfo['start_at']);
$date_end = new \DateTime($eventInfo['end_at']);
if ($date_now > $date_start && $date_end > $date_now ) {
//
} else {
throw new \Exception('活動已截止。');
}
}
DB::beginTransaction();
//$checkPhone = EventMetabolism::where('phone', '=', $request->input('phone'))->first();
//if ($checkPhone) {
// throw new \Exception('本電話號碼已經登記。');
//}
$twid = Str::upper($request->input('twid'));
$eventItem = EventImprovedHealth::where('twid', '=', $twid)->first();
if (!$eventItem) {
$eventItem = new EventImprovedHealth();
$eventItem->twid = $twid;
}
if ($eventItem->check_state == 1) {
throw new \Exception('您已經登記審查,請等待審查完成。');
}
if ($eventItem->check_state == 2) {
throw new \Exception('您已經登記審查通過。');
}
$eventItem->hospital_name = $request->input('hospital_name');
$eventItem->name = $request->input('name');
$eventItem->phone = $request->input('phone');
$eventItem->email = $request->input('email');
$eventItem->address = $request->input('address');
$uploadPath = 'uploads/improved_health';
$acceptExt = ['jpg', 'jpeg', 'png', 'pdf'];
$finfo = new \finfo(FILEINFO_MIME_TYPE);
$allowedMimeTypes = [
'image/png', // PNG
'image/jpeg', // JPG/JPEG
'application/pdf' // PDF
];
$manager = new ImageManager(Driver::class);
$uploadTime = time();
$fileName = $request->input('fileRecordCardFileName');
if ($fileName && $request->filled('fileRecordCardBase64')) {
$fileBase64 = $request->input('fileRecordCardBase64');
$fileData = base64_decode($fileBase64);
$fileExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
if (!in_array($fileExt, $acceptExt)) {
throw new \Exception('記錄小卡檔案 副檔名錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
$mimeType = $finfo->buffer($fileData);
if (!in_array($mimeType, $allowedMimeTypes)) {
throw new \Exception('記錄小卡檔案 檔案類型錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
if ($mimeType != 'application/pdf') {
$image = $manager->read($fileData);
$image->scaleDown(2048, 2048);
$fileData = $image->toJpeg(50);
$fileExt = 'jpg';
}
if ($eventItem->record_card_img_src) {
try {
Storage::disk('local')->delete($eventItem->record_card_img_src);
} catch (\Exception $ex2) {
}
}
$fileName = $eventItem->twid . "_RecordCard_" . $uploadTime . "." . $fileExt;
Storage::disk('local')->put($uploadPath. '/' . $fileName, $fileData);
$eventItem->record_card_img_src = $uploadPath.'/'.$fileName;
} else {
throw new \Exception('請上傳記錄小卡。');
}
$fileName = $request->input('fileTwidFrontFileName');
if ($fileName && $request->filled('fileTwidFrontBase64')) {
$fileBase64 = $request->input('fileTwidFrontBase64');
$fileData = base64_decode($fileBase64);
$fileExt = pathinfo($fileName, PATHINFO_EXTENSION);
if (!in_array($fileExt, $acceptExt)) {
throw new \Exception('身份證正面檔案 副檔名錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
$mimeType = $finfo->buffer($fileData);
if (!in_array($mimeType, $allowedMimeTypes)) {
throw new \Exception('身份證正面檔案 檔案類型錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
if ($mimeType != 'application/pdf') {
$image = $manager->read($fileData);
$image->scaleDown(2048, 2048);
$fileData = $image->toJpeg(50);
$fileExt = 'jpg';
}
if ($eventItem->twid_front_img_src) {
try {
Storage::disk('local')->delete($eventItem->twid_front_img_src);
} catch (\Exception $ex2) {
}
}
$fileName = $eventItem->twid . "_TwidFront_" . $uploadTime . "." . $fileExt;
Storage::disk('local')->put($uploadPath. '/' . $fileName, $fileData);
$eventItem->twid_front_img_src = $uploadPath.'/'.$fileName;
} else {
throw new \Exception('請上傳身份證正面。');
}
$fileName = $request->input('fileTwidBackFileName');
if ($fileName && $request->filled('fileTwidBackBase64')) {
$fileBase64 = $request->input('fileTwidBackBase64');
$fileData = base64_decode($fileBase64);
$fileExt = pathinfo($fileName, PATHINFO_EXTENSION);
if (!in_array($fileExt, $acceptExt)) {
throw new \Exception('身份證背面檔案 副檔名錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
$mimeType = $finfo->buffer($fileData);
if (!in_array($mimeType, $allowedMimeTypes)) {
throw new \Exception('身份證背面檔案 檔案類型錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
if ($mimeType != 'application/pdf') {
$image = $manager->read($fileData);
$image->scaleDown(2048, 2048);
$fileData = $image->toJpeg(50);
$fileExt = 'jpg';
}
if ($eventItem->twid_back_img_src) {
try {
Storage::disk('local')->delete($eventItem->twid_back_img_src);
} catch (\Exception $ex2) {
}
}
$fileName = $eventItem->twid . "_TwidBack_" . $uploadTime . "." . $fileExt;
Storage::disk('local')->put($uploadPath. '/' . $fileName, $fileData);
$eventItem->twid_back_img_src = $uploadPath.'/'.$fileName;
} else {
throw new \Exception('請上傳身份證背面。');
}
$fileName = $request->input('fileExamFileName');
if ($fileName && $request->filled('fileExamBase64')) {
$fileBase64 = $request->input('fileExamBase64');
$fileData = base64_decode($fileBase64);
$fileExt = pathinfo($fileName, PATHINFO_EXTENSION);
if (!in_array($fileExt, $acceptExt)) {
throw new \Exception('檢查報告檔案 副檔名錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
$mimeType = $finfo->buffer($fileData);
if (!in_array($mimeType, $allowedMimeTypes)) {
throw new \Exception('檢查報告檔案 檔案類型錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
if ($mimeType != 'application/pdf') {
$image = $manager->read($fileData);
$image->scaleDown(2048, 2048);
$fileData = $image->toJpeg(50);
$fileExt = 'jpg';
}
if ($eventItem->exam_img_src) {
try {
Storage::disk('local')->delete($eventItem->exam_img_src);
} catch (\Exception $ex2) {
}
}
$fileName = $eventItem->twid . "_Exam_" . $uploadTime . "." . $fileExt;
Storage::disk('local')->put($uploadPath. '/' . $fileName, $fileData);
$eventItem->exam_img_src = $uploadPath.'/'.$fileName;
} else {
throw new \Exception('請上傳檢查報告。');
}
// $file = $request->file('fileRecordCard');
// if ($file) {
// $fileExt = $file->getClientOriginalExtension();
// $fileName = $eventItem->twid . "_RecordCard." . $fileExt;
// $path = $file->storeAs($uploadPath, $fileName);
// $eventItem->record_card_img_src = $uploadPath.'/'.$fileName;
// } else {
// throw new \Exception('請上傳記錄小卡。');
// }
// $file = $request->file('fileTwidFront');
// if ($file) {
// $fileExt = $file->getClientOriginalExtension();
// $fileName = $eventItem->twid . "_TwidFront." . $fileExt;
// $path = $file->storeAs($uploadPath, $fileName);
// $eventItem->twid_front_img_src = $uploadPath.'/'.$fileName;
// } else {
// throw new \Exception('請上傳身份證正面。');
// }
// $file = $request->file('fileTwidBack');
// if ($file) {
// $fileExt = $file->getClientOriginalExtension();
// $fileName = $eventItem->twid . "_TwidBack." . $fileExt;
// $path = $file->storeAs($uploadPath, $fileName);
// $eventItem->twid_back_img_src = $uploadPath.'/'.$fileName;
// } else {
// throw new \Exception('請上傳身份證背面。');
// }
// $file = $request->file('fileExam');
// if ($file) {
// $fileExt = $file->getClientOriginalExtension();
// $fileName = $eventItem->twid . "_Exam." . $fileExt;
// $path = $file->storeAs($uploadPath, $fileName);
// $eventItem->exam_img_src = $uploadPath.'/'.$fileName;
// } else {
// throw new \Exception('請上傳檢查報告。');
// }
$eventItem->check_state = 1;
$eventItem->save();
DB::commit();
try {
Mail::to($request->input('email'))->send(new EventNotifyMail([
"title" => "健康達標GO 大獎汽車不是夢 登記成功!",
"body" => "登記資料:"
."\n就醫院所:".$request->input('hospital_name')
."\n姓名:".$request->input('name')
."\n身份證字號:".substr($request->input('twid'),0,2)."xxxx".substr($request->input('twid'),-4)
."\n行動電話:".$request->input('phone')
."\n電子信箱:".$request->input('email')
."\n收件地址:".$request->input('address')
,
]));
} catch (Exception $ex) {
}
}
catch (\Exception $ex) {
DB::rollBack();
return redirect()->back()->withErrors([$ex->getMessage()])->withInput(Request()->all());
}
//return redirect()->back()->with('success', '登記成功!');
return view('improved_health_fill_form_ok');
}
public function doCheckGet(Request $request)
{
return view('improved_health_check');
}
public function doCheckPost(EventImprovedHealthCheckRequest $request)
{
$rejectReason = '';
try
{
$twid = Str::upper($request->input('twid'));
$phone = $request->input('phone');
$eventItem = EventImprovedHealth::where('twid', 'like', '%'.$twid)->where('phone', 'like', '%'.$phone)->first();
if (!$eventItem) {
throw new \Exception('找不到您登記的資料,請確認是否資訊正確。');
}
if ($eventItem->check_state == 1) {
throw new \Exception('您已經登記審查,請等待審查完成。');
}
if ($eventItem->check_state == 2) {
$rejectReason = $eventItem->check_reson;
throw new \Exception('您的審查未通過,請依以下原因說明重新登記。');
}
}
catch (\Exception $ex) {
return redirect()->back()->withErrors([$ex->getMessage(), $rejectReason])->withInput(Request()->all());
}
return redirect()->back()->with('success', '您已審格通過!');
}
}

View File

@ -0,0 +1,18 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Mail;
use App\Mail\EventNotifyMail;
class MailController extends Controller
{
public function index()
{
Mail::to('ericli1018@gmail.com')->send(new EventNotifyMail([
"title" => "Test Notify",
"body" => "The Body\n1\n2\n",
]));
}
}

View File

@ -0,0 +1,321 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\EventMetabolismRequest;
use App\Http\Requests\EventMetabolismCheckRequest;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Carbon\Carbon;
use App\Models\EventMetabolism;
use App\Mail\EventNotifyMail;
use App\Models\EventRegistrationInfo;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Cache;
use Exception;
use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Gd\Driver;
class MetabolismFillFormController extends Controller
{
/**
* Handle the incoming request.
*/
public function __invoke(Request $request)
{
//
}
public function index(Request $request)
{
$enable = true;
$eventInfo = Cache::get('event-info-cache-1', function () {
$entry = EventRegistrationInfo::where('id', 1)->first();
if ($entry) {
return ['enable' => $entry->enable,'limit' => $entry->limit, 'start_at' => $entry->event_start_date, 'end_at' => $entry->event_end_date ];
}
return null;
});
if ($eventInfo) {
if ($eventInfo['enable'] != "1") {
$enable = false;
}
$date_now = new \DateTime("now");
$date_start = new \DateTime($eventInfo['start_at']);
$date_end = new \DateTime($eventInfo['end_at']);
if ($date_now > $date_start && $date_end > $date_now ) {
//
} else {
$enable = false;
}
}
return view('metabolism', [
'enable' => $enable
]);
}
public function doGet(Request $request)
{
return view('metabolism_fill_form');
}
public function doPostOk(Request $request)
{
return view('metabolism_fill_form_ok');
}
public function doPost(EventMetabolismRequest $request)
{
try
{
$eventInfo = Cache::get('event-info-cache-1', function () {
$entry = EventRegistrationInfo::where('id', 1)->first();
if ($entry) {
return ['enable' => $entry->enable,'limit' => $entry->limit, 'start_at' => $entry->event_start_date, 'end_at' => $entry->event_end_date ];
}
return null;
});
if ($eventInfo) {
if ($eventInfo['enable'] != "1") {
throw new \Exception('活動已截止。');
}
$date_now = new \DateTime("now");
$date_start = new \DateTime($eventInfo['start_at']);
$date_end = new \DateTime($eventInfo['end_at']);
if ($date_now > $date_start && $date_end > $date_now ) {
//
} else {
throw new \Exception('活動已截止。');
}
}
DB::beginTransaction();
//$checkPhone = EventMetabolism::where('phone', '=', $request->input('phone'))->first();
//if ($checkPhone) {
// throw new \Exception('本電話號碼已經登記。');
//}
$twid = Str::upper($request->input('twid'));
$eventItem = EventMetabolism::where('twid', '=', $twid)->first();
if (!$eventItem) {
$eventItem = new EventMetabolism();
$eventItem->twid = $twid;
}
if ($eventItem->check_state == 1) {
throw new \Exception('您已經登記審查,請等待審查完成。');
}
if ($eventItem->check_state == 2) {
throw new \Exception('您已經登記審查通過。');
}
$eventItem->hospital_name = $request->input('hospital_name');
$eventItem->name = $request->input('name');
$eventItem->phone = $request->input('phone');
$eventItem->email = $request->input('email');
$eventItem->address = $request->input('address');
$uploadPath = 'uploads/metabolism';
$acceptExt = ['jpg', 'jpeg', 'png', 'pdf'];
$finfo = new \finfo(FILEINFO_MIME_TYPE);
$allowedMimeTypes = [
'image/png', // PNG
'image/jpeg', // JPG/JPEG
'application/pdf' // PDF
];
$manager = new ImageManager(Driver::class);
$uploadTime = time();
$fileName = $request->input('fileRecordCardFileName');
if ($fileName && $request->filled('fileRecordCardBase64')) {
$fileBase64 = $request->input('fileRecordCardBase64');
$fileData = base64_decode($fileBase64);
$fileExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
if (!in_array($fileExt, $acceptExt)) {
throw new \Exception('記錄小卡檔案 副檔名錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
$mimeType = $finfo->buffer($fileData);
if (!in_array($mimeType, $allowedMimeTypes)) {
throw new \Exception('記錄小卡檔案 檔案類型錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
if ($mimeType != 'application/pdf') {
$image = $manager->read($fileData);
$image->scaleDown(2048, 2048);
$fileData = $image->toJpeg(50);
$fileExt = 'jpg';
}
if ($eventItem->record_card_img_src) {
try {
Storage::disk('local')->delete($eventItem->record_card_img_src);
} catch (\Exception $ex2) {
}
}
$fileName = $eventItem->twid . "_RecordCard_" . $uploadTime . "." . $fileExt;
Storage::disk('local')->put($uploadPath. '/' . $fileName, $fileData);
$eventItem->record_card_img_src = $uploadPath.'/'.$fileName;
} else {
throw new \Exception('請上傳記錄小卡。');
}
$fileName = $request->input('fileTwidFrontFileName');
if ($fileName && $request->filled('fileTwidFrontBase64')) {
$fileBase64 = $request->input('fileTwidFrontBase64');
$fileData = base64_decode($fileBase64);
$fileExt = pathinfo($fileName, PATHINFO_EXTENSION);
if (!in_array($fileExt, $acceptExt)) {
throw new \Exception('身份證正面檔案 副檔名錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
$mimeType = $finfo->buffer($fileData);
if (!in_array($mimeType, $allowedMimeTypes)) {
throw new \Exception('身份證正面檔案 檔案類型錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
if ($mimeType != 'application/pdf') {
$image = $manager->read($fileData);
$image->scaleDown(2048, 2048);
$fileData = $image->toJpeg(50);
$fileExt = 'jpg';
}
if ($eventItem->twid_front_img_src) {
try {
Storage::disk('local')->delete($eventItem->twid_front_img_src);
} catch (\Exception $ex2) {
}
}
$fileName = $eventItem->twid . "_TwidFront_" . $uploadTime . "." . $fileExt;
Storage::disk('local')->put($uploadPath. '/' . $fileName, $fileData);
$eventItem->twid_front_img_src = $uploadPath.'/'.$fileName;
} else {
throw new \Exception('請上傳身份證正面。');
}
$fileName = $request->input('fileTwidBackFileName');
if ($fileName && $request->filled('fileTwidBackBase64')) {
$fileBase64 = $request->input('fileTwidBackBase64');
$fileData = base64_decode($fileBase64);
$fileExt = pathinfo($fileName, PATHINFO_EXTENSION);
if (!in_array($fileExt, $acceptExt)) {
throw new \Exception('身份證背面檔案 副檔名錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
$mimeType = $finfo->buffer($fileData);
if (!in_array($mimeType, $allowedMimeTypes)) {
throw new \Exception('身份證背面檔案 檔案類型錯誤,只接受.jpg/.jpeg/.png/.pdf');
}
if ($mimeType != 'application/pdf') {
$image = $manager->read($fileData);
$image->scaleDown(2048, 2048);
$fileData = $image->toJpeg(50);
$fileExt = 'jpg';
}
if ($eventItem->twid_back_img_src) {
try {
Storage::disk('local')->delete($eventItem->twid_back_img_src);
} catch (\Exception $ex2) {
}
}
$fileName = $eventItem->twid . "_TwidBack_" . $uploadTime . "." . $fileExt;
Storage::disk('local')->put($uploadPath. '/' . $fileName, $fileData);
$eventItem->twid_back_img_src = $uploadPath.'/'.$fileName;
} else {
throw new \Exception('請上傳身份證背面。');
}
// $file = $request->file('fileRecordCard');
// if ($file) {
// $fileExt = $file->getClientOriginalExtension();
// $fileName = $eventItem->twid . "_RecordCard." . $fileExt;
// $path = $file->storeAs($uploadPath, $fileName);
// $eventItem->record_card_img_src = $uploadPath.'/'.$fileName;
// } else {
// throw new \Exception('請上傳記錄小卡。');
// }
// $file = $request->file('fileTwidFront');
// if ($file) {
// $fileExt = $file->getClientOriginalExtension();
// $fileName = $eventItem->twid . "_TwidFront." . $fileExt;
// $path = $file->storeAs($uploadPath, $fileName);
// $eventItem->twid_front_img_src = $uploadPath.'/'.$fileName;
// } else {
// throw new \Exception('請上傳身份證正面。');
// }
// $file = $request->file('fileTwidBack');
// if ($file) {
// $fileExt = $file->getClientOriginalExtension();
// $fileName = $eventItem->twid . "_TwidBack." . $fileExt;
// $path = $file->storeAs($uploadPath, $fileName);
// $eventItem->twid_back_img_src = $uploadPath.'/'.$fileName;
// } else {
// throw new \Exception('請上傳身份證背面。');
// }
$eventItem->check_state = 1;
$eventItem->save();
DB::commit();
try {
Mail::to($request->input('email'))->send(new EventNotifyMail([
"title" => "符合代謝新收案 早鳥報名最划算 登記成功!",
"body" => "登記資料:"
."\n就醫院所:".$request->input('hospital_name')
."\n姓名:".$request->input('name')
."\n身份證字號:".substr($request->input('twid'),0,2)."xxxx".substr($request->input('twid'),-4)
."\n行動電話:".$request->input('phone')
."\n電子信箱:".$request->input('email')
."\n收件地址:".$request->input('address')
,
]));
} catch (Exception $ex) {
}
}
catch (\Exception $ex) {
DB::rollBack();
return redirect()->back()->withErrors([$ex->getMessage()])->withInput(Request()->all());
}
//return redirect()->back()->with('success', '登記成功!');
return view('metabolism_fill_form_ok');
}
public function doCheckGet(Request $request)
{
return view('metabolism_check');
}
public function doCheckPost(EventMetabolismCheckRequest $request)
{
$rejectReason = '';
try
{
$twid = Str::upper($request->input('twid'));
$phone = $request->input('phone');
$eventItem = EventMetabolism::where('twid', 'like', '%'.$twid)->where('phone', 'like', '%'.$phone)->first();
if (!$eventItem) {
throw new \Exception('找不到您登記的資料,請確認是否資訊正確。');
}
if ($eventItem->check_state == 1) {
throw new \Exception('您已經登記審查,請等待審查完成。');
}
if ($eventItem->check_state == 2) {
$rejectReason = $eventItem->check_reson;
throw new \Exception('您的審查未通過,請依以下原因說明重新登記。');
}
}
catch (\Exception $ex) {
return redirect()->back()->withErrors([$ex->getMessage(), $rejectReason])->withInput(Request()->all());
}
return redirect()->back()->with('success', '您已審格通過!');
}
}

View File

@ -0,0 +1,37 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class NewsController extends Controller
{
public function index(Request $request)
{
$perPageItems = 999;
$page = $request->get("p");
$page = (!$page || $page < 1) ? 1 : $page;
$pageOffset = $perPageItems * ($page - 1);
$dataRows = \App\Models\News::where('is_front_show', '=', true)
->orderBy('post_at', 'desc');
//->select('id', 'title', 'description', 'body', 'photos', 'post_at');
return view('news', [
'dataRows' => $dataRows->skip($pageOffset)->take($perPageItems)->get(),
'dataCurrentPage' => $page,
'dataPerPageItems' => $perPageItems,
'dataTotalCount' => $dataRows->count(),
]);
}
public function detail(Request $request, $id)
{
$dataRow = \App\Models\News::where('id', '=', $id)
->where('is_front_show', '=', true);
return view('news_detail', [
'dataRow' => $dataRow->first(),
]);
}
}

View File

@ -0,0 +1,28 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class NoticeController extends Controller
{
public function index(Request $request)
{
$perPageItems = 999;
$page = $request->get("p");
$page = (!$page || $page < 1) ? 1 : $page;
$pageOffset = $perPageItems * ($page - 1);
$dataRows = \App\Models\Notice::where('is_front_show', '=', true)
->orderBy('post_at', 'desc');
//->select('id', 'title', 'description', 'body', 'photos', 'post_at');
return view('notices', [
'dataRows' => $dataRows->skip($pageOffset)->take($perPageItems)->get(),
'dataCurrentPage' => $page,
'dataPerPageItems' => $perPageItems,
'dataTotalCount' => $dataRows->count(),
]);
}
}

68
app/Http/Kernel.php Normal file
View File

@ -0,0 +1,68 @@
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array<int, class-string|string>
*/
protected $middleware = [
// \App\Http\Middleware\TrustHosts::class,
\App\Http\Middleware\TrustProxies::class,
\Illuminate\Http\Middleware\HandleCors::class,
\App\Http\Middleware\PreventRequestsDuringMaintenance::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
/**
* The application's route middleware groups.
*
* @var array<string, array<int, class-string|string>>
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
// \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
\Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
/**
* The application's middleware aliases.
*
* Aliases may be used instead of class names to conveniently assign middleware to routes and groups.
*
* @var array<string, class-string|string>
*/
protected $middlewareAliases = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'precognitive' => \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class,
'signed' => \App\Http\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
}

View File

@ -0,0 +1,17 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
use Illuminate\Http\Request;
class Authenticate extends Middleware
{
/**
* Get the path the user should be redirected to when they are not authenticated.
*/
protected function redirectTo(Request $request): ?string
{
return $request->expectsJson() ? null : route('login');
}
}

View File

@ -0,0 +1,68 @@
<?php
namespace App\Http\Middleware;
use Closure;
class CheckIfAdmin
{
/**
* Checked that the logged in user is an administrator.
*
* --------------
* VERY IMPORTANT
* --------------
* If you have both regular users and admins inside the same table, change
* the contents of this method to check that the logged in user
* is an admin, and not a regular user.
*
* Additionally, in Laravel 7+, you should change app/Providers/RouteServiceProvider::HOME
* which defines the route where a logged in user (but not admin) gets redirected
* when trying to access an admin route. By default it's '/home' but Backpack
* does not have a '/home' route, use something you've built for your users
* (again - users, not admins).
*
* @param \Illuminate\Contracts\Auth\Authenticatable|null $user
* @return bool
*/
private function checkIfUserIsAdmin($user)
{
// return ($user->is_admin == 1);
return true;
}
/**
* Answer to unauthorized access request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
private function respondToUnauthorizedRequest($request)
{
if ($request->ajax() || $request->wantsJson()) {
return response(trans('backpack::base.unauthorized'), 401);
} else {
return redirect()->guest(backpack_url('login'));
}
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (backpack_auth()->guest()) {
return $this->respondToUnauthorizedRequest($request);
}
if (! $this->checkIfUserIsAdmin(backpack_user())) {
return $this->respondToUnauthorizedRequest($request);
}
return $next($request);
}
}

View File

@ -0,0 +1,17 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;
class EncryptCookies extends Middleware
{
/**
* The names of the cookies that should not be encrypted.
*
* @var array<int, string>
*/
protected $except = [
//
];
}

View File

@ -0,0 +1,17 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance as Middleware;
class PreventRequestsDuringMaintenance extends Middleware
{
/**
* The URIs that should be reachable while maintenance mode is enabled.
*
* @var array<int, string>
*/
protected $except = [
//
];
}

View File

@ -0,0 +1,30 @@
<?php
namespace App\Http\Middleware;
use App\Providers\RouteServiceProvider;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;
class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next, string ...$guards): Response
{
$guards = empty($guards) ? [null] : $guards;
foreach ($guards as $guard) {
if (Auth::guard($guard)->check()) {
return redirect(RouteServiceProvider::HOME);
}
}
return $next($request);
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;
class TrimStrings extends Middleware
{
/**
* The names of the attributes that should not be trimmed.
*
* @var array<int, string>
*/
protected $except = [
'current_password',
'password',
'password_confirmation',
];
}

View File

@ -0,0 +1,20 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Middleware\TrustHosts as Middleware;
class TrustHosts extends Middleware
{
/**
* Get the host patterns that should be trusted.
*
* @return array<int, string|null>
*/
public function hosts(): array
{
return [
$this->allSubdomainsOfApplicationUrl(),
];
}
}

View File

@ -0,0 +1,28 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Middleware\TrustProxies as Middleware;
use Illuminate\Http\Request;
class TrustProxies extends Middleware
{
/**
* The trusted proxies for this application.
*
* @var array<int, string>|string|null
*/
protected $proxies;
/**
* The headers that should be used to detect proxies.
*
* @var int
*/
protected $headers =
Request::HEADER_X_FORWARDED_FOR |
Request::HEADER_X_FORWARDED_HOST |
Request::HEADER_X_FORWARDED_PORT |
Request::HEADER_X_FORWARDED_PROTO |
Request::HEADER_X_FORWARDED_AWS_ELB;
}

View File

@ -0,0 +1,22 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Routing\Middleware\ValidateSignature as Middleware;
class ValidateSignature extends Middleware
{
/**
* The names of the query string parameters that should be ignored.
*
* @var array<int, string>
*/
protected $except = [
// 'fbclid',
// 'utm_campaign',
// 'utm_content',
// 'utm_medium',
// 'utm_source',
// 'utm_term',
];
}

View File

@ -0,0 +1,17 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array<int, string>
*/
protected $except = [
//
];
}

View File

@ -0,0 +1,46 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class EventHealthAllowanceCheckRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function rules()
{
return [
'twid' => 'required|min:4|max:4',
'phone' => 'required|min:4|max:4',
];
}
/**
* Get the validation attributes that apply to the request.
*
* @return array
*/
public function attributes()
{
return [
'twid' => '身份證字號後4碼',
'phone' => '行動電話後4碼',
];
}
/**
* Get the validation messages that apply to the request.
*
* @return array
*/
public function messages()
{
return [
];
}
}

View File

@ -0,0 +1,57 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class EventHealthAllowanceRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function rules()
{
return [
'hospital_name' => 'required|min:2',
'name' => 'required|min:1|max:128',
'twid' => 'required|isNI',
'phone' => 'required|phone:TW',
'email' => 'required|email',
'address' => 'required|min:5',
'check_reson' => 'required_if:check_state,3',
];
}
/**
* Get the validation attributes that apply to the request.
*
* @return array
*/
public function attributes()
{
return [
'hospital_name' => '就醫院所',
'name' => '姓名',
'twid' => '身份證字號',
'phone' => '行動電話',
'email' => '電子信箱',
'address' => '收件地址'
];
}
/**
* Get the validation messages that apply to the request.
*
* @return array
*/
public function messages()
{
return [
'twid.is_n_i' => '身份證字號驗證有誤',
'phone.phone' => '行動電話驗證有誤',
'check_reson.required_if' => '當審核狀態為「未通過」時,必需填寫「審核回應」欄位'
];
}
}

View File

@ -0,0 +1,59 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class EventImprovedHealthCheckRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
// only allow updates if the user is logged in
//return backpack_auth()->check();
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'twid' => 'required|min:4|max:4',
'phone' => 'required|min:4|max:4',
];
}
/**
* Get the validation attributes that apply to the request.
*
* @return array
*/
public function attributes()
{
return [
'twid' => '身份證字號後4碼',
'phone' => '行動電話後4碼',
];
}
/**
* Get the validation messages that apply to the request.
*
* @return array
*/
public function messages()
{
return [
];
}
}

View File

@ -0,0 +1,69 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class EventImprovedHealthRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
// only allow updates if the user is logged in
//return backpack_auth()->check();
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'hospital_name' => 'required|min:2',
'name' => 'required|min:1|max:128',
'twid' => 'required|isNI',
'phone' => 'required|phone:TW',
'email' => 'required|email',
'address' => 'required|min:5',
'check_reson' => 'required_if:check_state,3',
];
}
/**
* Get the validation attributes that apply to the request.
*
* @return array
*/
public function attributes()
{
return [
'hospital_name' => '就醫院所',
'name' => '姓名',
'twid' => '身份證字號',
'phone' => '行動電話',
'email' => '電子信箱',
'address' => '收件地址'
];
}
/**
* Get the validation messages that apply to the request.
*
* @return array
*/
public function messages()
{
return [
'twid.is_n_i' => '身份證字號驗證有誤',
'phone.phone' => '行動電話驗證有誤',
'check_reson.required_if' => '當審核狀態為「未通過」時,必需填寫「審核回應」欄位'
];
}
}

View File

@ -0,0 +1,60 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class EventMetabolismCheckRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
// only allow updates if the user is logged in
//return backpack_auth()->check();
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'twid' => 'required|min:4|max:4',
'phone' => 'required|min:4|max:4',
];
}
/**
* Get the validation attributes that apply to the request.
*
* @return array
*/
public function attributes()
{
return [
'twid' => '身份證字號後4碼',
'phone' => '行動電話後4碼',
];
}
/**
* Get the validation messages that apply to the request.
*
* @return array
*/
public function messages()
{
return [
];
}
}

View File

@ -0,0 +1,69 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class EventMetabolismRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
// only allow updates if the user is logged in
//return backpack_auth()->check();
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'hospital_name' => 'required|min:2',
'name' => 'required|min:1|max:128',
'twid' => 'required|isNI',
'phone' => 'required|phone:TW',
'email' => 'required|email',
'address' => 'required|min:5',
'check_reson' => 'required_if:check_state,3',
];
}
/**
* Get the validation attributes that apply to the request.
*
* @return array
*/
public function attributes()
{
return [
'hospital_name' => '就醫院所',
'name' => '姓名',
'twid' => '身份證字號',
'phone' => '行動電話',
'email' => '電子信箱',
'address' => '收件地址',
];
}
/**
* Get the validation messages that apply to the request.
*
* @return array
*/
public function messages()
{
return [
'twid.is_n_i' => '身份證字號驗證有誤',
'phone.phone' => '行動電話驗證有誤',
'check_reson.required_if' => '當審核狀態為「未通過」時,必需填寫「審核回應」欄位'
];
}
}

View File

@ -0,0 +1,55 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class EventRegistrationInfoRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
// only allow updates if the user is logged in
return backpack_auth()->check();
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
// 'name' => 'required|min:5|max:255'
];
}
/**
* Get the validation attributes that apply to the request.
*
* @return array
*/
public function attributes()
{
return [
//
];
}
/**
* Get the validation messages that apply to the request.
*
* @return array
*/
public function messages()
{
return [
//
];
}
}

View File

@ -0,0 +1,55 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class FaqCatalogRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
// only allow updates if the user is logged in
return backpack_auth()->check();
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
// 'name' => 'required|min:5|max:255'
];
}
/**
* Get the validation attributes that apply to the request.
*
* @return array
*/
public function attributes()
{
return [
//
];
}
/**
* Get the validation messages that apply to the request.
*
* @return array
*/
public function messages()
{
return [
//
];
}
}

View File

@ -0,0 +1,57 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class FaqRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
// only allow updates if the user is logged in
return backpack_auth()->check();
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
// 'name' => 'required|min:5|max:255'
'title' => 'required|min:2|max:255',
'body' => 'required|min:2'
];
}
/**
* Get the validation attributes that apply to the request.
*
* @return array
*/
public function attributes()
{
return [
//
];
}
/**
* Get the validation messages that apply to the request.
*
* @return array
*/
public function messages()
{
return [
//
];
}
}

View File

@ -0,0 +1,55 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class HealthInfoCatalogRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
// only allow updates if the user is logged in
return backpack_auth()->check();
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
// 'name' => 'required|min:5|max:255'
];
}
/**
* Get the validation attributes that apply to the request.
*
* @return array
*/
public function attributes()
{
return [
//
];
}
/**
* Get the validation messages that apply to the request.
*
* @return array
*/
public function messages()
{
return [
//
];
}
}

View File

@ -0,0 +1,57 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class HealthInfoRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
// only allow updates if the user is logged in
return backpack_auth()->check();
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
// 'name' => 'required|min:5|max:255'
'title' => 'required|min:2|max:255',
'body' => 'required|min:2'
];
}
/**
* Get the validation attributes that apply to the request.
*
* @return array
*/
public function attributes()
{
return [
//
];
}
/**
* Get the validation messages that apply to the request.
*
* @return array
*/
public function messages()
{
return [
//
];
}
}

View File

@ -0,0 +1,55 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class NewsCatalogRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
// only allow updates if the user is logged in
return backpack_auth()->check();
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
// 'name' => 'required|min:5|max:255'
];
}
/**
* Get the validation attributes that apply to the request.
*
* @return array
*/
public function attributes()
{
return [
//
];
}
/**
* Get the validation messages that apply to the request.
*
* @return array
*/
public function messages()
{
return [
//
];
}
}

View File

@ -0,0 +1,57 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class NewsRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
// only allow updates if the user is logged in
return backpack_auth()->check();
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
// 'name' => 'required|min:5|max:255'
'title' => 'required|min:2|max:255',
'body' => 'required|min:2'
];
}
/**
* Get the validation attributes that apply to the request.
*
* @return array
*/
public function attributes()
{
return [
//
];
}
/**
* Get the validation messages that apply to the request.
*
* @return array
*/
public function messages()
{
return [
//
];
}
}

View File

@ -0,0 +1,55 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class NoticeCatalogRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
// only allow updates if the user is logged in
return backpack_auth()->check();
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
// 'name' => 'required|min:5|max:255'
];
}
/**
* Get the validation attributes that apply to the request.
*
* @return array
*/
public function attributes()
{
return [
//
];
}
/**
* Get the validation messages that apply to the request.
*
* @return array
*/
public function messages()
{
return [
//
];
}
}

View File

@ -0,0 +1,57 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class NoticeRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
// only allow updates if the user is logged in
return backpack_auth()->check();
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
// 'name' => 'required|min:5|max:255'
'title' => 'required|min:2|max:255',
'body' => 'required|min:2'
];
}
/**
* Get the validation attributes that apply to the request.
*
* @return array
*/
public function attributes()
{
return [
//
];
}
/**
* Get the validation messages that apply to the request.
*
* @return array
*/
public function messages()
{
return [
//
];
}
}

View File

@ -0,0 +1,55 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UserRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
// only allow updates if the user is logged in
return backpack_auth()->check();
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
// 'name' => 'required|min:5|max:255'
];
}
/**
* Get the validation attributes that apply to the request.
*
* @return array
*/
public function attributes()
{
return [
//
];
}
/**
* Get the validation messages that apply to the request.
*
* @return array
*/
public function messages()
{
return [
//
];
}
}

View File

@ -0,0 +1,56 @@
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class EventNotifyMail extends Mailable
{
use Queueable, SerializesModels;
public $data;
/**
* Create a new message instance.
*/
public function __construct($data)
{
//
$this->data = $data;
}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: '桃園市政府衛生局 114年慢性病防治管理暨多元行銷宣導',
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
view: 'event-notify-mail',
);
}
/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [];
}
}

View File

@ -0,0 +1,58 @@
<?php
namespace App\Models;
use Backpack\CRUD\app\Models\Traits\CrudTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\Traits\LogsActivity;
class EventHealthAllowance extends Model
{
use CrudTrait;
use LogsActivity;
use HasFactory;
/*
|--------------------------------------------------------------------------
| GLOBAL VARIABLES
|--------------------------------------------------------------------------
*/
protected $table = 'event_health_allowances';
// protected $primaryKey = 'id';
// public $timestamps = false;
protected $guarded = ['id'];
// protected $fillable = [];
// protected $hidden = [];
/*
|--------------------------------------------------------------------------
| FUNCTIONS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| RELATIONS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| SCOPES
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| ACCESSORS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| MUTATORS
|--------------------------------------------------------------------------
*/
}

View File

@ -0,0 +1,58 @@
<?php
namespace App\Models;
use Backpack\CRUD\app\Models\Traits\CrudTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\Traits\LogsActivity;
class EventImprovedHealth extends Model
{
use CrudTrait;
use LogsActivity;
use HasFactory;
/*
|--------------------------------------------------------------------------
| GLOBAL VARIABLES
|--------------------------------------------------------------------------
*/
protected $table = 'event_improved_healths';
// protected $primaryKey = 'id';
// public $timestamps = false;
protected $guarded = ['id'];
// protected $fillable = [];
// protected $hidden = [];
/*
|--------------------------------------------------------------------------
| FUNCTIONS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| RELATIONS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| SCOPES
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| ACCESSORS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| MUTATORS
|--------------------------------------------------------------------------
*/
}

View File

@ -0,0 +1,58 @@
<?php
namespace App\Models;
use Backpack\CRUD\app\Models\Traits\CrudTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\Traits\LogsActivity;
class EventMetabolism extends Model
{
use CrudTrait;
use LogsActivity;
use HasFactory;
/*
|--------------------------------------------------------------------------
| GLOBAL VARIABLES
|--------------------------------------------------------------------------
*/
protected $table = 'event_metabolisms';
// protected $primaryKey = 'id';
// public $timestamps = false;
protected $guarded = ['id'];
// protected $fillable = [];
// protected $hidden = [];
/*
|--------------------------------------------------------------------------
| FUNCTIONS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| RELATIONS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| SCOPES
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| ACCESSORS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| MUTATORS
|--------------------------------------------------------------------------
*/
}

View File

@ -0,0 +1,58 @@
<?php
namespace App\Models;
use Backpack\CRUD\app\Models\Traits\CrudTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\Traits\LogsActivity;
class EventRegistrationInfo extends Model
{
use CrudTrait;
use LogsActivity;
use HasFactory;
/*
|--------------------------------------------------------------------------
| GLOBAL VARIABLES
|--------------------------------------------------------------------------
*/
protected $table = 'event_registration_infos';
// protected $primaryKey = 'id';
// public $timestamps = false;
protected $guarded = ['id'];
// protected $fillable = [];
// protected $hidden = [];
/*
|--------------------------------------------------------------------------
| FUNCTIONS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| RELATIONS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| SCOPES
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| ACCESSORS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| MUTATORS
|--------------------------------------------------------------------------
*/
}

86
app/Models/Faq.php Normal file
View File

@ -0,0 +1,86 @@
<?php
namespace App\Models;
use Backpack\CRUD\app\Models\Traits\CrudTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Ericli1018\AwesomeFieldsForBackpack\Models\Traits\HasUploadImgFields;
use App\Models\Traits\LogsActivity;
class Faq extends Model
{
use CrudTrait;
use LogsActivity;
use HasFactory;
use HasUploadImgFields;
/*
|--------------------------------------------------------------------------
| GLOBAL VARIABLES
|--------------------------------------------------------------------------
*/
protected $table = 'faqs';
// protected $primaryKey = 'id';
// public $timestamps = false;
protected $guarded = ['id'];
// protected $fillable = [];
// protected $hidden = [];
protected $casts = [
'post_at' => 'datetime',
'photos' => 'array',
];
protected $attributes = [
'description' => 'N/A',
];
/*
|--------------------------------------------------------------------------
| FUNCTIONS
|--------------------------------------------------------------------------
*/
public static function boot()
{
parent::boot();
static::deleting(function($obj) {
if (count((array)$obj->photos)) {
foreach ($obj->photos as $item) {
\Storage::disk('public')->delete($item['file_path']);
}
}
});
}
/*
|--------------------------------------------------------------------------
| RELATIONS
|--------------------------------------------------------------------------
*/
public function faqCatalog()
{
return $this->belongsTo(FaqCatalog::class, 'faq_catalog_id');
}
/*
|--------------------------------------------------------------------------
| SCOPES
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| ACCESSORS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| MUTATORS
|--------------------------------------------------------------------------
*/
public function setPhotosAttribute($value)
{
$attribute_name = "photos";
$disk = "public";
$destination_path = "faqs";
$this->uploadImgMultipleFilesToDisk($value, $attribute_name, $disk, $destination_path);
}
}

64
app/Models/FaqCatalog.php Normal file
View File

@ -0,0 +1,64 @@
<?php
namespace App\Models;
use Backpack\CRUD\app\Models\Traits\CrudTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class FaqCatalog extends Model
{
use CrudTrait;
use HasFactory;
/*
|--------------------------------------------------------------------------
| GLOBAL VARIABLES
|--------------------------------------------------------------------------
*/
protected $table = 'faq_catalogs';
// protected $primaryKey = 'id';
// public $timestamps = false;
protected $guarded = ['id'];
// protected $fillable = [];
// protected $hidden = [];
/*
|--------------------------------------------------------------------------
| FUNCTIONS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| RELATIONS
|--------------------------------------------------------------------------
*/
public function parent()
{
return $this->belongsTo(FaqCatalog::class, 'parent_id');
}
public function children()
{
return $this->hasMany(FaqCatalog::class, 'parent_id');
}
/*
|--------------------------------------------------------------------------
| SCOPES
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| ACCESSORS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| MUTATORS
|--------------------------------------------------------------------------
*/
}

86
app/Models/HealthInfo.php Normal file
View File

@ -0,0 +1,86 @@
<?php
namespace App\Models;
use Backpack\CRUD\app\Models\Traits\CrudTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Ericli1018\AwesomeFieldsForBackpack\Models\Traits\HasUploadImgFields;
use App\Models\Traits\LogsActivity;
class HealthInfo extends Model
{
use CrudTrait;
use LogsActivity;
use HasFactory;
use HasUploadImgFields;
/*
|--------------------------------------------------------------------------
| GLOBAL VARIABLES
|--------------------------------------------------------------------------
*/
protected $table = 'health_infos';
// protected $primaryKey = 'id';
// public $timestamps = false;
protected $guarded = ['id'];
// protected $fillable = [];
// protected $hidden = [];
protected $casts = [
'post_at' => 'datetime',
'photos' => 'array',
];
protected $attributes = [
'description' => 'N/A',
];
/*
|--------------------------------------------------------------------------
| FUNCTIONS
|--------------------------------------------------------------------------
*/
public static function boot()
{
parent::boot();
static::deleting(function($obj) {
if (count((array)$obj->photos)) {
foreach ($obj->photos as $item) {
\Storage::disk('public')->delete($item['file_path']);
}
}
});
}
/*
|--------------------------------------------------------------------------
| RELATIONS
|--------------------------------------------------------------------------
*/
public function healthInfoCatalog()
{
return $this->belongsTo(HealthInfoCatalog::class, 'news_catalog_id');
}
/*
|--------------------------------------------------------------------------
| SCOPES
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| ACCESSORS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| MUTATORS
|--------------------------------------------------------------------------
*/
public function setPhotosAttribute($value)
{
$attribute_name = "photos";
$disk = "public";
$destination_path = "health_info";
$this->uploadImgMultipleFilesToDisk($value, $attribute_name, $disk, $destination_path);
}
}

View File

@ -0,0 +1,64 @@
<?php
namespace App\Models;
use Backpack\CRUD\app\Models\Traits\CrudTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class HealthInfoCatalog extends Model
{
use CrudTrait;
use HasFactory;
/*
|--------------------------------------------------------------------------
| GLOBAL VARIABLES
|--------------------------------------------------------------------------
*/
protected $table = 'health_info_catalogs';
// protected $primaryKey = 'id';
// public $timestamps = false;
protected $guarded = ['id'];
// protected $fillable = [];
// protected $hidden = [];
/*
|--------------------------------------------------------------------------
| FUNCTIONS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| RELATIONS
|--------------------------------------------------------------------------
*/
public function parent()
{
return $this->belongsTo(HealthInfoCatalog::class, 'parent_id');
}
public function children()
{
return $this->hasMany(HealthInfoCatalog::class, 'parent_id');
}
/*
|--------------------------------------------------------------------------
| SCOPES
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| ACCESSORS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| MUTATORS
|--------------------------------------------------------------------------
*/
}

86
app/Models/News.php Normal file
View File

@ -0,0 +1,86 @@
<?php
namespace App\Models;
use Backpack\CRUD\app\Models\Traits\CrudTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Ericli1018\AwesomeFieldsForBackpack\Models\Traits\HasUploadImgFields;
use App\Models\Traits\LogsActivity;
class News extends Model
{
use CrudTrait;
use LogsActivity;
use HasFactory;
use HasUploadImgFields;
/*
|--------------------------------------------------------------------------
| GLOBAL VARIABLES
|--------------------------------------------------------------------------
*/
protected $table = 'news';
// protected $primaryKey = 'id';
// public $timestamps = false;
protected $guarded = ['id'];
// protected $fillable = [];
// protected $hidden = [];
protected $casts = [
'post_at' => 'datetime',
'photos' => 'array',
];
protected $attributes = [
'description' => 'N/A',
];
/*
|--------------------------------------------------------------------------
| FUNCTIONS
|--------------------------------------------------------------------------
*/
public static function boot()
{
parent::boot();
static::deleting(function($obj) {
if (count((array)$obj->photos)) {
foreach ($obj->photos as $item) {
\Storage::disk('public')->delete($item['file_path']);
}
}
});
}
/*
|--------------------------------------------------------------------------
| RELATIONS
|--------------------------------------------------------------------------
*/
public function newsCatalog()
{
return $this->belongsTo(NewsCatalog::class, 'news_catalog_id');
}
/*
|--------------------------------------------------------------------------
| SCOPES
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| ACCESSORS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| MUTATORS
|--------------------------------------------------------------------------
*/
public function setPhotosAttribute($value)
{
$attribute_name = "photos";
$disk = "public";
$destination_path = "news";
$this->uploadImgMultipleFilesToDisk($value, $attribute_name, $disk, $destination_path);
}
}

View File

@ -0,0 +1,64 @@
<?php
namespace App\Models;
use Backpack\CRUD\app\Models\Traits\CrudTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class NewsCatalog extends Model
{
use CrudTrait;
use HasFactory;
/*
|--------------------------------------------------------------------------
| GLOBAL VARIABLES
|--------------------------------------------------------------------------
*/
protected $table = 'news_catalogs';
// protected $primaryKey = 'id';
// public $timestamps = false;
protected $guarded = ['id'];
// protected $fillable = [];
// protected $hidden = [];
/*
|--------------------------------------------------------------------------
| FUNCTIONS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| RELATIONS
|--------------------------------------------------------------------------
*/
public function parent()
{
return $this->belongsTo(NewsCatalog::class, 'parent_id');
}
public function children()
{
return $this->hasMany(NewsCatalog::class, 'parent_id');
}
/*
|--------------------------------------------------------------------------
| SCOPES
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| ACCESSORS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| MUTATORS
|--------------------------------------------------------------------------
*/
}

86
app/Models/Notice.php Normal file
View File

@ -0,0 +1,86 @@
<?php
namespace App\Models;
use Backpack\CRUD\app\Models\Traits\CrudTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Ericli1018\AwesomeFieldsForBackpack\Models\Traits\HasUploadImgFields;
use App\Models\Traits\LogsActivity;
class Notice extends Model
{
use CrudTrait;
use LogsActivity;
use HasFactory;
use HasUploadImgFields;
/*
|--------------------------------------------------------------------------
| GLOBAL VARIABLES
|--------------------------------------------------------------------------
*/
protected $table = 'notices';
// protected $primaryKey = 'id';
// public $timestamps = false;
protected $guarded = ['id'];
// protected $fillable = [];
// protected $hidden = [];
protected $casts = [
'post_at' => 'datetime',
'photos' => 'array',
];
protected $attributes = [
'description' => 'N/A',
];
/*
|--------------------------------------------------------------------------
| FUNCTIONS
|--------------------------------------------------------------------------
*/
public static function boot()
{
parent::boot();
static::deleting(function($obj) {
if (count((array)$obj->photos)) {
foreach ($obj->photos as $item) {
\Storage::disk('public')->delete($item['file_path']);
}
}
});
}
/*
|--------------------------------------------------------------------------
| RELATIONS
|--------------------------------------------------------------------------
*/
public function noticeCatalog()
{
return $this->belongsTo(NoticeCatalog::class, 'news_catalog_id');
}
/*
|--------------------------------------------------------------------------
| SCOPES
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| ACCESSORS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| MUTATORS
|--------------------------------------------------------------------------
*/
public function setPhotosAttribute($value)
{
$attribute_name = "photos";
$disk = "public";
$destination_path = "notices";
$this->uploadImgMultipleFilesToDisk($value, $attribute_name, $disk, $destination_path);
}
}

View File

@ -0,0 +1,64 @@
<?php
namespace App\Models;
use Backpack\CRUD\app\Models\Traits\CrudTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class NoticeCatalog extends Model
{
use CrudTrait;
use HasFactory;
/*
|--------------------------------------------------------------------------
| GLOBAL VARIABLES
|--------------------------------------------------------------------------
*/
protected $table = 'notice_catalogs';
// protected $primaryKey = 'id';
// public $timestamps = false;
protected $guarded = ['id'];
// protected $fillable = [];
// protected $hidden = [];
/*
|--------------------------------------------------------------------------
| FUNCTIONS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| RELATIONS
|--------------------------------------------------------------------------
*/
public function parent()
{
return $this->belongsTo(HealthInfoCatalog::class, 'parent_id');
}
public function children()
{
return $this->hasMany(HealthInfoCatalog::class, 'parent_id');
}
/*
|--------------------------------------------------------------------------
| SCOPES
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| ACCESSORS
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| MUTATORS
|--------------------------------------------------------------------------
*/
}

View File

@ -0,0 +1,22 @@
<?php
namespace App\Models\Traits;
use Spatie\Activitylog\LogOptions;
use Spatie\Activitylog\Traits\LogsActivity as OriginalLogsActivity;
trait LogsActivity
{
use OriginalLogsActivity;
/**
* Spatie Log Options
* By default will log only the changes between fillables
*
* @return LogOptions
*/
public function getActivitylogOptions(): LogOptions
{
return LogOptions::defaults()->logAll()->logOnlyDirty();
}
}

49
app/Models/User.php Normal file
View File

@ -0,0 +1,49 @@
<?php
namespace App\Models;
use Backpack\CRUD\app\Models\Traits\CrudTrait;
// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
use App\Models\Traits\LogsActivity;
class User extends Authenticatable
{
use CrudTrait;
use LogsActivity;
use HasApiTokens, HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'password',
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
}

View File

@ -0,0 +1,24 @@
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
//
}
/**
* Bootstrap any application services.
*/
public function boot(): void
{
//
}
}

View File

@ -0,0 +1,26 @@
<?php
namespace App\Providers;
// use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
/**
* The model to policy mappings for the application.
*
* @var array<class-string, class-string>
*/
protected $policies = [
//
];
/**
* Register any authentication / authorization services.
*/
public function boot(): void
{
//
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Broadcast;
use Illuminate\Support\ServiceProvider;
class BroadcastServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*/
public function boot(): void
{
Broadcast::routes();
require base_path('routes/channels.php');
}
}

View File

@ -0,0 +1,28 @@
<?php
namespace App\Providers;
use App\Fields\IframeField;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade;
use Illuminate\Support\ServiceProvider;
class CrudServiceProvider extends ServiceProvider
{
/**
* Register services.
*/
public function register(): void
{
//
}
/**
* Bootstrap services.
*/
public function boot(): void
{
CrudPanelFacade::macro('iframe', function (string $name, string $label, array $options = []) {
return IframeField::make($name, $label, $options);
});
}
}

View File

@ -0,0 +1,38 @@
<?php
namespace App\Providers;
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Event;
class EventServiceProvider extends ServiceProvider
{
/**
* The event to listener mappings for the application.
*
* @var array<class-string, array<int, class-string>>
*/
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
];
/**
* Register any events for your application.
*/
public function boot(): void
{
//
}
/**
* Determine if events and listeners should be automatically discovered.
*/
public function shouldDiscoverEvents(): bool
{
return false;
}
}

View File

@ -0,0 +1,40 @@
<?php
namespace App\Providers;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
/**
* The path to your application's "home" route.
*
* Typically, users are redirected here after authentication.
*
* @var string
*/
public const HOME = '/home';
/**
* Define your route model bindings, pattern filters, and other route configuration.
*/
public function boot(): void
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
$this->routes(function () {
Route::middleware('api')
->prefix('api')
->group(base_path('routes/api.php'));
Route::middleware('web')
->group(base_path('routes/web.php'));
});
}
}

53
artisan Executable file
View File

@ -0,0 +1,53 @@
#!/usr/bin/env php
<?php
define('LARAVEL_START', microtime(true));
/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader
| for our application. We just need to utilize it! We'll require it
| into the script here so that we do not have to worry about the
| loading of any of our classes manually. It's great to relax.
|
*/
require __DIR__.'/vendor/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';
/*
|--------------------------------------------------------------------------
| Run The Artisan Application
|--------------------------------------------------------------------------
|
| When we run the console application, the current CLI command will be
| executed in this console and the response sent back to a terminal
| or another output device for the developers. Here goes nothing!
|
*/
$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
$status = $kernel->handle(
$input = new Symfony\Component\Console\Input\ArgvInput,
new Symfony\Component\Console\Output\ConsoleOutput
);
/*
|--------------------------------------------------------------------------
| Shutdown The Application
|--------------------------------------------------------------------------
|
| Once Artisan has finished running, we will fire off the shutdown events
| so that any final work may be done by the application before we shut
| down the process. This is the last thing to happen to the request.
|
*/
$kernel->terminate($input, $status);
exit($status);

55
bootstrap/app.php Executable file
View File

@ -0,0 +1,55 @@
<?php
/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| The first thing we will do is create a new Laravel application instance
| which serves as the "glue" for all the components of Laravel, and is
| the IoC container for the system binding all of the various parts.
|
*/
$app = new Illuminate\Foundation\Application(
$_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);
/*
|--------------------------------------------------------------------------
| Bind Important Interfaces
|--------------------------------------------------------------------------
|
| Next, we need to bind some important interfaces into the container so
| we will be able to resolve them when needed. The kernels serve the
| incoming requests to this application from both the web and CLI.
|
*/
$app->singleton(
Illuminate\Contracts\Http\Kernel::class,
App\Http\Kernel::class
);
$app->singleton(
Illuminate\Contracts\Console\Kernel::class,
App\Console\Kernel::class
);
$app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class,
App\Exceptions\Handler::class
);
/*
|--------------------------------------------------------------------------
| Return The Application
|--------------------------------------------------------------------------
|
| This script returns the application instance. The instance is given to
| the calling script so we can separate the building of the instances
| from the actual running of the application and sending responses.
|
*/
return $app;

2
bootstrap/cache/.gitignore vendored Executable file
View File

@ -0,0 +1,2 @@
*
!.gitignore

99
composer.json Normal file
View File

@ -0,0 +1,99 @@
{
"name": "laravel/laravel",
"type": "project",
"description": "The skeleton application for the Laravel framework.",
"keywords": ["laravel", "framework"],
"license": "MIT",
"require": {
"php": "^8.1",
"backpack/activity-log": "^2.0",
"backpack/crud": "^6.8",
"backpack/filemanager": "^3.0",
"backpack/theme-tabler": "^1.2",
"chaoswey/taiwan-id-validator": "^0.1.0",
"cviebrock/eloquent-sluggable": "^10.0",
"diglactic/laravel-breadcrumbs": "^10.0",
"ericli1018/awesome-fields-for-backpack": "^1.1",
"guzzlehttp/guzzle": "^7.2",
"intervention/image": "^3.11",
"laravel/framework": "^10.10",
"laravel/sanctum": "^3.3",
"laravel/tinker": "^2.8",
"laravel/ui": "^4.6",
"propaganistas/laravel-phone": "^5.3"
},
"require-dev": {
"backpack/generators": "^4.0",
"fakerphp/faker": "^1.9.1",
"laracasts/generators": "^2.0",
"laravel-lang/lang": "^13",
"laravel-lang/publisher": "^14",
"laravel/pint": "^1.0",
"laravel/sail": "^1.18",
"mockery/mockery": "^1.4.4",
"nunomaduro/collision": "^7.0",
"phpunit/phpunit": "^10.1",
"spatie/laravel-ignition": "^2.0"
},
"autoload": {
"exclude-from-classmap": [
"vendor/backpack/crud/src/helpers.php",
"vendor/backpack/crud/src/app/Http/Controllers/ChartController.php",
"vendor/backpack/crud/src/app/Http/Controllers/Operations/BulkCloneOperation.php",
"vendor/backpack/crud/src/app/Http/Controllers/Operations/BulkDeleteOperation.php",
"vendor/backpack/crud/src/app/Http/Controllers/Operations/CloneOperation.php",
"vendor/backpack/crud/src/app/Http/Controllers/Operations/FetchOperation.php",
"vendor/backpack/crud/src/app/Http/Controllers/Operations/InlineCreateOperation.php"
],
"files": [
"vendor/ericli1018/awesome-fields-for-backpack/src/helpers.php",
"vendor/ericli1018/awesome-fields-for-backpack/src/Http/Controllers/ChartController.php",
"vendor/ericli1018/awesome-fields-for-backpack/src/Http/Controllers/Operations/BulkCloneOperation.php",
"vendor/ericli1018/awesome-fields-for-backpack/src/Http/Controllers/Operations/BulkDeleteOperation.php",
"vendor/ericli1018/awesome-fields-for-backpack/src/Http/Controllers/Operations/CloneOperation.php",
"vendor/ericli1018/awesome-fields-for-backpack/src/Http/Controllers/Operations/FetchOperation.php",
"vendor/ericli1018/awesome-fields-for-backpack/src/Http/Controllers/Operations/InlineCreateOperation.php"
],
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"scripts": {
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover --ansi"
],
"post-update-cmd": [
"@php artisan vendor:publish --tag=laravel-assets --ansi --force"
],
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"@php artisan key:generate --ansi"
]
},
"extra": {
"laravel": {
"dont-discover": []
}
},
"config": {
"optimize-autoloader": true,
"preferred-install": "dist",
"sort-packages": true,
"allow-plugins": {
"pestphp/pest-plugin": true,
"php-http/discovery": true
}
},
"minimum-stability": "stable",
"prefer-stable": true
}

10983
composer.lock generated Normal file

File diff suppressed because it is too large Load Diff

52
config/activitylog.php Normal file
View File

@ -0,0 +1,52 @@
<?php
return [
/*
* If set to false, no activities will be saved to the database.
*/
'enabled' => env('ACTIVITY_LOGGER_ENABLED', true),
/*
* When the clean-command is executed, all recording activities older than
* the number of days specified here will be deleted.
*/
'delete_records_older_than_days' => 365,
/*
* If no log name is passed to the activity() helper
* we use this default log name.
*/
'default_log_name' => 'default',
/*
* You can specify an auth driver here that gets user models.
* If this is null we'll use the current Laravel auth driver.
*/
'default_auth_driver' => null,
/*
* If set to true, the subject returns soft deleted models.
*/
'subject_returns_soft_deleted_models' => false,
/*
* This model will be used to log activity.
* It should implement the Spatie\Activitylog\Contracts\Activity interface
* and extend Illuminate\Database\Eloquent\Model.
*/
'activity_model' => \Spatie\Activitylog\Models\Activity::class,
/*
* This is the name of the table that will be created by the migration and
* used by the Activity model shipped with this package.
*/
'table_name' => env('ACTIVITY_LOGGER_TABLE_NAME', 'activity_log'),
/*
* This is the database connection that will be used by the migration and
* the Activity model shipped with this package. In case it's not set
* Laravel's database.default will be used instead.
*/
'database_connection' => env('ACTIVITY_LOGGER_DB_CONNECTION'),
];

189
config/app.php Normal file
View File

@ -0,0 +1,189 @@
<?php
use Illuminate\Support\Facades\Facade;
use Illuminate\Support\ServiceProvider;
return [
/*
|--------------------------------------------------------------------------
| Application Name
|--------------------------------------------------------------------------
|
| This value is the name of your application. This value is used when the
| framework needs to place the application's name in a notification or
| any other location as required by the application or its packages.
|
*/
'name' => env('APP_NAME', 'Laravel'),
/*
|--------------------------------------------------------------------------
| Application Environment
|--------------------------------------------------------------------------
|
| This value determines the "environment" your application is currently
| running in. This may determine how you prefer to configure various
| services the application utilizes. Set this in your ".env" file.
|
*/
'env' => env('APP_ENV', 'production'),
/*
|--------------------------------------------------------------------------
| Application Debug Mode
|--------------------------------------------------------------------------
|
| When your application is in debug mode, detailed error messages with
| stack traces will be shown on every error that occurs within your
| application. If disabled, a simple generic error page is shown.
|
*/
'debug' => (bool) env('APP_DEBUG', false),
/*
|--------------------------------------------------------------------------
| Application URL
|--------------------------------------------------------------------------
|
| This URL is used by the console to properly generate URLs when using
| the Artisan command line tool. You should set this to the root of
| your application so that it is used when running Artisan tasks.
|
*/
'url' => env('APP_URL', 'http://localhost'),
'asset_url' => env('ASSET_URL'),
/*
|--------------------------------------------------------------------------
| Application Timezone
|--------------------------------------------------------------------------
|
| Here you may specify the default timezone for your application, which
| will be used by the PHP date and date-time functions. We have gone
| ahead and set this to a sensible default for you out of the box.
|
*/
'timezone' => 'Asia/Taipei',
/*
|--------------------------------------------------------------------------
| Application Locale Configuration
|--------------------------------------------------------------------------
|
| The application locale determines the default locale that will be used
| by the translation service provider. You are free to set this value
| to any of the locales which will be supported by the application.
|
*/
'locale' => 'zh_TW',
/*
|--------------------------------------------------------------------------
| Application Fallback Locale
|--------------------------------------------------------------------------
|
| The fallback locale determines the locale to use when the current one
| is not available. You may change the value to correspond to any of
| the language folders that are provided through your application.
|
*/
'fallback_locale' => 'zh_TW',
/*
|--------------------------------------------------------------------------
| Faker Locale
|--------------------------------------------------------------------------
|
| This locale will be used by the Faker PHP library when generating fake
| data for your database seeds. For example, this will be used to get
| localized telephone numbers, street address information and more.
|
*/
'faker_locale' => 'en_US',
/*
|--------------------------------------------------------------------------
| Encryption Key
|--------------------------------------------------------------------------
|
| This key is used by the Illuminate encrypter service and should be set
| to a random, 32 character string, otherwise these encrypted strings
| will not be safe. Please do this before deploying an application!
|
*/
'key' => env('APP_KEY'),
'cipher' => 'AES-256-CBC',
/*
|--------------------------------------------------------------------------
| Maintenance Mode Driver
|--------------------------------------------------------------------------
|
| These configuration options determine the driver used to determine and
| manage Laravel's "maintenance mode" status. The "cache" driver will
| allow maintenance mode to be controlled across multiple machines.
|
| Supported drivers: "file", "cache"
|
*/
'maintenance' => [
'driver' => 'file',
// 'store' => 'redis',
],
/*
|--------------------------------------------------------------------------
| Autoloaded Service Providers
|--------------------------------------------------------------------------
|
| The service providers listed here will be automatically loaded on the
| request to your application. Feel free to add your own services to
| this array to grant expanded functionality to your applications.
|
*/
'providers' => ServiceProvider::defaultProviders()->merge([
/*
* Package Service Providers...
*/
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
App\Providers\CrudServiceProvider::class,
])->toArray(),
/*
|--------------------------------------------------------------------------
| Class Aliases
|--------------------------------------------------------------------------
|
| This array of class aliases will be registered when this application
| is started. However, feel free to register as many as you wish as
| the aliases are "lazy" loaded so they don't hinder performance.
|
*/
'aliases' => Facade::defaultAliases()->merge([
// 'Example' => App\Facades\Example::class,
])->toArray(),
];

115
config/auth.php Normal file
View File

@ -0,0 +1,115 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Authentication Defaults
|--------------------------------------------------------------------------
|
| This option controls the default authentication "guard" and password
| reset options for your application. You may change these defaults
| as required, but they're a perfect start for most applications.
|
*/
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
/*
|--------------------------------------------------------------------------
| Authentication Guards
|--------------------------------------------------------------------------
|
| Next, you may define every authentication guard for your application.
| Of course, a great default configuration has been defined for you
| here which uses session storage and the Eloquent user provider.
|
| All authentication drivers have a user provider. This defines how the
| users are actually retrieved out of your database or other storage
| mechanisms used by this application to persist your user's data.
|
| Supported: "session"
|
*/
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
],
/*
|--------------------------------------------------------------------------
| User Providers
|--------------------------------------------------------------------------
|
| All authentication drivers have a user provider. This defines how the
| users are actually retrieved out of your database or other storage
| mechanisms used by this application to persist your user's data.
|
| If you have multiple user tables or models you may configure multiple
| sources which represent each model / table. These sources may then
| be assigned to any extra authentication guards you have defined.
|
| Supported: "database", "eloquent"
|
*/
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
/*
|--------------------------------------------------------------------------
| Resetting Passwords
|--------------------------------------------------------------------------
|
| You may specify multiple password reset configurations if you have more
| than one user table or model in the application and you want to have
| separate password reset settings based on the specific user types.
|
| The expiry time is the number of minutes that each reset token will be
| considered valid. This security feature keeps tokens short-lived so
| they have less time to be guessed. You may change this as needed.
|
| The throttle setting is the number of seconds a user must wait before
| generating more password reset tokens. This prevents the user from
| quickly generating a very large amount of password reset tokens.
|
*/
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_reset_tokens',
'expire' => 60,
'throttle' => 60,
],
],
/*
|--------------------------------------------------------------------------
| Password Confirmation Timeout
|--------------------------------------------------------------------------
|
| Here you may define the amount of seconds before a password confirmation
| times out and the user is prompted to re-enter their password via the
| confirmation screen. By default, the timeout lasts for three hours.
|
*/
'password_timeout' => 10800,
];

194
config/backpack/base.php Normal file
View File

@ -0,0 +1,194 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Registration Open
|--------------------------------------------------------------------------
|
| Choose whether new users/admins are allowed to register.
| This will show the Register button on the login page and allow access to the
| Register functions in AuthController.
|
| By default the registration is open only on localhost.
*/
'registration_open' => false, //env('BACKPACK_REGISTRATION_OPEN', env('APP_ENV') === 'local'),
/*
|--------------------------------------------------------------------------
| Routing
|--------------------------------------------------------------------------
*/
// The prefix used in all base routes (the 'admin' in admin/dashboard)
// You can make sure all your URLs use this prefix by using the backpack_url() helper instead of url()
'route_prefix' => 'admin',
// The web middleware (group) used in all base & CRUD routes
// If you've modified your "web" middleware group (ex: removed sessions), you can use a different
// route group, that has all the the middleware listed below in the comments.
'web_middleware' => 'web',
// Or you can comment the above, and uncomment the complete list below.
// 'web_middleware' => [
// \App\Http\Middleware\EncryptCookies::class,
// \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
// \Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\View\Middleware\ShareErrorsFromSession::class,
// \App\Http\Middleware\VerifyCsrfToken::class,
// ],
// Set this to false if you would like to use your own AuthController and PasswordController
// (you then need to setup your auth routes manually in your routes.php file)
// Warning: if you disable this, the password recovery routes (below) will be disabled too!
'setup_auth_routes' => true,
// Set this to false if you would like to skip adding the dashboard routes
// (you then need to overwrite the login route on your AuthController)
'setup_dashboard_routes' => true,
// Set this to false if you would like to skip adding "my account" routes
// (you then need to manually define the routes in your web.php)
'setup_my_account_routes' => true,
// Set this to false if you would like to skip adding the password recovery routes
// (you then need to manually define the routes in your web.php)
'setup_password_recovery_routes' => false,
// Set this to true if you would like to enable email verification for your user model.
// Make sure your user model implements the MustVerifyEmail contract and your database
// table contains the `email_verified_at` column. Read the following before enabling:
// https://backpackforlaravel.com/docs/6.x/base-how-to#enable-email-verification-in-backpack-routes
'setup_email_verification_routes' => false,
// When email verification is enabled, automatically add the Verified middleware to Backpack routes?
// Set false if you want to use your own Verified middleware in `middleware_class`.
'setup_email_verification_middleware' => true,
// How many times in any given time period should the user be allowed to
// request a new verification email?
// Defaults to 1,10 - 1 time in 10 minutes.
'email_verification_throttle_access' => '3,15',
/*
|--------------------------------------------------------------------------
| Security
|--------------------------------------------------------------------------
*/
// Backpack will prevent visitors from requesting password recovery too many times
// for a certain email, to make sure they cannot be spammed that way.
// How many seconds should a visitor wait, after they've requested a
// password reset, before they can try again for the same email?
'password_recovery_throttle_notifications' => 600, // time in seconds
// How much time should the token sent to the user email be considered valid?
// After this time expires, user needs to request a new reset token.
'password_recovery_token_expiration' => 60, // time in minutes
// Backpack will prevent an IP from trying to reset the password too many times,
// so that a malicious actor cannot try too many emails, too see if they have
// accounts or to increase the AWS/SendGrid/etc bill.
//
// How many times in any given time period should the user be allowed to
// attempt a password reset? Take into account that user might wrongly
// type an email at first, so at least allow one more try.
// Defaults to 3,10 - 3 times in 10 minutes.
'password_recovery_throttle_access' => '3,10',
/*
|--------------------------------------------------------------------------
| Authentication
|--------------------------------------------------------------------------
*/
// Fully qualified namespace of the User model
'user_model_fqn' => config('auth.providers.users.model'),
// 'user_model_fqn' => App\User::class, // works on Laravel <= 7
// 'user_model_fqn' => App\Models\User::class, // works on Laravel >= 8
// The classes for the middleware to check if the visitor is an admin
// Can be a single class or an array of classes
'middleware_class' => [
App\Http\Middleware\CheckIfAdmin::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\Backpack\CRUD\app\Http\Middleware\AuthenticateSession::class,
// \Backpack\CRUD\app\Http\Middleware\UseBackpackAuthGuardInsteadOfDefaultAuthGuard::class,
],
// Alias for that middleware
'middleware_key' => 'admin',
// Note: It's recommended to use the backpack_middleware() helper everywhere, which pulls this key for you.
// Username column for authentication
// The Backpack default is the same as the Laravel default (email)
// If you need to switch to username, you also need to create that column in your db
'authentication_column' => 'email',
'authentication_column_name' => 'Email',
// Backpack assumes that your "database email column" for operations like Login and Register is called "email".
// If your database email column have a different name, you can configure it here. Eg: `user_mail`
'email_column' => 'email',
// The guard that protects the Backpack admin panel.
// If null, the config.auth.defaults.guard value will be used.
'guard' => 'backpack',
// The password reset configuration for Backpack.
// If null, the config.auth.defaults.passwords value will be used.
'passwords' => 'backpack',
// What kind of avatar will you like to show to the user?
// Default: gravatar (automatically use the gravatar for their email)
// Other options:
// - null (generic image with their first letter)
// - example_method_name (specify the method on the User model that returns the URL)
'avatar_type' => 'gravatar',
// Gravatar fallback options are 'identicon', 'monsterid', 'wavatar', 'retro', 'robohash', 'blank'
// 'blank' will keep the generic image with the user first letter
'gravatar_fallback' => 'blank',
/*
|--------------------------------------------------------------------------
| File System
|--------------------------------------------------------------------------
*/
// Backpack\Base sets up its own filesystem disk, just like you would by
// adding an entry to your config/filesystems.php. It points to the root
// of your project and it's used throughout all Backpack packages.
//
// You can rename this disk here. Default: root
'root_disk_name' => 'root',
/*
|--------------------------------------------------------------------------
| Application
|--------------------------------------------------------------------------
*/
// Should we use DB transactions when executing multiple queries? For example when creating an entry and it's relationships.
// By wrapping in a database transaction you ensure that either all queries went ok, or if some failed the whole process
// is rolled back and considered failed. This is a good setting for data integrity.
'useDatabaseTransactions' => false,
/*
|--------------------------------------------------------------------------
| Backpack Token Username
|--------------------------------------------------------------------------
|
| If you have access to closed-source Backpack add-ons, please provide
| your token username here, if you're getting yellow alerts on your
| admin panel's pages. Normally this is not needed, it is
| preferred to add this as an environment variable
| (most likely in your .env file).
|
| More info and payment form on:
| https://www.backpackforlaravel.com
|
*/
'token_username' => env('BACKPACK_TOKEN_USERNAME', false),
];

480
config/backpack/crud.php Normal file
View File

@ -0,0 +1,480 @@
<?php
/**
* Backpack\CRUD preferences.
*/
return [
/*
|-------------------
| TRANSLATABLE CRUDS
|-------------------
*/
'show_translatable_field_icon' => true,
'translatable_field_icon_position' => 'right', // left or right
'locales' => [
// "af_NA" => "Afrikaans (Namibia)",
// "af_ZA" => "Afrikaans (South Africa)",
// "af" => "Afrikaans",
// "ak_GH" => "Akan (Ghana)",
// "ak" => "Akan",
// "sq_AL" => "Albanian (Albania)",
// "sq" => "Albanian",
// "am_ET" => "Amharic (Ethiopia)",
// "am" => "Amharic",
// "ar_DZ" => "Arabic (Algeria)",
// "ar_BH" => "Arabic (Bahrain)",
// "ar_EG" => "Arabic (Egypt)",
// "ar_IQ" => "Arabic (Iraq)",
// "ar_JO" => "Arabic (Jordan)",
// "ar_KW" => "Arabic (Kuwait)",
// "ar_LB" => "Arabic (Lebanon)",
// "ar_LY" => "Arabic (Libya)",
// "ar_MA" => "Arabic (Morocco)",
// "ar_OM" => "Arabic (Oman)",
// "ar_QA" => "Arabic (Qatar)",
// "ar_SA" => "Arabic (Saudi Arabia)",
// "ar_SD" => "Arabic (Sudan)",
// "ar_SY" => "Arabic (Syria)",
// "ar_TN" => "Arabic (Tunisia)",
// "ar_AE" => "Arabic (United Arab Emirates)",
// "ar_YE" => "Arabic (Yemen)",
// "ar" => "Arabic",
// "hy_AM" => "Armenian (Armenia)",
// "hy" => "Armenian",
// "as_IN" => "Assamese (India)",
// "as" => "Assamese",
// "asa_TZ" => "Asu (Tanzania)",
// "asa" => "Asu",
// "az_Cyrl" => "Azerbaijani (Cyrillic)",
// "az_Cyrl_AZ" => "Azerbaijani (Cyrillic, Azerbaijan)",
// "az_Latn" => "Azerbaijani (Latin)",
// "az_Latn_AZ" => "Azerbaijani (Latin, Azerbaijan)",
// "az" => "Azerbaijani",
// "bm_ML" => "Bambara (Mali)",
// "bm" => "Bambara",
// "eu_ES" => "Basque (Spain)",
// "eu" => "Basque",
// "be_BY" => "Belarusian (Belarus)",
// "be" => "Belarusian",
// "bem_ZM" => "Bemba (Zambia)",
// "bem" => "Bemba",
// "bez_TZ" => "Bena (Tanzania)",
// "bez" => "Bena",
// "bn_BD" => "Bengali (Bangladesh)",
// "bn_IN" => "Bengali (India)",
// "bn" => "Bengali",
// "bs_BA" => "Bosnian (Bosnia and Herzegovina)",
// "bs" => "Bosnian",
// "bg_BG" => "Bulgarian (Bulgaria)",
// "bg" => "Bulgarian",
// "my_MM" => "Burmese (Myanmar [Burma])",
// "my" => "Burmese",
// "ca_ES" => "Catalan (Spain)",
// "ca" => "Catalan",
// "tzm_Latn" => "Central Morocco Tamazight (Latin)",
// "tzm_Latn_MA" => "Central Morocco Tamazight (Latin, Morocco)",
// "tzm" => "Central Morocco Tamazight",
// "chr_US" => "Cherokee (United States)",
// "chr" => "Cherokee",
// "cgg_UG" => "Chiga (Uganda)",
// "cgg" => "Chiga",
// "zh_Hans" => "Chinese (Simplified Han)",
// "zh_Hans_CN" => "Chinese (Simplified Han, China)",
// "zh_Hans_HK" => "Chinese (Simplified Han, Hong Kong SAR China)",
// "zh_Hans_MO" => "Chinese (Simplified Han, Macau SAR China)",
// "zh_Hans_SG" => "Chinese (Simplified Han, Singapore)",
// "zh_Hant" => "Chinese (Traditional Han)",
// "zh_Hant_HK" => "Chinese (Traditional Han, Hong Kong SAR China)",
// "zh_Hant_MO" => "Chinese (Traditional Han, Macau SAR China)",
"zh_Hant_TW" => "Chinese (Traditional Han, Taiwan)",
// "zh" => "Chinese",
// "kw_GB" => "Cornish (United Kingdom)",
// "kw" => "Cornish",
// "hr_HR" => "Croatian (Croatia)",
// "hr" => "Croatian",
// "cs_CZ" => "Czech (Czech Republic)",
// "cs" => "Czech",
// "da_DK" => "Danish (Denmark)",
// "da" => "Danish",
// "nl_BE" => "Dutch (Belgium)",
// "nl_NL" => "Dutch (Netherlands)",
// "nl" => "Dutch",
// "ebu_KE" => "Embu (Kenya)",
// "ebu" => "Embu",
// "en_AS" => "English (American Samoa)",
// "en_AU" => "English (Australia)",
// "en_BE" => "English (Belgium)",
// "en_BZ" => "English (Belize)",
// "en_BW" => "English (Botswana)",
// "en_CA" => "English (Canada)",
// "en_GU" => "English (Guam)",
// "en_HK" => "English (Hong Kong SAR China)",
// "en_IN" => "English (India)",
// "en_IE" => "English (Ireland)",
// "en_JM" => "English (Jamaica)",
// "en_MT" => "English (Malta)",
// "en_MH" => "English (Marshall Islands)",
// "en_MU" => "English (Mauritius)",
// "en_NA" => "English (Namibia)",
// "en_NZ" => "English (New Zealand)",
// "en_MP" => "English (Northern Mariana Islands)",
// "en_PK" => "English (Pakistan)",
// "en_PH" => "English (Philippines)",
// "en_SG" => "English (Singapore)",
// "en_ZA" => "English (South Africa)",
// "en_TT" => "English (Trinidad and Tobago)",
// "en_UM" => "English (U.S. Minor Outlying Islands)",
// "en_VI" => "English (U.S. Virgin Islands)",
// "en_GB" => "English (United Kingdom)",
// "en_US" => "English (United States)",
// "en_ZW" => "English (Zimbabwe)",
//'en' => 'English',
// "eo" => "Esperanto",
// "et_EE" => "Estonian (Estonia)",
// "et" => "Estonian",
// "ee_GH" => "Ewe (Ghana)",
// "ee_TG" => "Ewe (Togo)",
// "ee" => "Ewe",
// "fo_FO" => "Faroese (Faroe Islands)",
// "fo" => "Faroese",
// "fil_PH" => "Filipino (Philippines)",
// "fil" => "Filipino",
// "fi_FI" => "Finnish (Finland)",
// "fi" => "Finnish",
// "fr_BE" => "French (Belgium)",
// "fr_BJ" => "French (Benin)",
// "fr_BF" => "French (Burkina Faso)",
// "fr_BI" => "French (Burundi)",
// "fr_CM" => "French (Cameroon)",
// "fr_CA" => "French (Canada)",
// "fr_CF" => "French (Central African Republic)",
// "fr_TD" => "French (Chad)",
// "fr_KM" => "French (Comoros)",
// "fr_CG" => "French (Congo - Brazzaville)",
// "fr_CD" => "French (Congo - Kinshasa)",
// "fr_CI" => "French (Côte dIvoire)",
// "fr_DJ" => "French (Djibouti)",
// "fr_GQ" => "French (Equatorial Guinea)",
// "fr_FR" => "French (France)",
// "fr_GA" => "French (Gabon)",
// "fr_GP" => "French (Guadeloupe)",
// "fr_GN" => "French (Guinea)",
// "fr_LU" => "French (Luxembourg)",
// "fr_MG" => "French (Madagascar)",
// "fr_ML" => "French (Mali)",
// "fr_MQ" => "French (Martinique)",
// "fr_MC" => "French (Monaco)",
// "fr_NE" => "French (Niger)",
// "fr_RW" => "French (Rwanda)",
// "fr_RE" => "French (Réunion)",
// "fr_BL" => "French (Saint Barthélemy)",
// "fr_MF" => "French (Saint Martin)",
// "fr_SN" => "French (Senegal)",
// "fr_CH" => "French (Switzerland)",
// "fr_TG" => "French (Togo)",
//'fr' => 'French',
// "ff_SN" => "Fulah (Senegal)",
// "ff" => "Fulah",
// "gl_ES" => "Galician (Spain)",
// "gl" => "Galician",
// "lg_UG" => "Ganda (Uganda)",
// "lg" => "Ganda",
// "ka_GE" => "Georgian (Georgia)",
// "ka" => "Georgian",
// "de_AT" => "German (Austria)",
// "de_BE" => "German (Belgium)",
// "de_DE" => "German (Germany)",
// "de_LI" => "German (Liechtenstein)",
// "de_LU" => "German (Luxembourg)",
// "de_CH" => "German (Switzerland)",
// "de" => "German",
// "el_CY" => "Greek (Cyprus)",
// "el_GR" => "Greek (Greece)",
// "el" => "Greek",
// "gu_IN" => "Gujarati (India)",
// "gu" => "Gujarati",
// "guz_KE" => "Gusii (Kenya)",
// "guz" => "Gusii",
// "ha_Latn" => "Hausa (Latin)",
// "ha_Latn_GH" => "Hausa (Latin, Ghana)",
// "ha_Latn_NE" => "Hausa (Latin, Niger)",
// "ha_Latn_NG" => "Hausa (Latin, Nigeria)",
// "ha" => "Hausa",
// "haw_US" => "Hawaiian (United States)",
// "haw" => "Hawaiian",
// "he_IL" => "Hebrew (Israel)",
// "he" => "Hebrew",
// "hi_IN" => "Hindi (India)",
// "hi" => "Hindi",
// "hu_HU" => "Hungarian (Hungary)",
// "hu" => "Hungarian",
// "is_IS" => "Icelandic (Iceland)",
// "is" => "Icelandic",
// "ig_NG" => "Igbo (Nigeria)",
// "ig" => "Igbo",
// "id_ID" => "Indonesian (Indonesia)",
// "id" => "Indonesian",
// "ga_IE" => "Irish (Ireland)",
// "ga" => "Irish",
// "it_IT" => "Italian (Italy)",
// "it_CH" => "Italian (Switzerland)",
//'it' => 'Italian',
// "ja_JP" => "Japanese (Japan)",
// "ja" => "Japanese",
// "kea_CV" => "Kabuverdianu (Cape Verde)",
// "kea" => "Kabuverdianu",
// "kab_DZ" => "Kabyle (Algeria)",
// "kab" => "Kabyle",
// "kl_GL" => "Kalaallisut (Greenland)",
// "kl" => "Kalaallisut",
// "kln_KE" => "Kalenjin (Kenya)",
// "kln" => "Kalenjin",
// "kam_KE" => "Kamba (Kenya)",
// "kam" => "Kamba",
// "kn_IN" => "Kannada (India)",
// "kn" => "Kannada",
// "kk_Cyrl" => "Kazakh (Cyrillic)",
// "kk_Cyrl_KZ" => "Kazakh (Cyrillic, Kazakhstan)",
// "kk" => "Kazakh",
// "km_KH" => "Khmer (Cambodia)",
// "km" => "Khmer",
// "ki_KE" => "Kikuyu (Kenya)",
// "ki" => "Kikuyu",
// "rw_RW" => "Kinyarwanda (Rwanda)",
// "rw" => "Kinyarwanda",
// "kok_IN" => "Konkani (India)",
// "kok" => "Konkani",
// "ko_KR" => "Korean (South Korea)",
// "ko" => "Korean",
// "khq_ML" => "Koyra Chiini (Mali)",
// "khq" => "Koyra Chiini",
// "ses_ML" => "Koyraboro Senni (Mali)",
// "ses" => "Koyraboro Senni",
// "lag_TZ" => "Langi (Tanzania)",
// "lag" => "Langi",
// "lv_LV" => "Latvian (Latvia)",
// "lv" => "Latvian",
// "lt_LT" => "Lithuanian (Lithuania)",
// "lt" => "Lithuanian",
// "luo_KE" => "Luo (Kenya)",
// "luo" => "Luo",
// "luy_KE" => "Luyia (Kenya)",
// "luy" => "Luyia",
// "mk_MK" => "Macedonian (Macedonia)",
// "mk" => "Macedonian",
// "jmc_TZ" => "Machame (Tanzania)",
// "jmc" => "Machame",
// "kde_TZ" => "Makonde (Tanzania)",
// "kde" => "Makonde",
// "mg_MG" => "Malagasy (Madagascar)",
// "mg" => "Malagasy",
// "ms_BN" => "Malay (Brunei)",
// "ms_MY" => "Malay (Malaysia)",
// "ms" => "Malay",
// "ml_IN" => "Malayalam (India)",
// "ml" => "Malayalam",
// "mt_MT" => "Maltese (Malta)",
// "mt" => "Maltese",
// "gv_GB" => "Manx (United Kingdom)",
// "gv" => "Manx",
// "mr_IN" => "Marathi (India)",
// "mr" => "Marathi",
// "mas_KE" => "Masai (Kenya)",
// "mas_TZ" => "Masai (Tanzania)",
// "mas" => "Masai",
// "mer_KE" => "Meru (Kenya)",
// "mer" => "Meru",
// "mfe_MU" => "Morisyen (Mauritius)",
// "mfe" => "Morisyen",
// "naq_NA" => "Nama (Namibia)",
// "naq" => "Nama",
// "ne_IN" => "Nepali (India)",
// "ne_NP" => "Nepali (Nepal)",
// "ne" => "Nepali",
// "nd_ZW" => "North Ndebele (Zimbabwe)",
// "nd" => "North Ndebele",
// "nb_NO" => "Norwegian Bokmål (Norway)",
// "nb" => "Norwegian Bokmål",
// "nn_NO" => "Norwegian Nynorsk (Norway)",
// "nn" => "Norwegian Nynorsk",
// "nyn_UG" => "Nyankole (Uganda)",
// "nyn" => "Nyankole",
// "or_IN" => "Oriya (India)",
// "or" => "Oriya",
// "om_ET" => "Oromo (Ethiopia)",
// "om_KE" => "Oromo (Kenya)",
// "om" => "Oromo",
// "ps_AF" => "Pashto (Afghanistan)",
// "ps" => "Pashto",
// "fa_AF" => "Persian (Afghanistan)",
// "fa_IR" => "Persian (Iran)",
// "fa" => "Persian",
// "pl_PL" => "Polish (Poland)",
// "pl" => "Polish",
// "pt_BR" => "Portuguese (Brazil)",
// "pt_GW" => "Portuguese (Guinea-Bissau)",
// "pt_MZ" => "Portuguese (Mozambique)",
// "pt_PT" => "Portuguese (Portugal)",
// "pt" => "Portuguese",
// "pa_Arab" => "Punjabi (Arabic)",
// "pa_Arab_PK" => "Punjabi (Arabic, Pakistan)",
// "pa_Guru" => "Punjabi (Gurmukhi)",
// "pa_Guru_IN" => "Punjabi (Gurmukhi, India)",
// "pa" => "Punjabi",
// "ro_MD" => "Romanian (Moldova)",
// "ro_RO" => "Romanian (Romania)",
//'ro' => 'Romanian',
// "rm_CH" => "Romansh (Switzerland)",
// "rm" => "Romansh",
// "rof_TZ" => "Rombo (Tanzania)",
// "rof" => "Rombo",
// "ru_MD" => "Russian (Moldova)",
// "ru_RU" => "Russian (Russia)",
// "ru_UA" => "Russian (Ukraine)",
// "ru" => "Russian",
// "rwk_TZ" => "Rwa (Tanzania)",
// "rwk" => "Rwa",
// "saq_KE" => "Samburu (Kenya)",
// "saq" => "Samburu",
// "sg_CF" => "Sango (Central African Republic)",
// "sg" => "Sango",
// "seh_MZ" => "Sena (Mozambique)",
// "seh" => "Sena",
// "sr_Cyrl" => "Serbian (Cyrillic)",
// "sr_Cyrl_BA" => "Serbian (Cyrillic, Bosnia and Herzegovina)",
// "sr_Cyrl_ME" => "Serbian (Cyrillic, Montenegro)",
// "sr_Cyrl_RS" => "Serbian (Cyrillic, Serbia)",
// "sr_Latn" => "Serbian (Latin)",
// "sr_Latn_BA" => "Serbian (Latin, Bosnia and Herzegovina)",
// "sr_Latn_ME" => "Serbian (Latin, Montenegro)",
// "sr_Latn_RS" => "Serbian (Latin, Serbia)",
// "sr" => "Serbian",
// "sn_ZW" => "Shona (Zimbabwe)",
// "sn" => "Shona",
// "ii_CN" => "Sichuan Yi (China)",
// "ii" => "Sichuan Yi",
// "si_LK" => "Sinhala (Sri Lanka)",
// "si" => "Sinhala",
// "sk_SK" => "Slovak (Slovakia)",
// "sk" => "Slovak",
// "sl_SI" => "Slovenian (Slovenia)",
// "sl" => "Slovenian",
// "xog_UG" => "Soga (Uganda)",
// "xog" => "Soga",
// "so_DJ" => "Somali (Djibouti)",
// "so_ET" => "Somali (Ethiopia)",
// "so_KE" => "Somali (Kenya)",
// "so_SO" => "Somali (Somalia)",
// "so" => "Somali",
// "es_AR" => "Spanish (Argentina)",
// "es_BO" => "Spanish (Bolivia)",
// "es_CL" => "Spanish (Chile)",
// "es_CO" => "Spanish (Colombia)",
// "es_CR" => "Spanish (Costa Rica)",
// "es_DO" => "Spanish (Dominican Republic)",
// "es_EC" => "Spanish (Ecuador)",
// "es_SV" => "Spanish (El Salvador)",
// "es_GQ" => "Spanish (Equatorial Guinea)",
// "es_GT" => "Spanish (Guatemala)",
// "es_HN" => "Spanish (Honduras)",
// "es_419" => "Spanish (Latin America)",
// "es_MX" => "Spanish (Mexico)",
// "es_NI" => "Spanish (Nicaragua)",
// "es_PA" => "Spanish (Panama)",
// "es_PY" => "Spanish (Paraguay)",
// "es_PE" => "Spanish (Peru)",
// "es_PR" => "Spanish (Puerto Rico)",
// "es_ES" => "Spanish (Spain)",
// "es_US" => "Spanish (United States)",
// "es_UY" => "Spanish (Uruguay)",
// "es_VE" => "Spanish (Venezuela)",
// "es" => "Spanish",
// "sw_KE" => "Swahili (Kenya)",
// "sw_TZ" => "Swahili (Tanzania)",
// "sw" => "Swahili",
// "sv_FI" => "Swedish (Finland)",
// "sv_SE" => "Swedish (Sweden)",
// "sv" => "Swedish",
// "gsw_CH" => "Swiss German (Switzerland)",
// "gsw" => "Swiss German",
// "shi_Latn" => "Tachelhit (Latin)",
// "shi_Latn_MA" => "Tachelhit (Latin, Morocco)",
// "shi_Tfng" => "Tachelhit (Tifinagh)",
// "shi_Tfng_MA" => "Tachelhit (Tifinagh, Morocco)",
// "shi" => "Tachelhit",
// "dav_KE" => "Taita (Kenya)",
// "dav" => "Taita",
// "ta_IN" => "Tamil (India)",
// "ta_LK" => "Tamil (Sri Lanka)",
// "ta" => "Tamil",
// "te_IN" => "Telugu (India)",
// "te" => "Telugu",
// "teo_KE" => "Teso (Kenya)",
// "teo_UG" => "Teso (Uganda)",
// "teo" => "Teso",
// "th_TH" => "Thai (Thailand)",
// "th" => "Thai",
// "bo_CN" => "Tibetan (China)",
// "bo_IN" => "Tibetan (India)",
// "bo" => "Tibetan",
// "ti_ER" => "Tigrinya (Eritrea)",
// "ti_ET" => "Tigrinya (Ethiopia)",
// "ti" => "Tigrinya",
// "to_TO" => "Tonga (Tonga)",
// "to" => "Tonga",
// "tr_TR" => "Turkish (Turkey)",
// "tr" => "Turkish",
// "uk_UA" => "Ukrainian (Ukraine)",
// "uk" => "Ukrainian",
// "ur_IN" => "Urdu (India)",
// "ur_PK" => "Urdu (Pakistan)",
// "ur" => "Urdu",
// "uz_Arab" => "Uzbek (Arabic)",
// "uz_Arab_AF" => "Uzbek (Arabic, Afghanistan)",
// "uz_Cyrl" => "Uzbek (Cyrillic)",
// "uz_Cyrl_UZ" => "Uzbek (Cyrillic, Uzbekistan)",
// "uz_Latn" => "Uzbek (Latin)",
// "uz_Latn_UZ" => "Uzbek (Latin, Uzbekistan)",
// "uz" => "Uzbek",
// "vi_VN" => "Vietnamese (Vietnam)",
// "vi" => "Vietnamese",
// "vun_TZ" => "Vunjo (Tanzania)",
// "vun" => "Vunjo",
// "cy_GB" => "Welsh (United Kingdom)",
// "cy" => "Welsh",
// "yo_NG" => "Yoruba (Nigeria)",
// "yo" => "Yoruba",
// "zu_ZA" => "Zulu (South Africa)",
// "zu" => "Zulu"
],
'view_namespaces' => [
'buttons' => [
'crud::buttons', // falls back to 'resources/views/vendor/backpack/crud/buttons'
],
'columns' => [
'crud::columns', // falls back to 'resources/views/vendor/backpack/crud/columns'
],
'fields' => [
'crud::fields', // falls back to 'resources/views/vendor/backpack/crud/fields'
],
'filters' => [
'crud::filters', // falls back to 'resources/views/vendor/backpack/crud/filters'
],
],
// the uploaders for the `withFiles` macro
'uploaders' => [
'withFiles' => [
'image' => \Backpack\CRUD\app\Library\Uploaders\SingleBase64Image::class,
'upload' => \Backpack\CRUD\app\Library\Uploaders\SingleFile::class,
'upload_multiple' => \Backpack\CRUD\app\Library\Uploaders\MultipleFiles::class,
],
],
'file_name_generator' => \Backpack\CRUD\app\Library\Uploaders\Support\FileNameGenerator::class,
];

View File

@ -0,0 +1,44 @@
<?php
/**
* Configurations for Backpack's CreateOperation.
*
* @see https://backpackforlaravel.com/docs/crud-operation-create
*/
return [
// Define the size/looks of the content div for all CRUDs
// To override per view use $this->crud->setCreateContentClass('class-string')
'contentClass' => 'col-md-12 bold-labels',
// When using tabbed forms (create & update), what kind of tabs would you like?
'tabsType' => 'horizontal', //options: horizontal, vertical
// How would you like the validation errors to be shown?
'groupedErrors' => true,
'inlineErrors' => true,
// when the page loads, put the cursor on the first input?
'autoFocusOnFirstField' => true,
// Where do you want to redirect the user by default, save?
// options: save_and_back, save_and_edit, save_and_new
'defaultSaveAction' => 'save_and_back',
// When the user chooses "save and back" or "save and new", show a bubble
// for the fact that the default save action has been changed?
'showSaveActionChange' => true, //options: true, false
// Should we show a cancel button to the user?
'showCancelButton' => true,
// Should we warn the user before leaving the page with unsaved changes?
// NOTE: this works by removing all fields from the form data serialization where field name starts with "_" (underscore). Usualy backpack internal attributes.
// if you have fields that start with an underscore, you need to change the field name, or this functionality wont detect changes in that field.
'warnBeforeLeaving' => false,
// Before saving the entry, how would you like the request to be stripped?
// - false - use Backpack's default (ONLY save inputs that have fields)
// - invokable class - custom stripping (the return should be an array with input names)
// 'strippedRequest' => App\Http\Requests\StripBackpackRequest::class,
];

View File

@ -0,0 +1,39 @@
<?php
/**
* Default configurations for custom form operations.
*/
return [
// Define the size/looks of the content div for all CRUDs
// To override per view use $this->crud->setCreateContentClass('class-string')
'contentClass' => 'col-md-12 bold-labels',
// When using tabbed forms (create & update), what kind of tabs would you like?
'tabsType' => 'horizontal', //options: horizontal, vertical
// How would you like the validation errors to be shown?
'groupedErrors' => true,
'inlineErrors' => true,
// when the page loads, put the cursor on the first input?
'autoFocusOnFirstField' => true,
// Where do you want to redirect the user by default, save?
'defaultSaveAction' => 'save_and_back',
// When the user chooses "save and back" or "save and new", show a bubble
// for the fact that the default save action has been changed?
'showSaveActionChange' => false, //options: true, false
// Should we show a cancel button to the user?
'showCancelButton' => true,
// Should we warn a user before leaving the page with unsaved changes?
'warnBeforeLeaving' => false,
// Before saving the entry, how would you like the request to be stripped?
// - false - use Backpack's default (ONLY save inputs that have fields)
// - invokable class - custom stripping (the return should be an array with input names)
// 'strippedRequest' => App\Http\Requests\StripBackpackRequest::class,
];

View File

@ -0,0 +1,84 @@
<?php
/**
* Configurations for Backpack's ListOperation.
*
* @see https://backpackforlaravel.com/docs/crud-operation-list-entries
*/
return [
// Define the size/looks of the content div for all CRUDs
// To override per view use $this->crud->setListContentClass('class-string')
'contentClass' => 'col-md-12',
// enable the datatables-responsive plugin, which hides columns if they don't fit?
// if not, a horizontal scrollbar will be shown instead
'responsiveTable' => true,
// stores pagination and filters in localStorage for two hours
// whenever the user tries to see that page, backpack loads the previous pagination and filtration
'persistentTable' => true,
// show search bar in the top-right corner?
'searchableTable' => true,
// how much time should the system wait before triggering the search function after the user stops typing?
'searchDelay' => 400,
// the time the table will be persisted in minutes
// after this the table info is cleared from localStorage.
// use false to never force localStorage clear. (default)
// keep in mind: User can clear their localStorage whenever they want.
'persistentTableDuration' => false,
// How many items should be shown by default by the Datatable?
// This value can be overwritten on a specific CRUD by calling
// $this->crud->setDefaultPageLength(50);
'defaultPageLength' => 10,
// A 1D array of options which will be used for both the displayed option and the value, or
// A 2D array in which the first array is used to define the value options and the second array the displayed options
// If a 2D array is used, strings in the right hand array will be automatically run through trans()
'pageLengthMenu' => [[10, 25, 50, 100, -1], [10, 25, 50, 100, 'backpack::crud.all']],
// How important is it for the action buttons to be visible?
// - 0 - most important
// - 1 - as important as bulk buttons
// - 2-3 - more important than the rest of the columns
// - 4 - less important than most columns
'actionsColumnPriority' => 1,
// Nest action buttons within a dropdown in actions column
'lineButtonsAsDropdown' => false,
// What is the minimum actions for the dropdown to be created
// Example: when minimum to drop is «2», any row with less than «2» action buttons
// will not create a dropdown, but will show the buttons inline
'lineButtonsAsDropdownMinimum' => 1,
// Force «X» actions to be shown inline before the dropdown is created
// Example: when setting this to «2», the first «2» actions will be shown inline
// and the rest will be moved to the dropdown
'lineButtonsAsDropdownShowBefore' => 0,
// Show a "Reset" button next to the List operation subheading
// (Showing 1 to 25 of 9999 entries. Reset)
// that allows the user to erase local storage for that datatable,
// thus clearing any searching, filtering or pagination that has been
// remembered and persisted using persistentTable
'resetButton' => true,
// The query operator that is used to search on the table.
// If you are using PostgreSQL you might want to change
// to `ilike` for case-insensitive search
'searchOperator' => 'like',
// Display the `Showing X of XX entries (filtered from X entries)`?
// Setting this to false will improve performance on big datasets.
'showEntryCount' => true,
// when list operation load the information from database, should Backpack eager load the relations ?
// this setting is enabled by default as it reduces the amount of queries required to load the page
'eagerLoadRelationships' => true,
];

View File

@ -0,0 +1,16 @@
<?php
/**
* Configurations for Backpack ReorderOperation.
*
* @see https://backpackforlaravel.com/docs/crud-operation-reorder
*/
return [
// Define the size/looks of the content div for all CRUDs
// To override per Controller use $this->crud->setReorderContentClass('class-string')
'contentClass' => 'col-md-12 col-md-offset-2',
// should the content of the reorder label be escaped?
'escaped' => false,
];

View File

@ -0,0 +1,29 @@
<?php
/**
* Configurations for Backpack's ShowOperation.
*
* @see https://backpackforlaravel.com/docs/crud-operation-show
*/
return [
// Define the size/looks of the content div for all CRUDs
// To override per Controller use $this->crud->setShowContentClass('class-string')
'contentClass' => 'col-md-12',
// Automatically add all columns from the db table?
'setFromDb' => true,
// Automatically add created_at and updated_at columns, if model has timestamps?
'timestamps' => true,
// If model has SoftDeletes, allow the admin to access the Show page for
// soft deleted items & add a deleted_at column to ShowOperation?
'softDeletes' => false,
// Enable to group columns in tabs
'tabsEnabled' => false,
// When using tabbed forms (create & update), what kind of tabs would you like?
'tabsType' => 'horizontal', //options: horizontal, vertical
];

View File

@ -0,0 +1,53 @@
<?php
/**
* Configurations for Backpack's UpdateOperation.
*
* @see https://backpackforlaravel.com/docs/crud-operation-update
*/
return [
// Define the size/looks of the content div for all CRUDs
// To override per view use $this->crud->setEditContentClass('class-string')
'contentClass' => 'col-md-12 bold-labels',
// When using tabbed forms (create & update), what kind of tabs would you like?
'tabsType' => 'horizontal', //options: horizontal, vertical
// How would you like the validation errors to be shown?
'groupedErrors' => true,
'inlineErrors' => true,
// when the page loads, put the cursor on the first input?
'autoFocusOnFirstField' => true,
// Where do you want to redirect the user by default, save?
// options: save_and_back, save_and_edit, save_and_new
'defaultSaveAction' => 'save_and_back',
// When the user chooses "save and back" or "save and new", show a bubble
// for the fact that the default save action has been changed?
'showSaveActionChange' => true, //options: true, false
// Should we show a cancel button to the user?
'showCancelButton' => true,
// Should we show the delete button on the edit form?
'showDeleteButton' => false,
// Should we warn a user before leaving the page with unsaved changes?
'warnBeforeLeaving' => false,
// when viewing the update form of an entry in a language that's not translated should Backpack show a notice
// that allows the user to fill the form from another language?
'showTranslationNotice' => true,
// when loading an update form, should Backpack eager load the relationship information from database?
// this is generally a good thing to enable, as it helps to reduce the number of queries.
'eagerLoadRelationships' => false,
// Before saving the entry, how would you like the request to be stripped?
// - false - use Backpack's default (ONLY save inputs that have fields)
// - invokable class - custom stripping (the return should be an array with input names)
// 'strippedRequest' => App\Http\Requests\StripBackpackRequest::class,
];

View File

@ -0,0 +1,174 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Theme Configuration Values
|--------------------------------------------------------------------------
|
| The file provides extra configs on top of config/backpack/ui.php
|
| Any value set here will override the ones defined in
| config/backpack/ui.php when this theme is in use.
|
*/
/**
* 1st layer of customization
*
* Simple pick a layout and let Backpack decide the best look for it.
* No extra step is required.
*
* Possible values: horizontal, horizontal_dark, horizontal_overlap, vertical,
* vertical_dark, vertical_transparent (legacy theme), right_vertical, right_vertical_dark, right_vertical_transparent
*/
'layout' => 'vertical',
/**
* Pick a login page layout.
* Possible values: default, illustration, cover
*/
'auth_layout' => 'default', // default, illustration, cover
/**
* Here you can easily load your own extra css styles.
* Note: if you want to customize the style to create your own custom skin colors:
* - make a copy of the file "vendor/backpack/theme-tabler/resources/assets/css/colors.css" into your project
* - adjust colors variables as you wish
* - replace "base_path('vendor/backpack/theme-tabler/resources/assets/css/colors.css')," with the path to the file created above
* - boom!
*/
'styles' => [
base_path('vendor/backpack/theme-tabler/resources/assets/css/color-adjustments.css'),
base_path('vendor/backpack/theme-tabler/resources/assets/css/colors.css'),
],
/**
* 2nd Layer of customization
*
* If you need to further customize the way your panel looks,
* these options will help you achieve that.
*/
'options' => [
/**
* The available color modes.
*/
'colorModes' => [
'system' => 'la-desktop',
'light' => 'la-sun',
'dark' => 'la-moon',
],
/**
* The color mode used by default.
*/
'defaultColorMode' => 'light', // system, light, dark
/**
* When true, a switch is displayed to let admins choose their favorite theme mode.
* When false, the theme will only use the "defaultColorMode" set above.
* In case "defaultColorMode" is null, system is the default.
*/
'showColorModeSwitcher' => true,
/**
* Fix the top-header component (present in "vertical_transparent") and the menu when the layout type is set as "horizontal".
* This value is skipped when the layout type is horizontal-overlap, using false as default.
*/
'useStickyHeader' => false,
/**
* When true, the content area will take the whole screen width.
*/
'useFluidContainers' => false,
/**
* When true, the sidebar content for vertical layouts will not scroll with the rest of the content.
*/
'sidebarFixed' => false,
/**
* When true, horizontal layouts will display the classic top bar on top to free some space when multiple nav items are used.
*/
'doubleTopBarInHorizontalLayouts' => false,
/**
* When true, the password input will have a toggle button to show/hide the password.
*/
'showPasswordVisibilityToggler' => false,
],
/**
* 3rd Layer of customization
*
* In case the first two steps were not enough, here you have full control over
* the classes that make up the look of your panel.
*/
'classes' => [
/**
* Use this to pass classes to the <body> HTML element, on all pages.
*/
'body' => null,
/**
* For background colors use:
* bg-dark, bg-primary, bg-secondary, bg-danger, bg-warning, bg-success, bg-info, bg-blue, bg-light-blue,
* bg-indigo, bg-purple, bg-pink, bg-red, bg-orange, bg-yellow, bg-green, bg-teal, bg-cyan, bg-white.
*
* For links to be visible on different background colors use: "navbar-dark", "navbar-light".
*
*/
'topHeader' => null,
/**
* Applies only for Vertical Menu Layout
* For standard sidebar look (transparent):
* - Remove "navbar-dark/light"
* - Remove "navbar-light/dark" from 'classes.topHeader' and instead use "bg-light"
* You can also add a background class like bg-dark, bg-primary, bg-secondary, bg-danger, bg-warning, bg-success,
* bg-info, bg-blue, bg-light-blue, bg-indigo, bg-purple, bg-pink, bg-red, bg-orange, bg-yellow, bg-green, bg-teal, bg-cyan
*/
'sidebar' => null,
/**
* Used in the top container menu when the layout is of horizontal type.
*/
'menuHorizontalContainer' => null,
/**
* Used in the top menu content when the layout is of horizontal type.
*/
'menuHorizontalContent' => null,
/**
* Make transparent with footer-transparent.
* Hide it with d-none.
*
* Change background color with bg-dark, bg-primary, bg-secondary, bg-danger, bg-warning, bg-success, bg-info,
* bg-blue, bg-light-blue, bg-indigo, bg-purple, bg-pink, bg-red, bg-orange, bg-yellow, bg-green, bg-teal, bg-cyan, bg-white.
*/
'footer' => null,
/**
* Use this to pass classes to the table displayed in List Operation
* It defaults to: "table table-striped table-hover nowrap rounded card-table table-vcenter card-table shadow-xs border-xs"
*/
'table' => null,
/**
* Use this to pass classes to the table wrapper component displayed in List Operation
*/
'tableWrapper' => null,
],
/**
* 4th Layer of customization
*
* Alright, if nothing so far met your need, then you still have an easy way to build
* a custom layout using the already existing components of this theme.
*
* 1. Create a new blade file in resources/views/layouts/your-custom-layout.blade.php
* 2. Replace the value of layout on this file with "your-custom-layout"
* 3. Customize the blade and place components such as sidebar, header, top-bar, where you need them!
*/
];

147
config/backpack/ui.php Normal file
View File

@ -0,0 +1,147 @@
<?php
return [
// IMPORTANT NOTE: The configurations here get overridden by theme config files.
//
// Eg. If you're using theme-tabler and config/backpack/theme-tabler.php
// has "breadcrumbs" set as false, then THAT value will be used instead
// of the value in this file.
/*
|--------------------------------------------------------------------------
| Theme (User Interface)
|--------------------------------------------------------------------------
*/
// Change the view namespace in order to load a different theme than the one Backpack provides.
// You can create child themes yourself, by creating a view folder anywhere in your resources/views
// and choosing that view_namespace instead of the default one. Backpack will load a file from there
// if it exists, otherwise it will load it from the fallback namespace.
'view_namespace' => 'backpack.theme-tabler::',
'view_namespace_fallback' => 'backpack.theme-tabler::',
/*
|--------------------------------------------------------------------------
| Look & feel customizations
|--------------------------------------------------------------------------
|
| To make the UI feel yours.
|
| Note that values set here might be overridden by theme config files
| (eg. config/backpack/theme-tabler.php) when that theme is in use.
|
*/
// Date & Datetime Format Syntax: https://carbon.nesbot.com/docs/#api-localization
'default_date_format' => 'D MMM YYYY',
'default_datetime_format' => 'D MMM YYYY, HH:mm',
// Direction, according to language
// (left-to-right vs right-to-left)
'html_direction' => 'ltr',
// ----
// HEAD
// ----
// Project name - shown in the window title
'project_name' => '桃園衛生局活動網站管理',
// Content of the HTML meta robots tag to prevent indexing and link following
'meta_robots_content' => 'noindex, nofollow',
// ------
// HEADER
// ------
// When clicking on the admin panel's top-left logo/name,
// where should the user be redirected?
// The string below will be passed through the url() helper.
// - default: '' (project root)
// - alternative: 'admin' (the admin's dashboard)
'home_link' => '',
// Menu logo. You can replace this with an <img> tag if you have a logo.
'project_logo' => '<b>桃園衛生局</b>活動網站管理',
// Show / hide breadcrumbs on admin panel pages.
'breadcrumbs' => true,
// ------
// FOOTER
// ------
// Developer or company name. Shown in footer.
'developer_name' => false,
// Developer website. Link in footer. Type false if you want to hide it.
'developer_link' => false,
// Show powered by Laravel Backpack in the footer? true/false
'show_powered_by' => false,
// ---------
// DASHBOARD
// ---------
// Show "Getting Started with Backpack" info block?
'show_getting_started' => env('APP_ENV') == 'local',
// -------------
// GLOBAL STYLES
// -------------
// CSS files that are loaded in all pages, using Laravel's asset() helper
'styles' => [
// 'styles/example.css',
// 'https://some-cdn.com/example.css',
],
// CSS files that are loaded in all pages, using Laravel's mix() helper
'mix_styles' => [ // file_path => manifest_directory_path
// 'css/app.css' => '',
],
// CSS files that are loaded in all pages, using Laravel's @vite() helper
// Please note that support for Vite was added in Laravel 9.19. Earlier versions are not able to use this feature.
'vite_styles' => [ // resource file_path
// 'resources/css/app.css',
],
// --------------
// GLOBAL SCRIPTS
// --------------
// JS files that are loaded in all pages, using Laravel's asset() helper
'scripts' => [
// 'js/example.js',
// 'https://cdn.jsdelivr.net/npm/vue@2.4.4/dist/vue.min.js',
// 'https://cdn.jsdelivr.net/npm/react@16/umd/react.production.min.js',
// 'https://cdn.jsdelivr.net/npm/react-dom@16/umd/react-dom.production.min.js',
],
// JS files that are loaded in all pages, using Laravel's mix() helper
'mix_scripts' => [ // file_path => manifest_directory_path
// 'js/app.js' => '',
],
// JS files that are loaded in all pages, using Laravel's @vite() helper
'vite_scripts' => [ // resource file_path
// 'resources/js/app.js',
],
'classes' => [
/**
* Use this as fallback config for themes to pass classes to the table displayed in List Operation
* It defaults to: "table table-striped table-hover nowrap rounded card-table table-vcenter card-table shadow-xs border-xs".
*/
'table' => null,
/**
* Use this as fallback config for themes to pass classes to the table wrapper component displayed in List Operation.
*/
'tableWrapper' => null,
],
];

71
config/broadcasting.php Normal file
View File

@ -0,0 +1,71 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Broadcaster
|--------------------------------------------------------------------------
|
| This option controls the default broadcaster that will be used by the
| framework when an event needs to be broadcast. You may set this to
| any of the connections defined in the "connections" array below.
|
| Supported: "pusher", "ably", "redis", "log", "null"
|
*/
'default' => env('BROADCAST_DRIVER', 'null'),
/*
|--------------------------------------------------------------------------
| Broadcast Connections
|--------------------------------------------------------------------------
|
| Here you may define all of the broadcast connections that will be used
| to broadcast events to other systems or over websockets. Samples of
| each available type of connection are provided inside this array.
|
*/
'connections' => [
'pusher' => [
'driver' => 'pusher',
'key' => env('PUSHER_APP_KEY'),
'secret' => env('PUSHER_APP_SECRET'),
'app_id' => env('PUSHER_APP_ID'),
'options' => [
'cluster' => env('PUSHER_APP_CLUSTER'),
'host' => env('PUSHER_HOST') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com',
'port' => env('PUSHER_PORT', 443),
'scheme' => env('PUSHER_SCHEME', 'https'),
'encrypted' => true,
'useTLS' => env('PUSHER_SCHEME', 'https') === 'https',
],
'client_options' => [
// Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html
],
],
'ably' => [
'driver' => 'ably',
'key' => env('ABLY_KEY'),
],
'redis' => [
'driver' => 'redis',
'connection' => 'default',
],
'log' => [
'driver' => 'log',
],
'null' => [
'driver' => 'null',
],
],
];

111
config/cache.php Normal file
View File

@ -0,0 +1,111 @@
<?php
use Illuminate\Support\Str;
return [
/*
|--------------------------------------------------------------------------
| Default Cache Store
|--------------------------------------------------------------------------
|
| This option controls the default cache connection that gets used while
| using this caching library. This connection is used when another is
| not explicitly specified when executing a given caching function.
|
*/
'default' => env('CACHE_DRIVER', 'file'),
/*
|--------------------------------------------------------------------------
| Cache Stores
|--------------------------------------------------------------------------
|
| Here you may define all of the cache "stores" for your application as
| well as their drivers. You may even define multiple stores for the
| same cache driver to group types of items stored in your caches.
|
| Supported drivers: "apc", "array", "database", "file",
| "memcached", "redis", "dynamodb", "octane", "null"
|
*/
'stores' => [
'apc' => [
'driver' => 'apc',
],
'array' => [
'driver' => 'array',
'serialize' => false,
],
'database' => [
'driver' => 'database',
'table' => 'cache',
'connection' => null,
'lock_connection' => null,
],
'file' => [
'driver' => 'file',
'path' => storage_path('framework/cache/data'),
'lock_path' => storage_path('framework/cache/data'),
],
'memcached' => [
'driver' => 'memcached',
'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
'sasl' => [
env('MEMCACHED_USERNAME'),
env('MEMCACHED_PASSWORD'),
],
'options' => [
// Memcached::OPT_CONNECT_TIMEOUT => 2000,
],
'servers' => [
[
'host' => env('MEMCACHED_HOST', '127.0.0.1'),
'port' => env('MEMCACHED_PORT', 11211),
'weight' => 100,
],
],
],
'redis' => [
'driver' => 'redis',
'connection' => 'cache',
'lock_connection' => 'default',
],
'dynamodb' => [
'driver' => 'dynamodb',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
'endpoint' => env('DYNAMODB_ENDPOINT'),
],
'octane' => [
'driver' => 'octane',
],
],
/*
|--------------------------------------------------------------------------
| Cache Key Prefix
|--------------------------------------------------------------------------
|
| When utilizing the APC, database, memcached, Redis, or DynamoDB cache
| stores there might be other applications using the same cache. For
| that reason, you may prefix every cache key to avoid collisions.
|
*/
'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'),
];

34
config/cors.php Normal file
View File

@ -0,0 +1,34 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Cross-Origin Resource Sharing (CORS) Configuration
|--------------------------------------------------------------------------
|
| Here you may configure your settings for cross-origin resource sharing
| or "CORS". This determines what cross-origin operations may execute
| in web browsers. You are free to adjust these settings as needed.
|
| To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
|
*/
'paths' => ['api/*', 'sanctum/csrf-cookie'],
'allowed_methods' => ['*'],
'allowed_origins' => ['*'],
'allowed_origins_patterns' => [],
'allowed_headers' => ['*'],
'exposed_headers' => [],
'max_age' => 0,
'supports_credentials' => false,
];

Some files were not shown because too many files have changed in this diff Show More