Compare commits

16 Commits

Author SHA1 Message Date
6977325bb1 改用yarn:調整package.json檔案中scripts區段內包含npm run的字串改為yarn 2018-08-20 02:04:57 +08:00
1a565fd788 首頁建置與部份顯示模組拆開 2018-08-15 06:59:52 +08:00
67969b005f 從yarn改回npm,並將前端部署用的檔案從git分離
Laravel預設仍是使用npm,若不使用npm的情況下,會造成在跑 `yarn run dev`
的時候,中間有環節會呼叫npm時會出錯。
另外在使用 `npm run dev`
時發現會覆蓋掉有被git算上的前端部屬用的檔案,故修改.gitignore將這些檔案脫離。
2018-08-15 05:46:19 +08:00
62ce1f2068 Merge branch 'feature/auth' into develop 2018-08-15 04:52:50 +08:00
f682741758 edit password_resets tables 2018-08-15 04:51:56 +08:00
9fd6e08400 修改config/auth.php: 忘記密碼的資料表 2018-08-15 00:36:28 +08:00
a130550274 Merge branch 'develop' 2018-08-15 00:27:48 +08:00
7d48d74cb1 fix migration file error: Schema::table->Schema::create 2018-08-11 16:30:43 +08:00
e8b92eb473 重新命名表格名稱:password_resets->password_resets_for_receiver; 新增兩個資料庫遷移檔password_resets_for_admin和password_resets_for_casebuilder 2018-08-11 14:03:00 +08:00
21f7367b7e fix config/auth.php (忘記密碼功能尚未處理) 2018-08-07 23:14:32 +08:00
36fecb5d9e Merge branch 'develop' into feature/auth 2018-08-07 23:11:35 +08:00
a52429930e Router: 將登入模組移出來
留下可在路由群組加上中介層的彈性,若不移出來的話,會在登入時卡在中介層不通過導致無法進入登入畫面。
2018-08-07 23:08:16 +08:00
9216e2f157 (尚未改完) 修改config/auth.php 2018-08-07 19:19:43 +08:00
ddde0e25d1 add migration file for password_resets table 2018-08-07 19:03:57 +08:00
4b9b4f1880 訂定三種角色的登入架構 2018-08-07 18:27:50 +08:00
4bbed319f2 Route方面: 將原本Auth::routes();的簡寫手動拆出來
因為我們的專案在登入架構上有多出角色+ID綁雙主鍵的架構,在Route方面也需要連同一起改造
2018-08-06 23:58:28 +08:00
27 changed files with 690 additions and 59667 deletions

3
.gitignore vendored
View File

@@ -1,6 +1,9 @@
/node_modules
/public/hot
/public/storage
/public/js
/public/css
/public/fonts
/storage/*.key
/vendor
/.idea

View File

@@ -18,7 +18,9 @@ class LoginController extends Controller
|
*/
use AuthenticatesUsers;
use AuthenticatesUsers{
showLoginForm as traitShowLoginForm;
}
/**
* Where to redirect users after login.
@@ -36,4 +38,47 @@ class LoginController extends Controller
{
$this->middleware('guest')->except('logout');
}
/**
* Show the application's login form.
*
* @return \Illuminate\Http\Response
*/
public function showLoginForm()
{
// return view('auth.login');
// return $this->traitShowLoginForm();
return view('auth.login');
}
/**
* 顯示接案者的登入表單
*
* @return \Illuminate\Http\Response
*/
public function showReceiverLoginForm()
{
return $this->showLoginForm();
}
/**
* 顯示發案者的登入表單
*
* @return \Illuminate\Http\Response
*/
public function showCaseBuilderLoginForm()
{
return $this->showLoginForm();
}
/**
* 顯示網站管理者的登入表單
*
* @return \Illuminate\Http\Response
*/
public function showAdminLoginForm()
{
return $this->showLoginForm();
}
}

View File

