• 首页
  • 前端
    • HTML
    • CSS
    • Javascript
    • XML
    • AJAX
  • 前端框架
    • BootStrap
    • Jquery
  • PHP
    • 语法
    • 核心
    • 面向对象
    • PHP7
    • Socket
    • Swoole
  • 数据库
    • Mysql
    • Redis
    • Memcache
    • MongoDB
  • 优化
    • 优化方案
    • 页面静态化
    • Nginx
  • 后台框架与实战
    • Smarty
    • 源码Blog
    • TP3.2
    • TP3.2商城
    • TP5.0
    • TP5.0商城
    • Laravel
    • Laravel在线教育平台
    • Yii
    • Yii手机直播
    • CodeIgniter
    • Yaf
  • 移动开发
    • 微信公众号
    • 混合APP
  • 二次开发
    • DedeCMS
  • Linux
    • 基本操作
    • 环境搭建
  • 版本控制
    • GIT
    • SVN
  • Node.js
  • 资料库
没有结果
查看所有结果
  • 首页
  • 前端
    • HTML
    • CSS
    • Javascript
    • XML
    • AJAX
  • 前端框架
    • BootStrap
    • Jquery
  • PHP
    • 语法
    • 核心
    • 面向对象
    • PHP7
    • Socket
    • Swoole
  • 数据库
    • Mysql
    • Redis
    • Memcache
    • MongoDB
  • 优化
    • 优化方案
    • 页面静态化
    • Nginx
  • 后台框架与实战
    • Smarty
    • 源码Blog
    • TP3.2
    • TP3.2商城
    • TP5.0
    • TP5.0商城
    • Laravel
    • Laravel在线教育平台
    • Yii
    • Yii手机直播
    • CodeIgniter
    • Yaf
  • 移动开发
    • 微信公众号
    • 混合APP
  • 二次开发
    • DedeCMS
  • Linux
    • 基本操作
    • 环境搭建
  • 版本控制
    • GIT
    • SVN
  • Node.js
  • 资料库
没有结果
查看所有结果
没有结果
查看所有结果

Laravel在线教育平台(六)数据字典、数据迁移、后台试卷管理、试卷导出、答题处理、支付宝

Mr.Lee 由 Mr.Lee
2018年5月19日
在 Laravel, Laravel在线教育平台, 后台框架
0
Laravel在线教育平台(六)数据字典、数据迁移、后台试卷管理、试卷导出、答题处理、支付宝
0
分享
0
浏览

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”>&#xe61a;</i> 考试管理<i class=”Hui-iconfont menu_dropdown-arrow”>&#xe6d5;</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”>&#xe67f;</i> 首页 <span class=”c-gray en”>&gt;</span> 管理员管理 <span class=”c-gray en”>&gt;</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”>&#xe68f;</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”>&#xe665;</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”>&#xe6e2;</i> 批量删除

</a>

<a href=”javascript:;” onclick=”admin_permission_add(‘添加试卷节点’,'{{ url(‘admin/auth/add’) }}’,’400′,’360′)” class=”btn btn-primary radius”>

<i class=”Hui-iconfont”>&#xe600;</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”>&#xe6df;</i></a> <a title=”删除” href=”javascript:;” onclick=”admin_permission_del(this,’1′)” class=”ml-5″ style=”text-decoration:none”><i class=”Hui-iconfont”>&#xe6e2;</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=”&nbsp;&nbsp;提交&nbsp;&nbsp;”>

</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:创建控制器和方法,并获取所有数据传递给视图
  1. 定义模型,关联试题

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”>&#xe67f;</i> 首页 <span class=”c-gray en”>&gt;</span> 管理员管理 <span class=”c-gray en”>&gt;</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”>&#xe68f;</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”>&#xe665;</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”>&#xe6e2;</i> 批量删除

</a>

<a href=”javascript:;” onclick=”admin_permission_add(‘添加试卷节点’,'{{ url(‘admin/paper/add’) }}’,’400′,’360′)” class=”btn btn-primary radius”>

<i class=”Hui-iconfont”>&#xe600;</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”>&#xe6df;</i></a> <a title=”删除” href=”javascript:;” onclick=”admin_permission_del(this,’1′)” class=”ml-5″ style=”text-decoration:none”><i class=”Hui-iconfont”>&#xe6e2;</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:创建控制器方法
  1. 设置模型

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}}&nbsp;

