コミットを比較
共通のコミットはありません。 "newbackend" と "17169605594832515d173a212b38aca23553178c" の履歴はすべて異なっています。
newbackend
...
1716960559
71
README.md
71
README.md
|
@ -1,74 +1,7 @@
|
|||
# kikikanri
|
||||
危機管理クラウドアプリ\
|
||||
ランサーズに居る(株)ZOTMANの「chankan」というクライエント向け作りましたが、2月プロジェクトをもう完了しましたのに、全然払わないですので、危機管理はオープンソース化にしました。
|
||||
危機管理クラウドアプリ
|
||||
|
||||
ランサーズのスタッフ及び警察官も応援していませんので、この問題は自分で解決します。\
|
||||
chankanさんは詐欺師ですので、本当に本当にご注意下さい。
|
||||
|
||||
私はバックエンド部分を作りました、もう一人はフロントエンドを作りました。\
|
||||
chankanさんはフロントエンドの開発者も全然払いません。\
|
||||
フロントエンドの開発者による、chankanさんは私達だけじゃなくて、全てのフリーランサーの開発者を払いません。
|
||||
|
||||
こちらのソースコードは下記のプロジェクトについてでした:\
|
||||
https://www.lancers.jp/work/detail/3775955
|
||||
|
||||
ランサーズ上のプロフィール: https://www.lancers.jp/client/chankan
|
||||
|
||||
chankanさんはこれを読んだら、私達の仕事を払うと、ソースコードをまた隠れます。
|
||||
|
||||
# ZOTMAN=詐欺
|
||||
|
||||
2021年10月、2人とも危機管理アプリの開発を始めました。\
|
||||
締め切りは10月末でしたが、chankanさんは12月まで開発設計を沢山変更されました。\
|
||||
そうして、12月初旬、私達はプロジェクトを終わったら、chankanさんは2週間消えられました(病気になったみたいです)。\
|
||||
やっと戻ったすぐ、また設計を沢山変更されました。\
|
||||
1月、フロントエンドの開発者がマイルストーンを払うと頼んだら、chankanさんはフロントエンドの開発者を直ぐプロジェクトから落ちられました。\
|
||||
2月[最後の問題](https://git.076.ne.jp/TechnicalSuwako/kikikan/commit/890fc477f507aee94e7a8527db31c66ad4c4f8b7)を終わったら、私のこともプロジェクトから落ちられましたが、「1ヶ月後バグが出ないと、払います」と言われました。\
|
||||
でも、[1ヶ月後1つのバグを報告されました](https://git.076.ne.jp/TechnicalSuwako/kikikan/commit/378ec9904ea5ce269cd2a1772ad761f8e033da0a)。\
|
||||
これを直ぐ修正しましたら、また1ヶ月で延期されました。\
|
||||
[1ヶ月後同じページで違うバグを報告されまし](https://git.076.ne.jp/TechnicalSuwako/kikikan/commit/c186d806a3ccb08a426b512bce310ccd8aeb78e3)たので、その時から全然払わない調子だと疑いました。\
|
||||
同じページで1つのバグを見つけるのは1ヶ月がかかる事がありえないでしょ!
|
||||
|
||||
それで、下記の喧嘩となりました。
|
||||
|
||||
![](chankanisscammer1.png)\
|
||||
![](chankanisscammer2.png)\
|
||||
![](chankanisscammer3.png)\
|
||||
![](chankanisscammer4.png)
|
||||
|
||||
詐欺師だか確認するには、下記のプロポーズしました。\
|
||||
でも、「完了報告」ボタンを押したまで全然反応されなかったでした。\
|
||||
![](propose.png)
|
||||
|
||||
下記で詐欺師で確認されました:\
|
||||
![](notrust.png)\
|
||||
「「信頼」については不要でございます」ってどういう意味ですか!?\
|
||||
銀行であなたはお金を引き出す事が遠慮されたら、信頼も不要ですか!?\
|
||||
出品の場合も、信頼は不要って何ですか?\
|
||||
詐欺行為です!
|
||||
|
||||
# chankanさんはフロントエンドの開発者も払わない
|
||||
|
||||
![](fe1.png)\
|
||||
![](fe2.png)\
|
||||
![](fe3.png)
|
||||
|
||||
# 「未完了」だけど、「完了」!?
|
||||
|
||||
https://www.zotman.jp/ ([アーカイブ](https://hozon.site/1651132951/www.zotman.jp/index.html))\
|
||||
https://www.kikikan.jp/ ([アーカイブ](https://hozon.site/1651133017/www.kikikan.jp/index.html))\
|
||||
https://kikikan.xyz/admin/login\
|
||||
![](kikikanisactive.png)
|
||||
|
||||
上記のURLをアクセスすると、サービスはもう利用中みたいです。\
|
||||
まだ誰もの仕事を払わなかったけど、もう有料サービスとなった!?\
|
||||
ですから、プロジェクトはオープンソースとなりました!
|
||||
|
||||
# Gitミラー
|
||||
* https://git.076.ne.jp/TechnicalSuwako/kikikan
|
||||
* https://github.com/TechnicalSuwako/kikikan
|
||||
* https://codeberg.org/TechnicalSuwako/kikikan
|
||||
* https://gitgud.io/TechnicalSuwako/kikikan
|
||||
|
||||
# 開発環境構築手順
|
||||
#### 1.Docker立ち上げ
|
||||
|
@ -109,6 +42,8 @@ php artisan storage:link
|
|||
service cron start
|
||||
```
|
||||
|
||||
|
||||
|
||||
# 仕様書
|
||||
#### ■ 基本情報
|
||||
https://docs.google.com/spreadsheets/d/1_S9Hbrf3XZcLXBrnTqxTusuoO5_9dmAooTQ2EGsR7mo/edit?usp=sharing
|
||||
|
|
|
@ -11,6 +11,3 @@ Homestead.json
|
|||
Homestead.yaml
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
/storage/backup/mysql/*.gz
|
||||
/storage/backup/mysql/*.sql
|
||||
/storage/backup/file/*.tar.gz
|
||||
|
|
|
@ -9,8 +9,6 @@ use Illuminate\Http\Request;
|
|||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
use App\Models\LoginLimits;
|
||||
use App\Models\ManageVisiters;
|
||||
use App\Models\ManageFailureLogins;
|
||||
|
||||
trait AuthenticationTrait {
|
||||
private function makeSession ($guard, $db) {
|
||||
|
@ -28,10 +26,6 @@ trait AuthenticationTrait {
|
|||
}
|
||||
|
||||
public function checkSession () {
|
||||
if ($this->getGuard() == 'admins') {
|
||||
ManageVisiters::create(['ip_address' => $_SERVER['REMOTE_ADDR'], 'host' => gethostbyaddr($_SERVER['REMOTE_ADDR']), 'user_agent' => $_SERVER['HTTP_USER_AGENT']]);
|
||||
}
|
||||
|
||||
if (isset($_COOKIE['remember_token']) && !is_null($_COOKIE['remember_token'])) { // クッキーがある場合
|
||||
if (null !== ($get = $this->getModel()->where('remember_token', $_COOKIE['remember_token'])->first())) { // トークンがある場合
|
||||
// セッションを想像する
|
||||
|
@ -62,9 +56,6 @@ trait AuthenticationTrait {
|
|||
}
|
||||
|
||||
if (null !== ($ll = LoginLimits::where('login_id', $loginid)->first()) && $ll->fail_number >= 10) {
|
||||
if ($this->getGuard() == 'admins') {
|
||||
ManageFailureLogins::create(['email' => $loginid, 'password' => $r->password]);
|
||||
}
|
||||
return ['status_code' => 400, 'error_message' => ['10回連続で失敗したため、10分間はログインができなくなりました。']];
|
||||
}
|
||||
}
|
||||
|
@ -98,10 +89,6 @@ trait AuthenticationTrait {
|
|||
LoginLimits::create(['login_id' => $loginid, 'fail_number' => 1]);
|
||||
}
|
||||
|
||||
if ($this->getGuard() == 'admins') {
|
||||
ManageFailureLogins::create(['email' => $loginid, 'password' => $r->password]);
|
||||
}
|
||||
|
||||
return ['status_code' => 400, 'error_message' => ['ログインに失敗しました。10回連続で失敗すると、一定期間ログインできなくなります。']];
|
||||
}
|
||||
|
||||
|
@ -114,10 +101,6 @@ trait AuthenticationTrait {
|
|||
LoginLimits::create(['login_id' => $loginid, 'fail_number' => 1]);
|
||||
}
|
||||
|
||||
if ($this->getGuard() == 'admins') {
|
||||
ManageFailureLogins::create(['email' => $loginid, 'password' => $r->password]);
|
||||
}
|
||||
|
||||
return ['status_code' => 400, 'error_message' => ['ログインに失敗しました。10回連続で失敗すると、一定期間ログインできなくなります。']];
|
||||
}
|
||||
|
||||
|
@ -139,9 +122,6 @@ trait AuthenticationTrait {
|
|||
setcookie('remember_token', $token, $expire, '/', $_SERVER['HTTP_HOST'], false, true);
|
||||
}
|
||||
catch (\Throwable $e) {
|
||||
if ($this->getGuard() == 'admins') {
|
||||
ManageFailureLogins::create(['email' => $loginid, 'password' => $r->password]);
|
||||
}
|
||||
Log::critical($e->getMessage());
|
||||
return ['status_code' => 400, 'error_message' => ['ログインに失敗しました。10回連続で失敗すると、一定期間ログインできなくなります。']];
|
||||
}
|
||||
|
|
|
@ -144,7 +144,7 @@ class ChildrenController extends Controller {
|
|||
});
|
||||
|
||||
$validate = Validator::make($r->all(), [
|
||||
'identity' => 'required|max:20|numeric',
|
||||
'identity' => 'required|max:20|alpha_num',
|
||||
'email' => 'required|unique:children|max:255|email',
|
||||
'password' => ['required', 'min:8', 'max:72', 'confirmed', new \App\Rules\Hankaku],
|
||||
'last_name' => 'required|max:100',
|
||||
|
@ -552,7 +552,7 @@ class ChildrenController extends Controller {
|
|||
'tel' => 'required|numeric|starts_with:0|tel_size',
|
||||
'last_name' => 'required|max:100',
|
||||
'first_name' => 'required|max:100',
|
||||
'identity' => 'required|max:20|numeric',
|
||||
'identity' => 'required|max:20|alpha_num',
|
||||
'company' => 'max:100',
|
||||
]);
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@ class FatherRelationsController extends Controller {
|
|||
}
|
||||
|
||||
$validate = Validator::make($r->all(), [
|
||||
'identity' => 'required|max:20|numeric',
|
||||
'identity' => 'required|max:20|alpha_num',
|
||||
]);
|
||||
|
||||
if ($validate->fails()) {
|
||||
|
|
|
@ -63,25 +63,14 @@ class FathersController extends Controller {
|
|||
];
|
||||
|
||||
try {
|
||||
// DBの値の準備。
|
||||
DB::beginTransaction();
|
||||
|
||||
if (null !== ($oema = EmailActivation::where('email', $r->email)->first())) {
|
||||
$oema->delete();
|
||||
}
|
||||
$emac = new EmailActivation;
|
||||
$emac->fill($create);
|
||||
$emac->push();
|
||||
// DBに入ります。
|
||||
EmailActivation::create($create);
|
||||
|
||||
// メールを送ります。
|
||||
Mail::to($r->email)->send(new FathersForgetPasswordMail($token));
|
||||
|
||||
// DBに入ります。
|
||||
DB::commit();
|
||||
} catch (\Throwable $e) {
|
||||
// 失敗
|
||||
Log::critical($e->getMessage());
|
||||
DB::rollback();
|
||||
return ['status_code' => 400, 'error_messages' => 'メールアドレスが未登録です。入力した情報を確認してください。'];
|
||||
}
|
||||
|
||||
|
|
|
@ -773,7 +773,7 @@ class MeetingsController extends Controller {
|
|||
|
||||
// DBにミーティングがある場合
|
||||
if ($chk = Meeting::select('pdf')->where('id', (int)$meeting_id)->first()) {
|
||||
// base64の場合+データベースと異なる場合(ファイルパスだったら、スキップ)
|
||||
// base64の場合(ファイルパスだったら、スキップ)
|
||||
if (!preg_match('/\/files\/(.*).pdf/', $r->pdf)) {
|
||||
// もう存在しているPDFのファイル名からパスを外します。
|
||||
$opdf = str_replace('/files/', '', $chk->pdf);
|
||||
|
@ -792,10 +792,6 @@ class MeetingsController extends Controller {
|
|||
$update['pdf'] = '/files/'.$filename;
|
||||
Storage::disk('private')->put($filename, $pdf);
|
||||
}
|
||||
// 異ならない場合、交換せず保存する
|
||||
else {
|
||||
$update['pdf'] = $chk->pdf;
|
||||
}
|
||||
}
|
||||
// なければ、そのままストレージに保存します。
|
||||
else {
|
||||
|
@ -803,15 +799,6 @@ class MeetingsController extends Controller {
|
|||
Storage::disk('private')->put($filename, $pdf);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// DBにミーティングがある場合
|
||||
if ($chk = Meeting::select('pdf')->where('id', (int)$meeting_id)->first()) {
|
||||
$opdf = str_replace('/files/', '', $chk->pdf);
|
||||
if (Storage::disk('private')->get($opdf)) {
|
||||
Storage::disk('private')->delete($opdf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// データベースに保存します。
|
||||
DB::beginTransaction();
|
||||
|
@ -822,7 +809,6 @@ class MeetingsController extends Controller {
|
|||
$meeting->text = $update['text'];
|
||||
if (isset($update['memo'])) $meeting->memo = $update['memo'];
|
||||
if (isset($update['pdf'])) $meeting->pdf = $update['pdf'];
|
||||
else $meeting->pdf = null;
|
||||
|
||||
$meeting->save();
|
||||
|
||||
|
|
|
@ -1,12 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class ManageFailureLogins extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
protected $fillable = ['email', 'password'];
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class ManageVisiters extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
protected $fillable = ['ip_address', 'host', 'user_agent'];
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Database\Factories;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||
|
||||
class ManageFailureLoginsFactory extends Factory
|
||||
{
|
||||
/**
|
||||
* Define the model's default state.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function definition()
|
||||
{
|
||||
return [
|
||||
//
|
||||
];
|
||||
}
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Database\Factories;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||
|
||||
class ManageVisitersFactory extends Factory
|
||||
{
|
||||
/**
|
||||
* Define the model's default state.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function definition()
|
||||
{
|
||||
return [
|
||||
//
|
||||
];
|
||||
}
|
||||
}
|
|
@ -1,33 +0,0 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class CreateManageFailureLoginsTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::create('manage_failure_logins', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('email', 255);
|
||||
$table->string('password', 255);
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::dropIfExists('manage_failure_logins');
|
||||
}
|
||||
}
|
|
@ -1,34 +0,0 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class CreateManageVisitersTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::create('manage_visiters', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('ip_address', 20);
|
||||
$table->string('host', 255);
|
||||
$table->string('user_agent', 255);
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::dropIfExists('manage_visiters');
|
||||
}
|
||||
}
|
|
@ -26,9 +26,5 @@ class AdminsTableSeeder extends Seeder
|
|||
'email' => 'chankan77@gmail.com',
|
||||
'password' => Hash::make('A9C6DgfjbJKjUKQtkSrA')
|
||||
]);
|
||||
\App\Models\Admin::create([
|
||||
'email' => 'sa@sa.sa',
|
||||
'password' => Hash::make('sasasasa')
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,18 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
class ManageFailureLoginsSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function run()
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
class ManageVisitersSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function run()
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
長すぎる行があるためファイル差分は表示されません
長すぎる行があるためファイル差分は表示されません
|
@ -203,8 +203,8 @@ const AdminChildEdit = () => {
|
|||
</div>
|
||||
</div>
|
||||
}
|
||||
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
|
||||
{ _400error && <Alert type="fail" hide={()=>set400Error('')}> {_400error} </Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success} </Alert> }
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -213,4 +213,4 @@ const AdminChildEdit = () => {
|
|||
}
|
||||
|
||||
|
||||
export default AdminChildEdit;
|
||||
export default AdminChildEdit;
|
|
@ -157,12 +157,12 @@ const AdminChilds = () => {
|
|||
}
|
||||
</div>
|
||||
</div>
|
||||
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
|
||||
{ _400error && <Alert type="fail" hide={()=>set400Error('')}> {_400error} </Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success} </Alert> }
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default AdminChilds;
|
||||
export default AdminChilds;
|
|
@ -112,8 +112,8 @@ const AdminChildPasswordEdit = () => {
|
|||
className="btn-edit btn-default btn-h75 bg-yellow rounded-20">
|
||||
<span className={`ft-18 ft-xs-16 font-weight-bold ${!submit && 'text-black'}`}>パスワードを更新</span>
|
||||
</LoadingButton>
|
||||
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
|
||||
{ _400error && <Alert type="fail" hide={()=>set400Error('')}> {_400error} </Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success} </Alert> }
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
|
|
@ -226,8 +226,8 @@ const AdminMeetingDetail = () => {
|
|||
handleAccept={handleAcceptDelete}
|
||||
loading={submit}
|
||||
/>
|
||||
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
|
||||
{ _400error && <Alert type="fail" hide={()=>set400Error('')}> {_400error} </Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success} </Alert> }
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -292,7 +292,7 @@ const AdminMeetingEdit = () => {
|
|||
<div className="edit-set edit-set-mt15">
|
||||
<label className="edit-set-file-label" htmlFor="file_pdf">
|
||||
PDFアップロード
|
||||
<input type="file" name="file_pdf" accept=".pdf" id="file_pdf" onChange={handlePDFChange} onClick={(e) => { e.target.value = null; }} />
|
||||
<input type="file" name="file_pdf" accept=".pdf" id="file_pdf" onChange={handlePDFChange} />
|
||||
</label>
|
||||
{
|
||||
pdf &&
|
||||
|
@ -414,8 +414,8 @@ const AdminMeetingEdit = () => {
|
|||
</div>
|
||||
</article>
|
||||
}
|
||||
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
|
||||
{ _400error && <Alert type="fail" hide={()=>set400Error('')}> {_400error} </Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success} </Alert> }
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -424,4 +424,4 @@ const AdminMeetingEdit = () => {
|
|||
)
|
||||
}
|
||||
|
||||
export default AdminMeetingEdit;
|
||||
export default AdminMeetingEdit;
|
|
@ -214,8 +214,8 @@ const AdminParentDetail = () => {
|
|||
handleAccept={handleAcceptDelete}
|
||||
loading={submit}
|
||||
/>
|
||||
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
|
||||
{ _400error && <Alert type="fail" hide={()=>set400Error('')}> {_400error} </Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success} </Alert> }
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -193,8 +193,8 @@ const AdminParentEdit = () => {
|
|||
</div>
|
||||
</div>
|
||||
}
|
||||
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
|
||||
{ _400error && <Alert type="fail" hide={()=>set400Error('')}> {_400error} </Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success} </Alert> }
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -203,4 +203,4 @@ const AdminParentEdit = () => {
|
|||
}
|
||||
|
||||
|
||||
export default AdminParentEdit;
|
||||
export default AdminParentEdit;
|
|
@ -172,12 +172,12 @@ const AdminParents = () => {
|
|||
}
|
||||
</div>
|
||||
</div>
|
||||
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
|
||||
{ _400error && <Alert type="fail" hide={()=>set400Error('')}> {_400error} </Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success} </Alert> }
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default AdminParents;
|
||||
export default AdminParents;
|
|
@ -113,8 +113,8 @@ const AdminParentPasswordEdit = () => {
|
|||
className="btn-edit btn-default btn-h75 bg-yellow rounded-20">
|
||||
<span className={`ft-18 ft-xs-16 font-weight-bold ${!submit && 'text-black'}`}>パスワードを更新</span>
|
||||
</LoadingButton>
|
||||
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
|
||||
{ _400error && <Alert type="fail" hide={()=>set400Error('')}> {_400error} </Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success} </Alert> }
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
|
|
@ -70,7 +70,7 @@ const ChildForgotPassword = () => {
|
|||
</LoadingButton>
|
||||
|
||||
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success}</Alert> }
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -78,4 +78,4 @@ const ChildForgotPassword = () => {
|
|||
}
|
||||
|
||||
|
||||
export default ChildForgotPassword;
|
||||
export default ChildForgotPassword;
|
|
@ -22,7 +22,7 @@ const ParentForgotPassword = () => {
|
|||
axios.post('/api/fathers/requestPassword', formdata)
|
||||
.then(response => {
|
||||
setSubmit(false)
|
||||
switch (response.data.status_code) {
|
||||
switch(response.data.status_code){
|
||||
case 200: setSuccess(response.data.success_messages); break;
|
||||
case 400: set400Error(response.data.error_messages); break;
|
||||
case 422: window.scrollTo(0, 0); set422Errors(response.data.error_messages); break;
|
||||
|
@ -57,7 +57,7 @@ const ParentForgotPassword = () => {
|
|||
</span>
|
||||
</LoadingButton>
|
||||
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
|
||||
{ _success && <Alert type="success" hide={()=>setSucess('')}> {_success}</Alert> }
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -65,4 +65,4 @@ const ParentForgotPassword = () => {
|
|||
}
|
||||
|
||||
|
||||
export default ParentForgotPassword;
|
||||
export default ParentForgotPassword;
|
|
@ -270,7 +270,7 @@ const ParentMeetingAdd = () => {
|
|||
<div className="edit-set edit-set-mt15">
|
||||
<label className="edit-set-file-label" htmlFor="file_pdf">
|
||||
PDFアップロード
|
||||
<input type="file" name="file_pdf" accept=".pdf" id="file_pdf" onChange={handlePDFChange} onClick={(e) => { e.target.value = null; }} />
|
||||
<input type="file" name="file_pdf" accept=".pdf" id="file_pdf" onChange={handlePDFChange} />
|
||||
</label>
|
||||
{
|
||||
pdf &&
|
||||
|
|
|
@ -237,8 +237,8 @@ const ParentMeetingEdit = () => {
|
|||
e.preventDefault();
|
||||
let reader = new FileReader();
|
||||
let _file = e.target.files[0];
|
||||
if (!_file) return;
|
||||
setPDFURL(URL.createObjectURL(_file));
|
||||
if(!_file) return;
|
||||
setPDFURL(URL.createObjectURL(_file))
|
||||
reader.readAsDataURL(_file);
|
||||
reader.onloadend = () => {
|
||||
setPdf(reader.result);
|
||||
|
@ -308,12 +308,12 @@ const ParentMeetingEdit = () => {
|
|||
<div className="edit-set edit-set-mt15">
|
||||
<label className="edit-set-file-label" htmlFor="file_pdf">
|
||||
PDFアップロード
|
||||
<input type="file" name="file_pdf" accept=".pdf" id="file_pdf" onChange={handlePDFChange} onClick={(e) => { e.target.value = null; }} />
|
||||
<input type="file" name="file_pdf" accept=".pdf" id="file_pdf" onChange={handlePDFChange} />
|
||||
</label>
|
||||
{
|
||||
pdf &&
|
||||
<IconButton
|
||||
onClick={() => { setPdf(''); setPDFURL(''); }}
|
||||
onClick={()=>{setPdf(''); setPDFURL('');}}
|
||||
style={{position: 'absolute',
|
||||
top: '-6px',
|
||||
right: '-6px'}}>
|
||||
|
@ -450,4 +450,4 @@ const ParentMeetingEdit = () => {
|
|||
)
|
||||
}
|
||||
|
||||
export default ParentMeetingEdit;
|
||||
export default ParentMeetingEdit;
|
45
backup.sh
45
backup.sh
|
@ -1,45 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
ROOTPATH="/home/suwako/dev/kikikanri"
|
||||
BCKPDIR=`cd ${ROOTPATH}/backup && pwd`
|
||||
BACKEND=`cd ${ROOTPATH}/backend && pwd`
|
||||
source ${BACKEND}/.env
|
||||
TIME=`date '+%Y%m%d%H'`
|
||||
|
||||
echo "バックアップフォルダ=${BCKPDIR}"
|
||||
echo "バックエンドフォルダ=${BACKEND}"
|
||||
echo "${TIME} MYSQLバックアップ開始"
|
||||
|
||||
# DBコンテナ
|
||||
DBCONTID=`docker ps -q -f status=running -f name=db`
|
||||
if [ -z "$DBCONTID" ]; then
|
||||
echo "db は起動されていません。"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# アプリコンテナ
|
||||
FLCONTID=`docker ps -q -f status=running -f name=app`
|
||||
if [ -z "$FLCONTID" ]; then
|
||||
echo "app は起動されていません。"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# DBバックアップ
|
||||
echo "${BACKEND} MYSQLバックアップ開始"
|
||||
DNAME="${TIME}_mysql.sql"
|
||||
echo "ファイル名=${DNAME}"
|
||||
docker exec $DBCONTID mysqldump --no-tablespaces --user=$DB_USERNAME --host=$DB_HOST --password=$DB_PASSWORD --databases $DB_DATABASE > "${BCKPDIR}/mysql/${DNAME}"
|
||||
|
||||
gzip "$BCKPDIR/mysql/$DNAME"
|
||||
|
||||
# ファイルバックアップ
|
||||
echo "${BACKEND} ファイルバックアップ開始"
|
||||
FNAME="${TIME}.tar.gz"
|
||||
echo "ファイル名=${FNAME}"
|
||||
docker exec $FLCONTID tar zcf $FNAME -C / work/storage/app/private
|
||||
mv ${BACKEND}/${FNAME} ${BCKPDIR}/file
|
||||
|
||||
# 7日より古いファイルを削除
|
||||
echo "7日より古いファイルを削除"
|
||||
find ${BCKPDIR}/mysql -type f -name "${TIME}_mysql.sql.gz" -mtime +7 | xargs rm -f;
|
||||
find ${BCKPDIR}/file -type f -name "${TIME}.tar.gz" -mtime +7 | xargs rm -f;
|
バイナリファイルは表示されません。
変更前 幅: | 高さ: | サイズ: 142 KiB |
バイナリファイルは表示されません。
変更前 幅: | 高さ: | サイズ: 94 KiB |
バイナリファイルは表示されません。
変更前 幅: | 高さ: | サイズ: 96 KiB |
バイナリファイルは表示されません。
変更前 幅: | 高さ: | サイズ: 108 KiB |
|
@ -1,7 +0,0 @@
|
|||
【docker内】
|
||||
まずは下記のコマンドで新しいフォルダを創作して下さい。
|
||||
mkdir -p storage/backup/{file,mysql}
|
||||
|
||||
【docker外】
|
||||
「crontab -e」を実行すると、下記の行列を追加して下さい。
|
||||
0 0,12 * * * /var/www/html/kikikanri/backup.sh
|
|
@ -9,14 +9,8 @@ services:
|
|||
web:
|
||||
image: nginx:1.20-alpine
|
||||
ports:
|
||||
- mode: host
|
||||
protocol: tcp
|
||||
published: 80
|
||||
target: 80
|
||||
- mode: host
|
||||
protocol: tcp
|
||||
published: 443
|
||||
target: 443
|
||||
- 80:80
|
||||
- 443:443
|
||||
volumes:
|
||||
- ./backend:/work
|
||||
- /etc/letsencrypt/live/kikikan.xyz:/etc/letsencrypt/live/kikikan.xyz
|
||||
|
@ -40,4 +34,4 @@ services:
|
|||
- db-store:/var/lib/mysql
|
||||
|
||||
volumes:
|
||||
db-store:
|
||||
db-store:
|
|
@ -6,10 +6,7 @@ ENV MYSQL_DATABASE=laravel_local \
|
|||
MYSQL_ROOT_PASSWORD=secret \
|
||||
TZ=Asia/Tokyo
|
||||
|
||||
RUN export LC_ALL=ja_JP.UTF-8
|
||||
RUN export LANG=ja_JP.UTF-8
|
||||
|
||||
COPY ./my.cnf /etc/my.cnf
|
||||
RUN chmod 644 /etc/my.cnf
|
||||
# COPY ./my.cnf /etc/mysql/conf.d/my.cnf
|
||||
# RUN chmod 644 /etc/mysql/conf.d/my.cnf
|
||||
# RUN chmod 644 /etc/mysql/conf.d/my.cnf
|
|
@ -21,9 +21,7 @@ general_log = 1
|
|||
general_log_file = mysql-general.log
|
||||
|
||||
[mysql]
|
||||
#default-character-set = utf8mb4
|
||||
default-character-set = utf8mb3
|
||||
default-character-set = utf8mb4
|
||||
|
||||
[client]
|
||||
#default-character-set = utf8mb4
|
||||
default-character-set = utf8mb3
|
||||
default-character-set = utf8mb4
|
|
@ -43,12 +43,10 @@ server {
|
|||
try_files $uri =404;
|
||||
fastcgi_pass app:9000;
|
||||
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
|
||||
set_real_ip_from 127.0.0.1/32;
|
||||
real_ip_header X-Forwarded-For;
|
||||
include fastcgi_params;
|
||||
}
|
||||
|
||||
location ~ /\.(?!well-known).* {
|
||||
deny all;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -13,12 +13,8 @@ RUN apt-get install -y nodejs
|
|||
|
||||
# yarnをインストール
|
||||
RUN apt-get update
|
||||
RUN apt-get -y install git unzip libzip-dev libicu-dev libonig-dev zlib1g-dev cron mariadb-client locales
|
||||
RUN apt-get -y install git unzip libzip-dev libicu-dev libonig-dev zlib1g-dev cron
|
||||
RUN apt-get clean
|
||||
RUN echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen
|
||||
RUN echo "export LANG=ja_JP.UTF-8" >> ~/.bashrc
|
||||
RUN echo "export LANGUAGE=ja_JP.UTF-8" >> ~/.bashrc
|
||||
RUN locale-gen && update-locale LANG=ja_JP.UTF-8
|
||||
RUN curl --output libpng16-16_1.6.36-6_amd64.deb http://ftp.jp.debian.org/debian/pool/main/libp/libpng1.6/libpng16-16_1.6.36-6_amd64.deb
|
||||
RUN curl --output libpng-dev_1.6.36-6_amd64.deb http://ftp.jp.debian.org/debian/pool/main/libp/libpng1.6/libpng-dev_1.6.36-6_amd64.deb
|
||||
RUN curl --output libjpeg62-turbo_1.5.2-2+deb10u1_amd64.deb http://ftp.jp.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_1.5.2-2+deb10u1_amd64.deb
|
||||
|
|
バイナリ
kikikanisactive.png
バイナリ
kikikanisactive.png
バイナリファイルは表示されません。
変更前 幅: | 高さ: | サイズ: 19 KiB |
バイナリ
notrust.png
バイナリ
notrust.png
バイナリファイルは表示されません。
変更前 幅: | 高さ: | サイズ: 47 KiB |
バイナリ
propose.png
バイナリ
propose.png
バイナリファイルは表示されません。
変更前 幅: | 高さ: | サイズ: 144 KiB |
新しいイシューから参照