@@ -14,8 +14,8 @@ return [
*/
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
'guard' => 'receivers-web',
'passwords' => 'receivers',
],
/*
@@ -36,15 +36,42 @@ return [
*/
'guards' => [
'web' => [
// 'web' => [
// 'driver' => 'session',
// 'provider' => 'users',
// ],
// 'api' => [
// 'driver' => 'token',
// 'provider' => 'users',
// ],
'receivers-web' => [
'driver' => 'session',
'provider' => 'users',
'provider' => 'receivers',
],
'receivers-api' => [
'driver' => 'token',
'provider' => 'receivers',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
'caseBuilders-web' => [
'driver' => 'session',
'provider' => 'caseBuilders',
],
'caseBuilders-api' => [
'driver' => 'token',
'provider' => 'caseBuilders',
],
'admins-web' => [
'driver' => 'session',
'provider' => 'admins',
],
// 'admins-api' => [
// 'driver' => 'token',
// 'provider' => 'admins',
// ],
],
/*
@@ -65,9 +92,21 @@ return [
*/
'providers' => [
'users' => [
// 'users' => [
// 'driver' => 'eloquent',
// 'model' => App\User::class,
// ],
'receivers' => [
'driver' => 'eloquent',
'model' => App\User::class,
'model' => App\Receiver::class,
],
'caseBuilders' => [
'driver' => 'eloquent',
'model' => App\CaseBuilder::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
],
// 'users' => [
@@ -92,11 +131,21 @@ return [
*/
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
// 'users' => [
// 'provider' => 'users',
// 'table' => 'password_resets',
// 'expire' => 60,
// ],
'receivers' => [
'provider' => 'receivers',
'table' => 'password_resets_for_receiver',
'expire' => 60,
],
'caseBuilders' => [
'provider' => 'caseBuilders',
'table' => 'password_resets_for_casebuilder',
'expire' => 60,
]
],
];

View File

@@ -0,0 +1,32 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreatePasswordResetsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('password_resets', function (Blueprint $table) {
$table->string('email')->index();
$table->string('token');
$table->timestamp('created_at')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('password_resets');
}
}

View File

@@ -0,0 +1,32 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class RenameResetPasswordTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('password_resets', function (Blueprint $table) {
$table->rename('password_resets_for_receiver');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('password_resets_for_receiver', function (Blueprint $table) {
$table->rename('password_resets');
});
}
}

View File

@@ -0,0 +1,32 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreatePasswordResetsForCasebuilderTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('password_resets_for_casebuilder', function (Blueprint $table) {
$table->string('email')->index();
$table->string('token');
$table->timestamp('created_at')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('password_resets_for_casebuilder');
}
}

View File

@@ -0,0 +1,32 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreatePasswordResetsForAdminTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('password_resets_for_admin', function (Blueprint $table) {
$table->string('email')->index();
$table->string('token');
$table->timestamp('created_at')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('password_resets_for_admin');
}
}

View File

@@ -0,0 +1,38 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class ModifiyPasswordResetsForReceiverColumn extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('Receiver', function (Blueprint $table) {
$table->unique('email');
});
Schema::table('password_resets_for_receiver', function (Blueprint $table) {
$table->foreign('email', 'fk_password_resets_for_receiver_1')->references('email')->on('Receiver')->onUpdate('NO ACTION')->onDelete('CASCADE');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('password_resets_for_receiver', function (Blueprint $table) {
$table->dropForeign('fk_password_resets_for_receiver_1');
});
Schema::table('Receiver', function (Blueprint $table) {
$table->dropUnique('email');
});
}
}

View File

@@ -0,0 +1,38 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class ModifiyPasswordResetsForCasebuilderColumn extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('CaseBuilder', function (Blueprint $table) {
$table->unique('contactEmail');
});
Schema::table('password_resets_for_casebuilder', function (Blueprint $table) {
$table->foreign('email', 'fk_password_resets_for_casebuilder_1')->references('contactEmail')->on('CaseBuilder')->onUpdate('NO ACTION')->onDelete('CASCADE');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('password_resets_for_casebuilder', function (Blueprint $table) {
$table->dropForeign('fk_password_resets_for_casebuilder_1');
});
Schema::table('CaseBuilder', function (Blueprint $table) {
$table->dropUnique('contactEmail');
});
}
}

View File

@@ -0,0 +1,32 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class DropPasswordResetsForAdminTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::dropIfExists('password_resets_for_admin');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::create('password_resets_for_admin', function (Blueprint $table) {
$table->string('email')->index();
$table->string('token');
$table->timestamp('created_at')->nullable();
});
}
}

View File

@@ -1,22 +1,24 @@
{
"private": true,
"scripts": {
"dev": "npm run development",
"dev": "yarn development",
"development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"watch": "npm run development -- --watch",
"watch-poll": "npm run watch -- --watch-poll",
"watch": "yarn development -- --watch",
"watch-poll": "yarn watch -- --watch-poll",
"hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
"prod": "npm run production",
"prod": "yarn production",
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
},
"devDependencies": {
"axios": "^0.18",
"bootstrap": "^4.0.0",
"cross-env": "^5.1",
"font-awesome": "^4.7.0",
"jquery": "^3.2",
"laravel-mix": "^2.0",
"lodash": "^4.17.4",
"popper.js": "^1.12",
"vue": "^2.5.7"
}
},
"dependencies": {}
}

