diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index 1ef9c76..9d1f161 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -11,6 +11,8 @@ use App\User; use App\Announcement; use App\Http\Controllers\Controller; use App\Ticket; + +use App\Transaction; use Mews\Purifier\Purifier; class AdminController extends Controller @@ -28,7 +30,9 @@ class AdminController extends Controller $data['users'] = User::orderby('id', 'asc')->get(); $data['cats'] = GoodCat::orderby('cat_name', 'asc')->get(); $data['announcements'] = Announcement::orderby('id', 'dsc')->get(); - $data['reports'] = Ticket::where('type', '2')->orderby('id', 'dsc')->paginate(16); + $data['reports'] = Ticket::where('type', '2')->orderby('id', 'dsc')->paginate(40); + $data['users'] = User::orderby('id', 'asc')->paginate(40); + $data['trans'] = Transaction::orderby('id', 'asc')->paginate(40); return View::make('admin.index')->with($data); } diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index 40718ab..18a9323 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -19,6 +19,7 @@ use App\PasswordReset; use Mail; use App\AuthLog; use phpCAS; +use App\Wechat; class AuthController extends Controller { @@ -27,6 +28,68 @@ class AuthController extends Controller return View::make('auth.login'); } + public function wx(Request $request) + { + if(isset($request->data) && $request->sign == substr(md5($request->data . env('WECHAT_KEY')), 8, 16)) + { + $data['wechat'] = json_decode(base64_decode($request->data)); + $user = User::where('wechat_open_id', $data['wechat']->openId)->first(); + $request->session()->put('wechat_open_id', $data['wechat']->openId); + if(!$user) { + $wechat = Wechat::firstOrNew(['open_id' => $data['wechat']->openId]); + $wechat->head_img_url = $data['wechat']->headImgUrl; + $wechat->nick_name = $data['wechat']->nickName; + $wechat->sex = $data['wechat']->sex; + $wechat->save(); + + return view('auth.wechatGuide')->with($data); + } + else { + if ($user->baned) { + $nowdate = time(); + $banedstart = $user->banedstart; + $date = $nowdate-$banedstart; + if($date>($user->banedtime)*86400 && $user->banedtime!=-1) + { + $user->baned = 0; + return Redirect::to('/'); + } + // log start + $log = new AuthLog(); + $log->user_id = $user->id; + $log->ip = $request->ip(); + $log->event = "wechat_oauth_login_banned"; + $log->save(); + // log end + + if($user->banedtime == -1) + return Redirect::to('/login')->withInput()->withErrors('你已经被永久封禁!'); + return Redirect::to('/login')->withInput()->withErrors('你已经被封禁!'.ceil($user->banedtime-($date/86400)).'天后解禁!'); + } + + // log start + $log = new AuthLog(); + $log->user_id = $user->id; + $log->ip = $request->ip(); + $log->event = "wechat_oauth_login_success"; + $log->save(); + // log end + + $request->session()->put('user_id', $user->id); + $request->session()->put('username', $user->username); + $request->session()->put('nickname', $user->nickname); + if ($user->privilege) + $request->session()->put('is_admin', $user->privilege); + + if ($user->registerCompletion() != 0) + return Redirect::to('/register/' . $user->registerCompletion()); + else + return Redirect::to('/'); + } + } + return Redirect::to("http://api.xms.rmbz.net/open/oauth?path=" . env("APP_URL") . "/wx"); + } + public function cas(Request $request) { phpCAS::client(CAS_VERSION_2_0, "sso.neu.cn", 443, "/cas"); @@ -53,6 +116,18 @@ class AuthController extends Controller $log->save(); // log end + if($request->session()->has('wechat_open_id')) { + $user->wechat_open_id = $request->session()->get('wechat_open_id'); + $user->save(); + // log start + $log = new AuthLog(); + $log->user_id = $user->id; + $log->ip = $request->ip(); + $log->event = "wechat_oauth_sso_bind_success"; + $log->save(); + // log end + } + $request->session()->put('user_id', $user->id); return Redirect::to('/register/' . $user->registerCompletion()); @@ -75,10 +150,10 @@ class AuthController extends Controller $log->event = "cas_login_banned"; $log->save(); // log end - + if($user->banedtime == -1) - return Redirect::back()->withInput()->withErrors('你已经被永久封禁!'); - return Redirect::back()->withInput()->withErrors('你已经被封禁!'.ceil($user->banedtime-($date/86400)).'天后解禁!'); + return Redirect::to('/login')->withInput()->withErrors('你已经被永久封禁!'); + return Redirect::to('/login')->withInput()->withErrors('你已经被封禁!'.ceil($user->banedtime-($date/86400)).'天后解禁!'); } // log start @@ -95,6 +170,18 @@ class AuthController extends Controller if ($user->privilege) $request->session()->put('is_admin', $user->privilege); + if($request->session()->has('wechat_open_id')) { + $user->wechat_open_id = $request->session()->get('wechat_open_id'); + $user->save(); + // log start + $log = new AuthLog(); + $log->user_id = $user->id; + $log->ip = $request->ip(); + $log->event = "wechat_oauth_sso_bind_success"; + $log->save(); + // log end + } + if ($user->registerCompletion() != 0) return Redirect::to('/register/' . $user->registerCompletion()); else @@ -144,7 +231,7 @@ class AuthController extends Controller $log->event = "login_banned"; $log->save(); // log end - + if($user->banedtime == -1) return Redirect::back()->withInput()->withErrors('你已经被永久封禁!'); return Redirect::back()->withInput()->withErrors('你已经被封禁!'.ceil($user->banedtime-($date/86400)).'天后解禁!'); @@ -166,6 +253,18 @@ class AuthController extends Controller if ($user->privilege) $request->session()->put('is_admin', $user->privilege); + if($request->session()->has('wechat_open_id')) { + $user->wechat_open_id = $request->session()->get('wechat_open_id'); + $user->save(); + // log start + $log = new AuthLog(); + $log->user_id = $user->id; + $log->ip = $request->ip(); + $log->event = "wechat_oauth_bind_success"; + $log->save(); + // log end + } + if ($user->registerCompletion() != 0) return Redirect::to('/register/' . $user->registerCompletion()); else @@ -229,6 +328,7 @@ class AuthController extends Controller $request->session()->forget('username'); $request->session()->forget('nickname'); $request->session()->forget('is_admin'); + $request->session()->forget('wechat_open_id'); return Redirect::to('/'); } @@ -286,7 +386,7 @@ class AuthController extends Controller if ($user == NULL) abort(404); if (!$user->havecheckedemail) { - $user->email = ''; + $user->email = null; $user->save(); return true; } @@ -419,7 +519,7 @@ class AuthController extends Controller $user = User::find($check_email->user_id); if($user->email != $token[2]) return Redirect::to('/login')->withErrors('此链接已失效。'); - $user->email = ""; + $user->email = null; $user->update(); $check_email->delete(); diff --git a/app/Http/Controllers/ContentController.php b/app/Http/Controllers/ContentController.php index 086d2ce..c7b23b8 100644 --- a/app/Http/Controllers/ContentController.php +++ b/app/Http/Controllers/ContentController.php @@ -10,6 +10,7 @@ use App\Http\Controllers\Controller; use App\GoodInfo; use App\GoodCat; use App\Announcement; +use App\Transaction; class ContentController extends Controller { @@ -22,9 +23,10 @@ class ContentController extends Controller $data['populargoods'] = GoodInfo::where('baned', false)->where('count', '>', 0)->where('fav_num', '>', 0)->orderby('fav_num', 'desc')->limit(8)->get(); $data['cats'] = GoodCat::orderby('cat_index', 'asc')->get(); foreach($data['cats'] as $cat){ - $data['catgoods'][$cat->cat_name] = GoodInfo::where('cat_id', $cat->id)->where('baned', false)->inRandomOrder()->limit(4)->get(); + $data['catgoods'][$cat->cat_name] = GoodInfo::where('cat_id', $cat->id)->where('baned', false)->where('count', '>', 0)->inRandomOrder()->limit(4)->get(); } $data['announces'] = Announcement::orderby('id', 'dsc')->limit(5)->get(); + $data['trans'] = Transaction::where('status', '>', 3)->orderby('id', 'dsc')->limit(20)->get(); return View::make('welcome')->with($data); } diff --git a/app/Http/Controllers/MessageController.php b/app/Http/Controllers/MessageController.php index d5f51b0..0b71740 100644 --- a/app/Http/Controllers/MessageController.php +++ b/app/Http/Controllers/MessageController.php @@ -22,7 +22,7 @@ use App\Http\Controllers\Controller; class MessageController extends Controller { public function showMessageView(Request $request) - { + { return View::make('message.message'); } @@ -55,6 +55,8 @@ class MessageController extends Controller MessageContact::where('user_id', $user_id) ->where('contact_id', $contact_id) ->update(['unread_count' => 0]); + User::where('id', $user_id) + ->update(['last_get_new_message_time' => time()]); return json_encode($messages); } @@ -165,4 +167,4 @@ class MessageController extends Controller return json_encode(['result' => true, 'msg' => 'success']); } -} \ No newline at end of file +} diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index e4f66ef..484d680 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -172,7 +172,7 @@ class UserController extends Controller { $data = []; $user_id = $request->session()->get('user_id'); - $data['user'] = User::find($user_id); + $data['user'] = User::with('wechat')->find($user_id); $data['userinfos'] = UserInfo::where('user_id', $user_id)->get(); $data['tab'] = isset($request->tab) ? $request->tab : "profile"; return View::make('user.user')->with($data); diff --git a/app/Http/Requests/AddGoodRequest.php b/app/Http/Requests/AddGoodRequest.php index 8187d34..49ac772 100644 --- a/app/Http/Requests/AddGoodRequest.php +++ b/app/Http/Requests/AddGoodRequest.php @@ -51,7 +51,7 @@ class addGoodRequest extends Request 'count.max' => '库存数不能超过2147483647!', //'good_tag.required' => '商品标签不能为空!', //'other_tag.max' => '自定义标签不能多于2048个字符!', - 'goodTitlePic.required' => '必须为商品上传一张图片!', + 'goodTitlePic.required' => '必须为商品上传封面!', 'crop_width.required' => '请按要求裁剪图片', 'crop_height.required' => '请按要求裁剪图片', 'crop_x.required' => '请按要求裁剪图片', diff --git a/app/Http/routes.php b/app/Http/routes.php index 034cddc..ec3682c 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -30,6 +30,7 @@ Route::group(['middleware' => ['web']],function () { Route::group(['middleware' => ['authredirect']], function() { Route::get('/login', "AuthController@showLogin"); Route::get('/sso', "AuthController@cas"); + Route::get('/wx', "AuthController@wx"); Route::post('/login', "AuthController@login"); Route::get('/register', "AuthController@showRegister"); Route::post('/register', "AuthController@register"); diff --git a/app/Transaction.php b/app/Transaction.php index 8f0ec3f..d253b9b 100644 --- a/app/Transaction.php +++ b/app/Transaction.php @@ -20,7 +20,8 @@ class Transaction extends Model public function getSellerIdAttribute() { - return $this->good->user_id; + if($this->good != NULL) + return $this->good->user_id; } public function seller() @@ -32,4 +33,5 @@ class Transaction extends Model { return $this->hasOne('App\Ticket', 'trans_id'); } + } diff --git a/app/User.php b/app/User.php index 870749b..95967a4 100644 --- a/app/User.php +++ b/app/User.php @@ -9,6 +9,8 @@ class User extends Model { protected $table = 'users'; + protected $fillable = ['last_get_new_message_time', 'last_send_email_time']; + public function user_infos() { return $this->hasMany('App\UserInfo'); @@ -34,4 +36,19 @@ class User extends Model return $this->nickname != "" ? $this->nickname : "一位先锋市场用户"; } + public function wechat() + { + return $this->belongsTo('App\Wechat', "wechat_open_id", "open_id"); + } + + public function getcoding() + { + $len=strlen($this->stuid); + $ans = ""; + $ans = $ans . substr($this->stuid, 0, 1); + for($i=1; $i<($len-1); $i++) $ans = $ans . '*'; + $ans = $ans . substr($this->stuid, -1); + return $ans; + } + } diff --git a/app/Wechat.php b/app/Wechat.php new file mode 100644 index 0000000..631007f --- /dev/null +++ b/app/Wechat.php @@ -0,0 +1,10 @@ +string('open_id'); + $table->primary('open_id'); + $table->string('head_img_url'); + $table->string('nick_name'); + $table->string('sex'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('wechats'); + } +} diff --git a/database/migrations/2017_06_17_184808_alter_user_add_wechat_id.php b/database/migrations/2017_06_17_184808_alter_user_add_wechat_id.php new file mode 100644 index 0000000..026f460 --- /dev/null +++ b/database/migrations/2017_06_17_184808_alter_user_add_wechat_id.php @@ -0,0 +1,38 @@ +string('wechat_open_id')->nullable()->unique(); + }); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + if (Schema::hasTable('users') && Schema::hasColumn('users', 'wechat_open_id')) + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('wechat_open_id'); + }); + } + } +} diff --git a/database/migrations/2017_06_17_184809_alter_users_table_add_locker.php b/database/migrations/2017_06_17_184809_alter_users_table_add_locker.php new file mode 100644 index 0000000..25b7762 --- /dev/null +++ b/database/migrations/2017_06_17_184809_alter_users_table_add_locker.php @@ -0,0 +1,39 @@ +integer('last_get_new_message_time')->nullable()->default(0); + $table->integer('last_send_email_time')->nullable()->default(0); + }); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + if (Schema::hasTable('users') && Schema::hasColumn('users', 'last_get_new_message_time') + && Schema::hasColumn('users', 'last_send_email_time')) { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn(['last_get_new_message_time', 'last_send_email_time']); + }); + } + } +} diff --git a/public/css/app.css b/public/css/app.css new file mode 100644 index 0000000..da3707c --- /dev/null +++ b/public/css/app.css @@ -0,0 +1,223 @@ +hr { + margin: 5px 0; +} + +.banner-back { + position: absolute; + top: 0; + left: 0; + height: 160px; + width: 100%; + z-index: -10; + overflow: hidden; +} + +.banner { + background-image: url('/img/banner.jpg'); + background-repeat: no-repeat; + background-position: center 0; + position: absolute; + top: -10px; + left: -20px; + padding: 0 20px; + height: 160px; + width: 100%; + z-index: -10; + box-sizing: content-box; +} + +.top-bar { + box-shadow: rgba(0, 0, 0, 0.1) 0 1px 2px; + padding-top: 0; + padding-bottom: 0; +} + +.top-bar .menu { + background: none; +} + +.top-bar-list { + display: block; + color: #FEFEFE !IMPORTANT; + padding: 0 1rem !IMPORTANT; + height: 54px; + line-height: 54px !IMPORTANT; +} + +.top-bar-list:hover { + background: rgba(255, 255, 255, 0.25); +} + +.top-bar-list:active { + background: rgba(255, 255, 255, 0.5); +} + +.top-bar-dropdown::after { + border-color: #FFFFFF transparent transparent !IMPORTANT; +} + +.top-bar-avatar::after { + border-color: transparent transparent transparent !IMPORTANT; +} + +.top-bar-dropdown-menu { + border: 1px solid #DDDDDD; + border-radius: 5px; + background-color: #FFFFFF !IMPORTANT; +} + +.top-bar, +.top-bar-left, +.top-bar-right { + height: 54px; + position: relative; +} + +.top-bar-back { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow: hidden; +} + +.top-bar-filter { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(255, 255, 255, 0.4); +} + +.top-bar-bg { + position: absolute; + background-image: url('/img/banner.jpg'); + background-position: center 0; + background-repeat: no-repeat; + height: 74px; + top: -10px; + left: -20px; + padding: 0 20px; + width: 100%; + margin: 0; + -webki-filter: blur(5px); + -ms-filter: blur(5px); + filter: blur(5px); + box-sizing: content-box; +} + +#top-bar-quick-access-small { + position: relative; + top: 30px; +} + +#top-bar-quick-access { + position: relative; + top: 30px; + width: 300px; +} + +.top-bar-avatar { + display: block; + color: #FEFEFE !IMPORTANT; + padding: 0 1rem !IMPORTANT; + height: 54px; + transition: background 0.25s ease-out; + padding: 0 !IMPORTANT; + transition: box-shadow 0.25s; +} + +.top-bar-avatar > img { + margin-right: 0 !IMPORTANT; + border: 0; + border-radius: 27px; +} + +.top-bar-button { + height: 54px; + display: inline-block; + vertical-align: middle; + padding: 0 1rem!IMPORTANT; + border: 1px solid transparent; + border-radius: 0; + transition: background-color 0.25s ease-out, color 0.25s ease-out; + line-height: 54px!IMPORTANT; + text-align: center; + cursor: pointer; + background-color: #1779ba; + color: #fefefe; +} + +.top-bar-button:hover { + color: #fefefe; + background-color: #14679e; +} + +.search-bar { + position: relative; +} + +.page-content { + position: relative; + margin-top: 60px; +} + +.one-line-text { + white-space: nowrap; + overflow: hidden; +} + +.card-divider { + margin-bottom: 0; +} + +.card-item, +.card-item div { + border-bottom: 1px solid #e6e6e6; +} + +.card-item:last-child, +.card-item:last-child div { + border-bottom: 0; +} + +table.card-table { + border-bottom: 1px solid #e6e6e6; +} + +table.card-table th, +table.card-table td { + padding: 0.75em; + border-bottom: 1px solid #e6e6e6; + background: #fefefe; + text-align: center; +} + +.card-table.card-section { + padding: 0; +} + +footer span { + font-size: 13px; + margin-right: 10px; +} + +.vertical > li > a { + outline: none; +} + +.vertical > li > a > img { + border: 0; + border-radius: 110px; +} + +input::placeholder, textarea::placeholder { + color: #999999; +} + +.message-num-tip { + cursor:pointer; + background-color: #e69d00; +} \ No newline at end of file diff --git a/public/css/wechat.css b/public/css/wechat.css new file mode 100644 index 0000000..916db3a --- /dev/null +++ b/public/css/wechat.css @@ -0,0 +1,22 @@ +.head-img { + border-style: solid; + border-width: 0.3em; + border-color: #cccccc; + border-radius: 15%; + margin-bottom: 1em; +} + +.nickname { + background: #f9fafa; + padding: 3px 6px; + border-radius: 3px; + color: #f4645f; + margin: 5px; + border: 1px solid #ded9d9; + overflow-x: auto; + font-size: 0.9em; +} + +.content-wrapper { + margin-top: 3em; +} \ No newline at end of file diff --git a/public/font/FontAwesome.otf b/public/font/FontAwesome.otf new file mode 100644 index 0000000..401ec0f Binary files /dev/null and b/public/font/FontAwesome.otf differ diff --git a/public/font/fontawesome-webfont.eot b/public/font/fontawesome-webfont.eot new file mode 100644 index 0000000..e9f60ca Binary files /dev/null and b/public/font/fontawesome-webfont.eot differ diff --git a/public/font/fontawesome-webfont.svg b/public/font/fontawesome-webfont.svg new file mode 100644 index 0000000..855c845 --- /dev/null +++ b/public/font/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + diff --git a/public/font/fontawesome-webfont.ttf b/public/font/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/public/font/fontawesome-webfont.ttf differ diff --git a/public/font/fontawesome-webfont.woff b/public/font/fontawesome-webfont.woff new file mode 100644 index 0000000..400014a Binary files /dev/null and b/public/font/fontawesome-webfont.woff differ diff --git a/public/font/fontawesome-webfont.woff2 b/public/font/fontawesome-webfont.woff2 new file mode 100644 index 0000000..4d13fc6 Binary files /dev/null and b/public/font/fontawesome-webfont.woff2 differ diff --git a/public/js/good/good_list.js b/public/js/good/good_list.js index 2ac40eb..94da7fb 100644 --- a/public/js/good/good_list.js +++ b/public/js/good/good_list.js @@ -1,5 +1,5 @@ $(document).ready(function(){ - switch ($("#nm").prop("className")){ + switch ($("#nm").val()){ case "p": $("#sort").text('按价格从低到高');break; case "pd": @@ -53,8 +53,8 @@ function setc(ha){ if(ha!="a"){ hr=hr+"&sort="+ha; } - else if($("#nm").prop("className")!=""){ - hr=hr+"&sort="+$("#nm").prop("className"); + else if($("#nm").val()!=""){ + hr=hr+"&sort="+$("#nm").val(); } if($("#searchq").val()!=""){ hr=hr+"&query="+$("#searchq").val(); diff --git a/resources/views/admin/index.blade.php b/resources/views/admin/index.blade.php index 52d1e99..ce3bda1 100644 --- a/resources/views/admin/index.blade.php +++ b/resources/views/admin/index.blade.php @@ -11,6 +11,7 @@
| 交易单号 | +卖家学号 | +买家学号 | +商品ID | +交易数目 | +交易状态 | +评价 | +
|---|---|---|---|---|---|---|
| {{$tran->id}} | +{{$tran->seller->stuid}} | +{{$tran->buyer->stuid}} | +{{$tran->good_id}} | +{{$tran->number}} | ++ @if($tran->status == 0) + 订单已取消 + @endif + @if($tran->status == 1) + 买家已购买,卖家未确认 + @endif + @if($tran->status == 2) + 卖家已确认 + @endif + @if($tran->status == 3) + 交易失败 + @endif + @if($tran->status == 4) + 交易成功待评价 + @endif + @if($tran->status == 5) + 交易成功已评价 + @endif + | ++ @if($tran->status == 5) + {{$tran->reason}} + @else + 无 + @endif + | +