This commit is contained in:
Harry Zhou
2017-06-17 23:56:27 +08:00
17 changed files with 509 additions and 17 deletions
+4 -1
View File
@@ -11,6 +11,7 @@ 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 +29,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);
}
+104 -4
View File
@@ -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('/');
}
@@ -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
{
@@ -25,6 +26,7 @@ class ContentController extends Controller
$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(3)->get();
$data['trans'] = Transaction::where('status', '>', 3)->orderby('id', 'dsc')->limit(20)->get();
return View::make('welcome')->with($data);
}
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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' => '请按要求裁剪图片',
+1
View File
@@ -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");
+3 -1
View File
@@ -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');
}
}
+15
View File
@@ -36,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;
}
}
+10
View File
@@ -0,0 +1,10 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Wechat extends Model
{
protected $fillable = ['open_id'];
}
@@ -0,0 +1,35 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateWechatsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('wechats', function (Blueprint $table) {
$table->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');
}
}
@@ -0,0 +1,38 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AlterUserAddWechatId extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
if (Schema::hasTable('users') && !Schema::hasColumn('users', 'wechat_open_id'))
{
Schema::table('users', function (Blueprint $table) {
$table->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');
});
}
}
}
+22
View File
@@ -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;
}
+112 -4
View File
@@ -7,7 +7,9 @@
<ul class="tabs" data-tabs="w6tmms-tabs" id="editadmin" role="tablist">
<li class="tabs-title is-active " role="presentation"><a href="#announcement" aria-selected="true" role="tab" aria-controls="extra" id="extra-label">公告管理</a></li>
<li class="tabs-title " role="presentation"><a href="#classify" role="tab" aria-controls="account" aria-selected="false" id="account-label">分类管理</a></li>
<li class="tabs-title "><a href="#report">查看举报记录</a></li>
<li class="tabs-title"><a href="#report">查看举报记录</a></li>
<li class="tabs-title"><a href="#userlist">查看所有用户</a></li>
<li class="tabs-title"><a href="#translist">交易列表</a></li>
</ul>
<div class="tabs-content" data-tabs-content="editadmin">
@@ -91,6 +93,7 @@
<th>#</th>
<th>举报者ID</th>
<th>被举报者ID</th>
<th>举报理由</th>
<th>受理管理员ID</th>
<th colspan="2">状态</th>
</tr>
@@ -98,9 +101,10 @@
@foreach($reports as $repo)
<tbody>
<tr>
<td>{{ $repo->id }}</td>
<td>{{ $repo->sender_id }}</td>
<td>{{ $repo->receiver_id }}</td>
<td>{{$repo->id}}</td>
<td><a href="/user/{{$repo->sender_id}}">{{$repo->sender_id}}</a></td>
<td><a href="/user/{{$repo->receiver_id}}">{{$repo->receiver_id}}</a></td>
<td>{{$repo->message}}</td>
@if(!$repo->assignee)
<td>
<form action="/repo/{{ $repo->id }}/assign" method="POST">
@@ -144,6 +148,110 @@
{{ $reports->links() }}
</div>
<div class="tabs-panel" id="userlist">
<div class="card-section">
<table>
<thead>
<tr>
<th>用户ID</th>
<th>权限</th>
<th>学号</th>
<th>真实姓名</th>
<th>昵称</th>
<th>用户名</th>
<th>邮箱</th>
<th>是否封禁</th>
<th>注册时间</th>
</tr>
</thead>
@foreach($users as $user)
<tbody>
<tr>
<td><a href="/user/{{$user->id}}">{{$user->id}}</a></td>
<td>{{$user->privilege}}</td>
<td>{{$user->stuid}}</td>
<td>{{$user->realname}}</td>
<td><a href="/user/{{$user->id}}">{{$user->nickname}}</a></td>
<td>{{$user->username}}</td>
<td>{{$user->email}}</td>
<td>
@if($user->baned == 0)
否
@endif
@if($user->baned == 1)
已封禁{{$user->banedtime}}天
@endif
@if($user->baned == -1)
已永久封禁
@endif
</td>
<td>{{$user->created_at}}</td>
</tr>
</tbody>
@endforeach
</table>
</div>
{{ $users->links() }}
</div>
<div class="tabs-panel" id="translist">
<div class="card-section">
<table>
<thead>
<tr>
<th>交易单号</th>
<th>卖家学号</th>
<th>买家学号</th>
<th>商品ID</th>
<th>交易数目</th>
<th>交易状态</th>
<th>评价</th>
</tr>
</thead>
@foreach($trans as $tran)
@if($tran->seller != NULL)
<tbody>
<tr>
<td>{{$tran->id}}</td>
<td><a href="/user/{{$tran->seller->id}}">{{$tran->seller->stuid}}</a></td>
<td><a href="/user/{{$tran->buyer_id}}">{{$tran->buyer->stuid}}</a></td>
<td><a href="/good/{{$tran->good_id}}">{{$tran->good_id}}</a></td>
<td>{{$tran->number}}</td>
<td>
@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
</td>
<td>
@if($tran->status == 5)
{{$tran->reason}}
@else
无
@endif
</td>
</tr>
</tbody>
@endif
@endforeach
</table>
</div>
{{ $trans->links() }}
</div>
</div>
<script>
// WYSIWYG
@@ -0,0 +1,53 @@
<!DOCTYPE HTML>
<html class="no-js" lang="zh">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link rel="stylesheet" href="/css/foundation.css"/>
<link rel="stylesheet" href="/css/app.css"/>
<link rel="stylesheet" href="/css/cropper.min.css"/>
<link rel="stylesheet" href="/css/froala_editor.min.css">
<link rel="stylesheet" href="/css/froala_editor.pkgd.min.css">
<link rel="stylesheet" href="/css/font-awesome.min.css">
<link type="text/css" media="screen" rel="stylesheet" href="/css/responsive-tables.css" />
@yield('asset')
<script src="/js/jquery.min.js"></script>
<script src="/js/vendor/jquery.min.js"></script>
<script src="/js/vendor/what-input.min.js"></script>
<script src="/js/vendor/foundation.min.js"></script>
<script src="/js/cropper.min.js"></script>
<!--Pop foundation and cropper's old version jQuery-->
<script type="text/javascript">
var $jQuery_FOUNDATION = $.noConflict(true);
</script>
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<script src="/js/jquery.slides.min.js"></script>
<script src="/js/app.js"></script>
<script src="/js/froala_editor.pkgd.min.js"></script>
<title>微信登录 - 先锋市场</title>
</head>
<body>
<div class="content-wrapper row align-middle">
<div class="small-10 small-push-1 columns card">
<div class="card-section">
<form action="/login" method="POST" data-abide novalidate>
<center>
<img class="head-img" src="{{ $wechat->headImgUrl }}" width="64" height="64"/>
</center>
<p>您正在使用微信账号 <span class="nickname">{{ $wechat->nickName }}</span> 登录先锋市场,要绑定此账号,点击下面的按钮继续。</p>
<div class="row">
<a type="submit" class="expanded hollow button" href="/login">我已有账号</a>
</div>
<div class="row">
<a href="/sso" style="float: right" class="expanded button small-centered" href="/sso">校园卡认证注册</a>
</div>
</form>
</div>
</div>
</div>
<link rel="stylesheet" href="/css/wechat.css"/>
@include('layout.footer')
</body>
</html>
+3 -3
View File
@@ -53,13 +53,13 @@
</span>
</h2>
<div><!-- 放tag 和更多图片缩略图 --></div>
货主:<a href="/user/{{ $user->id }}">@if(isset($user->nickname)){{ $user->nickname }} @else 还没有昵称&gt;_&lt; @endif
卖家:<a href="/user/{{ $user->id }}">@if(isset($user->nickname)){{ $user->nickname }} @else 还没有昵称&gt;_&lt; @endif
@if($user->baned)
【已封禁】
@endif
</a>
@if ($user->id != session('user_id'))
<a href="/message/startConversation/{{ $user->id }}">和我联系</a>
<a href="/message/startConversation/{{ $user->id }}">联系卖家</a>
@endif
<h4 style="color: #cc4b37"><b>¥{{ $good->price }}</b></h4>
<p id="ach" class="show-for-small-only gb_right">@if($good->count > 1)(库存:{{ $good->count }}件)@else 仅一件 @endif</p>
@@ -169,7 +169,7 @@
<li style="width:25%">
<button class="button warning"
style="color:white;font-size: 15px;width:100%;height:40px;padding-left:0;padding-right:0;" onclick="window.location.href='/message/startConversation/{{ $user->id }}'">
联系货主
联系卖家
</button>
</li>
<li style="width:50%">
+11 -1
View File
@@ -30,6 +30,14 @@
<input type="submit" class="hollow button" value="解绑">
@endif
</form>
<form>
@if($user->wechat_open_id)
<label>微信:已关联 {{$user->wechat->nick_name}}</label>
<img class="head-img" src="{{$user->wechat->head_img_url}}" width="64px" height="64px">
@else
<label>微信:请在东大小秘书中点击“闲置市场”链接来关联微信。</label>
@endif
</form>
<form action="/user/edit/password" method="POST">
{{ csrf_field() }}
@if($user->password!='')
@@ -39,4 +47,6 @@
<label>确认新密码<input type="password" name="newPassword_confirmation" placeholder="必填" required></label>
<input type="submit" class="hollow button" name="password_submit" value="保存">
</form>
</div>
</div>
<link rel="stylesheet" href="/css/wechat.css"/>
+94 -1
View File
@@ -4,8 +4,85 @@
@section('asset')
<link rel="stylesheet" href="/css/wel.css" />
<style>
.slide-title{
background: rgba(0,0,0,.5);
color: #fff;
height: 34px;
line-height: 34px;
padding: 0 10px;
font-size: 12px;
font-weight: bold;
}
.slide-title span{
float: left;
margin-right: 0px;
}
.slide-title span:nth-child(1),
.slide-list li span:nth-child(1){
width: 1500px;
}
.slide-title span:nth-child(2),
.slide-list li span:nth-child(2){
width: 1500px;
}
.slide-title span:nth-child(3),
.slide-list li span:nth-child(3){
width: 1500px;
}
.slide-container{
position: relative;
overflow: hidden;
height: 90px;
}
.slide-list{
position: absolute;
width: 100%;
left: 0;
top: 0;
color: #000;
margin: 0;
padding: 0;
}
.slide-list li {
height: 30px;
line-height: 30px;
list-style: none;
margin: 0;
padding: 3px;
}
.slide-list li span {
display: inline-block;
margin-right: 0px;
font-size: 13px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.slide-list li.odd{
background: rgba(51,79,109,.2);
}
</style>
<script>
var doscroll = function(){
var $parent = $('.js-slide-list');
var $first = $parent.find('li:first');
var height = $first.height();
$first.animate({
marginTop: -height + 'px'
}, 500, function() {
$first.css('marginTop', 0).appendTo($parent);
});
};
setInterval(function(){doscroll()}, 2000);
</script>
@endsection
@section('content')
<div class="row">
@@ -165,7 +242,7 @@
@endif
@endforeach
</div>
<div class="hide-for-medium-only large-5 columns">
<div class="large-5 columns">
<div class="row">
<div class="medium-10 medium-offset-2 columns">
<div class="card">
@@ -178,6 +255,22 @@
</div>
</div>
</div>
<div class="row">
<div class="medium-10 medium-offset-2 columns">
<div class="slide-title">
<h4>交易公示牌OvO</h4>
</div>
<div class="slide-container">
<ul class="slide-list js-slide-list">
@foreach($trans as $tran)
@if($tran->seller != NULL)
<li class="odd"><span>恭喜{{$tran->seller->getcoding()}}和{{$tran->buyer->getcoding()}}成功完成了一笔交易!OvO</span></li>
@endif
@endforeach
</ul>
</div>
</div>
</div>
</div>
</div>
<script src="/js/good/cat.js"></script>