Compare commits

..

7 Commits

Author SHA1 Message Date
f674043430 Merge pull request 'main_watanabe' (#15) from main_watanabe into main
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 23s
Reviewed-on: #15
2025-09-12 14:13:18 +09:00
d16fcd1ce3 9/12 マージ
All checks were successful
Deploy preview (main_watanabe) / deploy (push) Successful in 12s
2025-09-12 14:10:57 +09:00
8329e9d9ee 9/12 マージ 2025-09-12 14:10:06 +09:00
53b6c8ea73 Merge pull request 'main_watanabe' (#14) from main_watanabe into main
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 21s
Deploy preview (main_watanabe) / deploy (push) Successful in 12s
Reviewed-on: #14
2025-09-12 11:13:17 +09:00
ebaca49f30 9/12 マージ
All checks were successful
Deploy preview (main_watanabe) / deploy (push) Successful in 13s
2025-09-12 11:12:07 +09:00
222a3d3664 9/12 マージ 2025-09-12 11:11:36 +09:00
fd0bdfff51 Merge pull request '定期契約履歴追加' (#13) from main_higashide into main
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 21s
Reviewed-on: #13
2025-09-10 17:52:39 +09:00
23 changed files with 304 additions and 1115 deletions

2
.env
View File

@ -2,7 +2,7 @@ APP_NAME=so-manager
APP_ENV=local
APP_KEY=base64:ejLwJbt2bEXY9emPUmsurG+X1hzkjTxQQvq2/FO14RY=
APP_DEBUG=true
APP_URL=https://so-manager-dev.com/
APP_URL=https://so-manager-dev.com/public/
APP_LOCALE=ja
APP_FALLBACK_LOCALE=ja
APP_FAKER_LOCALE=ja_JP

View File

@ -6,7 +6,7 @@ namespace App;
class CommonFunction
{
// 7DSRチェックデジット計算
public function calc7dsr($number) {
public static function calc7dsr($number) {
$sum = 0;
$weights = [2, 3, 4, 5, 6, 7];
$digits = str_split(strrev($number));
@ -18,7 +18,7 @@ class CommonFunction
}
// 初期パスワード作成
public function createPassword() {
public static function createPassword() {
// 使用可能文字 (使用不可1,l,L,i,I,z,Z,2,o,O,0)
$chars = 'ABCDEFGHJKMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz3456789';
$password = '';
@ -31,11 +31,16 @@ class CommonFunction
}
// パスワードハッシュ化
public function hashPassword($user_seq, $password) {
public static function hashPassword($user_seq, $password) {
$hash = hash('sha256', $password) . $user_seq . 'SOMSALT';
for ($i = 0; $i < 25; $i++) {
$hash = hash('sha256', $hash);
}
return $hash;
}
// パスワード照合
public static function verifyPassword($user_seq, $inputPassword, $hashedPassword) {
return self::hashPassword($user_seq, $inputPassword) === $hashedPassword;
}
}

View File

@ -50,10 +50,10 @@ class InquiryConfirmController extends Controller
// バリデーションチェック
$validator = Validator::make($request->all(), $rules, $message);
if ($validator->fails()) {
return redirect('general.swo7_1')
return redirect('swo7_1')
->withErrors($validator)
->withInput()
->with('before_subject', implode(',', $request->input('subject')));
->with('before_subject', implode(',', (array) $request->input('subject', [])));
}
// 画面返却値
@ -75,7 +75,7 @@ class InquiryConfirmController extends Controller
{
// 前の画面に戻る
if($request->input('back') == 'back'){
return redirect('general.swo7_1')
return redirect('swo7_1')
->withInput($request->all())
->with('before_subject', $request->input('subject'));
}

View File

@ -0,0 +1,29 @@
<?php
namespace App\Http\Controllers;
use App\CommonFunction;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Log;
class LoginController extends Controller
{
// ログイン処理
public function login(Request $request)
{
// ID・パスワードチェック
$existingMember = User::where('user_primemail', $request->input('login_id'))->first();
if (!$existingMember || !CommonFunction::verifyPassword($existingMember->user_seq, $request->input('password'), $existingMember->user_pass)) {
return redirect('swo8_1')
->withErrors(['login' => 'ID/パスワードが間違っています'])
->withInput();
}
// セッションにユーザ情報を保存してマイページトップへ遷移
session(['user_id' => $existingMember->user_id]);
return redirect()->route('mypage');
}
}

View File

@ -23,7 +23,7 @@ class MemberRegistrationController extends Controller
];
$validator = Validator::make($request->all(), $rules, $message);
if ($validator->fails()) {
return redirect('general.swo2_1')
return redirect('swo2_1')
->withErrors($validator)
->withInput();
}
@ -33,7 +33,7 @@ class MemberRegistrationController extends Controller
$existingMember = User::where('user_primemail', $email)->get();
foreach ($existingMember as $member) {
if ($member->user_quit_flag != 1) {
return redirect('general.swo2_1')
return redirect('swo2_1')
->withErrors(['email' => '指定のメールアドレスは既に使用されています。'])
->withInput();
}
@ -56,7 +56,7 @@ class MemberRegistrationController extends Controller
{
// 署名付きURLの有効期限チェック
if (!request()->hasValidSignature()) {
return redirect('general.error')->withErrors(['error' => '署名の有効期限が切れています']);
return redirect('error')->withErrors(['error' => '署名の有効期限が切れています']);
}
// 初回遷移(GETアクセス)時のリクエストパラメータチェック
@ -65,21 +65,21 @@ class MemberRegistrationController extends Controller
// パラメータ存在チェック
$encryptedEmail = request()->query('email');
if (!$encryptedEmail) {
return redirect('general.error')->withErrors(['error' => 'メールアドレスが指定されていません']);
return redirect('error')->withErrors(['error' => 'メールアドレスが指定されていません']);
}
// パラメータ整合性チェック
try {
$email = decrypt($encryptedEmail);
} catch (\Exception $e) {
return redirect('general.error')->withErrors(['error' => 'メールアドレスの情報が不正です']);
return redirect('error')->withErrors(['error' => 'メールアドレスの情報が不正です']);
}
// 二重登録防止チェック
$existingMember = User::where('user_primemail', $email)->get();
foreach ($existingMember as $member) {
if ($member->user_quit_flag != 1) {
return redirect('general.error')->withErrors(['error' => '既に登録済みです']);
return redirect('error')->withErrors(['error' => '既に登録済みです']);
}
}
@ -96,7 +96,7 @@ class MemberRegistrationController extends Controller
{
// 登録完了後のブラウザバックによる二重登録対策
if (!session()->has('email')) {
return redirect('general.error')->withErrors(['error' => '不正なアクセスです']);
return redirect('error')->withErrors(['error' => '不正なアクセスです']);
}
// 入力チェック内容 (メールアドレスはセッションから取得するため対象外)
@ -119,7 +119,7 @@ class MemberRegistrationController extends Controller
// バリデーションチェック
$validator = Validator::make($request->all(), $rules, $message);
if ($validator->fails()) {
return redirect('general.swo2_3')
return redirect('swo2_3')
->withErrors($validator)
->withInput();
}
@ -142,12 +142,12 @@ class MemberRegistrationController extends Controller
{
// 前の画面に戻る
if($request->input('back') == 'back'){
return redirect('general.swo2_3')->withInput();
return redirect('swo2_3')->withInput();
}
// 登録完了後のブラウザバックによる二重登録対策
if (!session()->has('email')) {
return redirect('general.error')->withErrors(['error' => '不正なアクセスです']);
return redirect('error')->withErrors(['error' => '不正なアクセスです']);
}
// 利用者連番、利用者ID(利用者連番+7DSRチェックデジット)、初期パスワード(ハッシュ化)を生成
@ -165,8 +165,8 @@ class MemberRegistrationController extends Controller
$user->tag_qr_flag = 1;
$user->user_name = $request->input('name');
$user->user_phonetic = $request->input('kana');
$user->user_homephone = $request->input('phone');
$user->user_mobile = $request->input('mobile');
$user->user_homephone = implode('-', $request->input('phone'));
$user->user_mobile = implode('-', $request->input('mobile'));
$user->user_primemail = session('email');
$user->user_quit_flag = 0;
$user->created_at = now();

View File

@ -0,0 +1,21 @@
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Mail;
class ParkingSearchController extends Controller
{
// 初期表示
public function index()
{
// 駐輪場情報検索
$park = \DB::table('park')->get();
// 検索結果返却
return view('general.swo5_1',['form_data' => $result ]);
}
}

View File

@ -30,7 +30,7 @@ class PasswordReminderController extends Controller
// バリデーションチェック
$validator = Validator::make($request->all(), $rules, $message);
if ($validator->fails()) {
return redirect('general.swo8_2')
return redirect('swo8_2')
->withErrors($validator)
->withInput();
}
@ -44,7 +44,7 @@ class PasswordReminderController extends Controller
$query->where('user_mobile', $phone)->orWhere('user_homephone', $phone);
})->first();
if (!$existingMember) {
return redirect('general.swo8_2')
return redirect('swo8_2')
->withErrors(['nodata' => '該当する会員情報が見つかりませんでした'])
->withInput();
}

View File

@ -1 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?> <dwsync> <file name="bootstrap.bundle.js" server="s33.coreserver.jp//public_html/wowo.work/so/" local="3619772220" remote="3619772220" Dst="-1" /> <file name="bootstrap.bundle.min.js" server="s33.coreserver.jp//public_html/wowo.work/so/" local="3619772220" remote="3619772220" Dst="-1" /> <file name="bootstrap.js" server="s33.coreserver.jp//public_html/wowo.work/so/" local="3619772220" remote="3619772220" Dst="-1" /> <file name="bootstrap.min.js" server="s33.coreserver.jp//public_html/wowo.work/so/" local="3619772220" remote="3619772220" Dst="-1" /> </dwsync>

View File

@ -1 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?> <dwsync> <file name=".DS_Store" server="lobo.xsrv.jp" local="3593592761" remote="3619561320" Dst="-1" /> <file name="ie10-viewport-bug-workaround.js" server="lobo.xsrv.jp" local="3591228208" remote="3619561320" Dst="-1" /> <file name="commons.js" server="lobo.xsrv.jp" local="3619562459" remote="3619562820" Dst="-1" /> <file name="ie-emulation-modes-warning.js" server="lobo.xsrv.jp" local="3591228208" remote="3619561320" Dst="-1" /> <file name="commons.js" server="s33.coreserver.jp//public_html/wowo.work/so/" local="3619772160" remote="3619772160" Dst="-1" /> <file name="ie-emulation-modes-warning.js" server="s33.coreserver.jp//public_html/wowo.work/so/" local="3619772160" remote="3619772160" Dst="-1" /> <file name="ie10-viewport-bug-workaround.js" server="s33.coreserver.jp//public_html/wowo.work/so/" local="3619772160" remote="3619772160" Dst="-1" /> </dwsync>

File diff suppressed because one or more lines are too long

View File

@ -10,23 +10,21 @@
</div>
<div class="card-body mt30">
<form class="row form" action="{{ route('swo4_1') }}">
<div class="col-12 col-lg-3 text-lg-center offset-0 offset-lg-1">
<label for="login_ID">ログインID</label>
</div>
<div class="col-12 col-lg-3 text-lg-center offset-0 offset-lg-1"><label>ログインID</label></div>
<div class="col-12 col-lg-7 mb10">
<input type="text" name="login_ID" id="login_ID" class="form-control form-control-lg" value="ログインID" />
</div>
<div class="col-12 col-lg-3 text-lg-center offset-0 offset-lg-1">
<label for="login_ID">パスワード</label>
<input type="text" name="login_id" class="form-control form-control-lg" value="{{ old('login_id') }}" />
</div>
<div class="col-12 col-lg-3 text-lg-center offset-0 offset-lg-1"><label>パスワード</label></div>
<div class="col-12 col-lg-7 mb10">
<input type="text" name="login_ID" id="login_ID" class="form-control form-control-lg" value="パスワード" />
<input type="text" name="password" class="form-control form-control-lg" value="" />
</div>
<div class="col-12 col-lg-6 text-lg-center offset-0 offset-lg-3 mt30 mb50">
<div class="text-danger">@if ($errors->any()) @foreach ($errors->all() as $error) {{ $error }} @endforeach @endif</div><br />
<input type="submit" name="submit" class="btn btn-block btn-lg btn-success" value="ログイン" /><br>
<a href="{{route('swo2_1')}}" class="text-secondary mt20">新規会員登録はこちら </a><br>
<a href="{{route('swo8_2')}}" class="text-secondary mt20">パスワードを忘れた方はこちら </a>
</div>
@csrf
</form>
</div>
</div>

View File

@ -6,12 +6,12 @@
<link href="https://cdnjs.cloudflare.com/ajax/libs/typicons/2.0.9/typicons.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/earlyaccess/roundedmplus1c.css" rel="stylesheet" />
<link rel="icon" href="{{ asset('assets/img/favicon.ico') }}">
<link href="{{ asset('../bootstrap/css/bootstrap.min.css') }}" rel="stylesheet">
<link href="{{ asset('assets//css/bootstrap.min.css') }}" rel="stylesheet">
<link href="{{ asset('assets/css/style.css') }}" rel="stylesheet">
<link href="{{ asset('assets/css/app.css') }}" rel="stylesheet">
<script src="{{ asset('assets/js/jquery.min.js') }}"></script>
<script src="{{ asset('assets/js/ie-emulation-modes-warning.js') }}"></script>
<script src="{{ asset('../bootstrap/js/bootstrap.min.js') }}"></script>
<script src="{{ asset('assets/js/bootstrap.min.js') }}"></script>
</head>
<body>
<div id="font-scale" class="home">

View File

@ -9,6 +9,7 @@ use Illuminate\Support\Facades\Auth;
use App\Models\User;
use App\Http\Controllers\Controller;
use App\Http\Controllers\InquiryConfirmController;
use App\Http\Controllers\LoginController;
use App\Http\Controllers\MemberRegistrationController;
use App\Http\Controllers\PasswordReminderController;
use App\Http\Controllers\UserInfoController;
@ -17,6 +18,7 @@ use App\Http\Controllers\UserEditConfirmController;
use App\Http\Controllers\UserWithdrawController;
use App\Http\Controllers\RegularContractController;
use App\Http\Controllers\RegularContractCreateController;
use App\Http\Controllers\ParkingSearchController;
use App\Http\Controllers\ParkWaitlistController;
use App\Http\Controllers\ReceiptController;
@ -26,8 +28,6 @@ Route::get('/swo2_1', function () { return view('general.swo2_1'); })->name('swo
Route::get('/swo3_1', function () { return view('general.swo3_1'); })->name('swo3_1');
Route::get('/swo3_2', function () { return view('general.swo3_2'); })->name('swo3_2');
Route::get('/swo3_3', function () { return view('general.swo3_3'); })->name('swo3_3');
Route::get('/swo4_1', function () { return view('general.swo4_1'); })->name('swo4_1');
Route::get('/swo5_1', function () { return view('general.swo5_1'); })->name('swo5_1');
Route::get('/swo6_1', function () { return view('general.swo6_1'); })->name('swo6_1');
Route::get('/swo8_1', function () { return view('general.swo8_1'); })->name('swo8_1');
Route::get('/swo8_2', function () { return view('general.swo8_2'); })->name('swo8_2');
@ -47,20 +47,27 @@ Route::get('/swo16_1', function () { return view('general.swo16_1'); })->name('s
Route::get('/swo17_1', function () { return view('general.swo17_1'); })->name('swo17_1');
Route::get('/error', function () { return view('general.error'); })->name('error');
// コントローラー経由
// コントローラー経由
Route::post('/swo2_2', [MemberRegistrationController::class, 'sendMail'])->name('swo2_2');
Route::get('/swo2_3', [MemberRegistrationController::class, 'index'])->name('swo2_3')->middleware('signed');
Route::post('/swo2_4', [MemberRegistrationController::class, 'confirm'])->name('swo2_4');
Route::post('/swo2_5', [MemberRegistrationController::class, 'complete'])->name('swo2_5');
Route::get('/swo4_1', [LoginController::class, 'login'])->name('swo4_1');
Route::get('/swo5_1', [ParkingSearchController::class, 'index'])->name('swo5_1');
Route::get('/swo7_1', [InquiryConfirmController::class, 'index'])->name('swo7_1');
Route::post('/swo7_2',[InquiryConfirmController::class, 'confirm'])->name('swo7_2');
Route::post('/swo7_3',[InquiryConfirmController::class, 'complete'])->name('swo7_3');
Route::post('/swo8_3', [PasswordReminderController::class, 'sendMail'])->name('swo8_3');
//マイページ(仮)
// ログイン画面へのリダイレクト
Route::get('/login', function () {
return redirect()->route('swo8_1');
})->name('login');
// マイページ画面へのリダイレクト
Route::get('/mypage', function () {
return 'マイページ(仮)';
})->name('mypage');
})->name('mypage');
// ユーザー情報確認画面
Route::get('/user/info', [UserInfoController::class, 'show'])
@ -137,17 +144,6 @@ Route::get('regular_contract/history', [RegularContractController::class, 'showH
Route::get('park_waitlist', [ParkWaitlistController::class, 'index'])
->name('park_waitlist.index');
// ログイン画面(仮)
Route::get('/login', function () {
return '
<form method="POST" action="/login">
<input type="hidden" name="_token" value="' . csrf_token() . '">
<input type="text" name="user_id" placeholder="ユーザーID">
<button type="submit">ログイン</button>
</form>
';
})->name('login');
Route::post('/login', function (Request $request) {
$user_id = $request->input('user_id');
Session::put('user_id', $user_id); // 入力されたIDをそのまま保存