@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

标签: 后台试卷管理支付宝数据字典数据迁移答题处理试卷导出
上一篇文章

微信公众号(一)服务号与订阅号、编辑模式和开发模式、接口开发、TOKEN、微信六大接口、阿里云服务器

下一篇文章

Laravel在线教育平台(五)直播课程管理、图片上传、首页点播、对象存储、日期插件、推流地址

下一篇文章
Laravel在线教育平台(六)数据字典、数据迁移、后台试卷管理、试卷导出、答题处理、支付宝

Laravel在线教育平台(五)直播课程管理、图片上传、首页点播、对象存储、日期插件、推流地址

发表回复 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Search

没有结果
查看所有结果

About Me

个人随笔

Winston Lee

Programmer

Hello & welcome to my blog! My name is Winston Lee and am a programmer and am keen on sharing.

Winston Lee

About Me

Hello & welcome to my blog! My name is Winston Lee and am a programmer and am keen on sharing.

Categories

  • AJAX
  • BootStrap
  • CodeIgniter
  • CSS
  • DedeCMS
  • GIT
  • HTML
  • Javascript
  • Jquery
  • Laravel
  • Laravel在线教育平台
  • Linux
  • Memcache
  • MongoDB
  • MVC
  • Mysql
  • Nginx
  • Node
  • PDO
  • PHP
  • PHP7
  • PHP基本语法
  • PHP核心编程
  • Redis
  • Smarty
  • Socket
  • SVN
  • Swoole
  • TP3.2
  • TP3.2商城
  • TP5.0
  • TP5.0商城
  • XML
  • Yaf
  • Yii
  • Yii手机直播
  • 二次开发
  • 优化方案
  • 前端技术
  • 前端框架
  • 后台框架
  • 基本操作
  • 微信公众号
  • 数据库
  • 未分类
  • 混合APP
  • 源码Blog项目
  • 版本控制
  • 环境搭建
  • 移动端开发
  • 网站优化
  • 资料
  • 面向对象
  • 面向对象编程
  • 页面静态化

Tags

DOM Json RBAC 事件 传参 函数 分页 判断语句 匿名函数 变量 图片上传 存储过程 安装 对象 封装 属性 接口 控制器 数据库操作 数据类型 数据表 数组 文件上传 无刷新分页 权限 标签 模型 正则 流程控制 目录结构 算法 类 索引 继承 缩略图 表关系 视图 路由 运算符 选择器 递归 配置 错误处理 页面静态化 验证码
  • 首页
  • 前端
  • 前端框架
  • PHP
  • 数据库
  • 优化
  • 后台框架与实战
  • 移动开发
  • 二次开发
  • Linux
  • 版本控制
  • Node.js
  • 资料库

沪公网安备31011502400873 | 沪ICP备2024050435号-3

没有结果
查看所有结果
  • 首页
  • 前端
    • HTML
    • CSS
    • Javascript
    • XML
    • AJAX
  • 前端框架
    • BootStrap
    • Jquery
  • PHP
    • 语法
    • 核心
    • 面向对象
    • PHP7
    • Socket
    • Swoole
  • 数据库
    • Mysql
    • Redis
    • Memcache
    • MongoDB
  • 优化
    • 优化方案
    • 页面静态化
    • Nginx
  • 后台框架与实战
    • Smarty
    • 源码Blog
    • TP3.2
    • TP3.2商城
    • TP5.0
    • TP5.0商城
    • Laravel
    • Laravel在线教育平台
    • Yii
    • Yii手机直播
    • CodeIgniter
    • Yaf
  • 移动开发
    • 微信公众号
    • 混合APP
  • 二次开发
    • DedeCMS
  • Linux
    • 基本操作
    • 环境搭建
  • 版本控制
    • GIT
    • SVN
  • Node.js
  • 资料库

沪公网安备31011502400873 | 沪ICP备2024050435号-3