Laravel框架实战-在线教育平台(6)
︴准备
1、数据字典
后台试卷表
表名 |
paper |
|||||
序号 |
字段 |
类型 |
说明 |
空 |
默认值 |
主键 |
1 |
id |
int |
自增主键 |
N |
N/A |
是 |
2 |
paper_name |
varchar(50) |
试卷名 |
N |
||
3 |
course_id |
tinyint |
关联课程ID,所属的课程 |
N |
||
4 |
score |
tinyint |
试卷总分 |
N |
100 |
|
5 |
updated_at |
int |
创建于 |
Y |
0 |
|
6 |
created_at |
int |
更新于 |
Y |
0 |
后台试题表
表名 |
question |
|||||
序号 |
字段 |
类型 |
说明 |
空 |
默认值 |
主键 |
1 |
id |
int |
自增主键 |
N |
N/A |
是 |
2 |
type |
tinyint |
类型:1-单选,2-多选 |
N |
||
3 |
question |
varchar(255) |
试题具体内容 |
N |
||
4 |
paper_id |
tinyint |
关联试卷ID |
N |
||
5 |
score |
tinyint |
该题总分 |
N |
2 |
|
6 |
options |
varchar(255) |
选项内容 |
N |
||
7 |
answer |
varchar(1) |
正确答案 |
N |
||
8 |
remark |
varchar(255) |
试题备注说明 |
Y |
||
9 |
updated_at |
int |
创建于 |
Y |
0 |
|
10 |
created_at |
int |
更新于 |
Y |
0 |
答题表
表名 |
answer |
|||||
序号 |
字段 |
类型 |
说明 |
空 |
默认值 |
主键 |
1 |
id |
int |
自增主键 |
N |
N/A |
是 |
2 |
paper_id |
tinyint |
试卷ID |
N |
||
3 |
question_id |
tinyint |
关联课程ID,所属的课程 |
N |
||
4 |
member_id |
tinyint |
会员ID |
N |
||
5 |
is_correct |
tinyint |
是否正确:1-正确,2-错误 |
N |
2 |
|
6 |
score |
tinyint |
得分 |
N |
0 |
|
7 |
answer |
char(4) |
学生的答案 |
Y |
||
8 |
updated_at |
int |
创建于 |
Y |
0 |
|
9 |
created_at |
int |
更新于 |
Y |
0 |
数据迁移
步骤1:创建迁移文件(该迁移文件一次性创建三个表)
步骤2:编写迁移文件
步骤3:执行迁移文件
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateKaoshiTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
#试卷
Schema::create(‘paper’, function (Blueprint $table) {
$table->increments(‘id’);
$table->string(‘paper_name’, 50)->comment(‘试卷名’);
$table->unsignedTinyInteger(‘course_id’)->comment(‘关联课程ID,所属的课程’);
$table->unsignedTinyInteger(‘score’)->default(100)->comment(‘试卷总分’);
$table->unsignedInteger(‘created_at’)->default(0)->comment(‘创建于’);
$table->unsignedInteger(‘updated_at’)->default(0)->comment(‘更新于’);
});
#试题
Schema::create(‘question’, function (Blueprint $table) {
$table->increments(‘id’);
$table->unsignedTinyInteger(‘type’)->default(1)->comment(‘类型:1-单选,2-多选’);
$table->unsignedTinyInteger(‘paper_id’)->comment(‘关联试卷ID’);
$table->unsignedTinyInteger(‘score’)->comment(‘该题总分’);
$table->string(‘question’)->comment(‘试题具体内容’);
$table->string(‘options’)->comment(‘选项内容’);
$table->string(‘answer’)->comment(‘正确答案’);
$table->string(‘remark’)->comment(‘试题备注说明’);
$table->unsignedInteger(‘created_at’)->default(0)->comment(‘创建于’);
$table->unsignedInteger(‘updated_at’)->default(0)->comment(‘更新于’);
});
#答题表
Schema::create(‘answer’, function (Blueprint $table) {
$table->increments(‘id’);
$table->unsignedTinyInteger(‘paper_id’)->comment(‘关联试卷ID’);
$table->unsignedTinyInteger(‘question_id’)->comment(‘关联课程ID,所属的课程’);
$table->unsignedTinyInteger(‘member_id’)->comment(‘会员ID’);
$table->unsignedTinyInteger(‘is_correct’)->comment(‘是否正确:1-是,2-否’);
$table->unsignedTinyInteger(‘score’)->default(0)->comment(‘得分’);
$table->char(‘answer’, 4)->comment(‘学生的答案’);
$table->unsignedInteger(‘created_at’)->default(0)->comment(‘创建于’);
$table->unsignedInteger(‘updated_at’)->default(0)->comment(‘更新于’);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}
模型
paper
<?php
namespace App\Http\Model;
use Illuminate\Database\Eloquent\Model;
class Paper extends Model
{
/**
* 声明表名(注:laravel会自动加s所以自己声明覆盖)
* @var string
*/
protected $table = ‘paper’;
/**
* Unix时间戳形式填充创建于和更新于(注:模型默认托管时间但是是datetime类型)
* @var string
*/
protected $dateFormat = ‘U’;
/**
* 声明可批量设置的属性(注:当使用create静态方式时)
* @var array
*/
protected $fillable = [‘paper_name’, ‘course_id’, ‘score’];
}
question
<?php
namespace App\Http\Model;
use Illuminate\Database\Eloquent\Model;
class Question extends Model
{
/**
* 声明表名(注:laravel会自动加s所以自己声明覆盖)
* @var string
*/
protected $table = ‘question’;
/**
* Unix时间戳形式填充创建于和更新于(注:模型默认托管时间但是是datetime类型)
* @var string
*/
protected $dateFormat = ‘U’;
/**
* 声明可批量设置的属性(注:当使用create静态方式时)
* @var array
*/
protected $fillable = [‘type’, ‘paper_id’, ‘score’, ‘question’, ‘options’, ‘answer’, ‘remark’];
}
answer
<?php
namespace App\Http\Model;
use Illuminate\Database\Eloquent\Model;
class Answer extends Model
{
/**
* 声明表名(注:laravel会自动加s所以自己声明覆盖)
* @var string
*/
protected $table = ‘answer’;
/**
* Unix时间戳形式填充创建于和更新于(注:模型默认托管时间但是是datetime类型)
* @var string
*/
protected $dateFormat = ‘U’;
/**
* 声明可批量设置的属性(注:当使用create静态方式时)
* @var array
*/
protected $fillable = [‘paper_id’, ‘question_id’, ‘member_id’, ‘is_correct’, ‘score’, ‘answer’];
}
一、后台试卷管理
1、设置添加试卷入口
<dl id=”menu-tongji”>
<dt><i class=”Hui-iconfont”></i> 考试管理<i class=”Hui-iconfont menu_dropdown-arrow”></i></dt>
<dd>
<ul>
<li><a data-href=”{{ url(‘admin/paper/index’) }}” data-title=”试卷管理” href=”javascript:void(0)”>试卷管理</a></li>
<li><a data-href=”{{ url(‘admin/question/index’) }}” data-title=”试题管理” href=”javascript:void(0)”>试题管理</a></li>
</ul>
</dd>
</dl>
列表
- 步骤1:定义路由
- 步骤2:创建控制器和方法、方法通过模型获取数据库所有数据,并传递给视图
步骤1:修改模型,增加关联方法
/**
* 关联课程
*/
public function course()
{
return $this->hasOne(‘App\Http\Model\Course’, ‘id’, ‘course_id’);
}
步骤2:控制器代码
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Model\Paper;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class PaperController extends Controller
{
//列表
public function index()
{
//1.查询所有数据
$papers = Paper::with(‘course’)->get();
//2.加载视图并传递数据
return view(‘admin.paper.index’, compact(‘papers’));
}
}
- 步骤3:视图循环显示(注:页面随便复制一个功能的列表进行修改)
<!DOCTYPE HTML>
<html>
<head>
<meta charset=”utf-8″>
<meta name=”renderer” content=”webkit|ie-comp|ie-stand”>
<meta http-equiv=”X-UA-Compatible” content=”IE=edge,chrome=1″>
<meta name=”viewport” content=”width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no” />
<meta http-equiv=”Cache-Control” content=”no-siteapp” />
<!–[if lt IE 9]>
<script type=”text/javascript” src=”{{ asset(‘admin/lib’) }}/html5shiv.js”></script>
<script type=”text/javascript” src=”{{ asset(‘admin/lib’) }}/respond.min.js”></script>
<![endif]–>
<link rel=”stylesheet” type=”text/css” href=”{{ asset(‘admin/static’) }}/h-ui/css/H-ui.min.css” />
<link rel=”stylesheet” type=”text/css” href=”{{ asset(‘admin/static’) }}/h-ui.admin/css/H-ui.admin.css” />
<link rel=”stylesheet” type=”text/css” href=”{{ asset(‘admin/lib’) }}/Hui-iconfont/1.0.8/iconfont.css” />
<link rel=”stylesheet” type=”text/css” href=”{{ asset(‘admin/static’) }}/h-ui.admin/skin/default/skin.css” id=”skin” />
<link rel=”stylesheet” type=”text/css” href=”{{ asset(‘admin/static’) }}/h-ui.admin/css/style.css” />
<!–[if IE 6]>
<script type=”text/javascript” src=”{{ asset(‘admin/lib’) }}/DD_belatedPNG_0.0.8a-min.js” ></script>
<script>DD_belatedPNG.fix(‘*’);</script>
<![endif]–>
<title>试卷管理</title>
</head>
<body>
<nav class=”breadcrumb”><i class=”Hui-iconfont”></i> 首页 <span class=”c-gray en”>></span> 管理员管理 <span class=”c-gray en”>></span> 试卷管理 <a class=”btn btn-success radius r” style=”line-height:1.6em;margin-top:3px” href=”javascript:location.replace(location.href);” title=”刷新” ><i class=”Hui-iconfont”></i></a></nav>
<div class=”page-container”>
<div class=”text-c”>
<form class=”Huiform” method=”post” action=”” target=”_self”>
<input type=”text” class=”input-text” style=”width:250px” placeholder=”试卷名称” id=”search_content” name=””>
<button type=”button” class=”btn btn-success” id=”search” name=””><i class=”Hui-iconfont”></i> 搜试卷节点</button>
</form>
</div>
<div class=”cl pd-5 bg-1 bk-gray mt-20″>
<span class=”l”>
<a href=”javascript:;” onclick=”datadel()” class=”btn btn-danger radius”>
<i class=”Hui-iconfont”></i> 批量删除
</a>
<a href=”javascript:;” onclick=”admin_permission_add(‘添加试卷节点’,'{{ url(‘admin/auth/add’) }}’,’400′,’360′)” class=”btn btn-primary radius”>
<i class=”Hui-iconfont”></i> 添加试卷节点
</a>
</span>
<span class=”r”>共有数据:<strong>54</strong> 条</span> </div>
<table class=”table table-border table-bordered table-bg”>
<thead>
<tr>
<th scope=”col” colspan=”8″>试卷节点</th>
</tr>
<tr class=”text-c”>
<th width=”25″><input type=”checkbox” name=”” value=””></th>
<th>ID</th>
<th>试卷名</th>
<th>所属的课程</th>
<th>试卷总分</th>
<th>创建于</th>
<th>更新于</th>
<th width=”100″>操作</th>
</tr>
</thead>
<tbody>
@foreach ($papers as $paper)
<tr class=”text-c”>
<td><input type=”checkbox” value=”{{ $paper->id }}” name=””></td>
<td>{{ $paper->id }}</td>
<td>{{ $paper->paper_name }}</td>
<!– <td>{{ $paper->course_id }}</td> –>
<td>{{ $paper->course->course_name }}</td>
<td>{{ $paper->score }}</td>
<td>{{ $paper->created_at }}</td>
<td>{{ $paper->updated_at }}</td>
<td><a title=”编辑” href=”javascript:;” onclick=”admin_permission_edit(‘角色编辑’,’admin-permission-add.html’,’1′,”,’310′)” class=”ml-5″ style=”text-decoration:none”><i class=”Hui-iconfont”></i></a> <a title=”删除” href=”javascript:;” onclick=”admin_permission_del(this,’1′)” class=”ml-5″ style=”text-decoration:none”><i class=”Hui-iconfont”></i></a></td>
</tr>
@endforeach
</tbody>
</table>
</div>
<!–_footer 作为公共模版分离出去–>
<script type=”text/javascript” src=”{{ asset(‘admin/lib’) }}/jquery/1.9.1/jquery.min.js”></script>
<script type=”text/javascript” src=”{{ asset(‘admin/lib’) }}/layer/2.4/layer.js”></script>
<script type=”text/javascript” src=”{{ asset(‘admin/static’) }}/h-ui/js/H-ui.min.js”></script>
<script type=”text/javascript” src=”{{ asset(‘admin/static’) }}/h-ui.admin/js/H-ui.admin.js”></script> <!–/_footer 作为公共模版分离出去–>
<!–请在下方写此页面业务相关的脚本–>
<script type=”text/javascript” src=”{{ asset(‘admin/lib’) }}/datatables/1.10.0/jquery.dataTables.min.js”></script>
<script type=”text/javascript”>
var table = $(‘table’).DataTable({
iDisplayLength:2, //限制每页显示条数
// searching : false, //禁用搜索
bLengthChange: false, //去掉每页显示多少条数据方法
});
//客户端搜索功能更
$(‘#search’).click(function(){
var search_content = $(‘#search_content’).val();
table.search(search_content).draw();
});
$(function(){
$(‘#DataTables_Table_0_filter’).hide();
});
/*
参数解释:
title 标题
url 请求的url
id 需要操作的数据id
w 弹出层宽度(缺省调默认值)
h 弹出层高度(缺省调默认值)
*/
/*管理员-试卷-添加*/
function admin_permission_add(title,url,w,h){
layer_show(title,url,w,h);
}
/*管理员-试卷-编辑*/
function admin_permission_edit(title,url,id,w,h){
layer_show(title,url,w,h);
}
/*管理员-试卷-删除*/
function admin_permission_del(obj,id){
layer.confirm(‘确认要删除吗?’,function(index){
$.ajax({
type: ‘POST’,
url: ”,
dataType: ‘json’,
success: function(data){
$(obj).parents(“tr”).remove();
layer.msg(‘已删除!’,{icon:1,time:1000});
},
error:function(data) {
console.log(data.msg);
},
});
});
}
</script>
</body>
</html>
3、添加试卷
1)加载视图
- 步骤1:定义路由(支持get和post提价)
- 步骤2:更改试卷列表视图中的添加试卷按钮链接
- 步骤3:更改add.blade.php视图(因为之前是直接复制auth的添加视图)
步骤1:修改控制器查询所有课程
步骤2:创建视图
<!DOCTYPE HTML>
<html>
<head>
<meta charset=”utf-8″>
<meta name=”renderer” content=”webkit|ie-comp|ie-stand”>
<meta http-equiv=”X-UA-Compatible” content=”IE=edge,chrome=1″>
<meta name=”viewport” content=”width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no” />
<meta http-equiv=”Cache-Control” content=”no-siteapp” />
<!–[if lt IE 9]>
<script type=”text/javascript” src=”{{ asset(‘admin/lib’) }}/html5shiv.js”></script>
<script type=”text/javascript” src=”{{ asset(‘admin/lib’) }}/respond.min.js”></script>
<![endif]–>
<link rel=”stylesheet” type=”text/css” href=”{{ asset(‘admin/static’) }}/h-ui/css/H-ui.min.css” />
<link rel=”stylesheet” type=”text/css” href=”{{ asset(‘admin/static’) }}/h-ui.admin/css/H-ui.admin.css” />
<link rel=”stylesheet” type=”text/css” href=”{{ asset(‘admin/lib’) }}/Hui-iconfont/1.0.8/iconfont.css” />
<link rel=”stylesheet” type=”text/css” href=”{{ asset(‘admin/static’) }}/h-ui.admin/skin/default/skin.css” id=”skin” />
<link rel=”stylesheet” type=”text/css” href=”{{ asset(‘admin/static’) }}/h-ui.admin/css/style.css” />
<!–[if IE 6]>
<script type=”text/javascript” src=”{{ asset(‘admin/lib’) }}/DD_belatedPNG_0.0.8a-min.js” ></script>
<script>DD_belatedPNG.fix(‘*’);</script>
<![endif]–>
<title>添加管理员 – 管理员管理 – H-ui.admin v3.1</title>
<meta name=”keywords” content=”H-ui.admin v3.1,H-ui网站后台模版,后台模版下载,后台管理系统模版,HTML后台模版下载”>
<meta name=”description” content=”H-ui.admin v3.1,是一款由国人开发的轻量级扁平化网站后台模板,完全免费开源的网站后台管理系统模版,适合中小型CMS后台系统。”>
</head>
<body>
<article class=”page-container”>
<form class=”form form-horizontal” id=”form-admin-add”>
{{ csrf_field() }}
<div class=”row cl”>
<label class=”form-label col-xs-4 col-sm-3″><span class=”c-red”>*</span>试卷名称:</label>
<div class=”formControls col-xs-8 col-sm-9″>
<input type=”text” class=”input-text” id=”paper_name” name=”paper_name”>
</div>
</div>
<div class=”row cl”>
<label class=”form-label col-xs-4 col-sm-3″><span class=”c-red”>*</span>总分:</label>
<div class=”formControls col-xs-8 col-sm-9″>
<input type=”text” class=”input-text” autocomplete=”off” id=”score” name=”score”>
</div>
</div>
<div class=”row cl”>
<label class=”form-label col-xs-4 col-sm-3″>关联课程:</label>
<div class=”formControls col-xs-8 col-sm-9″> <span class=”select-box” style=”width:150px;”>
<select class=”select” name=”pid” size=”1″>
@foreach ($courses as $course)
<option value=”{{ $course->id }}”>{{ $course->course_name }}</option>
@endforeach
</select>
</span> </div>
</div>
<div class=”row cl”>
<div class=”col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-3″>
<input class=”btn btn-primary radius” type=”submit” value=” 提交 ”>
</div>
</div>
</form>
</article>
<!–_footer 作为公共模版分离出去–>
<script type=”text/javascript” src=”{{ asset(‘admin/lib’) }}/jquery/1.9.1/jquery.min.js”></script>
<script type=”text/javascript” src=”{{ asset(‘admin/lib’) }}/layer/2.4/layer.js”></script>
<script type=”text/javascript” src=”{{ asset(‘admin/static’) }}/h-ui/js/H-ui.min.js”></script>
<script type=”text/javascript” src=”{{ asset(‘admin/static’) }}/h-ui.admin/js/H-ui.admin.js”></script> <!–/_footer 作为公共模版分离出去–>
<!–请在下方写此页面业务相关的脚本–>
<script type=”text/javascript” src=”{{ asset(‘admin/lib’) }}/jquery.validation/1.14.0/jquery.validate.js”></script>
<script type=”text/javascript” src=”{{ asset(‘admin/lib’) }}/jquery.validation/1.14.0/validate-methods.js”></script>
<script type=”text/javascript” src=”{{ asset(‘admin/lib’) }}/jquery.validation/1.14.0/messages_zh.js”></script>
<script type=”text/javascript”>
$(function(){
$(‘.skin-minimal input’).iCheck({
checkboxClass: ‘icheckbox-blue’,
radioClass: ‘iradio-blue’,
increaseArea: ‘20%’
});
$(“#form-admin-add”).validate({
rules:{
atuh_name:{
required:true,
minlength:4,
maxlength:16
},
controller:{
required:true,
},
action:{
required:true,
},
},
onkeyup:false,
focusCleanup:true,
success:”valid”,
submitHandler:function(form){
$(form).ajaxSubmit({
type: ‘post’,
url: “{{ url(‘admin/auth/add’) }}”,
success: function(data){
//在父元素提示
parent.layer.msg(‘添加成功!’,{icon:1,time:1000});
//成功则关闭窗口
var index = parent.layer.getFrameIndex(window.name);
parent.$(‘.btn-refresh’).click();
parent.layer.close(index);
},
error: function(XmlHttpRequest, textStatus, errorThrown){
layer.msg(‘error!’,{icon:1,time:1000});
}
});
}
});
});
</script>
<!–/请在上方写此页面业务相关的脚本–>
</body>
</html>
数据处理
- 步骤1:修改视图表单提js插件
- 步骤2:控制器录入数据
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Model\Paper;
use App\Http\Model\Course;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class PaperController extends Controller
{
//列表
public function index()
{
//1.查询所有数据
$papers = Paper::with(‘course’)->get();
//2.加载视图并传递数据
return view(‘admin.paper.index’, compact(‘papers’));
}
//添加
public function add(Request $request)
{
//1.判断HTTP请求类型
if ($request->isMethod(‘post’)) {
//2.接受数据
$postData = $request->only([‘paper_name’, ‘score’, ‘course_id’]);
//3.创建数据
$rs = Paper::create($postData);
//4.判断
return $rs ? 1 : 0;
} else {
//2.查询所有课程
$courses = Course::get();
//3.加载视图并传递数据
return view(‘admin.paper.add’, compact(‘courses’));
}
}
}
后台试题管理
1、列表
- 步骤1:定义路由
- 步骤2:设置入口
入口1
入口2
- 步骤3:创建控制器和方法,并获取所有数据传递给视图
- 定义模型,关联试题
2)控制器
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Model\Question;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class QuestionController extends Controller
{
//列表
public function index(Request $request)
{
//1.接受试题ID:有-显示该试题的列表,无-显示所有试题
$paper_id = $request->input(‘paper_id’);
//2.查询所有数据
if ($paper_id) {
$questions = Question::with(‘paper’)->where(‘paper_id’, $paper_id)->get();
} else {
$questions = Question::with(‘paper’)->get();
}
//3.加载视图并传递数据
return view(‘admin.question.index’, compact(‘questions’));
}
}
- 步骤4:常见视图循环显示数据
<!DOCTYPE HTML>
<html>
<head>
<meta charset=”utf-8″>
<meta name=”renderer” content=”webkit|ie-comp|ie-stand”>
<meta http-equiv=”X-UA-Compatible” content=”IE=edge,chrome=1″>
<meta name=”viewport” content=”width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no” />
<meta http-equiv=”Cache-Control” content=”no-siteapp” />
<!–[if lt IE 9]>
<script type=”text/javascript” src=”{{ asset(‘admin/lib’) }}/html5shiv.js”></script>
<script type=”text/javascript” src=”{{ asset(‘admin/lib’) }}/respond.min.js”></script>
<![endif]–>
<link rel=”stylesheet” type=”text/css” href=”{{ asset(‘admin/static’) }}/h-ui/css/H-ui.min.css” />
<link rel=”stylesheet” type=”text/css” href=”{{ asset(‘admin/static’) }}/h-ui.admin/css/H-ui.admin.css” />
<link rel=”stylesheet” type=”text/css” href=”{{ asset(‘admin/lib’) }}/Hui-iconfont/1.0.8/iconfont.css” />
<link rel=”stylesheet” type=”text/css” href=”{{ asset(‘admin/static’) }}/h-ui.admin/skin/default/skin.css” id=”skin” />
<link rel=”stylesheet” type=”text/css” href=”{{ asset(‘admin/static’) }}/h-ui.admin/css/style.css” />
<!–[if IE 6]>
<script type=”text/javascript” src=”{{ asset(‘admin/lib’) }}/DD_belatedPNG_0.0.8a-min.js” ></script>
<script>DD_belatedPNG.fix(‘*’);</script>
<![endif]–>
<title>试卷管理</title>
</head>
<body>
<nav class=”breadcrumb”><i class=”Hui-iconfont”></i> 首页 <span class=”c-gray en”>></span> 管理员管理 <span class=”c-gray en”>></span> 试卷管理 <a class=”btn btn-success radius r” style=”line-height:1.6em;margin-top:3px” href=”javascript:location.replace(location.href);” title=”刷新” ><i class=”Hui-iconfont”></i></a></nav>
<div class=”page-container”>
<div class=”text-c”>
<form class=”Huiform” method=”post” action=”” target=”_self”>
<input type=”text” class=”input-text” style=”width:250px” placeholder=”试卷名称” id=”search_content” name=””>
<button type=”button” class=”btn btn-success” id=”search” name=””><i class=”Hui-iconfont”></i> 搜试卷节点</button>
</form>
</div>
<div class=”cl pd-5 bg-1 bk-gray mt-20″>
<span class=”l”>
<a href=”javascript:;” onclick=”datadel()” class=”btn btn-danger radius”>
<i class=”Hui-iconfont”></i> 批量删除
</a>
<a href=”javascript:;” onclick=”admin_permission_add(‘添加试卷节点’,'{{ url(‘admin/paper/add’) }}’,’400′,’360′)” class=”btn btn-primary radius”>
<i class=”Hui-iconfont”></i> 添加试卷节点
</a>
</span>
<span class=”r”>共有数据:<strong>54</strong> 条</span> </div>
<table class=”table table-border table-bordered table-bg”>
<thead>
<tr>
<th scope=”col” colspan=”11″>试卷节点</th>
</tr>
<tr class=”text-c”>
<th width=”25″><input type=”checkbox” name=”” value=””></th>
<th>ID</th>
<th>类型</th>
<th>所属试卷</th>
<th>分数</th>
<th>问题</th>
<th>答案选项</th>
<th>答案</th>
<th>说明</th>
<th>创建于</th>
<th width=”100″>操作</th>
</tr>
</thead>
<tbody>
@foreach ($questions as $question)
<tr class=”text-c”>
<td><input type=”checkbox” value=”{{ $question->id }}” name=””></td>
<td>{{ $question->id }}</td>
<td>
@if ($question->type == 1)单选题
@else 多选题
@endif
</td>
<!– <td>{{ $question->paper_id }}</td> –>
<td>{{ $question->paper->paper_name }}</td>
<td>{{ $question->score }}</td>
<td>{{ $question->question }}</td>
<td>{{ $question->options }}</td>
<td>{{ $question->answer }}</td>
<td>{{ $question->remark }}</td>
<td>{{ $question->created_at }}</td>
<td><a title=”编辑” href=”javascript:;” onclick=”admin_permission_edit(‘角色编辑’,’admin-permission-add.html’,’1′,”,’310′)” class=”ml-5″ style=”text-decoration:none”><i class=”Hui-iconfont”></i></a> <a title=”删除” href=”javascript:;” onclick=”admin_permission_del(this,’1′)” class=”ml-5″ style=”text-decoration:none”><i class=”Hui-iconfont”></i></a></td>
</tr>
@endforeach
</tbody>
</table>
</div>
<!–_footer 作为公共模版分离出去–>
<script type=”text/javascript” src=”{{ asset(‘admin/lib’) }}/jquery/1.9.1/jquery.min.js”></script>
<script type=”text/javascript” src=”{{ asset(‘admin/lib’) }}/layer/2.4/layer.js”></script>
<script type=”text/javascript” src=”{{ asset(‘admin/static’) }}/h-ui/js/H-ui.min.js”></script>
<script type=”text/javascript” src=”{{ asset(‘admin/static’) }}/h-ui.admin/js/H-ui.admin.js”></script> <!–/_footer 作为公共模版分离出去–>
<!–请在下方写此页面业务相关的脚本–>
<script type=”text/javascript” src=”{{ asset(‘admin/lib’) }}/datatables/1.10.0/jquery.dataTables.min.js”></script>
<script type=”text/javascript”>
var table = $(‘table’).DataTable({
iDisplayLength:10, //限制每页显示条数
// searching : false, //禁用搜索
bLengthChange: false, //去掉每页显示多少条数据方法
});
//客户端搜索功能更
$(‘#search’).click(function(){
var search_content = $(‘#search_content’).val();
table.search(search_content).draw();
});
$(function(){
$(‘#DataTables_Table_0_filter’).hide();
});
/*
参数解释:
title 标题
url 请求的url
id 需要操作的数据id
w 弹出层宽度(缺省调默认值)
h 弹出层高度(缺省调默认值)
*/
/*管理员-试卷-添加*/
function admin_permission_add(title,url,w,h){
layer_show(title,url,w,h);
}
/*管理员-试卷-编辑*/
function admin_permission_edit(title,url,id,w,h){
layer_show(title,url,w,h);
}
/*管理员-试卷-删除*/
function admin_permission_del(obj,id){
layer.confirm(‘确认要删除吗?’,function(index){
$.ajax({
type: ‘POST’,
url: ”,
dataType: ‘json’,
success: function(data){
$(obj).parents(“tr”).remove();
layer.msg(‘已删除!’,{icon:1,time:1000});
},
error:function(data) {
console.log(data.msg);
},
});
});
}
</script>
</body>
</html>
后台试题导入和导出
︴下载工具库
资料:https://packagist.org/packages/maatwebsite/excel
- 步骤1:下载
- 步骤2:配置
︴导出语法
$data = [
[‘编号’,’姓名’,’年龄’],
[‘1′,’a1′,’1’],
[‘2′,’a2′,’2’],
[‘3′,’a3′,’3’]
];
Excel::create(‘学习成绩’, function($excel) use ($data) {
$excel->sheet(‘score’, function($sheet) use ($data) {
$sheet->rows($data);
});
})->export(‘xls’);
︴导入语法
$excel_file_path = getcwd() . ‘/t2.xls’; //你的Excel文件存放地址
$excel_data = Excel::load($excel_file_path, function($reader) {
$res = $reader->getSheet(0)->toArray();
// 直接打印内容即可看到效果
echo ‘job.xlsx 表格内容为:’;
dd($res);
});
1)试题导入(excel)
- 步骤1:定义路由
- 步骤2:试卷列表设置导入连接
- 步骤3:创建导入试题方法,并完成导入功能
//导入试题
public function add(Request $request)
{
//步骤1:获取参数
$paper_id = $request->input(‘paper_id’);
//步骤2;判断excel文件是否存在
$file = getcwd() . ‘/excel/’ . $paper_id .’.xlsx’;
if (file_exists($file)) {
//步骤3:读取excel内容
$excel_data = Excel::load($file, function($reader) {
$res = $reader->getSheet(0)->toArray();
// 直接打印内容即可看到效果
// echo ‘job.xlsx 表格内容为:’;
// dd($res);
//步骤4:通过循环将试题插入数据库
foreach ($res as $k=>$v) {
if ($k == 0) continue; //跳过表格标题
$type = $v[0] == ‘单选题’ ? 1 : 2;
$remark = $v[6] ? $v[6] : ”;
$data = [
‘type’ => $type,
‘paper_id’ => intval($v[1]),
‘score’ => $v[4],
‘question’ => $v[2],
‘options’ => $v[3],
‘answer’ => $v[5],
‘remark’ => $remark
];
Question::create($data);
}
});
//步骤5:跳转到试卷试题列表页
return redirect(‘admin/question/index?paper_id=’.$paper_id);
}
return redirect(‘admin/paper/index’);
}
2)试题导出(excel)
- 步骤1:定义路由
- 步骤2:创建控制器方法并完成功能
//导出试题
public function export(Request $request)
{
//步骤1:获取参数
$paper_id = $request->input(‘paper_id’);
//步骤2;根据试卷ID获取所有试题
$questions = Question::with(‘paper’)->where(‘paper_id’, $paper_id)->get();
//步骤3:组装导出数据
$data[] = [‘类型’,’所属试卷’,’问题’,’选项’,’分数’,’答案’,’说明’];
foreach ($questions as $key => $question) {
$type = $question->type == 1 ? ‘单选题’ : ‘多选题’;
$data[] = [
$type,
$question->paper->paper_name,
$question->question,
$question->options,
$question->score,
$question->answer,
$question->remark
];
$name = $question->paper->paper_name;
}
Excel::create($name, function($excel) use ($data) {
$excel->sheet(‘score’, function($sheet) use ($data) {
$sheet->rows($data);
});
})->export(‘xls’);
return redirect(‘admin/paper/index’);
}
三、前台答题功能
展示试题
- 步骤1:定义路由
- 步骤1:创建控制器方法并查询所有题目试题
- 步骤3:视图循环显示
<!DOCTYPE html>
<html>
<head>
<title>考试</title>
<style type=”text/css”>
* { padding:0px; margin:0px; }
body
{
font-family:”微软雅黑”,”Lucida Grande”,Helvetica,Arial,Verdana,sans-serif;
word-break:break-all;
word-wrap: break-word;
background: #ddf4ff url(“https://image.wjx.cn/images/newbg/oldbg2-bg.jpg”) repeat-x;
}
#main { width: 920px;margin: auto;}
#main .title {width: 100%; height:105px;background: url(“https://image.wjx.cn/images/newbg/oldbg2.jpg”) no-repeat top center; }
#main h1 { color:#19a8ee; text-align: center; font-size: 24px !important; }
#main h2 { margin-left: 30px; }
#main h3 { margin-bottom: 10px; }
#main .content {background: #fff;}
#main .content .question { width: 800px; margin: auto; border-bottom: 1px solid #EFEFEF;padding-top: 20px;}
#main .content .question input { width: 20px; height: 20px; vertical-align: middle; margin: 8px 0px; }
#main #submit { width: 80px; height: 40px; margin-left: 420px; cursor: pointer;}
</style>
</head>
<body>
<div id=”main”>
<div class=”title”></div>
<div class=”content”>
<h1>试卷A</h1>
<h2>单选</h2>
@foreach ($questions as $k=>$question)
@if ($question->type == 1)
<div class=”question”>
<div>
<h3>{{$k + 1}}.{{$question->question}}</h3>
@foreach (explode(‘,’, $question->options) as $option)
<input type=”radio” name=”a” value=”” />{{ $option }}<br />
@endforeach
</div>
</div>
@endif
@endforeach
<h2>多选</h2>)
@php
$k = 0;
@endphp
@foreach ($questions as $question)
@if ($question->type == 2)
<div class=”question”>
<div>
<h3>{{$k + 1}}.{{$question->question}}</h3>
@foreach (explode(‘,’, $question->options) as $option)
<input type=”checkbox” name=”a” value=”1″ />{{ $option }}<br />
@endforeach
</div>
</div>
@endif
@endforeach
<br/>
<br/>
<input type=”submit” name=”提交” id=”submit”>
</div>
</div>
</body>
</html>
答题处理
- 步骤1:定义路由
- 步骤2:修改视图
<!DOCTYPE html>
<html>
<head>
<title>考试</title>
<style type=”text/css”>
* { padding:0px; margin:0px; }
body
{
font-family:”微软雅黑”,”Lucida Grande”,Helvetica,Arial,Verdana,sans-serif;
word-break:break-all;
word-wrap: break-word;
background: #ddf4ff url(“https://image.wjx.cn/images/newbg/oldbg2-bg.jpg”) repeat-x;
}
#main { width: 920px;margin: auto;}
#main .title {width: 100%; height:105px;background: url(“https://image.wjx.cn/images/newbg/oldbg2.jpg”) no-repeat top center; }
#main h1 { color:#19a8ee; text-align: center; font-size: 24px !important; }
#main h2 { margin-left: 30px; }
#main h3 { margin-bottom: 10px; }
#main .content {background: #fff;}
#main .content .question { width: 800px; margin: auto; border-bottom: 1px solid #EFEFEF;padding-top: 20px;}
#main .content .question input { width: 20px; height: 20px; vertical-align: middle; margin: 8px 0px; }
#main #submit { width: 80px; height: 40px; margin-left: 420px; cursor: pointer;}
</style>
</head>
<body>
@php
$rs = [‘A’, ‘B’, ‘C’, ‘D’];
@endphp
<form action=”{{ url(‘home/answer/add’) }}” method=”post”>
{{ csrf_field() }}
<div id=”main”>
<div class=”title”></div>
<div class=”content”>
<h1>试卷A</h1>
<h2>单选</h2>
@foreach ($questions as $k=>$question)
@if ($question->type == 1)
<div class=”question”>
<div>
<h3>{{$k + 1}}.{{$question->question}}</h3>
@foreach (explode(‘,’, $question->options) as $temp=>$option)
<input type=”radio” name=”answer[{{ $question->id }}]” value=”{{ $rs[$temp] }}” />{{ $option }}<br />
@endforeach
</div>
</div>
@endif
@endforeach
<h2>多选</h2>
@php
$k = 0;
@endphp
@foreach ($questions as $question)
@if ($question->type == 2)
<div class=”question”>
<div>
<h3>{{$k + 1}}.{{$question->question}}</h3>
@foreach (explode(‘,’, $question->options) as $temp=>$option)
<input type=”checkbox” name=”answer[{{ $question->id }}][]” value=”{{ $rs[$temp] }}” />{{ $option }}<br />
@endforeach
</div>
</div>
@endif
@endforeach
<br/>
<br/>
<input type=”submit” name=”提交” id=”submit”>
</div>
</div>
</form>
</body>
</html>
- 步骤3:数据处理【难点、重点】
主要学习视图的name设置以及这边的判断原理
<?php
namespace App\Http\Controllers\Home;
use App\Http\Model\Question;
use App\Http\Model\Answer;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class AnswerController extends Controller
{
//答题处理
public function add(Request $request)
{
//1.判断请求类型
if ($request->isMethod(‘post’)) {
//2.接受数据
$postData = $request->only(‘answer’, ‘paper_id’);
//dd($postData);
//3.查询试卷对应的所有试题
$questions = Question::where(‘paper_id’, $postData[‘paper_id’])->get();
//4.循环判断提交的试题是否正确
foreach ($questions as $key => $question) {
//4.1先判断当前试题是否在提交表单中:
//正常流 ->肯定存在 处理:正确,错误
//非正常流->肯定不存在 处理:不管,不加入到answer直接没分
if (isset($postData[‘answer’][$question->id])) {
//用户本地答案
$userSubmitAnswer = is_array($postData[‘answer’][$question->id]) ? implode(”, $postData[‘answer’][$question->id]) : $postData[‘answer’][$question->id];
//判断是否正确
$temp = [
‘paper_id’ => $postData[‘paper_id’],
‘question_id’ => $question->id,
‘member_id’ => 0,
‘score’ => $question->score,
‘answer’ => $userSubmitAnswer //用户答案
];
if ($question->answer == $userSubmitAnswer) {
//答对
$temp[‘is_correct’] = 1; //是否正确:1-是,2-否
} else {
//答错
$temp[‘is_correct’] =2 ; //是否正确:1-是,2-否
}
Answer::create($temp);
}
}
//处理完毕跳转到结果页
return redirect(‘home/answer/detail’);
}
}
//答题结果显示
public function detail()
{
return view(‘home/answer/detail’);
}
}
展示答题结果
- 步骤1:定义路由
- 步骤2:创建控制器方法
- 设置模型
2)设置控制器
- 步骤3:视图判断显示结果
<!DOCTYPE html>
<html>
<head>
<title>考试</title>
<style type=”text/css”>
* { padding:0px; margin:0px; }
body
{
font-family:”微软雅黑”,”Lucida Grande”,Helvetica,Arial,Verdana,sans-serif;
word-break:break-all;
word-wrap: break-word;
background: #ddf4ff url(“https://image.wjx.cn/images/newbg/oldbg2-bg.jpg”) repeat-x;
}
#main { width: 920px;margin: auto;}
#main .title {width: 100%; height:105px;background: url(“https://image.wjx.cn/images/newbg/oldbg2.jpg”) no-repeat top center; }
#main h1 { color:#19a8ee; text-align: center; font-size: 24px !important; }
#main h2 { margin-left: 30px; }
#main h3 { margin-bottom: 10px; }
#main .content {background: #fff;}
#main .content .question { width: 800px; margin: auto; border-bottom: 1px solid #EFEFEF;padding-top: 20px;}
#main .content .question input { width: 20px; height: 20px; vertical-align: middle; margin: 8px 0px; }
#main #submit { width: 80px; height: 40px; margin-left: 420px; cursor: pointer;}
</style>
</head>
<body>
@php
$rs = [‘A’, ‘B’, ‘C’, ‘D’];
@endphp
<form action=”{{ url(‘home/answer/add’) }}” method=”post”>
{{ csrf_field() }}
<div id=”main”>
<div class=”title”></div>
<div class=”content”>
<h1>试卷A</h1>
<h2>单选</h2>
@foreach ($answers as $k=>$answer)
@if ($answer->question->type == 1)
<div class=”question”>
<div>
<h3>
{{$k + 1}}.{{$answer->question->question}}
@if ($answer->is_correct == 1)
<font color=”green”>正确</font>
@else
<font color=”red”>错误</font> ,正确答案:{{$answer->question->answer}}
@endif
</h3>
@foreach (explode(‘,’, $answer->question->options) as $temp=>$option)
<input type=”radio”
@if($rs[$temp] == $answer->answer)
checked
@endif
/>{{ $option }}<br />
@endforeach
</div>
</div>
@endif
@endforeach
<h2>多选</h2>
@php
$k = 0;
@endphp
@foreach ($answers as $answer)
@if ($answer->question->type == 2)
<div class=”question”>
<div>
<h3>
{{$k + 1}}.{{$answer->question->question}}
@if ($answer->is_correct == 1)
<font color=”green”>正确</font>
@else
<font color=”red”>错误</font> ,正确答案:{{$answer->question->answer}}
@endif
</h3>
@foreach (explode(‘,’, $answer->question->options) as $temp=>$option)
<input type=”checkbox”
@if(strpos(‘_’.$answer->answer, $rs[$temp]))
checked=checked
@endif
/>{{ $option }}<br />
@endforeach
</div>
</div>
@endif
@endforeach
<br/>
<br/>
<input type=”submit” name=”提交” id=”submit”>
</div>
</div>
</form>
</body>
</html>
在Laravle中使用支付宝
1、下载第三方支付宝SDK工具库
- 步骤1:下载
composer require “echobool/alipay-laravel5:dev-master”
- 步骤2:配置
- 步骤3:更新配置
- 步骤4:发布配置文件
1)生成配置文件
2)修改配置文件
<?php
/**
* Created by PhpStorm.
* User: luojinyi
* Date: 2017/6/26
* Time: 下午5:21
*/
return [
//应用ID,您的APPID。
‘app_id’ => “2016091200497515”,
//商户私钥 不能用pkcs8.pem中的密钥!!!!!
‘merchant_private_key’ => “MIIEogIBAAKCAQEAuVAxeZTkmobcdfsgOor2xK5vyHmLnGfDLK4latRGDu8Esil7vVx59IQK9rnDnO2KFn/zvk36PpsKyyV1c9p1IK+/pm/kpu9GkTJKJm5vSFx21UWzVCZlRLPy92UH9KGHyD4V28mzMCGuUwniy8O0oiwR9sL5Qcayh5/Ao47nnQ3VTby8bFyuEchsOd8fqVDJzyyAdHoWqqKsuYg+SJqdjP0dsJsryS427we2LEZ9k2IZhd2Mhuj7N28ZcI8NS3YAdh5Yw1+g1j6J0oReQ209awSnwkatwUEH1dSNCnI4tNQu7WfbKm9u1eKb6SE83bvKE11ombAftcaO/9X+be6XHwIDAQABAoIBAGlNmZ+mLTVmNzbPyiOaPdnL6fd4og3xpKXqG5cWIu1vgzKeghM7zo1Uz0oei3rMPLDGasKUWwRiZALGOXTpCa/WTsiMQtldlLMDacFm9dOfv2M35UyHOPqOax2MCrZHZ/ow1Yj8l9dc/EtxjbAOeMHC2z5m0u8+ssqAzB3lIdZLQiD+J744AzFZ09VcwtAzLpVBN67DCsqHd+MVwNMajcoUokMfXO7+KYO9uKFS50GDlhTs/nJXy7ihZ1GkLpKjXMBAlP2X3Iyv8Tibd1eKnXkzufCABPH1tnFsMwvW4PJ3DQY4pnyRb9Tq6Ydqcjrc4bgB9E5qUKeB/578R746WoECgYEA8ir1WjjTUYeskcs8Od9kqj/35WYDS704jD2VLp2Sjtodj+/em38s2l3xnH/+S7+msQFdsllmQYC/9yMZ65nNCGeoHKPrJvVgyl45KPxDeeCWrNq8UQBlOezyVg6BKQV8qFPHb/rag8OXhzcRxlIVqzZPFRSw1YVfLZSEADPYrMECgYEAw+XkgRkX6ia3JVFa8dpoFhHweDfuRncw9Wny0/6gFjNv/apl726BoS9jregeJfynqWDkDdkw05I6y9wiQyiXDWH6/JV97xXsoYqFIUfydFFGz2yHJ+l1rCLXjn+k1dmzTJLWU+bRxbVCqC2VAm6laJUkEuntDyCtnN+xf1cn298CgYB/4oG5CINH7d8LCwmeAkPVyHwv74RUDfP701WhzWKk/7hW17R1514XXz8Fh24SMH5lwTPqyF1AwC4f47B/g7QL+TmFDmdTJofbtpB2/WjgxuKrG8QQ/qV2RpPfMD+zGwuulLegghe9N6Agrss7MQPya3atykRsLceKeYCP3tFQwQKBgEX5rp/2yLYZUj6ASw4tSBTqH42x3OlK1jAzwku7no+PnCduYK8gOCnNdbu/OFW1ZGZ6d7wCoxBQIbSEU7DNpPdg0ni7JZrrp/UkN93lh1PJXJPnXngBSslMQNdj/Qtukj9+DBU4VCJdVwwgDCQsReWPsK0Y5lcLAzkQJqUoCtLdAoGAEm6PFZs3mQekOf1L43NfEdG5E8MvuguutBJaKqfuOLk5LnBgC2wP0XUL1Dz47oJNXoQxHse9QUOy7QijTLTz/tehDFUYDSwkJ1lEEvaEhmMqeR/MiUT+z2//MnG4AlNHyYU/cMU38CkgDPwinFv5TvjRMHWyx8ZSvQ2d99ptXHM=”,
//异步通知地址
‘notify_url’ => “http://外网可访问网关地址/alipay.trade.page.pay-PHP-UTF-8/notify_url.php”,
//同步跳转
‘return_url’ => “http://l.com/edu6/public/home/alipay/returnUrl”,
//编码格式
‘charset’ => “UTF-8”,
//签名方式
‘sign_type’ => “RSA2”,
//支付宝网关
‘gatewayUrl’ => “https://openapi.alipaydev.com/gateway.do”,
//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
‘alipay_public_key’ => “MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuVAxeZTkmobcdfsgOor2xK5vyHmLnGfDLK4latRGDu8Esil7vVx59IQK9rnDnO2KFn/zvk36PpsKyyV1c9p1IK+/pm/kpu9GkTJKJm5vSFx21UWzVCZlRLPy92UH9KGHyD4V28mzMCGuUwniy8O0oiwR9sL5Qcayh5/Ao47nnQ3VTby8bFyuEchsOd8fqVDJzyyAdHoWqqKsuYg+SJqdjP0dsJsryS427we2LEZ9k2IZhd2Mhuj7N28ZcI8NS3YAdh5Yw1+g1j6J0oReQ209awSnwkatwUEH1dSNCnI4tNQu7WfbKm9u1eKb6SE83bvKE11ombAftcaO/9X+be6XHwIDAQAB”,
//支付时提交方式 true 为表单提交方式成功后跳转到return_url,
//false 时为Curl方式 返回支付宝支付页面址址 自己跳转上去 支付成功不会跳转到return_url上, 我也不知道为什么,有人发现可以跳转请告诉 我一下 谢谢
// email: 40281612@qq.com
‘trade_pay_type’ => true,
];
- 步骤5:定义路由,创建控制器方法,并将官方demo代码放进去
<?php
namespace App\Http\Controllers\Home;
//文件头use一下
use EchoBool\AlipayLaravel\Facades\Alipay;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class AlipayController extends Controller
{
/**
* 支付
* @param Request $request
* @return mixed
*/
public function goPay(Request $request)
{
//商户订单号,商户网站订单系统中唯一订单号,必填
$out_trade_no = date(‘YmdHis’) . ‘00045623’;
//订单名称,必填
$subject = ‘锁贸通任务ID448’;
//付款金额,必填
$total_amount = 0.01;
//商品描述,可空
$body = ‘macbook pro2’;
$customData = json_encode([‘model_name’ => ‘ewrwe’, ‘id’ => 121]);//自定义参数
$response = Alipay::tradePagePay($subject, $body, $out_trade_no, $total_amount, $customData);
//输出表单
return $response[‘redirect_url’];
}
/**
* 退款
* @param Request $request
*/
public function refund(Request $request)
{
//商户订单号
$out_trade_no = $request->get(‘trade_no’);
$refund_amount = 0.01;
$refund_reason = ‘任务取消退款’;
$out_request_no = ‘201’;
$response = Alipay::tradeRefund($out_trade_no, $refund_amount, $refund_reason, $out_request_no);
dd($response);
}
/**
* 退款查询
* @param Request $request
*/
public function refundQuery(Request $request)
{
//商户订单号
$out_trade_no = $request->get(‘trade_no’);
$out_request_no = $request->get(‘out_request_no’);
$response = Alipay::refundQuery($out_trade_no,$out_request_no);
dd($response);
}
/**
* 交易是否成功查询
* @param Request $request
*/
public function tradePayQuery(Request $request)
{
//商户订单号
$out_trade_no = $request->get(‘trade_no’);
$response = Alipay::tradePayQuery($out_trade_no);
dd($response);
}
/**
* 交易关闭
* @param Request $request
*/
public function tradeClose(Request $request)
{
//商户订单号
$out_trade_no = $request->get(‘trade_no’);
$response = Alipay::Close($out_trade_no);
dd($response);
}
/**
* 异步通知
* @param Request $request
*/
public function notify(Request $request)
{
$result = Alipay::notify($_POST);
/* 实际验证过程建议商户添加以下校验。
1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
4、验证app_id是否为该商户本身。
*/
if ($result) {//验证成功
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//请在这里加上商户的业务逻辑程序代
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
//商户订单号
$out_trade_no = $_POST[‘out_trade_no’];
//支付宝交易号
$trade_no = $_POST[‘trade_no’];
//交易状态
$trade_status = $_POST[‘trade_status’];
if ($_POST[‘trade_status’] == ‘TRADE_FINISHED’) {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_amount与通知时获取的total_fee为一致的
//如果有做过处理,不执行商户的业务程序
//注意:
//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
} else if ($_POST[‘trade_status’] == ‘TRADE_SUCCESS’) {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_amount与通知时获取的total_fee为一致的
//如果有做过处理,不执行商户的业务程序
//注意:
//付款完成后,支付宝系统发送该交易状态通知
}
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
echo “success”; //请不要修改或删除
} else {
//验证失败
echo “fail”;
}
}
/**
* 同步通知 即支付成功后跳转到return_url 上时进行验证 如果支付方式是CURL方式将不会跳转 请注意
* @param Request $request
*/
public function returnUrl(Request $request)
{
$result = Alipay::notify($_GET);
/* 实际验证过程建议商户添加以下校验。
1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
4、验证app_id是否为该商户本身。
*/
if ($result) {//验证成功
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//请在这里加上商户的业务逻辑程序代码
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表
//商户订单号
$out_trade_no = htmlspecialchars($_GET[‘out_trade_no’]);
//支付宝交易号
$trade_no = htmlspecialchars($_GET[‘trade_no’]);
echo “验证成功<br />支付宝交易号:” . $trade_no;
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
} else {
//验证失败
echo “验证失败”;
}
}
}
- 步骤6:访问测试
报错
php artisan config:cache