10479
public/css/app.css vendored

File diff suppressed because it is too large Load Diff

47404
public/js/app.js vendored

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
{
"/js/app.js": "/js/app.js",
"/css/app.css": "/css/app.css"
}
}

View File

@@ -5,9 +5,7 @@
sudo apt install php mysql-server phpmyadmin php-mbstring php-xml php-zip curl wget libpng-dev
curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
sudo cat /etc/mysql/debian.cnf #查詢系統內定的MySQL預設帳號密碼
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update && apt install nodejs yarn
sudo apt update && apt install nodejs npm
## 專案參數與環境重建
當你Clone下來的專案因為有git採用了 `.gitignore` 機制比較敏感的參數像是APP_KEY、資料庫帳密等與共用的函式庫檔案不會包含進來必須在自己這邊重建。
@@ -22,7 +20,7 @@
$ composer install
### 3. 安裝前端相關函式庫
$ yarn install
$ npm install
### 4. 設定 .env 檔
`.env.example` 複製成 `.env`
@@ -35,9 +33,13 @@
這個專案有包含資料庫遷移(Migration),所以只要下:
$ php artisan migrate
就可以了,資料表都會自動產生
### 7. 重建前端部屬用檔案
$ npm run dev
## 執行此專案
### 快速啟動
$ php artisan serve

View File

@@ -7,6 +7,8 @@
// Bootstrap
@import '~bootstrap/scss/bootstrap';
@import '~font-awesome/scss/font-awesome';
$fa-font-path: "/fonts" !default;
.navbar-laravel {
background-color: #fff;

View File

@@ -1,7 +1,7 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="container py-4">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">

View File

@@ -1,7 +1,7 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="container py-4">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">

View File

@@ -1,7 +1,7 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="container py-4">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">

View File

@@ -1,7 +1,7 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="container py-4">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">

View File

@@ -3,6 +3,60 @@
@section('title', config('app.name', 'Laravel'))
@section('content')
<button class="btn btn-primary">我想成為KOL</button>
<button class="btn btn-primary">我想成為品牌/代理商</button>
<main role="main">
<section class="jumbotron text-center">
<div class="container">
<h1 class="jumbotron-heading">不只幫您找好KOL</h1>
<p class="lead text-muted">讓您輕鬆管理預算、掌握專案流程</p>
<h1 class="jumbotron-heading">不只幫您找好廠商</h1>
<p class="lead text-muted">讓您與廠商溝通無障礙、完美結案</p>
<form>
<div class="form-group">
<input class="form-control" type="search" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success" type="submit">Search</button>
</div>
</form>
<!-- <p>
<a href="#" class="btn btn-primary my-2">Main call to action</a>
<a href="#" class="btn btn-secondary my-2">Secondary action</a>
</p> -->
</div>
</section>
<section>
<div class="container">
<div class="row">
<div class="col-sm-3">
<h2>我是廠商</h2>
<ul>
<li>KOL搜尋</li>
<li>我的最愛KOL</li>
<li>發案管理</li>
<li>合作廠商</li>
<li>結案管理</li>
</ul>
<button class="btn btn-primary">我想成為KOL</button>
</div>
<div class="col-sm-3">
<h2>我是KOL</h2>
<ul>
<li>案件通知</li>
<li>合作廠商</li>
<li>執行管理</li>
<li>發布管理</li>
<li>結案管理</li>
</ul>
<button class="btn btn-primary">我想成為品牌/代理商</button>
</div>
<div class="col-sm">
<h2>公告區</h2>
<ul>
<li></li>
</ul>
</div>
</div>
</div>
</section>
</main>
@endsection

View File

@@ -45,9 +45,13 @@
</div>
</nav>
<main class="py-4">
<main>
@yield('content')
</main>
<footer>
@include('layouts.partials.footer')
</footer>
</div>
</body>
</html>

View File

@@ -1,12 +1,15 @@
<!-- Authentication Links -->
@guest
<li class="nav-item">
<a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a>
<a class="nav-link" href="{{ route('login') }}">登入</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a>
<a class="nav-link" href="{{ route('register') }}">註冊</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ route('register') }}">捷徑</a>
</li>
<!-- <li class="nav-item">
<a class="nav-link" href="/receiver/login">KOL登入<span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
@@ -14,7 +17,7 @@
</li>
<li class="nav-item">
<a class="nav-link" href="#">後台登入</a>
</li>
</li> -->
@else
<li class="nav-item dropdown">
<a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>

View File

@@ -0,0 +1,30 @@
<hr>
<div class="container">
<div class="row">
<div class="col-sm-2">
<h2>關於我們</h2>
<ul>
<li>關於</li>
<li>行銷知識</li>
<li>合作提案</li>
<li>聯絡我們</li>
</ul>
</div>
<div class="col-sm-2">
<h2>服務條款</h2>
<ul>
<li>隱私政策</li>
<li>網站條款</li>
<li>常見問題</li>
</ul>
</div>
<div class="col-sm-2">
<h2>服務聯盟</h2>
<ul>
<li>開箱王</li>
<li>BVG</li>
<li>凱曜網路</li>
</ul>
</div>
</div>
</div>

View File

@@ -19,7 +19,24 @@
Route::get('/', 'Home\HomeController@index')->name('home');
// 登入相關的
Auth::routes();
// Authentication Routes...
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::get('/receiver/login', 'Auth\LoginController@showReceiverLoginForm')->name('receiver.login');
Route::get('/casebuilder/login', 'Auth\LoginController@showCaseBuilderLoginForm')->name('casebuilder.login');
Route::get('/admin/login', 'Auth\LoginController@showAdminLoginForm')->name('admin.login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');
// Registration Routes...
Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
Route::post('register', 'Auth\RegisterController@register');
// Password Reset Routes...
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');
// 接案者相關url
Route::group(['prefix' => 'receiver'], function () {
@@ -41,8 +58,6 @@ Route::group(['prefix' => 'casebuilder'], function () {
});
// 管理者相關url
// Route::group(['prefix' => 'admin'], function () {
// Route::get('/login', '');
// Route::post('/login', '');
// Route::get('/dashbord', '');
// });
Route::group(['prefix' => 'admin'], function () {
// Route::get('/dashbord', '');
});

4
webpack.mix.js vendored
View File

@@ -12,4 +12,6 @@ let mix = require('laravel-mix');
*/
mix.js('resources/assets/js/app.js', 'public/js')
.sass('resources/assets/sass/app.scss', 'public/css');
.sass('resources/assets/sass/app.scss', 'public/css')
.copy('node_modules/font-awesome/fonts', 'public/fonts')
.sourceMaps();

1945
yarn.lock

File diff suppressed because it is too large Load Diff